// This file is distributed under the University of Illinois Open Source License.
// See LICENSE.TXT for details.
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus
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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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

#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

extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
VTBL_ENTRY *P__ZTIN3ccc4BB15E = _ZTIN3ccc4BB15E; 
Class_Descriptor cd__ZN3ccc4BB15E = {  "_ZN3ccc4BB15E", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTIN3ccc4BB15E),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  CC0x0y0  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y03pqrEv
  ~CC0x0y0(); // tgen
  CC0x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y0E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y03abcEv");}
void  ccc::CC0x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y03efgEv");}
void  ccc::CC0x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y03pqrEv");}
ccc::CC0x0y0 ::~CC0x0y0(){ note_dtor("_ZN3ccc7CC0x0y0E", this);} // tgen
ccc::CC0x0y0 ::CC0x0y0(){ note_ctor("_ZN3ccc7CC0x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y0E, buf);
    ::ccc::CC0x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y0E);
    dp->::ccc::CC0x0y0::~CC0x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y0E(Test__ZN3ccc7CC0x0y0E, "_ZN3ccc7CC0x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y0C1Ev();
extern void _ZN3ccc7CC0x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y0E[] = {
  NSPAIR(_ZN3ccc7CC0x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y0E[];
extern void _ZN3ccc7CC0x0y03abcEv();
extern void _ZN3ccc7CC0x0y03efgEv();
extern void _ZN3ccc7CC0x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y03abcEv,_ZTv0_n12_N3ccc7CC0x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03abcEv,_ZThn4_N3ccc7CC0x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y03efgEv,_ZTv0_n16_N3ccc7CC0x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03efgEv,_ZThn4_N3ccc7CC0x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y03pqrEv,_ZTv0_n20_N3ccc7CC0x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03pqrEv,_ZThn4_N3ccc7CC0x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y03abcEv,_ZTv0_n12_N3ccc7CC0x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y03efgEv,_ZTv0_n16_N3ccc7CC0x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y03pqrEv,_ZTv0_n20_N3ccc7CC0x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y0E[] = {
  {&(_ZTVN3ccc7CC0x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y0E[];
static VTBL_ENTRY alt_thunk_names1[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y03pqrEv,_ZTv0_n20_N3ccc7CC0x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y03pqrEv,_ZThn4_N3ccc7CC0x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y03efgEv,_ZTv0_n16_N3ccc7CC0x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y03efgEv,_ZThn4_N3ccc7CC0x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y03abcEv,_ZTv0_n12_N3ccc7CC0x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y03abcEv,_ZThn4_N3ccc7CC0x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y0E = {  "_ZN3ccc7CC0x0y0E", // class name
  bases__ZN3ccc7CC0x0y0E, 2,
  &(vtc__ZN3ccc7CC0x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y0E),2, //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  DD0x0y0  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD0x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y03pqrEv
  ~DD0x0y0(); // tgen
  DD0x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y03abcEv");}
void  ccc::DD0x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y03efgEv");}
void  ccc::DD0x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y03pqrEv");}
ccc::DD0x0y0 ::~DD0x0y0(){ note_dtor("_ZN3ccc7DD0x0y0E", this);} // tgen
ccc::DD0x0y0 ::DD0x0y0(){ note_ctor("_ZN3ccc7DD0x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y0E, buf);
    ::ccc::DD0x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y0E);
    dp->::ccc::DD0x0y0::~DD0x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y0E(Test__ZN3ccc7DD0x0y0E, "_ZN3ccc7DD0x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y0C1Ev();
extern void _ZN3ccc7DD0x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y0E[] = {
  NSPAIR(_ZN3ccc7DD0x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y0E[];
extern void _ZN3ccc7DD0x0y03abcEv();
extern void _ZN3ccc7DD0x0y03efgEv();
extern void _ZN3ccc7DD0x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y03abcEv,_ZTv0_n12_N3ccc7DD0x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y03abcEv,_ZThn4_N3ccc7DD0x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y03efgEv,_ZTv0_n16_N3ccc7DD0x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y03efgEv,_ZThn4_N3ccc7DD0x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y03pqrEv,_ZTv0_n20_N3ccc7DD0x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y03pqrEv,_ZThn4_N3ccc7DD0x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y03abcEv,_ZTv0_n12_N3ccc7DD0x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y03efgEv,_ZTv0_n16_N3ccc7DD0x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y03pqrEv,_ZTv0_n20_N3ccc7DD0x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y0E[] = {
  {&(_ZTVN3ccc7DD0x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y0E[];
static VTBL_ENTRY alt_thunk_names2[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y03pqrEv,_ZTv0_n20_N3ccc7DD0x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y03pqrEv,_ZThn4_N3ccc7DD0x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y03efgEv,_ZTv0_n16_N3ccc7DD0x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y03efgEv,_ZThn4_N3ccc7DD0x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y03abcEv,_ZTv0_n12_N3ccc7DD0x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y03abcEv,_ZThn4_N3ccc7DD0x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y0E = {  "_ZN3ccc7DD0x0y0E", // class name
  bases__ZN3ccc7DD0x0y0E, 2,
  &(vtc__ZN3ccc7DD0x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y0E),3, //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  CC0x0y1  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x0y13efgEv
  ~CC0x0y1(); // tgen
  CC0x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y1E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y13abcEv");}
void  ccc::CC0x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y13pqrEv");}
void  ccc::CC0x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y13efgEv");}
ccc::CC0x0y1 ::~CC0x0y1(){ note_dtor("_ZN3ccc7CC0x0y1E", this);} // tgen
ccc::CC0x0y1 ::CC0x0y1(){ note_ctor("_ZN3ccc7CC0x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y1E, buf);
    ::ccc::CC0x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y1E);
    dp->::ccc::CC0x0y1::~CC0x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y1E(Test__ZN3ccc7CC0x0y1E, "_ZN3ccc7CC0x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y1C1Ev();
extern void _ZN3ccc7CC0x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y1E[] = {
  NSPAIR(_ZN3ccc7CC0x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y1E[];
extern void _ZN3ccc7CC0x0y13abcEv();
extern void _ZN3ccc7CC0x0y13efgEv();
extern void _ZN3ccc7CC0x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y13abcEv,_ZTv0_n12_N3ccc7CC0x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13abcEv,_ZThn4_N3ccc7CC0x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y13efgEv,_ZTv0_n16_N3ccc7CC0x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13efgEv,_ZThn4_N3ccc7CC0x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y13pqrEv,_ZTv0_n20_N3ccc7CC0x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13pqrEv,_ZThn4_N3ccc7CC0x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y13abcEv,_ZTv0_n12_N3ccc7CC0x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y13efgEv,_ZTv0_n16_N3ccc7CC0x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y13pqrEv,_ZTv0_n20_N3ccc7CC0x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y1E[] = {
  {&(_ZTVN3ccc7CC0x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y1E[];
static VTBL_ENTRY alt_thunk_names3[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y13pqrEv,_ZTv0_n20_N3ccc7CC0x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y13pqrEv,_ZThn4_N3ccc7CC0x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y13efgEv,_ZTv0_n16_N3ccc7CC0x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y13efgEv,_ZThn4_N3ccc7CC0x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y13abcEv,_ZTv0_n12_N3ccc7CC0x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y13abcEv,_ZThn4_N3ccc7CC0x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y1E = {  "_ZN3ccc7CC0x0y1E", // class name
  bases__ZN3ccc7CC0x0y1E, 2,
  &(vtc__ZN3ccc7CC0x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y1E),2, //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  DD0x0y1  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD0x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x0y13efgEv
  ~DD0x0y1(); // tgen
  DD0x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y13abcEv");}
void  ccc::DD0x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y13pqrEv");}
void  ccc::DD0x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y13efgEv");}
ccc::DD0x0y1 ::~DD0x0y1(){ note_dtor("_ZN3ccc7DD0x0y1E", this);} // tgen
ccc::DD0x0y1 ::DD0x0y1(){ note_ctor("_ZN3ccc7DD0x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y1E, buf);
    ::ccc::DD0x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y1E);
    dp->::ccc::DD0x0y1::~DD0x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y1E(Test__ZN3ccc7DD0x0y1E, "_ZN3ccc7DD0x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y1C1Ev();
extern void _ZN3ccc7DD0x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y1E[] = {
  NSPAIR(_ZN3ccc7DD0x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y1E[];
extern void _ZN3ccc7DD0x0y13abcEv();
extern void _ZN3ccc7DD0x0y13efgEv();
extern void _ZN3ccc7DD0x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y13abcEv,_ZTv0_n12_N3ccc7DD0x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y13abcEv,_ZThn4_N3ccc7DD0x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y13efgEv,_ZTv0_n16_N3ccc7DD0x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y13efgEv,_ZThn4_N3ccc7DD0x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y13pqrEv,_ZTv0_n20_N3ccc7DD0x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y13pqrEv,_ZThn4_N3ccc7DD0x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y13abcEv,_ZTv0_n12_N3ccc7DD0x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y13efgEv,_ZTv0_n16_N3ccc7DD0x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y13pqrEv,_ZTv0_n20_N3ccc7DD0x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y1E[] = {
  {&(_ZTVN3ccc7DD0x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y1E[];
static VTBL_ENTRY alt_thunk_names4[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y13pqrEv,_ZTv0_n20_N3ccc7DD0x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y13pqrEv,_ZThn4_N3ccc7DD0x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y13efgEv,_ZTv0_n16_N3ccc7DD0x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y13efgEv,_ZThn4_N3ccc7DD0x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y13abcEv,_ZTv0_n12_N3ccc7DD0x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y13abcEv,_ZThn4_N3ccc7DD0x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y1E = {  "_ZN3ccc7DD0x0y1E", // class name
  bases__ZN3ccc7DD0x0y1E, 2,
  &(vtc__ZN3ccc7DD0x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y1E),3, //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  CC0x0y2  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y23pqrEv
  ~CC0x0y2(); // tgen
  CC0x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y2E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y23efgEv");}
void  ccc::CC0x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y23abcEv");}
void  ccc::CC0x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y23pqrEv");}
ccc::CC0x0y2 ::~CC0x0y2(){ note_dtor("_ZN3ccc7CC0x0y2E", this);} // tgen
ccc::CC0x0y2 ::CC0x0y2(){ note_ctor("_ZN3ccc7CC0x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y2E, buf);
    ::ccc::CC0x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y2E);
    dp->::ccc::CC0x0y2::~CC0x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y2E(Test__ZN3ccc7CC0x0y2E, "_ZN3ccc7CC0x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y2C1Ev();
extern void _ZN3ccc7CC0x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y2E[] = {
  NSPAIR(_ZN3ccc7CC0x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y2E[];
extern void _ZN3ccc7CC0x0y23abcEv();
extern void _ZN3ccc7CC0x0y23efgEv();
extern void _ZN3ccc7CC0x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y23abcEv,_ZTv0_n12_N3ccc7CC0x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23abcEv,_ZThn4_N3ccc7CC0x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y23efgEv,_ZTv0_n16_N3ccc7CC0x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23efgEv,_ZThn4_N3ccc7CC0x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y23pqrEv,_ZTv0_n20_N3ccc7CC0x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23pqrEv,_ZThn4_N3ccc7CC0x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y23abcEv,_ZTv0_n12_N3ccc7CC0x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y23efgEv,_ZTv0_n16_N3ccc7CC0x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y23pqrEv,_ZTv0_n20_N3ccc7CC0x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y2E[] = {
  {&(_ZTVN3ccc7CC0x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y2E[];
static VTBL_ENTRY alt_thunk_names5[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y23pqrEv,_ZTv0_n20_N3ccc7CC0x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y23pqrEv,_ZThn4_N3ccc7CC0x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y23efgEv,_ZTv0_n16_N3ccc7CC0x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y23efgEv,_ZThn4_N3ccc7CC0x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y23abcEv,_ZTv0_n12_N3ccc7CC0x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y23abcEv,_ZThn4_N3ccc7CC0x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y2E = {  "_ZN3ccc7CC0x0y2E", // class name
  bases__ZN3ccc7CC0x0y2E, 2,
  &(vtc__ZN3ccc7CC0x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names5,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x0y2  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD0x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y23pqrEv
  ~DD0x0y2(); // tgen
  DD0x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y23efgEv");}
void  ccc::DD0x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y23abcEv");}
void  ccc::DD0x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y23pqrEv");}
ccc::DD0x0y2 ::~DD0x0y2(){ note_dtor("_ZN3ccc7DD0x0y2E", this);} // tgen
ccc::DD0x0y2 ::DD0x0y2(){ note_ctor("_ZN3ccc7DD0x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y2E, buf);
    ::ccc::DD0x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y2E);
    dp->::ccc::DD0x0y2::~DD0x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y2E(Test__ZN3ccc7DD0x0y2E, "_ZN3ccc7DD0x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y2C1Ev();
extern void _ZN3ccc7DD0x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y2E[] = {
  NSPAIR(_ZN3ccc7DD0x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y2E[];
extern void _ZN3ccc7DD0x0y23abcEv();
extern void _ZN3ccc7DD0x0y23efgEv();
extern void _ZN3ccc7DD0x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y23abcEv,_ZTv0_n12_N3ccc7DD0x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y23abcEv,_ZThn4_N3ccc7DD0x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y23efgEv,_ZTv0_n16_N3ccc7DD0x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y23efgEv,_ZThn4_N3ccc7DD0x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y23pqrEv,_ZTv0_n20_N3ccc7DD0x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y23pqrEv,_ZThn4_N3ccc7DD0x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y23abcEv,_ZTv0_n12_N3ccc7DD0x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y23efgEv,_ZTv0_n16_N3ccc7DD0x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y23pqrEv,_ZTv0_n20_N3ccc7DD0x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y2E[] = {
  {&(_ZTVN3ccc7DD0x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y2E[];
static VTBL_ENTRY alt_thunk_names6[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y23pqrEv,_ZTv0_n20_N3ccc7DD0x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y23pqrEv,_ZThn4_N3ccc7DD0x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y23efgEv,_ZTv0_n16_N3ccc7DD0x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y23efgEv,_ZThn4_N3ccc7DD0x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y23abcEv,_ZTv0_n12_N3ccc7DD0x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y23abcEv,_ZThn4_N3ccc7DD0x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y2E = {  "_ZN3ccc7DD0x0y2E", // class name
  bases__ZN3ccc7DD0x0y2E, 2,
  &(vtc__ZN3ccc7DD0x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y2E),3, //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  CC0x0y3  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x0y33abcEv
  ~CC0x0y3(); // tgen
  CC0x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y3E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y33efgEv");}
void  ccc::CC0x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y33pqrEv");}
void  ccc::CC0x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y33abcEv");}
ccc::CC0x0y3 ::~CC0x0y3(){ note_dtor("_ZN3ccc7CC0x0y3E", this);} // tgen
ccc::CC0x0y3 ::CC0x0y3(){ note_ctor("_ZN3ccc7CC0x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y3E, buf);
    ::ccc::CC0x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y3E);
    dp->::ccc::CC0x0y3::~CC0x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y3E(Test__ZN3ccc7CC0x0y3E, "_ZN3ccc7CC0x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y3C1Ev();
extern void _ZN3ccc7CC0x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y3E[] = {
  NSPAIR(_ZN3ccc7CC0x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y3E[];
extern void _ZN3ccc7CC0x0y33abcEv();
extern void _ZN3ccc7CC0x0y33efgEv();
extern void _ZN3ccc7CC0x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y33abcEv,_ZTv0_n12_N3ccc7CC0x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33abcEv,_ZThn4_N3ccc7CC0x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y33efgEv,_ZTv0_n16_N3ccc7CC0x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33efgEv,_ZThn4_N3ccc7CC0x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y33pqrEv,_ZTv0_n20_N3ccc7CC0x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33pqrEv,_ZThn4_N3ccc7CC0x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y33abcEv,_ZTv0_n12_N3ccc7CC0x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y33efgEv,_ZTv0_n16_N3ccc7CC0x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y33pqrEv,_ZTv0_n20_N3ccc7CC0x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y3E[] = {
  {&(_ZTVN3ccc7CC0x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y3E[];
static VTBL_ENTRY alt_thunk_names7[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y33pqrEv,_ZTv0_n20_N3ccc7CC0x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y33pqrEv,_ZThn4_N3ccc7CC0x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y33efgEv,_ZTv0_n16_N3ccc7CC0x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y33efgEv,_ZThn4_N3ccc7CC0x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y33abcEv,_ZTv0_n12_N3ccc7CC0x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y33abcEv,_ZThn4_N3ccc7CC0x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y3E = {  "_ZN3ccc7CC0x0y3E", // class name
  bases__ZN3ccc7CC0x0y3E, 2,
  &(vtc__ZN3ccc7CC0x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y3E),2, //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  DD0x0y3  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD0x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x0y33abcEv
  ~DD0x0y3(); // tgen
  DD0x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y33efgEv");}
void  ccc::DD0x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y33pqrEv");}
void  ccc::DD0x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y33abcEv");}
ccc::DD0x0y3 ::~DD0x0y3(){ note_dtor("_ZN3ccc7DD0x0y3E", this);} // tgen
ccc::DD0x0y3 ::DD0x0y3(){ note_ctor("_ZN3ccc7DD0x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y3E, buf);
    ::ccc::DD0x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y3E);
    dp->::ccc::DD0x0y3::~DD0x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y3E(Test__ZN3ccc7DD0x0y3E, "_ZN3ccc7DD0x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y3C1Ev();
extern void _ZN3ccc7DD0x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y3E[] = {
  NSPAIR(_ZN3ccc7DD0x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y3E[];
extern void _ZN3ccc7DD0x0y33abcEv();
extern void _ZN3ccc7DD0x0y33efgEv();
extern void _ZN3ccc7DD0x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y33abcEv,_ZTv0_n12_N3ccc7DD0x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y33abcEv,_ZThn4_N3ccc7DD0x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y33efgEv,_ZTv0_n16_N3ccc7DD0x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y33efgEv,_ZThn4_N3ccc7DD0x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y33pqrEv,_ZTv0_n20_N3ccc7DD0x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y33pqrEv,_ZThn4_N3ccc7DD0x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y33abcEv,_ZTv0_n12_N3ccc7DD0x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y33efgEv,_ZTv0_n16_N3ccc7DD0x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y33pqrEv,_ZTv0_n20_N3ccc7DD0x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y3E[] = {
  {&(_ZTVN3ccc7DD0x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y3E[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y33pqrEv,_ZTv0_n20_N3ccc7DD0x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y33pqrEv,_ZThn4_N3ccc7DD0x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y33efgEv,_ZTv0_n16_N3ccc7DD0x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y33efgEv,_ZThn4_N3ccc7DD0x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y33abcEv,_ZTv0_n12_N3ccc7DD0x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y33abcEv,_ZThn4_N3ccc7DD0x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y3E = {  "_ZN3ccc7DD0x0y3E", // class name
  bases__ZN3ccc7DD0x0y3E, 2,
  &(vtc__ZN3ccc7DD0x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y3E),3, //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  CC0x0y4  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC0x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y43efgEv
  ~CC0x0y4(); // tgen
  CC0x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y4E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y43pqrEv");}
void  ccc::CC0x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y43abcEv");}
void  ccc::CC0x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y43efgEv");}
ccc::CC0x0y4 ::~CC0x0y4(){ note_dtor("_ZN3ccc7CC0x0y4E", this);} // tgen
ccc::CC0x0y4 ::CC0x0y4(){ note_ctor("_ZN3ccc7CC0x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y4E, buf);
    ::ccc::CC0x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y4E);
    dp->::ccc::CC0x0y4::~CC0x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y4E(Test__ZN3ccc7CC0x0y4E, "_ZN3ccc7CC0x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y4C1Ev();
extern void _ZN3ccc7CC0x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y4E[] = {
  NSPAIR(_ZN3ccc7CC0x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y4E[];
extern void _ZN3ccc7CC0x0y43abcEv();
extern void _ZN3ccc7CC0x0y43efgEv();
extern void _ZN3ccc7CC0x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y43abcEv,_ZTv0_n12_N3ccc7CC0x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43abcEv,_ZThn4_N3ccc7CC0x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y43efgEv,_ZTv0_n16_N3ccc7CC0x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43efgEv,_ZThn4_N3ccc7CC0x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y43pqrEv,_ZTv0_n20_N3ccc7CC0x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43pqrEv,_ZThn4_N3ccc7CC0x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y43abcEv,_ZTv0_n12_N3ccc7CC0x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y43efgEv,_ZTv0_n16_N3ccc7CC0x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y43pqrEv,_ZTv0_n20_N3ccc7CC0x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y4E[] = {
  {&(_ZTVN3ccc7CC0x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y4E[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y43pqrEv,_ZTv0_n20_N3ccc7CC0x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y43pqrEv,_ZThn4_N3ccc7CC0x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y43efgEv,_ZTv0_n16_N3ccc7CC0x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y43efgEv,_ZThn4_N3ccc7CC0x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y43abcEv,_ZTv0_n12_N3ccc7CC0x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y43abcEv,_ZThn4_N3ccc7CC0x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y4E = {  "_ZN3ccc7CC0x0y4E", // class name
  bases__ZN3ccc7CC0x0y4E, 2,
  &(vtc__ZN3ccc7CC0x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y4E),2, //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  DD0x0y4  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD0x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x0y43efgEv
  ~DD0x0y4(); // tgen
  DD0x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y43pqrEv");}
void  ccc::DD0x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y43abcEv");}
void  ccc::DD0x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y43efgEv");}
ccc::DD0x0y4 ::~DD0x0y4(){ note_dtor("_ZN3ccc7DD0x0y4E", this);} // tgen
ccc::DD0x0y4 ::DD0x0y4(){ note_ctor("_ZN3ccc7DD0x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y4E, buf);
    ::ccc::DD0x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y4E);
    dp->::ccc::DD0x0y4::~DD0x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y4E(Test__ZN3ccc7DD0x0y4E, "_ZN3ccc7DD0x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y4C1Ev();
extern void _ZN3ccc7DD0x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y4E[] = {
  NSPAIR(_ZN3ccc7DD0x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y4E[];
extern void _ZN3ccc7DD0x0y43abcEv();
extern void _ZN3ccc7DD0x0y43efgEv();
extern void _ZN3ccc7DD0x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y43abcEv,_ZTv0_n12_N3ccc7DD0x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y43abcEv,_ZThn4_N3ccc7DD0x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y43efgEv,_ZTv0_n16_N3ccc7DD0x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y43efgEv,_ZThn4_N3ccc7DD0x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y43pqrEv,_ZTv0_n20_N3ccc7DD0x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y43pqrEv,_ZThn4_N3ccc7DD0x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y43abcEv,_ZTv0_n12_N3ccc7DD0x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y43efgEv,_ZTv0_n16_N3ccc7DD0x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y43pqrEv,_ZTv0_n20_N3ccc7DD0x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y4E[] = {
  {&(_ZTVN3ccc7DD0x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y4E[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y43pqrEv,_ZTv0_n20_N3ccc7DD0x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y43pqrEv,_ZThn4_N3ccc7DD0x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y43efgEv,_ZTv0_n16_N3ccc7DD0x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y43efgEv,_ZThn4_N3ccc7DD0x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y43abcEv,_ZTv0_n12_N3ccc7DD0x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y43abcEv,_ZThn4_N3ccc7DD0x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y4E = {  "_ZN3ccc7DD0x0y4E", // class name
  bases__ZN3ccc7DD0x0y4E, 2,
  &(vtc__ZN3ccc7DD0x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y4E),3, //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  CC0x0y5  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC0x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y53abcEv
  ~CC0x0y5(); // tgen
  CC0x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y5E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y53pqrEv");}
void  ccc::CC0x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y53efgEv");}
void  ccc::CC0x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y53abcEv");}
ccc::CC0x0y5 ::~CC0x0y5(){ note_dtor("_ZN3ccc7CC0x0y5E", this);} // tgen
ccc::CC0x0y5 ::CC0x0y5(){ note_ctor("_ZN3ccc7CC0x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y5E, buf);
    ::ccc::CC0x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y5E);
    dp->::ccc::CC0x0y5::~CC0x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y5E(Test__ZN3ccc7CC0x0y5E, "_ZN3ccc7CC0x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y5C1Ev();
extern void _ZN3ccc7CC0x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y5E[] = {
  NSPAIR(_ZN3ccc7CC0x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y5E[];
extern void _ZN3ccc7CC0x0y53abcEv();
extern void _ZN3ccc7CC0x0y53efgEv();
extern void _ZN3ccc7CC0x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y53abcEv,_ZTv0_n12_N3ccc7CC0x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53abcEv,_ZThn4_N3ccc7CC0x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y53efgEv,_ZTv0_n16_N3ccc7CC0x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53efgEv,_ZThn4_N3ccc7CC0x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y53pqrEv,_ZTv0_n20_N3ccc7CC0x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53pqrEv,_ZThn4_N3ccc7CC0x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y53abcEv,_ZTv0_n12_N3ccc7CC0x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y53efgEv,_ZTv0_n16_N3ccc7CC0x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y53pqrEv,_ZTv0_n20_N3ccc7CC0x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y5E[] = {
  {&(_ZTVN3ccc7CC0x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y5E[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y53pqrEv,_ZTv0_n20_N3ccc7CC0x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y53pqrEv,_ZThn4_N3ccc7CC0x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y53efgEv,_ZTv0_n16_N3ccc7CC0x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y53efgEv,_ZThn4_N3ccc7CC0x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y53abcEv,_ZTv0_n12_N3ccc7CC0x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y53abcEv,_ZThn4_N3ccc7CC0x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y5E = {  "_ZN3ccc7CC0x0y5E", // class name
  bases__ZN3ccc7CC0x0y5E, 2,
  &(vtc__ZN3ccc7CC0x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y5E),2, //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  DD0x0y5  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD0x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x0y53abcEv
  ~DD0x0y5(); // tgen
  DD0x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y53pqrEv");}
void  ccc::DD0x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y53efgEv");}
void  ccc::DD0x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y53abcEv");}
ccc::DD0x0y5 ::~DD0x0y5(){ note_dtor("_ZN3ccc7DD0x0y5E", this);} // tgen
ccc::DD0x0y5 ::DD0x0y5(){ note_ctor("_ZN3ccc7DD0x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y5E, buf);
    ::ccc::DD0x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y5E);
    dp->::ccc::DD0x0y5::~DD0x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y5E(Test__ZN3ccc7DD0x0y5E, "_ZN3ccc7DD0x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y5C1Ev();
extern void _ZN3ccc7DD0x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y5E[] = {
  NSPAIR(_ZN3ccc7DD0x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y5E[];
extern void _ZN3ccc7DD0x0y53abcEv();
extern void _ZN3ccc7DD0x0y53efgEv();
extern void _ZN3ccc7DD0x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y53abcEv,_ZTv0_n12_N3ccc7DD0x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y53abcEv,_ZThn4_N3ccc7DD0x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y53efgEv,_ZTv0_n16_N3ccc7DD0x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y53efgEv,_ZThn4_N3ccc7DD0x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y53pqrEv,_ZTv0_n20_N3ccc7DD0x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y53pqrEv,_ZThn4_N3ccc7DD0x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y53abcEv,_ZTv0_n12_N3ccc7DD0x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y53efgEv,_ZTv0_n16_N3ccc7DD0x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y53pqrEv,_ZTv0_n20_N3ccc7DD0x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y5E[] = {
  {&(_ZTVN3ccc7DD0x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y5E[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y53pqrEv,_ZTv0_n20_N3ccc7DD0x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y53pqrEv,_ZThn4_N3ccc7DD0x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y53efgEv,_ZTv0_n16_N3ccc7DD0x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y53efgEv,_ZThn4_N3ccc7DD0x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y53abcEv,_ZTv0_n12_N3ccc7DD0x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y53abcEv,_ZThn4_N3ccc7DD0x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y5E = {  "_ZN3ccc7DD0x0y5E", // class name
  bases__ZN3ccc7DD0x0y5E, 2,
  &(vtc__ZN3ccc7DD0x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y5E),3, //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  CC0x0y6  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y63efgEv
  ~CC0x0y6(); // tgen
  CC0x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y6E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y63abcEv");}
void  ccc::CC0x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y63efgEv");}
ccc::CC0x0y6 ::~CC0x0y6(){ note_dtor("_ZN3ccc7CC0x0y6E", this);} // tgen
ccc::CC0x0y6 ::CC0x0y6(){ note_ctor("_ZN3ccc7CC0x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y6E, buf);
    ::ccc::CC0x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y6E);
    dp->::ccc::CC0x0y6::~CC0x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y6E(Test__ZN3ccc7CC0x0y6E, "_ZN3ccc7CC0x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y6C1Ev();
extern void _ZN3ccc7CC0x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y6E[] = {
  NSPAIR(_ZN3ccc7CC0x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y6E[];
extern void _ZN3ccc7CC0x0y63abcEv();
extern void _ZN3ccc7CC0x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y63abcEv,_ZTv0_n12_N3ccc7CC0x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y63abcEv,_ZThn4_N3ccc7CC0x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y63efgEv,_ZTv0_n16_N3ccc7CC0x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y63efgEv,_ZThn4_N3ccc7CC0x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y63abcEv,_ZTv0_n12_N3ccc7CC0x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y63efgEv,_ZTv0_n16_N3ccc7CC0x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y6E[] = {
  {&(_ZTVN3ccc7CC0x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y6E[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y63efgEv,_ZTv0_n16_N3ccc7CC0x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y63efgEv,_ZThn4_N3ccc7CC0x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y63abcEv,_ZTv0_n12_N3ccc7CC0x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y63abcEv,_ZThn4_N3ccc7CC0x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y6E = {  "_ZN3ccc7CC0x0y6E", // class name
  bases__ZN3ccc7CC0x0y6E, 2,
  &(vtc__ZN3ccc7CC0x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names13,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x0y6  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD0x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x0y63efgEv
  ~DD0x0y6(); // tgen
  DD0x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y63abcEv");}
void  ccc::DD0x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y63efgEv");}
ccc::DD0x0y6 ::~DD0x0y6(){ note_dtor("_ZN3ccc7DD0x0y6E", this);} // tgen
ccc::DD0x0y6 ::DD0x0y6(){ note_ctor("_ZN3ccc7DD0x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y6E, buf);
    ::ccc::DD0x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y6E);
    dp->::ccc::DD0x0y6::~DD0x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y6E(Test__ZN3ccc7DD0x0y6E, "_ZN3ccc7DD0x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y6C1Ev();
extern void _ZN3ccc7DD0x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y6E[] = {
  NSPAIR(_ZN3ccc7DD0x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y6E[];
extern void _ZN3ccc7DD0x0y63abcEv();
extern void _ZN3ccc7DD0x0y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y63abcEv,_ZTv0_n12_N3ccc7DD0x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y63abcEv,_ZThn4_N3ccc7DD0x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y63efgEv,_ZTv0_n16_N3ccc7DD0x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y63efgEv,_ZThn4_N3ccc7DD0x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y63abcEv,_ZTv0_n12_N3ccc7DD0x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y63efgEv,_ZTv0_n16_N3ccc7DD0x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y6E[] = {
  {&(_ZTVN3ccc7DD0x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y6E[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y63efgEv,_ZTv0_n16_N3ccc7DD0x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y63efgEv,_ZThn4_N3ccc7DD0x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y63abcEv,_ZTv0_n12_N3ccc7DD0x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y63abcEv,_ZThn4_N3ccc7DD0x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y6E = {  "_ZN3ccc7DD0x0y6E", // class name
  bases__ZN3ccc7DD0x0y6E, 2,
  &(vtc__ZN3ccc7DD0x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y6E),3, //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  CC0x0y7  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y73pqrEv
  ~CC0x0y7(); // tgen
  CC0x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y7E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y73abcEv");}
void  ccc::CC0x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y73pqrEv");}
ccc::CC0x0y7 ::~CC0x0y7(){ note_dtor("_ZN3ccc7CC0x0y7E", this);} // tgen
ccc::CC0x0y7 ::CC0x0y7(){ note_ctor("_ZN3ccc7CC0x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y7E, buf);
    ::ccc::CC0x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y7E);
    dp->::ccc::CC0x0y7::~CC0x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y7E(Test__ZN3ccc7CC0x0y7E, "_ZN3ccc7CC0x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y7C1Ev();
extern void _ZN3ccc7CC0x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y7E[] = {
  NSPAIR(_ZN3ccc7CC0x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y7E[];
extern void _ZN3ccc7CC0x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC0x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y73abcEv,_ZTv0_n12_N3ccc7CC0x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y73abcEv,_ZThn4_N3ccc7CC0x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y73pqrEv,_ZTv0_n20_N3ccc7CC0x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y73pqrEv,_ZThn4_N3ccc7CC0x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y73abcEv,_ZTv0_n12_N3ccc7CC0x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y73pqrEv,_ZTv0_n20_N3ccc7CC0x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y7E[] = {
  {&(_ZTVN3ccc7CC0x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y7E[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y73pqrEv,_ZTv0_n20_N3ccc7CC0x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y73pqrEv,_ZThn4_N3ccc7CC0x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y73abcEv,_ZTv0_n12_N3ccc7CC0x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y73abcEv,_ZThn4_N3ccc7CC0x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y7E = {  "_ZN3ccc7CC0x0y7E", // class name
  bases__ZN3ccc7CC0x0y7E, 2,
  &(vtc__ZN3ccc7CC0x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y7E),2, //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  DD0x0y7  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD0x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y73pqrEv
  ~DD0x0y7(); // tgen
  DD0x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y73abcEv");}
void  ccc::DD0x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y73pqrEv");}
ccc::DD0x0y7 ::~DD0x0y7(){ note_dtor("_ZN3ccc7DD0x0y7E", this);} // tgen
ccc::DD0x0y7 ::DD0x0y7(){ note_ctor("_ZN3ccc7DD0x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y7E, buf);
    ::ccc::DD0x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y7E);
    dp->::ccc::DD0x0y7::~DD0x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y7E(Test__ZN3ccc7DD0x0y7E, "_ZN3ccc7DD0x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y7C1Ev();
extern void _ZN3ccc7DD0x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y7E[] = {
  NSPAIR(_ZN3ccc7DD0x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y7E[];
extern void _ZN3ccc7DD0x0y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y73abcEv,_ZTv0_n12_N3ccc7DD0x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y73abcEv,_ZThn4_N3ccc7DD0x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y73pqrEv,_ZTv0_n20_N3ccc7DD0x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y73pqrEv,_ZThn4_N3ccc7DD0x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y73abcEv,_ZTv0_n12_N3ccc7DD0x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y73pqrEv,_ZTv0_n20_N3ccc7DD0x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y7E[] = {
  {&(_ZTVN3ccc7DD0x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y7E[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y73pqrEv,_ZTv0_n20_N3ccc7DD0x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y73pqrEv,_ZThn4_N3ccc7DD0x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y73abcEv,_ZTv0_n12_N3ccc7DD0x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y73abcEv,_ZThn4_N3ccc7DD0x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y7E = {  "_ZN3ccc7DD0x0y7E", // class name
  bases__ZN3ccc7DD0x0y7E, 2,
  &(vtc__ZN3ccc7DD0x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y7E),3, //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  CC0x0y8  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y83abcEv
  ~CC0x0y8(); // tgen
  CC0x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y8E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y83efgEv");}
void  ccc::CC0x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y83abcEv");}
ccc::CC0x0y8 ::~CC0x0y8(){ note_dtor("_ZN3ccc7CC0x0y8E", this);} // tgen
ccc::CC0x0y8 ::CC0x0y8(){ note_ctor("_ZN3ccc7CC0x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y8E, buf);
    ::ccc::CC0x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y8E);
    dp->::ccc::CC0x0y8::~CC0x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y8E(Test__ZN3ccc7CC0x0y8E, "_ZN3ccc7CC0x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y8C1Ev();
extern void _ZN3ccc7CC0x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y8E[] = {
  NSPAIR(_ZN3ccc7CC0x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y8E[];
extern void _ZN3ccc7CC0x0y83abcEv();
extern void _ZN3ccc7CC0x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x0y83abcEv,_ZTv0_n12_N3ccc7CC0x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y83abcEv,_ZThn4_N3ccc7CC0x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y83efgEv,_ZTv0_n16_N3ccc7CC0x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y83efgEv,_ZThn4_N3ccc7CC0x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x0y83abcEv,_ZTv0_n12_N3ccc7CC0x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y83efgEv,_ZTv0_n16_N3ccc7CC0x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y8E[] = {
  {&(_ZTVN3ccc7CC0x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y8E[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y83efgEv,_ZTv0_n16_N3ccc7CC0x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y83efgEv,_ZThn4_N3ccc7CC0x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x0y83abcEv,_ZTv0_n12_N3ccc7CC0x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y83abcEv,_ZThn4_N3ccc7CC0x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y8E = {  "_ZN3ccc7CC0x0y8E", // class name
  bases__ZN3ccc7CC0x0y8E, 2,
  &(vtc__ZN3ccc7CC0x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y8E),2, //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  DD0x0y8  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD0x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x0y83abcEv
  ~DD0x0y8(); // tgen
  DD0x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y83efgEv");}
void  ccc::DD0x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x0y83abcEv");}
ccc::DD0x0y8 ::~DD0x0y8(){ note_dtor("_ZN3ccc7DD0x0y8E", this);} // tgen
ccc::DD0x0y8 ::DD0x0y8(){ note_ctor("_ZN3ccc7DD0x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y8E, buf);
    ::ccc::DD0x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y8E);
    dp->::ccc::DD0x0y8::~DD0x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y8E(Test__ZN3ccc7DD0x0y8E, "_ZN3ccc7DD0x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y8C1Ev();
extern void _ZN3ccc7DD0x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y8E[] = {
  NSPAIR(_ZN3ccc7DD0x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y8E[];
extern void _ZN3ccc7DD0x0y83abcEv();
extern void _ZN3ccc7DD0x0y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x0y83abcEv,_ZTv0_n12_N3ccc7DD0x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y83abcEv,_ZThn4_N3ccc7DD0x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y83efgEv,_ZTv0_n16_N3ccc7DD0x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y83efgEv,_ZThn4_N3ccc7DD0x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x0y83abcEv,_ZTv0_n12_N3ccc7DD0x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y83efgEv,_ZTv0_n16_N3ccc7DD0x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y8E[] = {
  {&(_ZTVN3ccc7DD0x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y8E[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y83efgEv,_ZTv0_n16_N3ccc7DD0x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y83efgEv,_ZThn4_N3ccc7DD0x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x0y83abcEv,_ZTv0_n12_N3ccc7DD0x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y83abcEv,_ZThn4_N3ccc7DD0x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y8E = {  "_ZN3ccc7DD0x0y8E", // class name
  bases__ZN3ccc7DD0x0y8E, 2,
  &(vtc__ZN3ccc7DD0x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y8E),3, //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  CC0x0y9  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y93pqrEv
  ~CC0x0y9(); // tgen
  CC0x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y9E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y93efgEv");}
void  ccc::CC0x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y93pqrEv");}
ccc::CC0x0y9 ::~CC0x0y9(){ note_dtor("_ZN3ccc7CC0x0y9E", this);} // tgen
ccc::CC0x0y9 ::CC0x0y9(){ note_ctor("_ZN3ccc7CC0x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y9E, buf);
    ::ccc::CC0x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC0x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y9E);
    dp->::ccc::CC0x0y9::~CC0x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y9E(Test__ZN3ccc7CC0x0y9E, "_ZN3ccc7CC0x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y9C1Ev();
extern void _ZN3ccc7CC0x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y9E[] = {
  NSPAIR(_ZN3ccc7CC0x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC0x0y93efgEv();
extern void _ZN3ccc7CC0x0y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x0y93efgEv,_ZTv0_n16_N3ccc7CC0x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y93efgEv,_ZThn4_N3ccc7CC0x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x0y93pqrEv,_ZTv0_n20_N3ccc7CC0x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y93pqrEv,_ZThn4_N3ccc7CC0x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x0y93efgEv,_ZTv0_n16_N3ccc7CC0x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x0y93pqrEv,_ZTv0_n20_N3ccc7CC0x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x0y9E[] = {
  {&(_ZTVN3ccc7CC0x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x0y9E[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x0y93pqrEv,_ZTv0_n20_N3ccc7CC0x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y93pqrEv,_ZThn4_N3ccc7CC0x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x0y93efgEv,_ZTv0_n16_N3ccc7CC0x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x0y93efgEv,_ZThn4_N3ccc7CC0x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x0y9E = {  "_ZN3ccc7CC0x0y9E", // class name
  bases__ZN3ccc7CC0x0y9E, 2,
  &(vtc__ZN3ccc7CC0x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x0y9E),2, //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  DD0x0y9  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD0x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x0y93pqrEv
  ~DD0x0y9(); // tgen
  DD0x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x0y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x0y93efgEv");}
void  ccc::DD0x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x0y93pqrEv");}
ccc::DD0x0y9 ::~DD0x0y9(){ note_dtor("_ZN3ccc7DD0x0y9E", this);} // tgen
ccc::DD0x0y9 ::DD0x0y9(){ note_ctor("_ZN3ccc7DD0x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x0y9E, buf);
    ::ccc::DD0x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x0y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD0x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x0y9E);
    dp->::ccc::DD0x0y9::~DD0x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x0y9E(Test__ZN3ccc7DD0x0y9E, "_ZN3ccc7DD0x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x0y9C1Ev();
extern void _ZN3ccc7DD0x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x0y9E[] = {
  NSPAIR(_ZN3ccc7DD0x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD0x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x0y93efgEv();
extern void _ZN3ccc7DD0x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x0y93efgEv,_ZTv0_n16_N3ccc7DD0x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y93efgEv,_ZThn4_N3ccc7DD0x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x0y93pqrEv,_ZTv0_n20_N3ccc7DD0x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x0y93pqrEv,_ZThn4_N3ccc7DD0x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x0y93efgEv,_ZTv0_n16_N3ccc7DD0x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x0y93pqrEv,_ZTv0_n20_N3ccc7DD0x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x0y9E[] = {
  {&(_ZTVN3ccc7DD0x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x0y9E[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x0y93pqrEv,_ZTv0_n20_N3ccc7DD0x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y93pqrEv,_ZThn4_N3ccc7DD0x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x0y93efgEv,_ZTv0_n16_N3ccc7DD0x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x0y93efgEv,_ZThn4_N3ccc7DD0x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x0y9E = {  "_ZN3ccc7DD0x0y9E", // class name
  bases__ZN3ccc7DD0x0y9E, 2,
  &(vtc__ZN3ccc7DD0x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x0y9E),3, //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  CC0x0y10  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x0y103abcEv
  ~CC0x0y10(); // tgen
  CC0x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y10E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y103pqrEv");}
void  ccc::CC0x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x0y103abcEv");}
ccc::CC0x0y10 ::~CC0x0y10(){ note_dtor("_ZN3ccc8CC0x0y10E", this);} // tgen
ccc::CC0x0y10 ::CC0x0y10(){ note_ctor("_ZN3ccc8CC0x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y10E, buf);
    ::ccc::CC0x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y10E);
    dp->::ccc::CC0x0y10::~CC0x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y10E(Test__ZN3ccc8CC0x0y10E, "_ZN3ccc8CC0x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y10C1Ev();
extern void _ZN3ccc8CC0x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y10E[] = {
  NSPAIR(_ZN3ccc8CC0x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y10E[];
extern void _ZN3ccc8CC0x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC0x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x0y103abcEv,_ZTv0_n12_N3ccc8CC0x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y103abcEv,_ZThn4_N3ccc8CC0x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x0y103pqrEv,_ZTv0_n20_N3ccc8CC0x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y103pqrEv,_ZThn4_N3ccc8CC0x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x0y103abcEv,_ZTv0_n12_N3ccc8CC0x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x0y103pqrEv,_ZTv0_n20_N3ccc8CC0x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y10E[] = {
  {&(_ZTVN3ccc8CC0x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y10E[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x0y103pqrEv,_ZTv0_n20_N3ccc8CC0x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y103pqrEv,_ZThn4_N3ccc8CC0x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x0y103abcEv,_ZTv0_n12_N3ccc8CC0x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y103abcEv,_ZThn4_N3ccc8CC0x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x0y10E = {  "_ZN3ccc8CC0x0y10E", // class name
  bases__ZN3ccc8CC0x0y10E, 2,
  &(vtc__ZN3ccc8CC0x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y10E),2, //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  DD0x0y10  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD0x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x0y103abcEv
  ~DD0x0y10(); // tgen
  DD0x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x0y103pqrEv");}
void  ccc::DD0x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x0y103abcEv");}
ccc::DD0x0y10 ::~DD0x0y10(){ note_dtor("_ZN3ccc8DD0x0y10E", this);} // tgen
ccc::DD0x0y10 ::DD0x0y10(){ note_ctor("_ZN3ccc8DD0x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y10E, buf);
    ::ccc::DD0x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y10E);
    dp->::ccc::DD0x0y10::~DD0x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y10E(Test__ZN3ccc8DD0x0y10E, "_ZN3ccc8DD0x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y10C1Ev();
extern void _ZN3ccc8DD0x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y10E[] = {
  NSPAIR(_ZN3ccc8DD0x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y10E[];
extern void _ZN3ccc8DD0x0y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x0y103abcEv,_ZTv0_n12_N3ccc8DD0x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y103abcEv,_ZThn4_N3ccc8DD0x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x0y103pqrEv,_ZTv0_n20_N3ccc8DD0x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y103pqrEv,_ZThn4_N3ccc8DD0x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x0y103abcEv,_ZTv0_n12_N3ccc8DD0x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x0y103pqrEv,_ZTv0_n20_N3ccc8DD0x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y10E[] = {
  {&(_ZTVN3ccc8DD0x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y10E[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x0y103pqrEv,_ZTv0_n20_N3ccc8DD0x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y103pqrEv,_ZThn4_N3ccc8DD0x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x0y103abcEv,_ZTv0_n12_N3ccc8DD0x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y103abcEv,_ZThn4_N3ccc8DD0x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x0y10E = {  "_ZN3ccc8DD0x0y10E", // class name
  bases__ZN3ccc8DD0x0y10E, 2,
  &(vtc__ZN3ccc8DD0x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y10E),3, //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  CC0x0y11  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x0y113efgEv
  ~CC0x0y11(); // tgen
  CC0x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y11E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y113pqrEv");}
void  ccc::CC0x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x0y113efgEv");}
ccc::CC0x0y11 ::~CC0x0y11(){ note_dtor("_ZN3ccc8CC0x0y11E", this);} // tgen
ccc::CC0x0y11 ::CC0x0y11(){ note_ctor("_ZN3ccc8CC0x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y11E, buf);
    ::ccc::CC0x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y11E);
    dp->::ccc::CC0x0y11::~CC0x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y11E(Test__ZN3ccc8CC0x0y11E, "_ZN3ccc8CC0x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y11C1Ev();
extern void _ZN3ccc8CC0x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y11E[] = {
  NSPAIR(_ZN3ccc8CC0x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC0x0y113efgEv();
extern void _ZN3ccc8CC0x0y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x0y113efgEv,_ZTv0_n16_N3ccc8CC0x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y113efgEv,_ZThn4_N3ccc8CC0x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x0y113pqrEv,_ZTv0_n20_N3ccc8CC0x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y113pqrEv,_ZThn4_N3ccc8CC0x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x0y113efgEv,_ZTv0_n16_N3ccc8CC0x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x0y113pqrEv,_ZTv0_n20_N3ccc8CC0x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y11E[] = {
  {&(_ZTVN3ccc8CC0x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y11E[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x0y113pqrEv,_ZTv0_n20_N3ccc8CC0x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y113pqrEv,_ZThn4_N3ccc8CC0x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x0y113efgEv,_ZTv0_n16_N3ccc8CC0x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y113efgEv,_ZThn4_N3ccc8CC0x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x0y11E = {  "_ZN3ccc8CC0x0y11E", // class name
  bases__ZN3ccc8CC0x0y11E, 2,
  &(vtc__ZN3ccc8CC0x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y11E),2, //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  DD0x0y11  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD0x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x0y113efgEv
  ~DD0x0y11(); // tgen
  DD0x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x0y113pqrEv");}
void  ccc::DD0x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x0y113efgEv");}
ccc::DD0x0y11 ::~DD0x0y11(){ note_dtor("_ZN3ccc8DD0x0y11E", this);} // tgen
ccc::DD0x0y11 ::DD0x0y11(){ note_ctor("_ZN3ccc8DD0x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y11E, buf);
    ::ccc::DD0x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y11E);
    dp->::ccc::DD0x0y11::~DD0x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y11E(Test__ZN3ccc8DD0x0y11E, "_ZN3ccc8DD0x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y11C1Ev();
extern void _ZN3ccc8DD0x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y11E[] = {
  NSPAIR(_ZN3ccc8DD0x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x0y113efgEv();
extern void _ZN3ccc8DD0x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x0y113efgEv,_ZTv0_n16_N3ccc8DD0x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y113efgEv,_ZThn4_N3ccc8DD0x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x0y113pqrEv,_ZTv0_n20_N3ccc8DD0x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y113pqrEv,_ZThn4_N3ccc8DD0x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x0y113efgEv,_ZTv0_n16_N3ccc8DD0x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x0y113pqrEv,_ZTv0_n20_N3ccc8DD0x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y11E[] = {
  {&(_ZTVN3ccc8DD0x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y11E[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x0y113pqrEv,_ZTv0_n20_N3ccc8DD0x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y113pqrEv,_ZThn4_N3ccc8DD0x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x0y113efgEv,_ZTv0_n16_N3ccc8DD0x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y113efgEv,_ZThn4_N3ccc8DD0x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x0y11E = {  "_ZN3ccc8DD0x0y11E", // class name
  bases__ZN3ccc8DD0x0y11E, 2,
  &(vtc__ZN3ccc8DD0x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y11E),3, //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  CC0x0y12  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC0x0y123abcEv
  ~CC0x0y12(); // tgen
  CC0x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x0y123abcEv");}
ccc::CC0x0y12 ::~CC0x0y12(){ note_dtor("_ZN3ccc8CC0x0y12E", this);} // tgen
ccc::CC0x0y12 ::CC0x0y12(){ note_ctor("_ZN3ccc8CC0x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y12E, buf);
    ::ccc::CC0x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y12E);
    dp->::ccc::CC0x0y12::~CC0x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y12E(Test__ZN3ccc8CC0x0y12E, "_ZN3ccc8CC0x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y12C1Ev();
extern void _ZN3ccc8CC0x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y12E[] = {
  NSPAIR(_ZN3ccc8CC0x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y12E[];
extern void _ZN3ccc8CC0x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x0y123abcEv,_ZTv0_n12_N3ccc8CC0x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y123abcEv,_ZThn4_N3ccc8CC0x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x0y123abcEv,_ZTv0_n12_N3ccc8CC0x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y12E[] = {
  {&(_ZTVN3ccc8CC0x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y12E[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x0y123abcEv,_ZTv0_n12_N3ccc8CC0x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y123abcEv,_ZThn4_N3ccc8CC0x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x0y12E = {  "_ZN3ccc8CC0x0y12E", // class name
  bases__ZN3ccc8CC0x0y12E, 2,
  &(vtc__ZN3ccc8CC0x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names25,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x0y12  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD0x0y123abcEv
  ~DD0x0y12(); // tgen
  DD0x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x0y123abcEv");}
ccc::DD0x0y12 ::~DD0x0y12(){ note_dtor("_ZN3ccc8DD0x0y12E", this);} // tgen
ccc::DD0x0y12 ::DD0x0y12(){ note_ctor("_ZN3ccc8DD0x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y12E, buf);
    ::ccc::DD0x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y12E);
    dp->::ccc::DD0x0y12::~DD0x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y12E(Test__ZN3ccc8DD0x0y12E, "_ZN3ccc8DD0x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y12C1Ev();
extern void _ZN3ccc8DD0x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y12E[] = {
  NSPAIR(_ZN3ccc8DD0x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y12E[];
extern void _ZN3ccc8DD0x0y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x0y123abcEv,_ZTv0_n12_N3ccc8DD0x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y123abcEv,_ZThn4_N3ccc8DD0x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x0y123abcEv,_ZTv0_n12_N3ccc8DD0x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y12E[] = {
  {&(_ZTVN3ccc8DD0x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y12E[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x0y123abcEv,_ZTv0_n12_N3ccc8DD0x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y123abcEv,_ZThn4_N3ccc8DD0x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x0y12E = {  "_ZN3ccc8DD0x0y12E", // class name
  bases__ZN3ccc8DD0x0y12E, 2,
  &(vtc__ZN3ccc8DD0x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y12E),3, //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  CC0x0y13  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC0x0y133efgEv
  ~CC0x0y13(); // tgen
  CC0x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x0y133efgEv");}
ccc::CC0x0y13 ::~CC0x0y13(){ note_dtor("_ZN3ccc8CC0x0y13E", this);} // tgen
ccc::CC0x0y13 ::CC0x0y13(){ note_ctor("_ZN3ccc8CC0x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y13E, buf);
    ::ccc::CC0x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y13E);
    dp->::ccc::CC0x0y13::~CC0x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y13E(Test__ZN3ccc8CC0x0y13E, "_ZN3ccc8CC0x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y13C1Ev();
extern void _ZN3ccc8CC0x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y13E[] = {
  NSPAIR(_ZN3ccc8CC0x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC0x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x0y133efgEv,_ZTv0_n16_N3ccc8CC0x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y133efgEv,_ZThn4_N3ccc8CC0x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x0y133efgEv,_ZTv0_n16_N3ccc8CC0x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y13E[] = {
  {&(_ZTVN3ccc8CC0x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y13E[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x0y133efgEv,_ZTv0_n16_N3ccc8CC0x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y133efgEv,_ZThn4_N3ccc8CC0x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x0y13E = {  "_ZN3ccc8CC0x0y13E", // class name
  bases__ZN3ccc8CC0x0y13E, 2,
  &(vtc__ZN3ccc8CC0x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y13E),2, //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  DD0x0y13  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD0x0y133efgEv
  ~DD0x0y13(); // tgen
  DD0x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x0y133efgEv");}
ccc::DD0x0y13 ::~DD0x0y13(){ note_dtor("_ZN3ccc8DD0x0y13E", this);} // tgen
ccc::DD0x0y13 ::DD0x0y13(){ note_ctor("_ZN3ccc8DD0x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y13E, buf);
    ::ccc::DD0x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y13E);
    dp->::ccc::DD0x0y13::~DD0x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y13E(Test__ZN3ccc8DD0x0y13E, "_ZN3ccc8DD0x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y13C1Ev();
extern void _ZN3ccc8DD0x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y13E[] = {
  NSPAIR(_ZN3ccc8DD0x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x0y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x0y133efgEv,_ZTv0_n16_N3ccc8DD0x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y133efgEv,_ZThn4_N3ccc8DD0x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x0y133efgEv,_ZTv0_n16_N3ccc8DD0x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y13E[] = {
  {&(_ZTVN3ccc8DD0x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y13E[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x0y133efgEv,_ZTv0_n16_N3ccc8DD0x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y133efgEv,_ZThn4_N3ccc8DD0x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x0y13E = {  "_ZN3ccc8DD0x0y13E", // class name
  bases__ZN3ccc8DD0x0y13E, 2,
  &(vtc__ZN3ccc8DD0x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y13E),3, //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  CC0x0y14  : virtual ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y143pqrEv
  ~CC0x0y14(); // tgen
  CC0x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y143pqrEv");}
ccc::CC0x0y14 ::~CC0x0y14(){ note_dtor("_ZN3ccc8CC0x0y14E", this);} // tgen
ccc::CC0x0y14 ::CC0x0y14(){ note_ctor("_ZN3ccc8CC0x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y14E, buf);
    ::ccc::CC0x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y14E);
    dp->::ccc::CC0x0y14::~CC0x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y14E(Test__ZN3ccc8CC0x0y14E, "_ZN3ccc8CC0x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y14C1Ev();
extern void _ZN3ccc8CC0x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y14E[] = {
  NSPAIR(_ZN3ccc8CC0x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC0x0y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x0y143pqrEv,_ZTv0_n20_N3ccc8CC0x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y143pqrEv,_ZThn4_N3ccc8CC0x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x0y143pqrEv,_ZTv0_n20_N3ccc8CC0x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y14E[] = {
  {&(_ZTVN3ccc8CC0x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y14E[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x0y143pqrEv,_ZTv0_n20_N3ccc8CC0x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x0y143pqrEv,_ZThn4_N3ccc8CC0x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x0y14E = {  "_ZN3ccc8CC0x0y14E", // class name
  bases__ZN3ccc8CC0x0y14E, 2,
  &(vtc__ZN3ccc8CC0x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y14E),2, //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  DD0x0y14  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD0x0y143pqrEv
  ~DD0x0y14(); // tgen
  DD0x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x0y143pqrEv");}
ccc::DD0x0y14 ::~DD0x0y14(){ note_dtor("_ZN3ccc8DD0x0y14E", this);} // tgen
ccc::DD0x0y14 ::DD0x0y14(){ note_ctor("_ZN3ccc8DD0x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y14E, buf);
    ::ccc::DD0x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y14E);
    dp->::ccc::DD0x0y14::~DD0x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y14E(Test__ZN3ccc8DD0x0y14E, "_ZN3ccc8DD0x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y14C1Ev();
extern void _ZN3ccc8DD0x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y14E[] = {
  NSPAIR(_ZN3ccc8DD0x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x0y143pqrEv,_ZTv0_n20_N3ccc8DD0x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x0y143pqrEv,_ZThn4_N3ccc8DD0x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x0y143pqrEv,_ZTv0_n20_N3ccc8DD0x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y14E[] = {
  {&(_ZTVN3ccc8DD0x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y14E[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x0y143pqrEv,_ZTv0_n20_N3ccc8DD0x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x0y143pqrEv,_ZThn4_N3ccc8DD0x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x0y14E = {  "_ZN3ccc8DD0x0y14E", // class name
  bases__ZN3ccc8DD0x0y14E, 2,
  &(vtc__ZN3ccc8DD0x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y14E),3, //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  CC0x0y15  : virtual ::ccc::AA0 , ::ccc::BB0 {
  ~CC0x0y15(); // tgen
  CC0x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x0y15 ::~CC0x0y15(){ note_dtor("_ZN3ccc8CC0x0y15E", this);} // tgen
ccc::CC0x0y15 ::CC0x0y15(){ note_ctor("_ZN3ccc8CC0x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y15E, buf);
    ::ccc::CC0x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC0x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y15E);
    dp->::ccc::CC0x0y15::~CC0x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y15E(Test__ZN3ccc8CC0x0y15E, "_ZN3ccc8CC0x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y15C1Ev();
extern void _ZN3ccc8CC0x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y15E[] = {
  NSPAIR(_ZN3ccc8CC0x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x0y15E[] = {
  {&(_ZTVN3ccc8CC0x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x0y15E[];
Class_Descriptor cd__ZN3ccc8CC0x0y15E = {  "_ZN3ccc8CC0x0y15E", // class name
  bases__ZN3ccc8CC0x0y15E, 2,
  &(vtc__ZN3ccc8CC0x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x0y15  : virtual ::ccc::AA0 , virtual ::ccc::BB0 {
  ~DD0x0y15(); // tgen
  DD0x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x0y15 ::~DD0x0y15(){ note_dtor("_ZN3ccc8DD0x0y15E", this);} // tgen
ccc::DD0x0y15 ::DD0x0y15(){ note_ctor("_ZN3ccc8DD0x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x0y15E, buf);
    ::ccc::DD0x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x0y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD0x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x0y15E);
    dp->::ccc::DD0x0y15::~DD0x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x0y15E(Test__ZN3ccc8DD0x0y15E, "_ZN3ccc8DD0x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x0y15C1Ev();
extern void _ZN3ccc8DD0x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x0y15E[] = {
  NSPAIR(_ZN3ccc8DD0x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD0x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x0y15E[] = {
  {&(_ZTVN3ccc8DD0x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x0y15E[];
Class_Descriptor cd__ZN3ccc8DD0x0y15E = {  "_ZN3ccc8DD0x0y15E", // class name
  bases__ZN3ccc8DD0x0y15E, 2,
  &(vtc__ZN3ccc8DD0x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y0  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y03pqrEv
  ~CC0x1y0(); // tgen
  CC0x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y0E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y03abcEv");}
void  ccc::CC0x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y03efgEv");}
void  ccc::CC0x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y03pqrEv");}
ccc::CC0x1y0 ::~CC0x1y0(){ note_dtor("_ZN3ccc7CC0x1y0E", this);} // tgen
ccc::CC0x1y0 ::CC0x1y0(){ note_ctor("_ZN3ccc7CC0x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y0E, buf);
    ::ccc::CC0x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y0E);
    dp->::ccc::CC0x1y0::~CC0x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y0E(Test__ZN3ccc7CC0x1y0E, "_ZN3ccc7CC0x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y0C1Ev();
extern void _ZN3ccc7CC0x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y0E[] = {
  NSPAIR(_ZN3ccc7CC0x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y0E[];
extern void _ZN3ccc7CC0x1y03abcEv();
extern void _ZN3ccc7CC0x1y03pqrEv();
extern void _ZN3ccc7CC0x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y03abcEv,_ZTv0_n12_N3ccc7CC0x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03abcEv,_ZThn4_N3ccc7CC0x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y03efgEv,_ZTv0_n16_N3ccc7CC0x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03efgEv,_ZThn4_N3ccc7CC0x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y03pqrEv,_ZTv0_n20_N3ccc7CC0x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03pqrEv,_ZThn4_N3ccc7CC0x1y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y03abcEv,_ZTv0_n12_N3ccc7CC0x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y03efgEv,_ZTv0_n16_N3ccc7CC0x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y03pqrEv,_ZTv0_n20_N3ccc7CC0x1y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y0E[] = {
  {&(_ZTVN3ccc7CC0x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y0E[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y03pqrEv,_ZTv0_n20_N3ccc7CC0x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y03pqrEv,_ZThn4_N3ccc7CC0x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y03efgEv,_ZTv0_n16_N3ccc7CC0x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y03efgEv,_ZThn4_N3ccc7CC0x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y03abcEv,_ZTv0_n12_N3ccc7CC0x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y03abcEv,_ZThn4_N3ccc7CC0x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y0E = {  "_ZN3ccc7CC0x1y0E", // class name
  bases__ZN3ccc7CC0x1y0E, 2,
  &(vtc__ZN3ccc7CC0x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y0E),2, //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  DD0x1y0  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD0x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y03pqrEv
  ~DD0x1y0(); // tgen
  DD0x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y03abcEv");}
void  ccc::DD0x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y03efgEv");}
void  ccc::DD0x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y03pqrEv");}
ccc::DD0x1y0 ::~DD0x1y0(){ note_dtor("_ZN3ccc7DD0x1y0E", this);} // tgen
ccc::DD0x1y0 ::DD0x1y0(){ note_ctor("_ZN3ccc7DD0x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y0E, buf);
    ::ccc::DD0x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y0E);
    dp->::ccc::DD0x1y0::~DD0x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y0E(Test__ZN3ccc7DD0x1y0E, "_ZN3ccc7DD0x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y0C1Ev();
extern void _ZN3ccc7DD0x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y0E[] = {
  NSPAIR(_ZN3ccc7DD0x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y0E[];
extern void _ZN3ccc7DD0x1y03abcEv();
extern void _ZN3ccc7DD0x1y03efgEv();
extern void _ZN3ccc7DD0x1y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y03abcEv,_ZTv0_n12_N3ccc7DD0x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y03abcEv,_ZThn4_N3ccc7DD0x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y03pqrEv,_ZTv0_n16_N3ccc7DD0x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y03pqrEv,_ZThn4_N3ccc7DD0x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y03efgEv,_ZTv0_n20_N3ccc7DD0x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y03efgEv,_ZThn4_N3ccc7DD0x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y03abcEv,_ZTv0_n12_N3ccc7DD0x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y03pqrEv,_ZTv0_n16_N3ccc7DD0x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y03efgEv,_ZTv0_n20_N3ccc7DD0x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y0E[] = {
  {&(_ZTVN3ccc7DD0x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y0E[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y03efgEv,_ZTv0_n20_N3ccc7DD0x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y03efgEv,_ZThn4_N3ccc7DD0x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y03pqrEv,_ZTv0_n16_N3ccc7DD0x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y03pqrEv,_ZThn4_N3ccc7DD0x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y03abcEv,_ZTv0_n12_N3ccc7DD0x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y03abcEv,_ZThn4_N3ccc7DD0x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y0E = {  "_ZN3ccc7DD0x1y0E", // class name
  bases__ZN3ccc7DD0x1y0E, 2,
  &(vtc__ZN3ccc7DD0x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y0E),3, //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  CC0x1y1  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x1y13efgEv
  ~CC0x1y1(); // tgen
  CC0x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y1E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y13abcEv");}
void  ccc::CC0x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y13pqrEv");}
void  ccc::CC0x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y13efgEv");}
ccc::CC0x1y1 ::~CC0x1y1(){ note_dtor("_ZN3ccc7CC0x1y1E", this);} // tgen
ccc::CC0x1y1 ::CC0x1y1(){ note_ctor("_ZN3ccc7CC0x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y1E, buf);
    ::ccc::CC0x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y1E);
    dp->::ccc::CC0x1y1::~CC0x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y1E(Test__ZN3ccc7CC0x1y1E, "_ZN3ccc7CC0x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y1C1Ev();
extern void _ZN3ccc7CC0x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y1E[] = {
  NSPAIR(_ZN3ccc7CC0x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y1E[];
extern void _ZN3ccc7CC0x1y13abcEv();
extern void _ZN3ccc7CC0x1y13pqrEv();
extern void _ZN3ccc7CC0x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y13abcEv,_ZTv0_n12_N3ccc7CC0x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13abcEv,_ZThn4_N3ccc7CC0x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y13efgEv,_ZTv0_n16_N3ccc7CC0x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13efgEv,_ZThn4_N3ccc7CC0x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y13pqrEv,_ZTv0_n20_N3ccc7CC0x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13pqrEv,_ZThn4_N3ccc7CC0x1y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y13abcEv,_ZTv0_n12_N3ccc7CC0x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y13efgEv,_ZTv0_n16_N3ccc7CC0x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y13pqrEv,_ZTv0_n20_N3ccc7CC0x1y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y1E[] = {
  {&(_ZTVN3ccc7CC0x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y1E[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y13pqrEv,_ZTv0_n20_N3ccc7CC0x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y13pqrEv,_ZThn4_N3ccc7CC0x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y13efgEv,_ZTv0_n16_N3ccc7CC0x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y13efgEv,_ZThn4_N3ccc7CC0x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y13abcEv,_ZTv0_n12_N3ccc7CC0x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y13abcEv,_ZThn4_N3ccc7CC0x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y1E = {  "_ZN3ccc7CC0x1y1E", // class name
  bases__ZN3ccc7CC0x1y1E, 2,
  &(vtc__ZN3ccc7CC0x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y1E),2, //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  DD0x1y1  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD0x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x1y13efgEv
  ~DD0x1y1(); // tgen
  DD0x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y13abcEv");}
void  ccc::DD0x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y13pqrEv");}
void  ccc::DD0x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y13efgEv");}
ccc::DD0x1y1 ::~DD0x1y1(){ note_dtor("_ZN3ccc7DD0x1y1E", this);} // tgen
ccc::DD0x1y1 ::DD0x1y1(){ note_ctor("_ZN3ccc7DD0x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y1E, buf);
    ::ccc::DD0x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y1E);
    dp->::ccc::DD0x1y1::~DD0x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y1E(Test__ZN3ccc7DD0x1y1E, "_ZN3ccc7DD0x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y1C1Ev();
extern void _ZN3ccc7DD0x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y1E[] = {
  NSPAIR(_ZN3ccc7DD0x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y1E[];
extern void _ZN3ccc7DD0x1y13abcEv();
extern void _ZN3ccc7DD0x1y13efgEv();
extern void _ZN3ccc7DD0x1y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y13abcEv,_ZTv0_n12_N3ccc7DD0x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y13abcEv,_ZThn4_N3ccc7DD0x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y13pqrEv,_ZTv0_n16_N3ccc7DD0x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y13pqrEv,_ZThn4_N3ccc7DD0x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y13efgEv,_ZTv0_n20_N3ccc7DD0x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y13efgEv,_ZThn4_N3ccc7DD0x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y13abcEv,_ZTv0_n12_N3ccc7DD0x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y13pqrEv,_ZTv0_n16_N3ccc7DD0x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y13efgEv,_ZTv0_n20_N3ccc7DD0x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y1E[] = {
  {&(_ZTVN3ccc7DD0x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y1E[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y13efgEv,_ZTv0_n20_N3ccc7DD0x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y13efgEv,_ZThn4_N3ccc7DD0x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y13pqrEv,_ZTv0_n16_N3ccc7DD0x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y13pqrEv,_ZThn4_N3ccc7DD0x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y13abcEv,_ZTv0_n12_N3ccc7DD0x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y13abcEv,_ZThn4_N3ccc7DD0x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y1E = {  "_ZN3ccc7DD0x1y1E", // class name
  bases__ZN3ccc7DD0x1y1E, 2,
  &(vtc__ZN3ccc7DD0x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y1E),3, //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  CC0x1y2  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y23pqrEv
  ~CC0x1y2(); // tgen
  CC0x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y2E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y23efgEv");}
void  ccc::CC0x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y23abcEv");}
void  ccc::CC0x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y23pqrEv");}
ccc::CC0x1y2 ::~CC0x1y2(){ note_dtor("_ZN3ccc7CC0x1y2E", this);} // tgen
ccc::CC0x1y2 ::CC0x1y2(){ note_ctor("_ZN3ccc7CC0x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y2E, buf);
    ::ccc::CC0x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y2E);
    dp->::ccc::CC0x1y2::~CC0x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y2E(Test__ZN3ccc7CC0x1y2E, "_ZN3ccc7CC0x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y2C1Ev();
extern void _ZN3ccc7CC0x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y2E[] = {
  NSPAIR(_ZN3ccc7CC0x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y2E[];
extern void _ZN3ccc7CC0x1y23abcEv();
extern void _ZN3ccc7CC0x1y23pqrEv();
extern void _ZN3ccc7CC0x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y23abcEv,_ZTv0_n12_N3ccc7CC0x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23abcEv,_ZThn4_N3ccc7CC0x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y23efgEv,_ZTv0_n16_N3ccc7CC0x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23efgEv,_ZThn4_N3ccc7CC0x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y23pqrEv,_ZTv0_n20_N3ccc7CC0x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23pqrEv,_ZThn4_N3ccc7CC0x1y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y23abcEv,_ZTv0_n12_N3ccc7CC0x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y23efgEv,_ZTv0_n16_N3ccc7CC0x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y23pqrEv,_ZTv0_n20_N3ccc7CC0x1y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y2E[] = {
  {&(_ZTVN3ccc7CC0x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y2E[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y23pqrEv,_ZTv0_n20_N3ccc7CC0x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y23pqrEv,_ZThn4_N3ccc7CC0x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y23efgEv,_ZTv0_n16_N3ccc7CC0x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y23efgEv,_ZThn4_N3ccc7CC0x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y23abcEv,_ZTv0_n12_N3ccc7CC0x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y23abcEv,_ZThn4_N3ccc7CC0x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y2E = {  "_ZN3ccc7CC0x1y2E", // class name
  bases__ZN3ccc7CC0x1y2E, 2,
  &(vtc__ZN3ccc7CC0x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y2E),2, //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  DD0x1y2  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD0x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y23pqrEv
  ~DD0x1y2(); // tgen
  DD0x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y23efgEv");}
void  ccc::DD0x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y23abcEv");}
void  ccc::DD0x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y23pqrEv");}
ccc::DD0x1y2 ::~DD0x1y2(){ note_dtor("_ZN3ccc7DD0x1y2E", this);} // tgen
ccc::DD0x1y2 ::DD0x1y2(){ note_ctor("_ZN3ccc7DD0x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y2E, buf);
    ::ccc::DD0x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y2E);
    dp->::ccc::DD0x1y2::~DD0x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y2E(Test__ZN3ccc7DD0x1y2E, "_ZN3ccc7DD0x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y2C1Ev();
extern void _ZN3ccc7DD0x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y2E[] = {
  NSPAIR(_ZN3ccc7DD0x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y2E[];
extern void _ZN3ccc7DD0x1y23abcEv();
extern void _ZN3ccc7DD0x1y23efgEv();
extern void _ZN3ccc7DD0x1y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y23abcEv,_ZTv0_n12_N3ccc7DD0x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y23abcEv,_ZThn4_N3ccc7DD0x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y23pqrEv,_ZTv0_n16_N3ccc7DD0x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y23pqrEv,_ZThn4_N3ccc7DD0x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y23efgEv,_ZTv0_n20_N3ccc7DD0x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y23efgEv,_ZThn4_N3ccc7DD0x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y23abcEv,_ZTv0_n12_N3ccc7DD0x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y23pqrEv,_ZTv0_n16_N3ccc7DD0x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y23efgEv,_ZTv0_n20_N3ccc7DD0x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y2E[] = {
  {&(_ZTVN3ccc7DD0x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y2E[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y23efgEv,_ZTv0_n20_N3ccc7DD0x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y23efgEv,_ZThn4_N3ccc7DD0x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y23pqrEv,_ZTv0_n16_N3ccc7DD0x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y23pqrEv,_ZThn4_N3ccc7DD0x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y23abcEv,_ZTv0_n12_N3ccc7DD0x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y23abcEv,_ZThn4_N3ccc7DD0x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y2E = {  "_ZN3ccc7DD0x1y2E", // class name
  bases__ZN3ccc7DD0x1y2E, 2,
  &(vtc__ZN3ccc7DD0x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y2E),3, //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  CC0x1y3  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x1y33abcEv
  ~CC0x1y3(); // tgen
  CC0x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y3E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y33efgEv");}
void  ccc::CC0x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y33pqrEv");}
void  ccc::CC0x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y33abcEv");}
ccc::CC0x1y3 ::~CC0x1y3(){ note_dtor("_ZN3ccc7CC0x1y3E", this);} // tgen
ccc::CC0x1y3 ::CC0x1y3(){ note_ctor("_ZN3ccc7CC0x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y3E, buf);
    ::ccc::CC0x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y3E);
    dp->::ccc::CC0x1y3::~CC0x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y3E(Test__ZN3ccc7CC0x1y3E, "_ZN3ccc7CC0x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y3C1Ev();
extern void _ZN3ccc7CC0x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y3E[] = {
  NSPAIR(_ZN3ccc7CC0x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y3E[];
extern void _ZN3ccc7CC0x1y33abcEv();
extern void _ZN3ccc7CC0x1y33pqrEv();
extern void _ZN3ccc7CC0x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y33abcEv,_ZTv0_n12_N3ccc7CC0x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33abcEv,_ZThn4_N3ccc7CC0x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y33efgEv,_ZTv0_n16_N3ccc7CC0x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33efgEv,_ZThn4_N3ccc7CC0x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y33pqrEv,_ZTv0_n20_N3ccc7CC0x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33pqrEv,_ZThn4_N3ccc7CC0x1y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y33abcEv,_ZTv0_n12_N3ccc7CC0x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y33efgEv,_ZTv0_n16_N3ccc7CC0x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y33pqrEv,_ZTv0_n20_N3ccc7CC0x1y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y3E[] = {
  {&(_ZTVN3ccc7CC0x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y3E[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y33pqrEv,_ZTv0_n20_N3ccc7CC0x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y33pqrEv,_ZThn4_N3ccc7CC0x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y33efgEv,_ZTv0_n16_N3ccc7CC0x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y33efgEv,_ZThn4_N3ccc7CC0x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y33abcEv,_ZTv0_n12_N3ccc7CC0x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y33abcEv,_ZThn4_N3ccc7CC0x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y3E = {  "_ZN3ccc7CC0x1y3E", // class name
  bases__ZN3ccc7CC0x1y3E, 2,
  &(vtc__ZN3ccc7CC0x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names37,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x1y3  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD0x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x1y33abcEv
  ~DD0x1y3(); // tgen
  DD0x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y33efgEv");}
void  ccc::DD0x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y33pqrEv");}
void  ccc::DD0x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y33abcEv");}
ccc::DD0x1y3 ::~DD0x1y3(){ note_dtor("_ZN3ccc7DD0x1y3E", this);} // tgen
ccc::DD0x1y3 ::DD0x1y3(){ note_ctor("_ZN3ccc7DD0x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y3E, buf);
    ::ccc::DD0x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y3E);
    dp->::ccc::DD0x1y3::~DD0x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y3E(Test__ZN3ccc7DD0x1y3E, "_ZN3ccc7DD0x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y3C1Ev();
extern void _ZN3ccc7DD0x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y3E[] = {
  NSPAIR(_ZN3ccc7DD0x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y3E[];
extern void _ZN3ccc7DD0x1y33abcEv();
extern void _ZN3ccc7DD0x1y33efgEv();
extern void _ZN3ccc7DD0x1y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y33abcEv,_ZTv0_n12_N3ccc7DD0x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y33abcEv,_ZThn4_N3ccc7DD0x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y33pqrEv,_ZTv0_n16_N3ccc7DD0x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y33pqrEv,_ZThn4_N3ccc7DD0x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y33efgEv,_ZTv0_n20_N3ccc7DD0x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y33efgEv,_ZThn4_N3ccc7DD0x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y33abcEv,_ZTv0_n12_N3ccc7DD0x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y33pqrEv,_ZTv0_n16_N3ccc7DD0x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y33efgEv,_ZTv0_n20_N3ccc7DD0x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y3E[] = {
  {&(_ZTVN3ccc7DD0x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y3E[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y33efgEv,_ZTv0_n20_N3ccc7DD0x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y33efgEv,_ZThn4_N3ccc7DD0x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y33pqrEv,_ZTv0_n16_N3ccc7DD0x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y33pqrEv,_ZThn4_N3ccc7DD0x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y33abcEv,_ZTv0_n12_N3ccc7DD0x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y33abcEv,_ZThn4_N3ccc7DD0x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y3E = {  "_ZN3ccc7DD0x1y3E", // class name
  bases__ZN3ccc7DD0x1y3E, 2,
  &(vtc__ZN3ccc7DD0x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y3E),3, //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  CC0x1y4  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC0x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y43efgEv
  ~CC0x1y4(); // tgen
  CC0x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y4E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y43pqrEv");}
void  ccc::CC0x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y43abcEv");}
void  ccc::CC0x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y43efgEv");}
ccc::CC0x1y4 ::~CC0x1y4(){ note_dtor("_ZN3ccc7CC0x1y4E", this);} // tgen
ccc::CC0x1y4 ::CC0x1y4(){ note_ctor("_ZN3ccc7CC0x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y4E, buf);
    ::ccc::CC0x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y4E);
    dp->::ccc::CC0x1y4::~CC0x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y4E(Test__ZN3ccc7CC0x1y4E, "_ZN3ccc7CC0x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y4C1Ev();
extern void _ZN3ccc7CC0x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y4E[] = {
  NSPAIR(_ZN3ccc7CC0x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y4E[];
extern void _ZN3ccc7CC0x1y43abcEv();
extern void _ZN3ccc7CC0x1y43pqrEv();
extern void _ZN3ccc7CC0x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y43abcEv,_ZTv0_n12_N3ccc7CC0x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43abcEv,_ZThn4_N3ccc7CC0x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y43efgEv,_ZTv0_n16_N3ccc7CC0x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43efgEv,_ZThn4_N3ccc7CC0x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y43pqrEv,_ZTv0_n20_N3ccc7CC0x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43pqrEv,_ZThn4_N3ccc7CC0x1y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y43abcEv,_ZTv0_n12_N3ccc7CC0x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y43efgEv,_ZTv0_n16_N3ccc7CC0x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y43pqrEv,_ZTv0_n20_N3ccc7CC0x1y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y4E[] = {
  {&(_ZTVN3ccc7CC0x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y4E[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y43pqrEv,_ZTv0_n20_N3ccc7CC0x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y43pqrEv,_ZThn4_N3ccc7CC0x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y43efgEv,_ZTv0_n16_N3ccc7CC0x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y43efgEv,_ZThn4_N3ccc7CC0x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y43abcEv,_ZTv0_n12_N3ccc7CC0x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y43abcEv,_ZThn4_N3ccc7CC0x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y4E = {  "_ZN3ccc7CC0x1y4E", // class name
  bases__ZN3ccc7CC0x1y4E, 2,
  &(vtc__ZN3ccc7CC0x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y4E),2, //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  DD0x1y4  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD0x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x1y43efgEv
  ~DD0x1y4(); // tgen
  DD0x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y43pqrEv");}
void  ccc::DD0x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y43abcEv");}
void  ccc::DD0x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y43efgEv");}
ccc::DD0x1y4 ::~DD0x1y4(){ note_dtor("_ZN3ccc7DD0x1y4E", this);} // tgen
ccc::DD0x1y4 ::DD0x1y4(){ note_ctor("_ZN3ccc7DD0x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y4E, buf);
    ::ccc::DD0x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y4E);
    dp->::ccc::DD0x1y4::~DD0x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y4E(Test__ZN3ccc7DD0x1y4E, "_ZN3ccc7DD0x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y4C1Ev();
extern void _ZN3ccc7DD0x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y4E[] = {
  NSPAIR(_ZN3ccc7DD0x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y4E[];
extern void _ZN3ccc7DD0x1y43abcEv();
extern void _ZN3ccc7DD0x1y43efgEv();
extern void _ZN3ccc7DD0x1y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y43abcEv,_ZTv0_n12_N3ccc7DD0x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y43abcEv,_ZThn4_N3ccc7DD0x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y43pqrEv,_ZTv0_n16_N3ccc7DD0x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y43pqrEv,_ZThn4_N3ccc7DD0x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y43efgEv,_ZTv0_n20_N3ccc7DD0x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y43efgEv,_ZThn4_N3ccc7DD0x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y43abcEv,_ZTv0_n12_N3ccc7DD0x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y43pqrEv,_ZTv0_n16_N3ccc7DD0x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y43efgEv,_ZTv0_n20_N3ccc7DD0x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y4E[] = {
  {&(_ZTVN3ccc7DD0x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y4E[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y43efgEv,_ZTv0_n20_N3ccc7DD0x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y43efgEv,_ZThn4_N3ccc7DD0x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y43pqrEv,_ZTv0_n16_N3ccc7DD0x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y43pqrEv,_ZThn4_N3ccc7DD0x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y43abcEv,_ZTv0_n12_N3ccc7DD0x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y43abcEv,_ZThn4_N3ccc7DD0x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y4E = {  "_ZN3ccc7DD0x1y4E", // class name
  bases__ZN3ccc7DD0x1y4E, 2,
  &(vtc__ZN3ccc7DD0x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y4E),3, //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  CC0x1y5  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC0x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y53abcEv
  ~CC0x1y5(); // tgen
  CC0x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y5E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y53pqrEv");}
void  ccc::CC0x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y53efgEv");}
void  ccc::CC0x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y53abcEv");}
ccc::CC0x1y5 ::~CC0x1y5(){ note_dtor("_ZN3ccc7CC0x1y5E", this);} // tgen
ccc::CC0x1y5 ::CC0x1y5(){ note_ctor("_ZN3ccc7CC0x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y5E, buf);
    ::ccc::CC0x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y5E);
    dp->::ccc::CC0x1y5::~CC0x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y5E(Test__ZN3ccc7CC0x1y5E, "_ZN3ccc7CC0x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y5C1Ev();
extern void _ZN3ccc7CC0x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y5E[] = {
  NSPAIR(_ZN3ccc7CC0x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y5E[];
extern void _ZN3ccc7CC0x1y53abcEv();
extern void _ZN3ccc7CC0x1y53pqrEv();
extern void _ZN3ccc7CC0x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y53abcEv,_ZTv0_n12_N3ccc7CC0x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53abcEv,_ZThn4_N3ccc7CC0x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y53efgEv,_ZTv0_n16_N3ccc7CC0x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53efgEv,_ZThn4_N3ccc7CC0x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y53pqrEv,_ZTv0_n20_N3ccc7CC0x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53pqrEv,_ZThn4_N3ccc7CC0x1y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y53abcEv,_ZTv0_n12_N3ccc7CC0x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y53efgEv,_ZTv0_n16_N3ccc7CC0x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y53pqrEv,_ZTv0_n20_N3ccc7CC0x1y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y5E[] = {
  {&(_ZTVN3ccc7CC0x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y5E[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y53pqrEv,_ZTv0_n20_N3ccc7CC0x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y53pqrEv,_ZThn4_N3ccc7CC0x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y53efgEv,_ZTv0_n16_N3ccc7CC0x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y53efgEv,_ZThn4_N3ccc7CC0x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y53abcEv,_ZTv0_n12_N3ccc7CC0x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y53abcEv,_ZThn4_N3ccc7CC0x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y5E = {  "_ZN3ccc7CC0x1y5E", // class name
  bases__ZN3ccc7CC0x1y5E, 2,
  &(vtc__ZN3ccc7CC0x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y5E),2, //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  DD0x1y5  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD0x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x1y53abcEv
  ~DD0x1y5(); // tgen
  DD0x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y53pqrEv");}
void  ccc::DD0x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y53efgEv");}
void  ccc::DD0x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y53abcEv");}
ccc::DD0x1y5 ::~DD0x1y5(){ note_dtor("_ZN3ccc7DD0x1y5E", this);} // tgen
ccc::DD0x1y5 ::DD0x1y5(){ note_ctor("_ZN3ccc7DD0x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y5E, buf);
    ::ccc::DD0x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y5E);
    dp->::ccc::DD0x1y5::~DD0x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y5E(Test__ZN3ccc7DD0x1y5E, "_ZN3ccc7DD0x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y5C1Ev();
extern void _ZN3ccc7DD0x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y5E[] = {
  NSPAIR(_ZN3ccc7DD0x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y5E[];
extern void _ZN3ccc7DD0x1y53abcEv();
extern void _ZN3ccc7DD0x1y53efgEv();
extern void _ZN3ccc7DD0x1y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y53abcEv,_ZTv0_n12_N3ccc7DD0x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y53abcEv,_ZThn4_N3ccc7DD0x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y53pqrEv,_ZTv0_n16_N3ccc7DD0x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y53pqrEv,_ZThn4_N3ccc7DD0x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y53efgEv,_ZTv0_n20_N3ccc7DD0x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y53efgEv,_ZThn4_N3ccc7DD0x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y53abcEv,_ZTv0_n12_N3ccc7DD0x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y53pqrEv,_ZTv0_n16_N3ccc7DD0x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y53efgEv,_ZTv0_n20_N3ccc7DD0x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y5E[] = {
  {&(_ZTVN3ccc7DD0x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y5E[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y53efgEv,_ZTv0_n20_N3ccc7DD0x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y53efgEv,_ZThn4_N3ccc7DD0x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y53pqrEv,_ZTv0_n16_N3ccc7DD0x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y53pqrEv,_ZThn4_N3ccc7DD0x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y53abcEv,_ZTv0_n12_N3ccc7DD0x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y53abcEv,_ZThn4_N3ccc7DD0x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y5E = {  "_ZN3ccc7DD0x1y5E", // class name
  bases__ZN3ccc7DD0x1y5E, 2,
  &(vtc__ZN3ccc7DD0x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y5E),3, //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  CC0x1y6  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y63efgEv
  ~CC0x1y6(); // tgen
  CC0x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y6E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y63abcEv");}
void  ccc::CC0x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y63efgEv");}
ccc::CC0x1y6 ::~CC0x1y6(){ note_dtor("_ZN3ccc7CC0x1y6E", this);} // tgen
ccc::CC0x1y6 ::CC0x1y6(){ note_ctor("_ZN3ccc7CC0x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y6E, buf);
    ::ccc::CC0x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y6E);
    dp->::ccc::CC0x1y6::~CC0x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y6E(Test__ZN3ccc7CC0x1y6E, "_ZN3ccc7CC0x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y6C1Ev();
extern void _ZN3ccc7CC0x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y6E[] = {
  NSPAIR(_ZN3ccc7CC0x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y6E[];
extern void _ZN3ccc7CC0x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC0x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y63abcEv,_ZTv0_n12_N3ccc7CC0x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y63abcEv,_ZThn4_N3ccc7CC0x1y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y63efgEv,_ZTv0_n16_N3ccc7CC0x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y63efgEv,_ZThn4_N3ccc7CC0x1y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y63abcEv,_ZTv0_n12_N3ccc7CC0x1y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y63efgEv,_ZTv0_n16_N3ccc7CC0x1y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y6E[] = {
  {&(_ZTVN3ccc7CC0x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y6E[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y63efgEv,_ZTv0_n16_N3ccc7CC0x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y63efgEv,_ZThn4_N3ccc7CC0x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y63abcEv,_ZTv0_n12_N3ccc7CC0x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y63abcEv,_ZThn4_N3ccc7CC0x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y6E = {  "_ZN3ccc7CC0x1y6E", // class name
  bases__ZN3ccc7CC0x1y6E, 2,
  &(vtc__ZN3ccc7CC0x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y6E),2, //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  DD0x1y6  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD0x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x1y63efgEv
  ~DD0x1y6(); // tgen
  DD0x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y63abcEv");}
void  ccc::DD0x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y63efgEv");}
ccc::DD0x1y6 ::~DD0x1y6(){ note_dtor("_ZN3ccc7DD0x1y6E", this);} // tgen
ccc::DD0x1y6 ::DD0x1y6(){ note_ctor("_ZN3ccc7DD0x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y6E, buf);
    ::ccc::DD0x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y6E);
    dp->::ccc::DD0x1y6::~DD0x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y6E(Test__ZN3ccc7DD0x1y6E, "_ZN3ccc7DD0x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y6C1Ev();
extern void _ZN3ccc7DD0x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y6E[] = {
  NSPAIR(_ZN3ccc7DD0x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y6E[];
extern void _ZN3ccc7DD0x1y63abcEv();
extern void _ZN3ccc7DD0x1y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y63abcEv,_ZTv0_n12_N3ccc7DD0x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y63abcEv,_ZThn4_N3ccc7DD0x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y63efgEv,_ZTv0_n20_N3ccc7DD0x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y63efgEv,_ZThn4_N3ccc7DD0x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y63abcEv,_ZTv0_n12_N3ccc7DD0x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y63efgEv,_ZTv0_n20_N3ccc7DD0x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y6E[] = {
  {&(_ZTVN3ccc7DD0x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y6E[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y63efgEv,_ZTv0_n20_N3ccc7DD0x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y63efgEv,_ZThn4_N3ccc7DD0x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y63abcEv,_ZTv0_n12_N3ccc7DD0x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y63abcEv,_ZThn4_N3ccc7DD0x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y6E = {  "_ZN3ccc7DD0x1y6E", // class name
  bases__ZN3ccc7DD0x1y6E, 2,
  &(vtc__ZN3ccc7DD0x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y6E),3, //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  CC0x1y7  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y73pqrEv
  ~CC0x1y7(); // tgen
  CC0x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y7E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y73abcEv");}
void  ccc::CC0x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y73pqrEv");}
ccc::CC0x1y7 ::~CC0x1y7(){ note_dtor("_ZN3ccc7CC0x1y7E", this);} // tgen
ccc::CC0x1y7 ::CC0x1y7(){ note_ctor("_ZN3ccc7CC0x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y7E, buf);
    ::ccc::CC0x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y7E);
    dp->::ccc::CC0x1y7::~CC0x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y7E(Test__ZN3ccc7CC0x1y7E, "_ZN3ccc7CC0x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y7C1Ev();
extern void _ZN3ccc7CC0x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y7E[] = {
  NSPAIR(_ZN3ccc7CC0x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y7E[];
extern void _ZN3ccc7CC0x1y73abcEv();
extern void _ZN3ccc7CC0x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y73abcEv,_ZTv0_n12_N3ccc7CC0x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y73abcEv,_ZThn4_N3ccc7CC0x1y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y73pqrEv,_ZTv0_n20_N3ccc7CC0x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y73pqrEv,_ZThn4_N3ccc7CC0x1y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y73abcEv,_ZTv0_n12_N3ccc7CC0x1y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y73pqrEv,_ZTv0_n20_N3ccc7CC0x1y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y7E[] = {
  {&(_ZTVN3ccc7CC0x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y7E[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y73pqrEv,_ZTv0_n20_N3ccc7CC0x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y73pqrEv,_ZThn4_N3ccc7CC0x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y73abcEv,_ZTv0_n12_N3ccc7CC0x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y73abcEv,_ZThn4_N3ccc7CC0x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y7E = {  "_ZN3ccc7CC0x1y7E", // class name
  bases__ZN3ccc7CC0x1y7E, 2,
  &(vtc__ZN3ccc7CC0x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y7E),2, //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  DD0x1y7  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD0x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y73pqrEv
  ~DD0x1y7(); // tgen
  DD0x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y73abcEv");}
void  ccc::DD0x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y73pqrEv");}
ccc::DD0x1y7 ::~DD0x1y7(){ note_dtor("_ZN3ccc7DD0x1y7E", this);} // tgen
ccc::DD0x1y7 ::DD0x1y7(){ note_ctor("_ZN3ccc7DD0x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y7E, buf);
    ::ccc::DD0x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y7E);
    dp->::ccc::DD0x1y7::~DD0x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y7E(Test__ZN3ccc7DD0x1y7E, "_ZN3ccc7DD0x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y7C1Ev();
extern void _ZN3ccc7DD0x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y7E[] = {
  NSPAIR(_ZN3ccc7DD0x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y7E[];
extern void _ZN3ccc7DD0x1y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x1y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y73abcEv,_ZTv0_n12_N3ccc7DD0x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y73abcEv,_ZThn4_N3ccc7DD0x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y73pqrEv,_ZTv0_n16_N3ccc7DD0x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y73pqrEv,_ZThn4_N3ccc7DD0x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y73abcEv,_ZTv0_n12_N3ccc7DD0x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y73pqrEv,_ZTv0_n16_N3ccc7DD0x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y7E[] = {
  {&(_ZTVN3ccc7DD0x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y7E[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y73pqrEv,_ZTv0_n16_N3ccc7DD0x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y73pqrEv,_ZThn4_N3ccc7DD0x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y73abcEv,_ZTv0_n12_N3ccc7DD0x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y73abcEv,_ZThn4_N3ccc7DD0x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y7E = {  "_ZN3ccc7DD0x1y7E", // class name
  bases__ZN3ccc7DD0x1y7E, 2,
  &(vtc__ZN3ccc7DD0x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y7E),3, //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  CC0x1y8  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y83abcEv
  ~CC0x1y8(); // tgen
  CC0x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y8E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y83efgEv");}
void  ccc::CC0x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y83abcEv");}
ccc::CC0x1y8 ::~CC0x1y8(){ note_dtor("_ZN3ccc7CC0x1y8E", this);} // tgen
ccc::CC0x1y8 ::CC0x1y8(){ note_ctor("_ZN3ccc7CC0x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y8E, buf);
    ::ccc::CC0x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y8E);
    dp->::ccc::CC0x1y8::~CC0x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y8E(Test__ZN3ccc7CC0x1y8E, "_ZN3ccc7CC0x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y8C1Ev();
extern void _ZN3ccc7CC0x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y8E[] = {
  NSPAIR(_ZN3ccc7CC0x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y8E[];
extern void _ZN3ccc7CC0x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC0x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x1y83abcEv,_ZTv0_n12_N3ccc7CC0x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y83abcEv,_ZThn4_N3ccc7CC0x1y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y83efgEv,_ZTv0_n16_N3ccc7CC0x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y83efgEv,_ZThn4_N3ccc7CC0x1y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x1y83abcEv,_ZTv0_n12_N3ccc7CC0x1y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y83efgEv,_ZTv0_n16_N3ccc7CC0x1y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y8E[] = {
  {&(_ZTVN3ccc7CC0x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y8E[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y83efgEv,_ZTv0_n16_N3ccc7CC0x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y83efgEv,_ZThn4_N3ccc7CC0x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x1y83abcEv,_ZTv0_n12_N3ccc7CC0x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y83abcEv,_ZThn4_N3ccc7CC0x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y8E = {  "_ZN3ccc7CC0x1y8E", // class name
  bases__ZN3ccc7CC0x1y8E, 2,
  &(vtc__ZN3ccc7CC0x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y8E),2, //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  DD0x1y8  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD0x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x1y83abcEv
  ~DD0x1y8(); // tgen
  DD0x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y83efgEv");}
void  ccc::DD0x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x1y83abcEv");}
ccc::DD0x1y8 ::~DD0x1y8(){ note_dtor("_ZN3ccc7DD0x1y8E", this);} // tgen
ccc::DD0x1y8 ::DD0x1y8(){ note_ctor("_ZN3ccc7DD0x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y8E, buf);
    ::ccc::DD0x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y8E);
    dp->::ccc::DD0x1y8::~DD0x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y8E(Test__ZN3ccc7DD0x1y8E, "_ZN3ccc7DD0x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y8C1Ev();
extern void _ZN3ccc7DD0x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y8E[] = {
  NSPAIR(_ZN3ccc7DD0x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y8E[];
extern void _ZN3ccc7DD0x1y83abcEv();
extern void _ZN3ccc7DD0x1y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x1y83abcEv,_ZTv0_n12_N3ccc7DD0x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y83abcEv,_ZThn4_N3ccc7DD0x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y83efgEv,_ZTv0_n20_N3ccc7DD0x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y83efgEv,_ZThn4_N3ccc7DD0x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x1y83abcEv,_ZTv0_n12_N3ccc7DD0x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y83efgEv,_ZTv0_n20_N3ccc7DD0x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y8E[] = {
  {&(_ZTVN3ccc7DD0x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y8E[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y83efgEv,_ZTv0_n20_N3ccc7DD0x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y83efgEv,_ZThn4_N3ccc7DD0x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x1y83abcEv,_ZTv0_n12_N3ccc7DD0x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y83abcEv,_ZThn4_N3ccc7DD0x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y8E = {  "_ZN3ccc7DD0x1y8E", // class name
  bases__ZN3ccc7DD0x1y8E, 2,
  &(vtc__ZN3ccc7DD0x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y8E),3, //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  CC0x1y9  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y93pqrEv
  ~CC0x1y9(); // tgen
  CC0x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y9E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y93efgEv");}
void  ccc::CC0x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y93pqrEv");}
ccc::CC0x1y9 ::~CC0x1y9(){ note_dtor("_ZN3ccc7CC0x1y9E", this);} // tgen
ccc::CC0x1y9 ::CC0x1y9(){ note_ctor("_ZN3ccc7CC0x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y9E, buf);
    ::ccc::CC0x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC0x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y9E);
    dp->::ccc::CC0x1y9::~CC0x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y9E(Test__ZN3ccc7CC0x1y9E, "_ZN3ccc7CC0x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y9C1Ev();
extern void _ZN3ccc7CC0x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y9E[] = {
  NSPAIR(_ZN3ccc7CC0x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC0x1y93pqrEv();
extern void _ZN3ccc7CC0x1y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x1y93efgEv,_ZTv0_n16_N3ccc7CC0x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y93efgEv,_ZThn4_N3ccc7CC0x1y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x1y93pqrEv,_ZTv0_n20_N3ccc7CC0x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y93pqrEv,_ZThn4_N3ccc7CC0x1y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x1y93efgEv,_ZTv0_n16_N3ccc7CC0x1y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x1y93pqrEv,_ZTv0_n20_N3ccc7CC0x1y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x1y9E[] = {
  {&(_ZTVN3ccc7CC0x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x1y9E[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x1y93pqrEv,_ZTv0_n20_N3ccc7CC0x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y93pqrEv,_ZThn4_N3ccc7CC0x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x1y93efgEv,_ZTv0_n16_N3ccc7CC0x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x1y93efgEv,_ZThn4_N3ccc7CC0x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x1y9E = {  "_ZN3ccc7CC0x1y9E", // class name
  bases__ZN3ccc7CC0x1y9E, 2,
  &(vtc__ZN3ccc7CC0x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x1y9E),2, //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  DD0x1y9  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD0x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x1y93pqrEv
  ~DD0x1y9(); // tgen
  DD0x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x1y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x1y93efgEv");}
void  ccc::DD0x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x1y93pqrEv");}
ccc::DD0x1y9 ::~DD0x1y9(){ note_dtor("_ZN3ccc7DD0x1y9E", this);} // tgen
ccc::DD0x1y9 ::DD0x1y9(){ note_ctor("_ZN3ccc7DD0x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x1y9E, buf);
    ::ccc::DD0x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x1y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD0x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x1y9E);
    dp->::ccc::DD0x1y9::~DD0x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x1y9E(Test__ZN3ccc7DD0x1y9E, "_ZN3ccc7DD0x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x1y9C1Ev();
extern void _ZN3ccc7DD0x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x1y9E[] = {
  NSPAIR(_ZN3ccc7DD0x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD0x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x1y93efgEv();
extern void _ZN3ccc7DD0x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x1y93pqrEv,_ZTv0_n16_N3ccc7DD0x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y93pqrEv,_ZThn4_N3ccc7DD0x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x1y93efgEv,_ZTv0_n20_N3ccc7DD0x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x1y93efgEv,_ZThn4_N3ccc7DD0x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x1y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x1y93pqrEv,_ZTv0_n16_N3ccc7DD0x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x1y93efgEv,_ZTv0_n20_N3ccc7DD0x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x1y9E[] = {
  {&(_ZTVN3ccc7DD0x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x1y9E[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x1y93efgEv,_ZTv0_n20_N3ccc7DD0x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y93efgEv,_ZThn4_N3ccc7DD0x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x1y93pqrEv,_ZTv0_n16_N3ccc7DD0x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x1y93pqrEv,_ZThn4_N3ccc7DD0x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x1y9E = {  "_ZN3ccc7DD0x1y9E", // class name
  bases__ZN3ccc7DD0x1y9E, 2,
  &(vtc__ZN3ccc7DD0x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x1y9E),3, //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  CC0x1y10  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x1y103abcEv
  ~CC0x1y10(); // tgen
  CC0x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y10E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y103pqrEv");}
void  ccc::CC0x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x1y103abcEv");}
ccc::CC0x1y10 ::~CC0x1y10(){ note_dtor("_ZN3ccc8CC0x1y10E", this);} // tgen
ccc::CC0x1y10 ::CC0x1y10(){ note_ctor("_ZN3ccc8CC0x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y10E, buf);
    ::ccc::CC0x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y10E);
    dp->::ccc::CC0x1y10::~CC0x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y10E(Test__ZN3ccc8CC0x1y10E, "_ZN3ccc8CC0x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y10C1Ev();
extern void _ZN3ccc8CC0x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y10E[] = {
  NSPAIR(_ZN3ccc8CC0x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y10E[];
extern void _ZN3ccc8CC0x1y103abcEv();
extern void _ZN3ccc8CC0x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x1y103abcEv,_ZTv0_n12_N3ccc8CC0x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y103abcEv,_ZThn4_N3ccc8CC0x1y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x1y103pqrEv,_ZTv0_n20_N3ccc8CC0x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y103pqrEv,_ZThn4_N3ccc8CC0x1y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x1y103abcEv,_ZTv0_n12_N3ccc8CC0x1y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x1y103pqrEv,_ZTv0_n20_N3ccc8CC0x1y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y10E[] = {
  {&(_ZTVN3ccc8CC0x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y10E[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x1y103pqrEv,_ZTv0_n20_N3ccc8CC0x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y103pqrEv,_ZThn4_N3ccc8CC0x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x1y103abcEv,_ZTv0_n12_N3ccc8CC0x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y103abcEv,_ZThn4_N3ccc8CC0x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x1y10E = {  "_ZN3ccc8CC0x1y10E", // class name
  bases__ZN3ccc8CC0x1y10E, 2,
  &(vtc__ZN3ccc8CC0x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y10E),2, //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  DD0x1y10  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD0x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x1y103abcEv
  ~DD0x1y10(); // tgen
  DD0x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x1y103pqrEv");}
void  ccc::DD0x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x1y103abcEv");}
ccc::DD0x1y10 ::~DD0x1y10(){ note_dtor("_ZN3ccc8DD0x1y10E", this);} // tgen
ccc::DD0x1y10 ::DD0x1y10(){ note_ctor("_ZN3ccc8DD0x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y10E, buf);
    ::ccc::DD0x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y10E);
    dp->::ccc::DD0x1y10::~DD0x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y10E(Test__ZN3ccc8DD0x1y10E, "_ZN3ccc8DD0x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y10C1Ev();
extern void _ZN3ccc8DD0x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y10E[] = {
  NSPAIR(_ZN3ccc8DD0x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y10E[];
extern void _ZN3ccc8DD0x1y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x1y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x1y103abcEv,_ZTv0_n12_N3ccc8DD0x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y103abcEv,_ZThn4_N3ccc8DD0x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x1y103pqrEv,_ZTv0_n16_N3ccc8DD0x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y103pqrEv,_ZThn4_N3ccc8DD0x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x1y103abcEv,_ZTv0_n12_N3ccc8DD0x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x1y103pqrEv,_ZTv0_n16_N3ccc8DD0x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y10E[] = {
  {&(_ZTVN3ccc8DD0x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y10E[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x1y103pqrEv,_ZTv0_n16_N3ccc8DD0x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y103pqrEv,_ZThn4_N3ccc8DD0x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x1y103abcEv,_ZTv0_n12_N3ccc8DD0x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y103abcEv,_ZThn4_N3ccc8DD0x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x1y10E = {  "_ZN3ccc8DD0x1y10E", // class name
  bases__ZN3ccc8DD0x1y10E, 2,
  &(vtc__ZN3ccc8DD0x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y10E),3, //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  CC0x1y11  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x1y113efgEv
  ~CC0x1y11(); // tgen
  CC0x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y11E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y113pqrEv");}
void  ccc::CC0x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x1y113efgEv");}
ccc::CC0x1y11 ::~CC0x1y11(){ note_dtor("_ZN3ccc8CC0x1y11E", this);} // tgen
ccc::CC0x1y11 ::CC0x1y11(){ note_ctor("_ZN3ccc8CC0x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y11E, buf);
    ::ccc::CC0x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y11E);
    dp->::ccc::CC0x1y11::~CC0x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y11E(Test__ZN3ccc8CC0x1y11E, "_ZN3ccc8CC0x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y11C1Ev();
extern void _ZN3ccc8CC0x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y11E[] = {
  NSPAIR(_ZN3ccc8CC0x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC0x1y113pqrEv();
extern void _ZN3ccc8CC0x1y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x1y113efgEv,_ZTv0_n16_N3ccc8CC0x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y113efgEv,_ZThn4_N3ccc8CC0x1y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x1y113pqrEv,_ZTv0_n20_N3ccc8CC0x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y113pqrEv,_ZThn4_N3ccc8CC0x1y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x1y113efgEv,_ZTv0_n16_N3ccc8CC0x1y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x1y113pqrEv,_ZTv0_n20_N3ccc8CC0x1y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y11E[] = {
  {&(_ZTVN3ccc8CC0x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y11E[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x1y113pqrEv,_ZTv0_n20_N3ccc8CC0x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y113pqrEv,_ZThn4_N3ccc8CC0x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x1y113efgEv,_ZTv0_n16_N3ccc8CC0x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y113efgEv,_ZThn4_N3ccc8CC0x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x1y11E = {  "_ZN3ccc8CC0x1y11E", // class name
  bases__ZN3ccc8CC0x1y11E, 2,
  &(vtc__ZN3ccc8CC0x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y11E),2, //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  DD0x1y11  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD0x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x1y113efgEv
  ~DD0x1y11(); // tgen
  DD0x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x1y113pqrEv");}
void  ccc::DD0x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x1y113efgEv");}
ccc::DD0x1y11 ::~DD0x1y11(){ note_dtor("_ZN3ccc8DD0x1y11E", this);} // tgen
ccc::DD0x1y11 ::DD0x1y11(){ note_ctor("_ZN3ccc8DD0x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y11E, buf);
    ::ccc::DD0x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y11E);
    dp->::ccc::DD0x1y11::~DD0x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y11E(Test__ZN3ccc8DD0x1y11E, "_ZN3ccc8DD0x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y11C1Ev();
extern void _ZN3ccc8DD0x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y11E[] = {
  NSPAIR(_ZN3ccc8DD0x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x1y113efgEv();
extern void _ZN3ccc8DD0x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x1y113pqrEv,_ZTv0_n16_N3ccc8DD0x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y113pqrEv,_ZThn4_N3ccc8DD0x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x1y113efgEv,_ZTv0_n20_N3ccc8DD0x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y113efgEv,_ZThn4_N3ccc8DD0x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x1y113pqrEv,_ZTv0_n16_N3ccc8DD0x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x1y113efgEv,_ZTv0_n20_N3ccc8DD0x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y11E[] = {
  {&(_ZTVN3ccc8DD0x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y11E[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x1y113efgEv,_ZTv0_n20_N3ccc8DD0x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y113efgEv,_ZThn4_N3ccc8DD0x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x1y113pqrEv,_ZTv0_n16_N3ccc8DD0x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y113pqrEv,_ZThn4_N3ccc8DD0x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x1y11E = {  "_ZN3ccc8DD0x1y11E", // class name
  bases__ZN3ccc8DD0x1y11E, 2,
  &(vtc__ZN3ccc8DD0x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y11E),3, //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  CC0x1y12  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC0x1y123abcEv
  ~CC0x1y12(); // tgen
  CC0x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x1y123abcEv");}
ccc::CC0x1y12 ::~CC0x1y12(){ note_dtor("_ZN3ccc8CC0x1y12E", this);} // tgen
ccc::CC0x1y12 ::CC0x1y12(){ note_ctor("_ZN3ccc8CC0x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y12E, buf);
    ::ccc::CC0x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y12E);
    dp->::ccc::CC0x1y12::~CC0x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y12E(Test__ZN3ccc8CC0x1y12E, "_ZN3ccc8CC0x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y12C1Ev();
extern void _ZN3ccc8CC0x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y12E[] = {
  NSPAIR(_ZN3ccc8CC0x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y12E[];
extern void _ZN3ccc8CC0x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x1y123abcEv,_ZTv0_n12_N3ccc8CC0x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y123abcEv,_ZThn4_N3ccc8CC0x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x1y123abcEv,_ZTv0_n12_N3ccc8CC0x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y12E[] = {
  {&(_ZTVN3ccc8CC0x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y12E[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x1y123abcEv,_ZTv0_n12_N3ccc8CC0x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y123abcEv,_ZThn4_N3ccc8CC0x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x1y12E = {  "_ZN3ccc8CC0x1y12E", // class name
  bases__ZN3ccc8CC0x1y12E, 2,
  &(vtc__ZN3ccc8CC0x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y12E),2, //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  DD0x1y12  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD0x1y123abcEv
  ~DD0x1y12(); // tgen
  DD0x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x1y123abcEv");}
ccc::DD0x1y12 ::~DD0x1y12(){ note_dtor("_ZN3ccc8DD0x1y12E", this);} // tgen
ccc::DD0x1y12 ::DD0x1y12(){ note_ctor("_ZN3ccc8DD0x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y12E, buf);
    ::ccc::DD0x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y12E);
    dp->::ccc::DD0x1y12::~DD0x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y12E(Test__ZN3ccc8DD0x1y12E, "_ZN3ccc8DD0x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y12C1Ev();
extern void _ZN3ccc8DD0x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y12E[] = {
  NSPAIR(_ZN3ccc8DD0x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y12E[];
extern void _ZN3ccc8DD0x1y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x1y123abcEv,_ZTv0_n12_N3ccc8DD0x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y123abcEv,_ZThn4_N3ccc8DD0x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x1y123abcEv,_ZTv0_n12_N3ccc8DD0x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y12E[] = {
  {&(_ZTVN3ccc8DD0x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y12E[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x1y123abcEv,_ZTv0_n12_N3ccc8DD0x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y123abcEv,_ZThn4_N3ccc8DD0x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x1y12E = {  "_ZN3ccc8DD0x1y12E", // class name
  bases__ZN3ccc8DD0x1y12E, 2,
  &(vtc__ZN3ccc8DD0x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y12E),3, //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  CC0x1y13  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC0x1y133efgEv
  ~CC0x1y13(); // tgen
  CC0x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x1y133efgEv");}
ccc::CC0x1y13 ::~CC0x1y13(){ note_dtor("_ZN3ccc8CC0x1y13E", this);} // tgen
ccc::CC0x1y13 ::CC0x1y13(){ note_ctor("_ZN3ccc8CC0x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y13E, buf);
    ::ccc::CC0x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y13E);
    dp->::ccc::CC0x1y13::~CC0x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y13E(Test__ZN3ccc8CC0x1y13E, "_ZN3ccc8CC0x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y13C1Ev();
extern void _ZN3ccc8CC0x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y13E[] = {
  NSPAIR(_ZN3ccc8CC0x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC0x1y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x1y133efgEv,_ZTv0_n16_N3ccc8CC0x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y133efgEv,_ZThn4_N3ccc8CC0x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x1y133efgEv,_ZTv0_n16_N3ccc8CC0x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y13E[] = {
  {&(_ZTVN3ccc8CC0x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y13E[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x1y133efgEv,_ZTv0_n16_N3ccc8CC0x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y133efgEv,_ZThn4_N3ccc8CC0x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x1y13E = {  "_ZN3ccc8CC0x1y13E", // class name
  bases__ZN3ccc8CC0x1y13E, 2,
  &(vtc__ZN3ccc8CC0x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y13E),2, //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  DD0x1y13  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD0x1y133efgEv
  ~DD0x1y13(); // tgen
  DD0x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x1y133efgEv");}
ccc::DD0x1y13 ::~DD0x1y13(){ note_dtor("_ZN3ccc8DD0x1y13E", this);} // tgen
ccc::DD0x1y13 ::DD0x1y13(){ note_ctor("_ZN3ccc8DD0x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y13E, buf);
    ::ccc::DD0x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y13E);
    dp->::ccc::DD0x1y13::~DD0x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y13E(Test__ZN3ccc8DD0x1y13E, "_ZN3ccc8DD0x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y13C1Ev();
extern void _ZN3ccc8DD0x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y13E[] = {
  NSPAIR(_ZN3ccc8DD0x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x1y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x1y133efgEv,_ZTv0_n20_N3ccc8DD0x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y133efgEv,_ZThn4_N3ccc8DD0x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x1y133efgEv,_ZTv0_n20_N3ccc8DD0x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y13E[] = {
  {&(_ZTVN3ccc8DD0x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y13E[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x1y133efgEv,_ZTv0_n20_N3ccc8DD0x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y133efgEv,_ZThn4_N3ccc8DD0x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x1y13E = {  "_ZN3ccc8DD0x1y13E", // class name
  bases__ZN3ccc8DD0x1y13E, 2,
  &(vtc__ZN3ccc8DD0x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y13E),3, //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  CC0x1y14  : virtual ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y143pqrEv
  ~CC0x1y14(); // tgen
  CC0x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y143pqrEv");}
ccc::CC0x1y14 ::~CC0x1y14(){ note_dtor("_ZN3ccc8CC0x1y14E", this);} // tgen
ccc::CC0x1y14 ::CC0x1y14(){ note_ctor("_ZN3ccc8CC0x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y14E, buf);
    ::ccc::CC0x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y14E);
    dp->::ccc::CC0x1y14::~CC0x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y14E(Test__ZN3ccc8CC0x1y14E, "_ZN3ccc8CC0x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y14C1Ev();
extern void _ZN3ccc8CC0x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y14E[] = {
  NSPAIR(_ZN3ccc8CC0x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC0x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x1y143pqrEv,_ZTv0_n20_N3ccc8CC0x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y143pqrEv,_ZThn4_N3ccc8CC0x1y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x1y143pqrEv,_ZTv0_n20_N3ccc8CC0x1y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y14E[] = {
  {&(_ZTVN3ccc8CC0x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y14E[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x1y143pqrEv,_ZTv0_n20_N3ccc8CC0x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x1y143pqrEv,_ZThn4_N3ccc8CC0x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x1y14E = {  "_ZN3ccc8CC0x1y14E", // class name
  bases__ZN3ccc8CC0x1y14E, 2,
  &(vtc__ZN3ccc8CC0x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y14E),2, //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  DD0x1y14  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD0x1y143pqrEv
  ~DD0x1y14(); // tgen
  DD0x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x1y143pqrEv");}
ccc::DD0x1y14 ::~DD0x1y14(){ note_dtor("_ZN3ccc8DD0x1y14E", this);} // tgen
ccc::DD0x1y14 ::DD0x1y14(){ note_ctor("_ZN3ccc8DD0x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y14E, buf);
    ::ccc::DD0x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y14E);
    dp->::ccc::DD0x1y14::~DD0x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y14E(Test__ZN3ccc8DD0x1y14E, "_ZN3ccc8DD0x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y14C1Ev();
extern void _ZN3ccc8DD0x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y14E[] = {
  NSPAIR(_ZN3ccc8DD0x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x1y143pqrEv,_ZTv0_n16_N3ccc8DD0x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x1y143pqrEv,_ZThn4_N3ccc8DD0x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x1y143pqrEv,_ZTv0_n16_N3ccc8DD0x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y14E[] = {
  {&(_ZTVN3ccc8DD0x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y14E[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x1y143pqrEv,_ZTv0_n16_N3ccc8DD0x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x1y143pqrEv,_ZThn4_N3ccc8DD0x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x1y14E = {  "_ZN3ccc8DD0x1y14E", // class name
  bases__ZN3ccc8DD0x1y14E, 2,
  &(vtc__ZN3ccc8DD0x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y14E),3, //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  CC0x1y15  : virtual ::ccc::AA0 , ::ccc::BB1 {
  ~CC0x1y15(); // tgen
  CC0x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x1y15 ::~CC0x1y15(){ note_dtor("_ZN3ccc8CC0x1y15E", this);} // tgen
ccc::CC0x1y15 ::CC0x1y15(){ note_ctor("_ZN3ccc8CC0x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y15E, buf);
    ::ccc::CC0x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC0x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y15E);
    dp->::ccc::CC0x1y15::~CC0x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y15E(Test__ZN3ccc8CC0x1y15E, "_ZN3ccc8CC0x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y15C1Ev();
extern void _ZN3ccc8CC0x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y15E[] = {
  NSPAIR(_ZN3ccc8CC0x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x1y15E[] = {
  {&(_ZTVN3ccc8CC0x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x1y15E[];
Class_Descriptor cd__ZN3ccc8CC0x1y15E = {  "_ZN3ccc8CC0x1y15E", // class name
  bases__ZN3ccc8CC0x1y15E, 2,
  &(vtc__ZN3ccc8CC0x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x1y15  : virtual ::ccc::AA0 , virtual ::ccc::BB1 {
  ~DD0x1y15(); // tgen
  DD0x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x1y15 ::~DD0x1y15(){ note_dtor("_ZN3ccc8DD0x1y15E", this);} // tgen
ccc::DD0x1y15 ::DD0x1y15(){ note_ctor("_ZN3ccc8DD0x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x1y15E, buf);
    ::ccc::DD0x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x1y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD0x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x1y15E);
    dp->::ccc::DD0x1y15::~DD0x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x1y15E(Test__ZN3ccc8DD0x1y15E, "_ZN3ccc8DD0x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x1y15C1Ev();
extern void _ZN3ccc8DD0x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x1y15E[] = {
  NSPAIR(_ZN3ccc8DD0x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD0x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x1y15E[] = {
  {&(_ZTVN3ccc8DD0x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x1y15E[];
Class_Descriptor cd__ZN3ccc8DD0x1y15E = {  "_ZN3ccc8DD0x1y15E", // class name
  bases__ZN3ccc8DD0x1y15E, 2,
  &(vtc__ZN3ccc8DD0x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y0  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y03pqrEv
  ~CC0x2y0(); // tgen
  CC0x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y0E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y03abcEv");}
void  ccc::CC0x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y03efgEv");}
void  ccc::CC0x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y03pqrEv");}
ccc::CC0x2y0 ::~CC0x2y0(){ note_dtor("_ZN3ccc7CC0x2y0E", this);} // tgen
ccc::CC0x2y0 ::CC0x2y0(){ note_ctor("_ZN3ccc7CC0x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y0E, buf);
    ::ccc::CC0x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y0E);
    dp->::ccc::CC0x2y0::~CC0x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y0E(Test__ZN3ccc7CC0x2y0E, "_ZN3ccc7CC0x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y0C1Ev();
extern void _ZN3ccc7CC0x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y0E[] = {
  NSPAIR(_ZN3ccc7CC0x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y0E[];
extern void _ZN3ccc7CC0x2y03efgEv();
extern void _ZN3ccc7CC0x2y03abcEv();
extern void _ZN3ccc7CC0x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y03abcEv,_ZTv0_n12_N3ccc7CC0x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03abcEv,_ZThn4_N3ccc7CC0x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y03efgEv,_ZTv0_n16_N3ccc7CC0x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03efgEv,_ZThn4_N3ccc7CC0x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y03pqrEv,_ZTv0_n20_N3ccc7CC0x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03pqrEv,_ZThn4_N3ccc7CC0x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y03abcEv,_ZTv0_n12_N3ccc7CC0x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y03efgEv,_ZTv0_n16_N3ccc7CC0x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y03pqrEv,_ZTv0_n20_N3ccc7CC0x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y0E[] = {
  {&(_ZTVN3ccc7CC0x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y0E[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y03pqrEv,_ZTv0_n20_N3ccc7CC0x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y03pqrEv,_ZThn4_N3ccc7CC0x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y03efgEv,_ZTv0_n16_N3ccc7CC0x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y03efgEv,_ZThn4_N3ccc7CC0x2y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y03abcEv,_ZTv0_n12_N3ccc7CC0x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y03abcEv,_ZThn4_N3ccc7CC0x2y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y0E = {  "_ZN3ccc7CC0x2y0E", // class name
  bases__ZN3ccc7CC0x2y0E, 2,
  &(vtc__ZN3ccc7CC0x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y0E),2, //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  DD0x2y0  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD0x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y03pqrEv
  ~DD0x2y0(); // tgen
  DD0x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y03abcEv");}
void  ccc::DD0x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y03efgEv");}
void  ccc::DD0x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y03pqrEv");}
ccc::DD0x2y0 ::~DD0x2y0(){ note_dtor("_ZN3ccc7DD0x2y0E", this);} // tgen
ccc::DD0x2y0 ::DD0x2y0(){ note_ctor("_ZN3ccc7DD0x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y0E, buf);
    ::ccc::DD0x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y0E);
    dp->::ccc::DD0x2y0::~DD0x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y0E(Test__ZN3ccc7DD0x2y0E, "_ZN3ccc7DD0x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y0C1Ev();
extern void _ZN3ccc7DD0x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y0E[] = {
  NSPAIR(_ZN3ccc7DD0x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y0E[];
extern void _ZN3ccc7DD0x2y03abcEv();
extern void _ZN3ccc7DD0x2y03efgEv();
extern void _ZN3ccc7DD0x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y03efgEv,_ZTv0_n12_N3ccc7DD0x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y03efgEv,_ZThn4_N3ccc7DD0x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y03abcEv,_ZTv0_n16_N3ccc7DD0x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y03abcEv,_ZThn4_N3ccc7DD0x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y03pqrEv,_ZTv0_n20_N3ccc7DD0x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y03pqrEv,_ZThn4_N3ccc7DD0x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y03efgEv,_ZTv0_n12_N3ccc7DD0x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y03abcEv,_ZTv0_n16_N3ccc7DD0x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y03pqrEv,_ZTv0_n20_N3ccc7DD0x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y0E[] = {
  {&(_ZTVN3ccc7DD0x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y0E[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y03pqrEv,_ZTv0_n20_N3ccc7DD0x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y03pqrEv,_ZThn4_N3ccc7DD0x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y03abcEv,_ZTv0_n16_N3ccc7DD0x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y03abcEv,_ZThn4_N3ccc7DD0x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y03efgEv,_ZTv0_n12_N3ccc7DD0x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y03efgEv,_ZThn4_N3ccc7DD0x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y0E = {  "_ZN3ccc7DD0x2y0E", // class name
  bases__ZN3ccc7DD0x2y0E, 2,
  &(vtc__ZN3ccc7DD0x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y0E),3, //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  CC0x2y1  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x2y13efgEv
  ~CC0x2y1(); // tgen
  CC0x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y1E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y13abcEv");}
void  ccc::CC0x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y13pqrEv");}
void  ccc::CC0x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y13efgEv");}
ccc::CC0x2y1 ::~CC0x2y1(){ note_dtor("_ZN3ccc7CC0x2y1E", this);} // tgen
ccc::CC0x2y1 ::CC0x2y1(){ note_ctor("_ZN3ccc7CC0x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y1E, buf);
    ::ccc::CC0x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y1E);
    dp->::ccc::CC0x2y1::~CC0x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y1E(Test__ZN3ccc7CC0x2y1E, "_ZN3ccc7CC0x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y1C1Ev();
extern void _ZN3ccc7CC0x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y1E[] = {
  NSPAIR(_ZN3ccc7CC0x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y1E[];
extern void _ZN3ccc7CC0x2y13efgEv();
extern void _ZN3ccc7CC0x2y13abcEv();
extern void _ZN3ccc7CC0x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y13abcEv,_ZTv0_n12_N3ccc7CC0x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13abcEv,_ZThn4_N3ccc7CC0x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y13efgEv,_ZTv0_n16_N3ccc7CC0x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13efgEv,_ZThn4_N3ccc7CC0x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y13pqrEv,_ZTv0_n20_N3ccc7CC0x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13pqrEv,_ZThn4_N3ccc7CC0x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y13abcEv,_ZTv0_n12_N3ccc7CC0x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y13efgEv,_ZTv0_n16_N3ccc7CC0x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y13pqrEv,_ZTv0_n20_N3ccc7CC0x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y1E[] = {
  {&(_ZTVN3ccc7CC0x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y1E[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y13pqrEv,_ZTv0_n20_N3ccc7CC0x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y13pqrEv,_ZThn4_N3ccc7CC0x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y13efgEv,_ZTv0_n16_N3ccc7CC0x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y13efgEv,_ZThn4_N3ccc7CC0x2y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y13abcEv,_ZTv0_n12_N3ccc7CC0x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y13abcEv,_ZThn4_N3ccc7CC0x2y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y1E = {  "_ZN3ccc7CC0x2y1E", // class name
  bases__ZN3ccc7CC0x2y1E, 2,
  &(vtc__ZN3ccc7CC0x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y1E),2, //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  DD0x2y1  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD0x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x2y13efgEv
  ~DD0x2y1(); // tgen
  DD0x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y13abcEv");}
void  ccc::DD0x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y13pqrEv");}
void  ccc::DD0x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y13efgEv");}
ccc::DD0x2y1 ::~DD0x2y1(){ note_dtor("_ZN3ccc7DD0x2y1E", this);} // tgen
ccc::DD0x2y1 ::DD0x2y1(){ note_ctor("_ZN3ccc7DD0x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y1E, buf);
    ::ccc::DD0x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y1E);
    dp->::ccc::DD0x2y1::~DD0x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y1E(Test__ZN3ccc7DD0x2y1E, "_ZN3ccc7DD0x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y1C1Ev();
extern void _ZN3ccc7DD0x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y1E[] = {
  NSPAIR(_ZN3ccc7DD0x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y1E[];
extern void _ZN3ccc7DD0x2y13abcEv();
extern void _ZN3ccc7DD0x2y13efgEv();
extern void _ZN3ccc7DD0x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y13efgEv,_ZTv0_n12_N3ccc7DD0x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y13efgEv,_ZThn4_N3ccc7DD0x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y13abcEv,_ZTv0_n16_N3ccc7DD0x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y13abcEv,_ZThn4_N3ccc7DD0x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y13pqrEv,_ZTv0_n20_N3ccc7DD0x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y13pqrEv,_ZThn4_N3ccc7DD0x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y13efgEv,_ZTv0_n12_N3ccc7DD0x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y13abcEv,_ZTv0_n16_N3ccc7DD0x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y13pqrEv,_ZTv0_n20_N3ccc7DD0x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y1E[] = {
  {&(_ZTVN3ccc7DD0x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y1E[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y13pqrEv,_ZTv0_n20_N3ccc7DD0x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y13pqrEv,_ZThn4_N3ccc7DD0x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y13abcEv,_ZTv0_n16_N3ccc7DD0x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y13abcEv,_ZThn4_N3ccc7DD0x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y13efgEv,_ZTv0_n12_N3ccc7DD0x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y13efgEv,_ZThn4_N3ccc7DD0x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y1E = {  "_ZN3ccc7DD0x2y1E", // class name
  bases__ZN3ccc7DD0x2y1E, 2,
  &(vtc__ZN3ccc7DD0x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y1E),3, //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  CC0x2y2  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y23pqrEv
  ~CC0x2y2(); // tgen
  CC0x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y2E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y23efgEv");}
void  ccc::CC0x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y23abcEv");}
void  ccc::CC0x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y23pqrEv");}
ccc::CC0x2y2 ::~CC0x2y2(){ note_dtor("_ZN3ccc7CC0x2y2E", this);} // tgen
ccc::CC0x2y2 ::CC0x2y2(){ note_ctor("_ZN3ccc7CC0x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y2E, buf);
    ::ccc::CC0x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y2E);
    dp->::ccc::CC0x2y2::~CC0x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y2E(Test__ZN3ccc7CC0x2y2E, "_ZN3ccc7CC0x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y2C1Ev();
extern void _ZN3ccc7CC0x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y2E[] = {
  NSPAIR(_ZN3ccc7CC0x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y2E[];
extern void _ZN3ccc7CC0x2y23efgEv();
extern void _ZN3ccc7CC0x2y23abcEv();
extern void _ZN3ccc7CC0x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y23abcEv,_ZTv0_n12_N3ccc7CC0x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23abcEv,_ZThn4_N3ccc7CC0x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y23efgEv,_ZTv0_n16_N3ccc7CC0x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23efgEv,_ZThn4_N3ccc7CC0x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y23pqrEv,_ZTv0_n20_N3ccc7CC0x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23pqrEv,_ZThn4_N3ccc7CC0x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y23abcEv,_ZTv0_n12_N3ccc7CC0x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y23efgEv,_ZTv0_n16_N3ccc7CC0x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y23pqrEv,_ZTv0_n20_N3ccc7CC0x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y2E[] = {
  {&(_ZTVN3ccc7CC0x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y2E[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y23pqrEv,_ZTv0_n20_N3ccc7CC0x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y23pqrEv,_ZThn4_N3ccc7CC0x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y23efgEv,_ZTv0_n16_N3ccc7CC0x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y23efgEv,_ZThn4_N3ccc7CC0x2y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y23abcEv,_ZTv0_n12_N3ccc7CC0x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y23abcEv,_ZThn4_N3ccc7CC0x2y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y2E = {  "_ZN3ccc7CC0x2y2E", // class name
  bases__ZN3ccc7CC0x2y2E, 2,
  &(vtc__ZN3ccc7CC0x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y2E),2, //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  DD0x2y2  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD0x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y23pqrEv
  ~DD0x2y2(); // tgen
  DD0x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y23efgEv");}
void  ccc::DD0x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y23abcEv");}
void  ccc::DD0x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y23pqrEv");}
ccc::DD0x2y2 ::~DD0x2y2(){ note_dtor("_ZN3ccc7DD0x2y2E", this);} // tgen
ccc::DD0x2y2 ::DD0x2y2(){ note_ctor("_ZN3ccc7DD0x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y2E, buf);
    ::ccc::DD0x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y2E);
    dp->::ccc::DD0x2y2::~DD0x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y2E(Test__ZN3ccc7DD0x2y2E, "_ZN3ccc7DD0x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y2C1Ev();
extern void _ZN3ccc7DD0x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y2E[] = {
  NSPAIR(_ZN3ccc7DD0x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y2E[];
extern void _ZN3ccc7DD0x2y23abcEv();
extern void _ZN3ccc7DD0x2y23efgEv();
extern void _ZN3ccc7DD0x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y23efgEv,_ZTv0_n12_N3ccc7DD0x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y23efgEv,_ZThn4_N3ccc7DD0x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y23abcEv,_ZTv0_n16_N3ccc7DD0x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y23abcEv,_ZThn4_N3ccc7DD0x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y23pqrEv,_ZTv0_n20_N3ccc7DD0x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y23pqrEv,_ZThn4_N3ccc7DD0x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y23efgEv,_ZTv0_n12_N3ccc7DD0x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y23abcEv,_ZTv0_n16_N3ccc7DD0x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y23pqrEv,_ZTv0_n20_N3ccc7DD0x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y2E[] = {
  {&(_ZTVN3ccc7DD0x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y2E[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y23pqrEv,_ZTv0_n20_N3ccc7DD0x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y23pqrEv,_ZThn4_N3ccc7DD0x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y23abcEv,_ZTv0_n16_N3ccc7DD0x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y23abcEv,_ZThn4_N3ccc7DD0x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y23efgEv,_ZTv0_n12_N3ccc7DD0x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y23efgEv,_ZThn4_N3ccc7DD0x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y2E = {  "_ZN3ccc7DD0x2y2E", // class name
  bases__ZN3ccc7DD0x2y2E, 2,
  &(vtc__ZN3ccc7DD0x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y2E),3, //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  CC0x2y3  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x2y33abcEv
  ~CC0x2y3(); // tgen
  CC0x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y3E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y33efgEv");}
void  ccc::CC0x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y33pqrEv");}
void  ccc::CC0x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y33abcEv");}
ccc::CC0x2y3 ::~CC0x2y3(){ note_dtor("_ZN3ccc7CC0x2y3E", this);} // tgen
ccc::CC0x2y3 ::CC0x2y3(){ note_ctor("_ZN3ccc7CC0x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y3E, buf);
    ::ccc::CC0x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y3E);
    dp->::ccc::CC0x2y3::~CC0x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y3E(Test__ZN3ccc7CC0x2y3E, "_ZN3ccc7CC0x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y3C1Ev();
extern void _ZN3ccc7CC0x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y3E[] = {
  NSPAIR(_ZN3ccc7CC0x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y3E[];
extern void _ZN3ccc7CC0x2y33efgEv();
extern void _ZN3ccc7CC0x2y33abcEv();
extern void _ZN3ccc7CC0x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y33abcEv,_ZTv0_n12_N3ccc7CC0x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33abcEv,_ZThn4_N3ccc7CC0x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y33efgEv,_ZTv0_n16_N3ccc7CC0x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33efgEv,_ZThn4_N3ccc7CC0x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y33pqrEv,_ZTv0_n20_N3ccc7CC0x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33pqrEv,_ZThn4_N3ccc7CC0x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y33abcEv,_ZTv0_n12_N3ccc7CC0x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y33efgEv,_ZTv0_n16_N3ccc7CC0x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y33pqrEv,_ZTv0_n20_N3ccc7CC0x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y3E[] = {
  {&(_ZTVN3ccc7CC0x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y3E[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y33pqrEv,_ZTv0_n20_N3ccc7CC0x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y33pqrEv,_ZThn4_N3ccc7CC0x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y33efgEv,_ZTv0_n16_N3ccc7CC0x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y33efgEv,_ZThn4_N3ccc7CC0x2y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y33abcEv,_ZTv0_n12_N3ccc7CC0x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y33abcEv,_ZThn4_N3ccc7CC0x2y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y3E = {  "_ZN3ccc7CC0x2y3E", // class name
  bases__ZN3ccc7CC0x2y3E, 2,
  &(vtc__ZN3ccc7CC0x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y3E),2, //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  DD0x2y3  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD0x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x2y33abcEv
  ~DD0x2y3(); // tgen
  DD0x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y33efgEv");}
void  ccc::DD0x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y33pqrEv");}
void  ccc::DD0x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y33abcEv");}
ccc::DD0x2y3 ::~DD0x2y3(){ note_dtor("_ZN3ccc7DD0x2y3E", this);} // tgen
ccc::DD0x2y3 ::DD0x2y3(){ note_ctor("_ZN3ccc7DD0x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y3E, buf);
    ::ccc::DD0x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y3E);
    dp->::ccc::DD0x2y3::~DD0x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y3E(Test__ZN3ccc7DD0x2y3E, "_ZN3ccc7DD0x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y3C1Ev();
extern void _ZN3ccc7DD0x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y3E[] = {
  NSPAIR(_ZN3ccc7DD0x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y3E[];
extern void _ZN3ccc7DD0x2y33abcEv();
extern void _ZN3ccc7DD0x2y33efgEv();
extern void _ZN3ccc7DD0x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y33efgEv,_ZTv0_n12_N3ccc7DD0x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y33efgEv,_ZThn4_N3ccc7DD0x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y33abcEv,_ZTv0_n16_N3ccc7DD0x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y33abcEv,_ZThn4_N3ccc7DD0x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y33pqrEv,_ZTv0_n20_N3ccc7DD0x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y33pqrEv,_ZThn4_N3ccc7DD0x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y33efgEv,_ZTv0_n12_N3ccc7DD0x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y33abcEv,_ZTv0_n16_N3ccc7DD0x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y33pqrEv,_ZTv0_n20_N3ccc7DD0x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y3E[] = {
  {&(_ZTVN3ccc7DD0x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y3E[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y33pqrEv,_ZTv0_n20_N3ccc7DD0x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y33pqrEv,_ZThn4_N3ccc7DD0x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y33abcEv,_ZTv0_n16_N3ccc7DD0x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y33abcEv,_ZThn4_N3ccc7DD0x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y33efgEv,_ZTv0_n12_N3ccc7DD0x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y33efgEv,_ZThn4_N3ccc7DD0x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y3E = {  "_ZN3ccc7DD0x2y3E", // class name
  bases__ZN3ccc7DD0x2y3E, 2,
  &(vtc__ZN3ccc7DD0x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y3E),3, //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  CC0x2y4  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC0x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y43efgEv
  ~CC0x2y4(); // tgen
  CC0x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y4E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y43pqrEv");}
void  ccc::CC0x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y43abcEv");}
void  ccc::CC0x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y43efgEv");}
ccc::CC0x2y4 ::~CC0x2y4(){ note_dtor("_ZN3ccc7CC0x2y4E", this);} // tgen
ccc::CC0x2y4 ::CC0x2y4(){ note_ctor("_ZN3ccc7CC0x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y4E, buf);
    ::ccc::CC0x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y4E);
    dp->::ccc::CC0x2y4::~CC0x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y4E(Test__ZN3ccc7CC0x2y4E, "_ZN3ccc7CC0x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y4C1Ev();
extern void _ZN3ccc7CC0x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y4E[] = {
  NSPAIR(_ZN3ccc7CC0x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y4E[];
extern void _ZN3ccc7CC0x2y43efgEv();
extern void _ZN3ccc7CC0x2y43abcEv();
extern void _ZN3ccc7CC0x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y43abcEv,_ZTv0_n12_N3ccc7CC0x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43abcEv,_ZThn4_N3ccc7CC0x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y43efgEv,_ZTv0_n16_N3ccc7CC0x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43efgEv,_ZThn4_N3ccc7CC0x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y43pqrEv,_ZTv0_n20_N3ccc7CC0x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43pqrEv,_ZThn4_N3ccc7CC0x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y43abcEv,_ZTv0_n12_N3ccc7CC0x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y43efgEv,_ZTv0_n16_N3ccc7CC0x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y43pqrEv,_ZTv0_n20_N3ccc7CC0x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y4E[] = {
  {&(_ZTVN3ccc7CC0x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y4E[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y43pqrEv,_ZTv0_n20_N3ccc7CC0x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y43pqrEv,_ZThn4_N3ccc7CC0x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y43efgEv,_ZTv0_n16_N3ccc7CC0x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y43efgEv,_ZThn4_N3ccc7CC0x2y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y43abcEv,_ZTv0_n12_N3ccc7CC0x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y43abcEv,_ZThn4_N3ccc7CC0x2y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y4E = {  "_ZN3ccc7CC0x2y4E", // class name
  bases__ZN3ccc7CC0x2y4E, 2,
  &(vtc__ZN3ccc7CC0x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y4E),2, //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  DD0x2y4  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD0x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x2y43efgEv
  ~DD0x2y4(); // tgen
  DD0x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y43pqrEv");}
void  ccc::DD0x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y43abcEv");}
void  ccc::DD0x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y43efgEv");}
ccc::DD0x2y4 ::~DD0x2y4(){ note_dtor("_ZN3ccc7DD0x2y4E", this);} // tgen
ccc::DD0x2y4 ::DD0x2y4(){ note_ctor("_ZN3ccc7DD0x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y4E, buf);
    ::ccc::DD0x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y4E);
    dp->::ccc::DD0x2y4::~DD0x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y4E(Test__ZN3ccc7DD0x2y4E, "_ZN3ccc7DD0x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y4C1Ev();
extern void _ZN3ccc7DD0x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y4E[] = {
  NSPAIR(_ZN3ccc7DD0x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y4E[];
extern void _ZN3ccc7DD0x2y43abcEv();
extern void _ZN3ccc7DD0x2y43efgEv();
extern void _ZN3ccc7DD0x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y43efgEv,_ZTv0_n12_N3ccc7DD0x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y43efgEv,_ZThn4_N3ccc7DD0x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y43abcEv,_ZTv0_n16_N3ccc7DD0x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y43abcEv,_ZThn4_N3ccc7DD0x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y43pqrEv,_ZTv0_n20_N3ccc7DD0x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y43pqrEv,_ZThn4_N3ccc7DD0x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y43efgEv,_ZTv0_n12_N3ccc7DD0x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y43abcEv,_ZTv0_n16_N3ccc7DD0x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y43pqrEv,_ZTv0_n20_N3ccc7DD0x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y4E[] = {
  {&(_ZTVN3ccc7DD0x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y4E[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y43pqrEv,_ZTv0_n20_N3ccc7DD0x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y43pqrEv,_ZThn4_N3ccc7DD0x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y43abcEv,_ZTv0_n16_N3ccc7DD0x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y43abcEv,_ZThn4_N3ccc7DD0x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y43efgEv,_ZTv0_n12_N3ccc7DD0x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y43efgEv,_ZThn4_N3ccc7DD0x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y4E = {  "_ZN3ccc7DD0x2y4E", // class name
  bases__ZN3ccc7DD0x2y4E, 2,
  &(vtc__ZN3ccc7DD0x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y4E),3, //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  CC0x2y5  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC0x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y53abcEv
  ~CC0x2y5(); // tgen
  CC0x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y5E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y53pqrEv");}
void  ccc::CC0x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y53efgEv");}
void  ccc::CC0x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y53abcEv");}
ccc::CC0x2y5 ::~CC0x2y5(){ note_dtor("_ZN3ccc7CC0x2y5E", this);} // tgen
ccc::CC0x2y5 ::CC0x2y5(){ note_ctor("_ZN3ccc7CC0x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y5E, buf);
    ::ccc::CC0x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y5E);
    dp->::ccc::CC0x2y5::~CC0x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y5E(Test__ZN3ccc7CC0x2y5E, "_ZN3ccc7CC0x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y5C1Ev();
extern void _ZN3ccc7CC0x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y5E[] = {
  NSPAIR(_ZN3ccc7CC0x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y5E[];
extern void _ZN3ccc7CC0x2y53efgEv();
extern void _ZN3ccc7CC0x2y53abcEv();
extern void _ZN3ccc7CC0x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y53abcEv,_ZTv0_n12_N3ccc7CC0x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53abcEv,_ZThn4_N3ccc7CC0x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y53efgEv,_ZTv0_n16_N3ccc7CC0x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53efgEv,_ZThn4_N3ccc7CC0x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y53pqrEv,_ZTv0_n20_N3ccc7CC0x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53pqrEv,_ZThn4_N3ccc7CC0x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y53abcEv,_ZTv0_n12_N3ccc7CC0x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y53efgEv,_ZTv0_n16_N3ccc7CC0x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y53pqrEv,_ZTv0_n20_N3ccc7CC0x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y5E[] = {
  {&(_ZTVN3ccc7CC0x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y5E[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y53pqrEv,_ZTv0_n20_N3ccc7CC0x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y53pqrEv,_ZThn4_N3ccc7CC0x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y53efgEv,_ZTv0_n16_N3ccc7CC0x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y53efgEv,_ZThn4_N3ccc7CC0x2y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y53abcEv,_ZTv0_n12_N3ccc7CC0x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y53abcEv,_ZThn4_N3ccc7CC0x2y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y5E = {  "_ZN3ccc7CC0x2y5E", // class name
  bases__ZN3ccc7CC0x2y5E, 2,
  &(vtc__ZN3ccc7CC0x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y5E),2, //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  DD0x2y5  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD0x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x2y53abcEv
  ~DD0x2y5(); // tgen
  DD0x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y53pqrEv");}
void  ccc::DD0x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y53efgEv");}
void  ccc::DD0x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y53abcEv");}
ccc::DD0x2y5 ::~DD0x2y5(){ note_dtor("_ZN3ccc7DD0x2y5E", this);} // tgen
ccc::DD0x2y5 ::DD0x2y5(){ note_ctor("_ZN3ccc7DD0x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y5E, buf);
    ::ccc::DD0x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y5E);
    dp->::ccc::DD0x2y5::~DD0x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y5E(Test__ZN3ccc7DD0x2y5E, "_ZN3ccc7DD0x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y5C1Ev();
extern void _ZN3ccc7DD0x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y5E[] = {
  NSPAIR(_ZN3ccc7DD0x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y5E[];
extern void _ZN3ccc7DD0x2y53abcEv();
extern void _ZN3ccc7DD0x2y53efgEv();
extern void _ZN3ccc7DD0x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y53efgEv,_ZTv0_n12_N3ccc7DD0x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y53efgEv,_ZThn4_N3ccc7DD0x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y53abcEv,_ZTv0_n16_N3ccc7DD0x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y53abcEv,_ZThn4_N3ccc7DD0x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y53pqrEv,_ZTv0_n20_N3ccc7DD0x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y53pqrEv,_ZThn4_N3ccc7DD0x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y53efgEv,_ZTv0_n12_N3ccc7DD0x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y53abcEv,_ZTv0_n16_N3ccc7DD0x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y53pqrEv,_ZTv0_n20_N3ccc7DD0x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y5E[] = {
  {&(_ZTVN3ccc7DD0x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y5E[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y53pqrEv,_ZTv0_n20_N3ccc7DD0x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y53pqrEv,_ZThn4_N3ccc7DD0x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y53abcEv,_ZTv0_n16_N3ccc7DD0x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y53abcEv,_ZThn4_N3ccc7DD0x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y53efgEv,_ZTv0_n12_N3ccc7DD0x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y53efgEv,_ZThn4_N3ccc7DD0x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y5E = {  "_ZN3ccc7DD0x2y5E", // class name
  bases__ZN3ccc7DD0x2y5E, 2,
  &(vtc__ZN3ccc7DD0x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y5E),3, //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  CC0x2y6  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y63efgEv
  ~CC0x2y6(); // tgen
  CC0x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y6E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y63abcEv");}
void  ccc::CC0x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y63efgEv");}
ccc::CC0x2y6 ::~CC0x2y6(){ note_dtor("_ZN3ccc7CC0x2y6E", this);} // tgen
ccc::CC0x2y6 ::CC0x2y6(){ note_ctor("_ZN3ccc7CC0x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y6E, buf);
    ::ccc::CC0x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y6E);
    dp->::ccc::CC0x2y6::~CC0x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y6E(Test__ZN3ccc7CC0x2y6E, "_ZN3ccc7CC0x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y6C1Ev();
extern void _ZN3ccc7CC0x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y6E[] = {
  NSPAIR(_ZN3ccc7CC0x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y6E[];
extern void _ZN3ccc7CC0x2y63efgEv();
extern void _ZN3ccc7CC0x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y63abcEv,_ZTv0_n12_N3ccc7CC0x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y63abcEv,_ZThn4_N3ccc7CC0x2y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y63efgEv,_ZTv0_n16_N3ccc7CC0x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y63efgEv,_ZThn4_N3ccc7CC0x2y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y63abcEv,_ZTv0_n12_N3ccc7CC0x2y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y63efgEv,_ZTv0_n16_N3ccc7CC0x2y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y6E[] = {
  {&(_ZTVN3ccc7CC0x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y6E[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y63efgEv,_ZTv0_n16_N3ccc7CC0x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y63efgEv,_ZThn4_N3ccc7CC0x2y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y63abcEv,_ZTv0_n12_N3ccc7CC0x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y63abcEv,_ZThn4_N3ccc7CC0x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y6E = {  "_ZN3ccc7CC0x2y6E", // class name
  bases__ZN3ccc7CC0x2y6E, 2,
  &(vtc__ZN3ccc7CC0x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y6E),2, //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  DD0x2y6  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD0x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x2y63efgEv
  ~DD0x2y6(); // tgen
  DD0x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y63abcEv");}
void  ccc::DD0x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y63efgEv");}
ccc::DD0x2y6 ::~DD0x2y6(){ note_dtor("_ZN3ccc7DD0x2y6E", this);} // tgen
ccc::DD0x2y6 ::DD0x2y6(){ note_ctor("_ZN3ccc7DD0x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y6E, buf);
    ::ccc::DD0x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y6E);
    dp->::ccc::DD0x2y6::~DD0x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y6E(Test__ZN3ccc7DD0x2y6E, "_ZN3ccc7DD0x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y6C1Ev();
extern void _ZN3ccc7DD0x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y6E[] = {
  NSPAIR(_ZN3ccc7DD0x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y6E[];
extern void _ZN3ccc7DD0x2y63abcEv();
extern void _ZN3ccc7DD0x2y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y63efgEv,_ZTv0_n12_N3ccc7DD0x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y63efgEv,_ZThn4_N3ccc7DD0x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y63abcEv,_ZTv0_n16_N3ccc7DD0x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y63abcEv,_ZThn4_N3ccc7DD0x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y63efgEv,_ZTv0_n12_N3ccc7DD0x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y63abcEv,_ZTv0_n16_N3ccc7DD0x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y6E[] = {
  {&(_ZTVN3ccc7DD0x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y6E[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y63abcEv,_ZTv0_n16_N3ccc7DD0x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y63abcEv,_ZThn4_N3ccc7DD0x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y63efgEv,_ZTv0_n12_N3ccc7DD0x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y63efgEv,_ZThn4_N3ccc7DD0x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y6E = {  "_ZN3ccc7DD0x2y6E", // class name
  bases__ZN3ccc7DD0x2y6E, 2,
  &(vtc__ZN3ccc7DD0x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y6E),3, //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  CC0x2y7  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y73pqrEv
  ~CC0x2y7(); // tgen
  CC0x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y7E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y73abcEv");}
void  ccc::CC0x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y73pqrEv");}
ccc::CC0x2y7 ::~CC0x2y7(){ note_dtor("_ZN3ccc7CC0x2y7E", this);} // tgen
ccc::CC0x2y7 ::CC0x2y7(){ note_ctor("_ZN3ccc7CC0x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y7E, buf);
    ::ccc::CC0x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y7E);
    dp->::ccc::CC0x2y7::~CC0x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y7E(Test__ZN3ccc7CC0x2y7E, "_ZN3ccc7CC0x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y7C1Ev();
extern void _ZN3ccc7CC0x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y7E[] = {
  NSPAIR(_ZN3ccc7CC0x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC0x2y73abcEv();
extern void _ZN3ccc7CC0x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y73abcEv,_ZTv0_n12_N3ccc7CC0x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y73abcEv,_ZThn4_N3ccc7CC0x2y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y73pqrEv,_ZTv0_n20_N3ccc7CC0x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y73pqrEv,_ZThn4_N3ccc7CC0x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y73abcEv,_ZTv0_n12_N3ccc7CC0x2y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y73pqrEv,_ZTv0_n20_N3ccc7CC0x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y7E[] = {
  {&(_ZTVN3ccc7CC0x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y7E[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y73pqrEv,_ZTv0_n20_N3ccc7CC0x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y73pqrEv,_ZThn4_N3ccc7CC0x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y73abcEv,_ZTv0_n12_N3ccc7CC0x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y73abcEv,_ZThn4_N3ccc7CC0x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y7E = {  "_ZN3ccc7CC0x2y7E", // class name
  bases__ZN3ccc7CC0x2y7E, 2,
  &(vtc__ZN3ccc7CC0x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y7E),2, //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  DD0x2y7  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD0x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y73pqrEv
  ~DD0x2y7(); // tgen
  DD0x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y73abcEv");}
void  ccc::DD0x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y73pqrEv");}
ccc::DD0x2y7 ::~DD0x2y7(){ note_dtor("_ZN3ccc7DD0x2y7E", this);} // tgen
ccc::DD0x2y7 ::DD0x2y7(){ note_ctor("_ZN3ccc7DD0x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y7E, buf);
    ::ccc::DD0x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y7E);
    dp->::ccc::DD0x2y7::~DD0x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y7E(Test__ZN3ccc7DD0x2y7E, "_ZN3ccc7DD0x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y7C1Ev();
extern void _ZN3ccc7DD0x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y7E[] = {
  NSPAIR(_ZN3ccc7DD0x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y7E[];
extern void _ZN3ccc7DD0x2y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y73abcEv,_ZTv0_n16_N3ccc7DD0x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y73abcEv,_ZThn4_N3ccc7DD0x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y73pqrEv,_ZTv0_n20_N3ccc7DD0x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y73pqrEv,_ZThn4_N3ccc7DD0x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y73abcEv,_ZTv0_n16_N3ccc7DD0x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y73pqrEv,_ZTv0_n20_N3ccc7DD0x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y7E[] = {
  {&(_ZTVN3ccc7DD0x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y7E[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y73pqrEv,_ZTv0_n20_N3ccc7DD0x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y73pqrEv,_ZThn4_N3ccc7DD0x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y73abcEv,_ZTv0_n16_N3ccc7DD0x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y73abcEv,_ZThn4_N3ccc7DD0x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y7E = {  "_ZN3ccc7DD0x2y7E", // class name
  bases__ZN3ccc7DD0x2y7E, 2,
  &(vtc__ZN3ccc7DD0x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y7E),3, //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  CC0x2y8  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y83abcEv
  ~CC0x2y8(); // tgen
  CC0x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y8E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y83efgEv");}
void  ccc::CC0x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y83abcEv");}
ccc::CC0x2y8 ::~CC0x2y8(){ note_dtor("_ZN3ccc7CC0x2y8E", this);} // tgen
ccc::CC0x2y8 ::CC0x2y8(){ note_ctor("_ZN3ccc7CC0x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y8E, buf);
    ::ccc::CC0x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y8E);
    dp->::ccc::CC0x2y8::~CC0x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y8E(Test__ZN3ccc7CC0x2y8E, "_ZN3ccc7CC0x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y8C1Ev();
extern void _ZN3ccc7CC0x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y8E[] = {
  NSPAIR(_ZN3ccc7CC0x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y8E[];
extern void _ZN3ccc7CC0x2y83efgEv();
extern void _ZN3ccc7CC0x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x2y83abcEv,_ZTv0_n12_N3ccc7CC0x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y83abcEv,_ZThn4_N3ccc7CC0x2y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y83efgEv,_ZTv0_n16_N3ccc7CC0x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y83efgEv,_ZThn4_N3ccc7CC0x2y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x2y83abcEv,_ZTv0_n12_N3ccc7CC0x2y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y83efgEv,_ZTv0_n16_N3ccc7CC0x2y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y8E[] = {
  {&(_ZTVN3ccc7CC0x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y8E[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y83efgEv,_ZTv0_n16_N3ccc7CC0x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y83efgEv,_ZThn4_N3ccc7CC0x2y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x2y83abcEv,_ZTv0_n12_N3ccc7CC0x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y83abcEv,_ZThn4_N3ccc7CC0x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y8E = {  "_ZN3ccc7CC0x2y8E", // class name
  bases__ZN3ccc7CC0x2y8E, 2,
  &(vtc__ZN3ccc7CC0x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y8E),2, //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  DD0x2y8  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD0x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x2y83abcEv
  ~DD0x2y8(); // tgen
  DD0x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y83efgEv");}
void  ccc::DD0x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x2y83abcEv");}
ccc::DD0x2y8 ::~DD0x2y8(){ note_dtor("_ZN3ccc7DD0x2y8E", this);} // tgen
ccc::DD0x2y8 ::DD0x2y8(){ note_ctor("_ZN3ccc7DD0x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y8E, buf);
    ::ccc::DD0x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y8E);
    dp->::ccc::DD0x2y8::~DD0x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y8E(Test__ZN3ccc7DD0x2y8E, "_ZN3ccc7DD0x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y8C1Ev();
extern void _ZN3ccc7DD0x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y8E[] = {
  NSPAIR(_ZN3ccc7DD0x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y8E[];
extern void _ZN3ccc7DD0x2y83abcEv();
extern void _ZN3ccc7DD0x2y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y83efgEv,_ZTv0_n12_N3ccc7DD0x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y83efgEv,_ZThn4_N3ccc7DD0x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x2y83abcEv,_ZTv0_n16_N3ccc7DD0x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y83abcEv,_ZThn4_N3ccc7DD0x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y83efgEv,_ZTv0_n12_N3ccc7DD0x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x2y83abcEv,_ZTv0_n16_N3ccc7DD0x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y8E[] = {
  {&(_ZTVN3ccc7DD0x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y8E[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x2y83abcEv,_ZTv0_n16_N3ccc7DD0x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y83abcEv,_ZThn4_N3ccc7DD0x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y83efgEv,_ZTv0_n12_N3ccc7DD0x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y83efgEv,_ZThn4_N3ccc7DD0x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y8E = {  "_ZN3ccc7DD0x2y8E", // class name
  bases__ZN3ccc7DD0x2y8E, 2,
  &(vtc__ZN3ccc7DD0x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y8E),3, //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  CC0x2y9  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y93pqrEv
  ~CC0x2y9(); // tgen
  CC0x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y9E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y93efgEv");}
void  ccc::CC0x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y93pqrEv");}
ccc::CC0x2y9 ::~CC0x2y9(){ note_dtor("_ZN3ccc7CC0x2y9E", this);} // tgen
ccc::CC0x2y9 ::CC0x2y9(){ note_ctor("_ZN3ccc7CC0x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y9E, buf);
    ::ccc::CC0x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC0x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y9E);
    dp->::ccc::CC0x2y9::~CC0x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y9E(Test__ZN3ccc7CC0x2y9E, "_ZN3ccc7CC0x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y9C1Ev();
extern void _ZN3ccc7CC0x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y9E[] = {
  NSPAIR(_ZN3ccc7CC0x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y9E[];
extern void _ZN3ccc7CC0x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC0x2y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x2y93efgEv,_ZTv0_n16_N3ccc7CC0x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y93efgEv,_ZThn4_N3ccc7CC0x2y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x2y93pqrEv,_ZTv0_n20_N3ccc7CC0x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y93pqrEv,_ZThn4_N3ccc7CC0x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x2y93efgEv,_ZTv0_n16_N3ccc7CC0x2y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x2y93pqrEv,_ZTv0_n20_N3ccc7CC0x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x2y9E[] = {
  {&(_ZTVN3ccc7CC0x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x2y9E[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x2y93pqrEv,_ZTv0_n20_N3ccc7CC0x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y93pqrEv,_ZThn4_N3ccc7CC0x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x2y93efgEv,_ZTv0_n16_N3ccc7CC0x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x2y93efgEv,_ZThn4_N3ccc7CC0x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x2y9E = {  "_ZN3ccc7CC0x2y9E", // class name
  bases__ZN3ccc7CC0x2y9E, 2,
  &(vtc__ZN3ccc7CC0x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x2y9E),2, //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  DD0x2y9  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD0x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x2y93pqrEv
  ~DD0x2y9(); // tgen
  DD0x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x2y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x2y93efgEv");}
void  ccc::DD0x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x2y93pqrEv");}
ccc::DD0x2y9 ::~DD0x2y9(){ note_dtor("_ZN3ccc7DD0x2y9E", this);} // tgen
ccc::DD0x2y9 ::DD0x2y9(){ note_ctor("_ZN3ccc7DD0x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x2y9E, buf);
    ::ccc::DD0x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x2y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD0x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x2y9E);
    dp->::ccc::DD0x2y9::~DD0x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x2y9E(Test__ZN3ccc7DD0x2y9E, "_ZN3ccc7DD0x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x2y9C1Ev();
extern void _ZN3ccc7DD0x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x2y9E[] = {
  NSPAIR(_ZN3ccc7DD0x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD0x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x2y93efgEv();
extern void _ZN3ccc7DD0x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x2y93efgEv,_ZTv0_n12_N3ccc7DD0x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y93efgEv,_ZThn4_N3ccc7DD0x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x2y93pqrEv,_ZTv0_n20_N3ccc7DD0x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x2y93pqrEv,_ZThn4_N3ccc7DD0x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x2y93efgEv,_ZTv0_n12_N3ccc7DD0x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x2y93pqrEv,_ZTv0_n20_N3ccc7DD0x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x2y9E[] = {
  {&(_ZTVN3ccc7DD0x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x2y9E[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x2y93pqrEv,_ZTv0_n20_N3ccc7DD0x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y93pqrEv,_ZThn4_N3ccc7DD0x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x2y93efgEv,_ZTv0_n12_N3ccc7DD0x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x2y93efgEv,_ZThn4_N3ccc7DD0x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x2y9E = {  "_ZN3ccc7DD0x2y9E", // class name
  bases__ZN3ccc7DD0x2y9E, 2,
  &(vtc__ZN3ccc7DD0x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x2y9E),3, //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  CC0x2y10  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x2y103abcEv
  ~CC0x2y10(); // tgen
  CC0x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y10E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y103pqrEv");}
void  ccc::CC0x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x2y103abcEv");}
ccc::CC0x2y10 ::~CC0x2y10(){ note_dtor("_ZN3ccc8CC0x2y10E", this);} // tgen
ccc::CC0x2y10 ::CC0x2y10(){ note_ctor("_ZN3ccc8CC0x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y10E, buf);
    ::ccc::CC0x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y10E);
    dp->::ccc::CC0x2y10::~CC0x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y10E(Test__ZN3ccc8CC0x2y10E, "_ZN3ccc8CC0x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y10C1Ev();
extern void _ZN3ccc8CC0x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y10E[] = {
  NSPAIR(_ZN3ccc8CC0x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC0x2y103abcEv();
extern void _ZN3ccc8CC0x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x2y103abcEv,_ZTv0_n12_N3ccc8CC0x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y103abcEv,_ZThn4_N3ccc8CC0x2y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x2y103pqrEv,_ZTv0_n20_N3ccc8CC0x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y103pqrEv,_ZThn4_N3ccc8CC0x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x2y103abcEv,_ZTv0_n12_N3ccc8CC0x2y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x2y103pqrEv,_ZTv0_n20_N3ccc8CC0x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y10E[] = {
  {&(_ZTVN3ccc8CC0x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y10E[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x2y103pqrEv,_ZTv0_n20_N3ccc8CC0x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y103pqrEv,_ZThn4_N3ccc8CC0x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x2y103abcEv,_ZTv0_n12_N3ccc8CC0x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y103abcEv,_ZThn4_N3ccc8CC0x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x2y10E = {  "_ZN3ccc8CC0x2y10E", // class name
  bases__ZN3ccc8CC0x2y10E, 2,
  &(vtc__ZN3ccc8CC0x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y10E),2, //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  DD0x2y10  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD0x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x2y103abcEv
  ~DD0x2y10(); // tgen
  DD0x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x2y103pqrEv");}
void  ccc::DD0x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x2y103abcEv");}
ccc::DD0x2y10 ::~DD0x2y10(){ note_dtor("_ZN3ccc8DD0x2y10E", this);} // tgen
ccc::DD0x2y10 ::DD0x2y10(){ note_ctor("_ZN3ccc8DD0x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y10E, buf);
    ::ccc::DD0x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y10E);
    dp->::ccc::DD0x2y10::~DD0x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y10E(Test__ZN3ccc8DD0x2y10E, "_ZN3ccc8DD0x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y10C1Ev();
extern void _ZN3ccc8DD0x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y10E[] = {
  NSPAIR(_ZN3ccc8DD0x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y10E[];
extern void _ZN3ccc8DD0x2y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x2y103abcEv,_ZTv0_n16_N3ccc8DD0x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y103abcEv,_ZThn4_N3ccc8DD0x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x2y103pqrEv,_ZTv0_n20_N3ccc8DD0x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y103pqrEv,_ZThn4_N3ccc8DD0x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x2y103abcEv,_ZTv0_n16_N3ccc8DD0x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x2y103pqrEv,_ZTv0_n20_N3ccc8DD0x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y10E[] = {
  {&(_ZTVN3ccc8DD0x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y10E[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x2y103pqrEv,_ZTv0_n20_N3ccc8DD0x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y103pqrEv,_ZThn4_N3ccc8DD0x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x2y103abcEv,_ZTv0_n16_N3ccc8DD0x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y103abcEv,_ZThn4_N3ccc8DD0x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x2y10E = {  "_ZN3ccc8DD0x2y10E", // class name
  bases__ZN3ccc8DD0x2y10E, 2,
  &(vtc__ZN3ccc8DD0x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y10E),3, //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  CC0x2y11  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x2y113efgEv
  ~CC0x2y11(); // tgen
  CC0x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y11E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y113pqrEv");}
void  ccc::CC0x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x2y113efgEv");}
ccc::CC0x2y11 ::~CC0x2y11(){ note_dtor("_ZN3ccc8CC0x2y11E", this);} // tgen
ccc::CC0x2y11 ::CC0x2y11(){ note_ctor("_ZN3ccc8CC0x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y11E, buf);
    ::ccc::CC0x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y11E);
    dp->::ccc::CC0x2y11::~CC0x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y11E(Test__ZN3ccc8CC0x2y11E, "_ZN3ccc8CC0x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y11C1Ev();
extern void _ZN3ccc8CC0x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y11E[] = {
  NSPAIR(_ZN3ccc8CC0x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y11E[];
extern void _ZN3ccc8CC0x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC0x2y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x2y113efgEv,_ZTv0_n16_N3ccc8CC0x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y113efgEv,_ZThn4_N3ccc8CC0x2y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x2y113pqrEv,_ZTv0_n20_N3ccc8CC0x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y113pqrEv,_ZThn4_N3ccc8CC0x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x2y113efgEv,_ZTv0_n16_N3ccc8CC0x2y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x2y113pqrEv,_ZTv0_n20_N3ccc8CC0x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y11E[] = {
  {&(_ZTVN3ccc8CC0x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y11E[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x2y113pqrEv,_ZTv0_n20_N3ccc8CC0x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y113pqrEv,_ZThn4_N3ccc8CC0x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x2y113efgEv,_ZTv0_n16_N3ccc8CC0x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y113efgEv,_ZThn4_N3ccc8CC0x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x2y11E = {  "_ZN3ccc8CC0x2y11E", // class name
  bases__ZN3ccc8CC0x2y11E, 2,
  &(vtc__ZN3ccc8CC0x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y11E),2, //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  DD0x2y11  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD0x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x2y113efgEv
  ~DD0x2y11(); // tgen
  DD0x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x2y113pqrEv");}
void  ccc::DD0x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x2y113efgEv");}
ccc::DD0x2y11 ::~DD0x2y11(){ note_dtor("_ZN3ccc8DD0x2y11E", this);} // tgen
ccc::DD0x2y11 ::DD0x2y11(){ note_ctor("_ZN3ccc8DD0x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y11E, buf);
    ::ccc::DD0x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y11E);
    dp->::ccc::DD0x2y11::~DD0x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y11E(Test__ZN3ccc8DD0x2y11E, "_ZN3ccc8DD0x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y11C1Ev();
extern void _ZN3ccc8DD0x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y11E[] = {
  NSPAIR(_ZN3ccc8DD0x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x2y113efgEv();
extern void _ZN3ccc8DD0x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x2y113efgEv,_ZTv0_n12_N3ccc8DD0x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y113efgEv,_ZThn4_N3ccc8DD0x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x2y113pqrEv,_ZTv0_n20_N3ccc8DD0x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y113pqrEv,_ZThn4_N3ccc8DD0x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x2y113efgEv,_ZTv0_n12_N3ccc8DD0x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x2y113pqrEv,_ZTv0_n20_N3ccc8DD0x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y11E[] = {
  {&(_ZTVN3ccc8DD0x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y11E[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x2y113pqrEv,_ZTv0_n20_N3ccc8DD0x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y113pqrEv,_ZThn4_N3ccc8DD0x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x2y113efgEv,_ZTv0_n12_N3ccc8DD0x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y113efgEv,_ZThn4_N3ccc8DD0x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x2y11E = {  "_ZN3ccc8DD0x2y11E", // class name
  bases__ZN3ccc8DD0x2y11E, 2,
  &(vtc__ZN3ccc8DD0x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y11E),3, //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  CC0x2y12  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC0x2y123abcEv
  ~CC0x2y12(); // tgen
  CC0x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x2y123abcEv");}
ccc::CC0x2y12 ::~CC0x2y12(){ note_dtor("_ZN3ccc8CC0x2y12E", this);} // tgen
ccc::CC0x2y12 ::CC0x2y12(){ note_ctor("_ZN3ccc8CC0x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y12E, buf);
    ::ccc::CC0x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y12E);
    dp->::ccc::CC0x2y12::~CC0x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y12E(Test__ZN3ccc8CC0x2y12E, "_ZN3ccc8CC0x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y12C1Ev();
extern void _ZN3ccc8CC0x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y12E[] = {
  NSPAIR(_ZN3ccc8CC0x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC0x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x2y123abcEv,_ZTv0_n12_N3ccc8CC0x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y123abcEv,_ZThn4_N3ccc8CC0x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x2y123abcEv,_ZTv0_n12_N3ccc8CC0x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y12E[] = {
  {&(_ZTVN3ccc8CC0x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y12E[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x2y123abcEv,_ZTv0_n12_N3ccc8CC0x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y123abcEv,_ZThn4_N3ccc8CC0x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x2y12E = {  "_ZN3ccc8CC0x2y12E", // class name
  bases__ZN3ccc8CC0x2y12E, 2,
  &(vtc__ZN3ccc8CC0x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y12E),2, //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  DD0x2y12  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD0x2y123abcEv
  ~DD0x2y12(); // tgen
  DD0x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x2y123abcEv");}
ccc::DD0x2y12 ::~DD0x2y12(){ note_dtor("_ZN3ccc8DD0x2y12E", this);} // tgen
ccc::DD0x2y12 ::DD0x2y12(){ note_ctor("_ZN3ccc8DD0x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y12E, buf);
    ::ccc::DD0x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y12E);
    dp->::ccc::DD0x2y12::~DD0x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y12E(Test__ZN3ccc8DD0x2y12E, "_ZN3ccc8DD0x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y12C1Ev();
extern void _ZN3ccc8DD0x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y12E[] = {
  NSPAIR(_ZN3ccc8DD0x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y12E[];
extern void _ZN3ccc8DD0x2y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x2y123abcEv,_ZTv0_n16_N3ccc8DD0x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y123abcEv,_ZThn4_N3ccc8DD0x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x2y123abcEv,_ZTv0_n16_N3ccc8DD0x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y12E[] = {
  {&(_ZTVN3ccc8DD0x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y12E[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x2y123abcEv,_ZTv0_n16_N3ccc8DD0x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y123abcEv,_ZThn4_N3ccc8DD0x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x2y12E = {  "_ZN3ccc8DD0x2y12E", // class name
  bases__ZN3ccc8DD0x2y12E, 2,
  &(vtc__ZN3ccc8DD0x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y12E),3, //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  CC0x2y13  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC0x2y133efgEv
  ~CC0x2y13(); // tgen
  CC0x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x2y133efgEv");}
ccc::CC0x2y13 ::~CC0x2y13(){ note_dtor("_ZN3ccc8CC0x2y13E", this);} // tgen
ccc::CC0x2y13 ::CC0x2y13(){ note_ctor("_ZN3ccc8CC0x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y13E, buf);
    ::ccc::CC0x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y13E);
    dp->::ccc::CC0x2y13::~CC0x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y13E(Test__ZN3ccc8CC0x2y13E, "_ZN3ccc8CC0x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y13C1Ev();
extern void _ZN3ccc8CC0x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y13E[] = {
  NSPAIR(_ZN3ccc8CC0x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y13E[];
extern void _ZN3ccc8CC0x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x2y133efgEv,_ZTv0_n16_N3ccc8CC0x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y133efgEv,_ZThn4_N3ccc8CC0x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x2y133efgEv,_ZTv0_n16_N3ccc8CC0x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y13E[] = {
  {&(_ZTVN3ccc8CC0x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y13E[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x2y133efgEv,_ZTv0_n16_N3ccc8CC0x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y133efgEv,_ZThn4_N3ccc8CC0x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x2y13E = {  "_ZN3ccc8CC0x2y13E", // class name
  bases__ZN3ccc8CC0x2y13E, 2,
  &(vtc__ZN3ccc8CC0x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y13E),2, //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  DD0x2y13  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD0x2y133efgEv
  ~DD0x2y13(); // tgen
  DD0x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x2y133efgEv");}
ccc::DD0x2y13 ::~DD0x2y13(){ note_dtor("_ZN3ccc8DD0x2y13E", this);} // tgen
ccc::DD0x2y13 ::DD0x2y13(){ note_ctor("_ZN3ccc8DD0x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y13E, buf);
    ::ccc::DD0x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y13E);
    dp->::ccc::DD0x2y13::~DD0x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y13E(Test__ZN3ccc8DD0x2y13E, "_ZN3ccc8DD0x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y13C1Ev();
extern void _ZN3ccc8DD0x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y13E[] = {
  NSPAIR(_ZN3ccc8DD0x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x2y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x2y133efgEv,_ZTv0_n12_N3ccc8DD0x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y133efgEv,_ZThn4_N3ccc8DD0x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x2y133efgEv,_ZTv0_n12_N3ccc8DD0x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y13E[] = {
  {&(_ZTVN3ccc8DD0x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y13E[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x2y133efgEv,_ZTv0_n12_N3ccc8DD0x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y133efgEv,_ZThn4_N3ccc8DD0x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x2y13E = {  "_ZN3ccc8DD0x2y13E", // class name
  bases__ZN3ccc8DD0x2y13E, 2,
  &(vtc__ZN3ccc8DD0x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y13E),3, //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  CC0x2y14  : virtual ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y143pqrEv
  ~CC0x2y14(); // tgen
  CC0x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y143pqrEv");}
ccc::CC0x2y14 ::~CC0x2y14(){ note_dtor("_ZN3ccc8CC0x2y14E", this);} // tgen
ccc::CC0x2y14 ::CC0x2y14(){ note_ctor("_ZN3ccc8CC0x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y14E, buf);
    ::ccc::CC0x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y14E);
    dp->::ccc::CC0x2y14::~CC0x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y14E(Test__ZN3ccc8CC0x2y14E, "_ZN3ccc8CC0x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y14C1Ev();
extern void _ZN3ccc8CC0x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y14E[] = {
  NSPAIR(_ZN3ccc8CC0x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC0x2y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x2y143pqrEv,_ZTv0_n20_N3ccc8CC0x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y143pqrEv,_ZThn4_N3ccc8CC0x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x2y143pqrEv,_ZTv0_n20_N3ccc8CC0x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y14E[] = {
  {&(_ZTVN3ccc8CC0x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y14E[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x2y143pqrEv,_ZTv0_n20_N3ccc8CC0x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x2y143pqrEv,_ZThn4_N3ccc8CC0x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x2y14E = {  "_ZN3ccc8CC0x2y14E", // class name
  bases__ZN3ccc8CC0x2y14E, 2,
  &(vtc__ZN3ccc8CC0x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y14E),2, //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  DD0x2y14  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD0x2y143pqrEv
  ~DD0x2y14(); // tgen
  DD0x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x2y143pqrEv");}
ccc::DD0x2y14 ::~DD0x2y14(){ note_dtor("_ZN3ccc8DD0x2y14E", this);} // tgen
ccc::DD0x2y14 ::DD0x2y14(){ note_ctor("_ZN3ccc8DD0x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y14E, buf);
    ::ccc::DD0x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y14E);
    dp->::ccc::DD0x2y14::~DD0x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y14E(Test__ZN3ccc8DD0x2y14E, "_ZN3ccc8DD0x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y14C1Ev();
extern void _ZN3ccc8DD0x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y14E[] = {
  NSPAIR(_ZN3ccc8DD0x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x2y143pqrEv,_ZTv0_n20_N3ccc8DD0x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x2y143pqrEv,_ZThn4_N3ccc8DD0x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x2y143pqrEv,_ZTv0_n20_N3ccc8DD0x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y14E[] = {
  {&(_ZTVN3ccc8DD0x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y14E[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x2y143pqrEv,_ZTv0_n20_N3ccc8DD0x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x2y143pqrEv,_ZThn4_N3ccc8DD0x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x2y14E = {  "_ZN3ccc8DD0x2y14E", // class name
  bases__ZN3ccc8DD0x2y14E, 2,
  &(vtc__ZN3ccc8DD0x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y14E),3, //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  CC0x2y15  : virtual ::ccc::AA0 , ::ccc::BB2 {
  ~CC0x2y15(); // tgen
  CC0x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x2y15 ::~CC0x2y15(){ note_dtor("_ZN3ccc8CC0x2y15E", this);} // tgen
ccc::CC0x2y15 ::CC0x2y15(){ note_ctor("_ZN3ccc8CC0x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y15E, buf);
    ::ccc::CC0x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC0x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y15E);
    dp->::ccc::CC0x2y15::~CC0x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y15E(Test__ZN3ccc8CC0x2y15E, "_ZN3ccc8CC0x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y15C1Ev();
extern void _ZN3ccc8CC0x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y15E[] = {
  NSPAIR(_ZN3ccc8CC0x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x2y15E[] = {
  {&(_ZTVN3ccc8CC0x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x2y15E[];
Class_Descriptor cd__ZN3ccc8CC0x2y15E = {  "_ZN3ccc8CC0x2y15E", // class name
  bases__ZN3ccc8CC0x2y15E, 2,
  &(vtc__ZN3ccc8CC0x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x2y15  : virtual ::ccc::AA0 , virtual ::ccc::BB2 {
  ~DD0x2y15(); // tgen
  DD0x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x2y15 ::~DD0x2y15(){ note_dtor("_ZN3ccc8DD0x2y15E", this);} // tgen
ccc::DD0x2y15 ::DD0x2y15(){ note_ctor("_ZN3ccc8DD0x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x2y15E, buf);
    ::ccc::DD0x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x2y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD0x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x2y15E);
    dp->::ccc::DD0x2y15::~DD0x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x2y15E(Test__ZN3ccc8DD0x2y15E, "_ZN3ccc8DD0x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x2y15C1Ev();
extern void _ZN3ccc8DD0x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x2y15E[] = {
  NSPAIR(_ZN3ccc8DD0x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD0x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x2y15E[] = {
  {&(_ZTVN3ccc8DD0x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x2y15E[];
Class_Descriptor cd__ZN3ccc8DD0x2y15E = {  "_ZN3ccc8DD0x2y15E", // class name
  bases__ZN3ccc8DD0x2y15E, 2,
  &(vtc__ZN3ccc8DD0x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y0  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y03pqrEv
  ~CC0x3y0(); // tgen
  CC0x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y0E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y03abcEv");}
void  ccc::CC0x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y03efgEv");}
void  ccc::CC0x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y03pqrEv");}
ccc::CC0x3y0 ::~CC0x3y0(){ note_dtor("_ZN3ccc7CC0x3y0E", this);} // tgen
ccc::CC0x3y0 ::CC0x3y0(){ note_ctor("_ZN3ccc7CC0x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y0E, buf);
    ::ccc::CC0x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y0E);
    dp->::ccc::CC0x3y0::~CC0x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y0E(Test__ZN3ccc7CC0x3y0E, "_ZN3ccc7CC0x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y0C1Ev();
extern void _ZN3ccc7CC0x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y0E[] = {
  NSPAIR(_ZN3ccc7CC0x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y0E[];
extern void _ZN3ccc7CC0x3y03efgEv();
extern void _ZN3ccc7CC0x3y03pqrEv();
extern void _ZN3ccc7CC0x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y03abcEv,_ZTv0_n12_N3ccc7CC0x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03abcEv,_ZThn4_N3ccc7CC0x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y03efgEv,_ZTv0_n16_N3ccc7CC0x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03efgEv,_ZThn4_N3ccc7CC0x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y03pqrEv,_ZTv0_n20_N3ccc7CC0x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03pqrEv,_ZThn4_N3ccc7CC0x3y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y03abcEv,_ZTv0_n12_N3ccc7CC0x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y03efgEv,_ZTv0_n16_N3ccc7CC0x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y03pqrEv,_ZTv0_n20_N3ccc7CC0x3y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y0E[] = {
  {&(_ZTVN3ccc7CC0x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y0E[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y03pqrEv,_ZTv0_n20_N3ccc7CC0x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y03pqrEv,_ZThn4_N3ccc7CC0x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y03efgEv,_ZTv0_n16_N3ccc7CC0x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y03efgEv,_ZThn4_N3ccc7CC0x3y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y03abcEv,_ZTv0_n12_N3ccc7CC0x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y03abcEv,_ZThn4_N3ccc7CC0x3y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y0E = {  "_ZN3ccc7CC0x3y0E", // class name
  bases__ZN3ccc7CC0x3y0E, 2,
  &(vtc__ZN3ccc7CC0x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y0E),2, //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  DD0x3y0  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD0x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y03pqrEv
  ~DD0x3y0(); // tgen
  DD0x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y03abcEv");}
void  ccc::DD0x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y03efgEv");}
void  ccc::DD0x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y03pqrEv");}
ccc::DD0x3y0 ::~DD0x3y0(){ note_dtor("_ZN3ccc7DD0x3y0E", this);} // tgen
ccc::DD0x3y0 ::DD0x3y0(){ note_ctor("_ZN3ccc7DD0x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y0E, buf);
    ::ccc::DD0x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y0E);
    dp->::ccc::DD0x3y0::~DD0x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y0E(Test__ZN3ccc7DD0x3y0E, "_ZN3ccc7DD0x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y0C1Ev();
extern void _ZN3ccc7DD0x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y0E[] = {
  NSPAIR(_ZN3ccc7DD0x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y0E[];
extern void _ZN3ccc7DD0x3y03abcEv();
extern void _ZN3ccc7DD0x3y03efgEv();
extern void _ZN3ccc7DD0x3y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y03efgEv,_ZTv0_n12_N3ccc7DD0x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y03efgEv,_ZThn4_N3ccc7DD0x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y03pqrEv,_ZTv0_n16_N3ccc7DD0x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y03pqrEv,_ZThn4_N3ccc7DD0x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y03abcEv,_ZTv0_n20_N3ccc7DD0x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y03abcEv,_ZThn4_N3ccc7DD0x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y03efgEv,_ZTv0_n12_N3ccc7DD0x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y03pqrEv,_ZTv0_n16_N3ccc7DD0x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y03abcEv,_ZTv0_n20_N3ccc7DD0x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y0E[] = {
  {&(_ZTVN3ccc7DD0x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y0E[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y03abcEv,_ZTv0_n20_N3ccc7DD0x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y03abcEv,_ZThn4_N3ccc7DD0x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y03pqrEv,_ZTv0_n16_N3ccc7DD0x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y03pqrEv,_ZThn4_N3ccc7DD0x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y03efgEv,_ZTv0_n12_N3ccc7DD0x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y03efgEv,_ZThn4_N3ccc7DD0x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y0E = {  "_ZN3ccc7DD0x3y0E", // class name
  bases__ZN3ccc7DD0x3y0E, 2,
  &(vtc__ZN3ccc7DD0x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y0E),3, //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  CC0x3y1  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x3y13efgEv
  ~CC0x3y1(); // tgen
  CC0x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y1E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y13abcEv");}
void  ccc::CC0x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y13pqrEv");}
void  ccc::CC0x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y13efgEv");}
ccc::CC0x3y1 ::~CC0x3y1(){ note_dtor("_ZN3ccc7CC0x3y1E", this);} // tgen
ccc::CC0x3y1 ::CC0x3y1(){ note_ctor("_ZN3ccc7CC0x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y1E, buf);
    ::ccc::CC0x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y1E);
    dp->::ccc::CC0x3y1::~CC0x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y1E(Test__ZN3ccc7CC0x3y1E, "_ZN3ccc7CC0x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y1C1Ev();
extern void _ZN3ccc7CC0x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y1E[] = {
  NSPAIR(_ZN3ccc7CC0x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y1E[];
extern void _ZN3ccc7CC0x3y13efgEv();
extern void _ZN3ccc7CC0x3y13pqrEv();
extern void _ZN3ccc7CC0x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y13abcEv,_ZTv0_n12_N3ccc7CC0x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13abcEv,_ZThn4_N3ccc7CC0x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y13efgEv,_ZTv0_n16_N3ccc7CC0x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13efgEv,_ZThn4_N3ccc7CC0x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y13pqrEv,_ZTv0_n20_N3ccc7CC0x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13pqrEv,_ZThn4_N3ccc7CC0x3y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y13abcEv,_ZTv0_n12_N3ccc7CC0x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y13efgEv,_ZTv0_n16_N3ccc7CC0x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y13pqrEv,_ZTv0_n20_N3ccc7CC0x3y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y1E[] = {
  {&(_ZTVN3ccc7CC0x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y1E[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y13pqrEv,_ZTv0_n20_N3ccc7CC0x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y13pqrEv,_ZThn4_N3ccc7CC0x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y13efgEv,_ZTv0_n16_N3ccc7CC0x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y13efgEv,_ZThn4_N3ccc7CC0x3y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y13abcEv,_ZTv0_n12_N3ccc7CC0x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y13abcEv,_ZThn4_N3ccc7CC0x3y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y1E = {  "_ZN3ccc7CC0x3y1E", // class name
  bases__ZN3ccc7CC0x3y1E, 2,
  &(vtc__ZN3ccc7CC0x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y1E),2, //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  DD0x3y1  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD0x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x3y13efgEv
  ~DD0x3y1(); // tgen
  DD0x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y13abcEv");}
void  ccc::DD0x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y13pqrEv");}
void  ccc::DD0x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y13efgEv");}
ccc::DD0x3y1 ::~DD0x3y1(){ note_dtor("_ZN3ccc7DD0x3y1E", this);} // tgen
ccc::DD0x3y1 ::DD0x3y1(){ note_ctor("_ZN3ccc7DD0x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y1E, buf);
    ::ccc::DD0x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y1E);
    dp->::ccc::DD0x3y1::~DD0x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y1E(Test__ZN3ccc7DD0x3y1E, "_ZN3ccc7DD0x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y1C1Ev();
extern void _ZN3ccc7DD0x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y1E[] = {
  NSPAIR(_ZN3ccc7DD0x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y1E[];
extern void _ZN3ccc7DD0x3y13abcEv();
extern void _ZN3ccc7DD0x3y13efgEv();
extern void _ZN3ccc7DD0x3y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y13efgEv,_ZTv0_n12_N3ccc7DD0x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y13efgEv,_ZThn4_N3ccc7DD0x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y13pqrEv,_ZTv0_n16_N3ccc7DD0x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y13pqrEv,_ZThn4_N3ccc7DD0x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y13abcEv,_ZTv0_n20_N3ccc7DD0x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y13abcEv,_ZThn4_N3ccc7DD0x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y13efgEv,_ZTv0_n12_N3ccc7DD0x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y13pqrEv,_ZTv0_n16_N3ccc7DD0x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y13abcEv,_ZTv0_n20_N3ccc7DD0x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y1E[] = {
  {&(_ZTVN3ccc7DD0x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y1E[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y13abcEv,_ZTv0_n20_N3ccc7DD0x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y13abcEv,_ZThn4_N3ccc7DD0x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y13pqrEv,_ZTv0_n16_N3ccc7DD0x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y13pqrEv,_ZThn4_N3ccc7DD0x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y13efgEv,_ZTv0_n12_N3ccc7DD0x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y13efgEv,_ZThn4_N3ccc7DD0x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y1E = {  "_ZN3ccc7DD0x3y1E", // class name
  bases__ZN3ccc7DD0x3y1E, 2,
  &(vtc__ZN3ccc7DD0x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y1E),3, //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  CC0x3y2  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y23pqrEv
  ~CC0x3y2(); // tgen
  CC0x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y2E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y23efgEv");}
void  ccc::CC0x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y23abcEv");}
void  ccc::CC0x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y23pqrEv");}
ccc::CC0x3y2 ::~CC0x3y2(){ note_dtor("_ZN3ccc7CC0x3y2E", this);} // tgen
ccc::CC0x3y2 ::CC0x3y2(){ note_ctor("_ZN3ccc7CC0x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y2E, buf);
    ::ccc::CC0x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y2E);
    dp->::ccc::CC0x3y2::~CC0x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y2E(Test__ZN3ccc7CC0x3y2E, "_ZN3ccc7CC0x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y2C1Ev();
extern void _ZN3ccc7CC0x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y2E[] = {
  NSPAIR(_ZN3ccc7CC0x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y2E[];
extern void _ZN3ccc7CC0x3y23efgEv();
extern void _ZN3ccc7CC0x3y23pqrEv();
extern void _ZN3ccc7CC0x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y23abcEv,_ZTv0_n12_N3ccc7CC0x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23abcEv,_ZThn4_N3ccc7CC0x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y23efgEv,_ZTv0_n16_N3ccc7CC0x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23efgEv,_ZThn4_N3ccc7CC0x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y23pqrEv,_ZTv0_n20_N3ccc7CC0x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23pqrEv,_ZThn4_N3ccc7CC0x3y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y23abcEv,_ZTv0_n12_N3ccc7CC0x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y23efgEv,_ZTv0_n16_N3ccc7CC0x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y23pqrEv,_ZTv0_n20_N3ccc7CC0x3y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y2E[] = {
  {&(_ZTVN3ccc7CC0x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y2E[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y23pqrEv,_ZTv0_n20_N3ccc7CC0x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y23pqrEv,_ZThn4_N3ccc7CC0x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y23efgEv,_ZTv0_n16_N3ccc7CC0x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y23efgEv,_ZThn4_N3ccc7CC0x3y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y23abcEv,_ZTv0_n12_N3ccc7CC0x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y23abcEv,_ZThn4_N3ccc7CC0x3y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y2E = {  "_ZN3ccc7CC0x3y2E", // class name
  bases__ZN3ccc7CC0x3y2E, 2,
  &(vtc__ZN3ccc7CC0x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y2E),2, //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  DD0x3y2  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD0x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y23pqrEv
  ~DD0x3y2(); // tgen
  DD0x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y23efgEv");}
void  ccc::DD0x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y23abcEv");}
void  ccc::DD0x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y23pqrEv");}
ccc::DD0x3y2 ::~DD0x3y2(){ note_dtor("_ZN3ccc7DD0x3y2E", this);} // tgen
ccc::DD0x3y2 ::DD0x3y2(){ note_ctor("_ZN3ccc7DD0x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y2E, buf);
    ::ccc::DD0x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y2E);
    dp->::ccc::DD0x3y2::~DD0x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y2E(Test__ZN3ccc7DD0x3y2E, "_ZN3ccc7DD0x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y2C1Ev();
extern void _ZN3ccc7DD0x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y2E[] = {
  NSPAIR(_ZN3ccc7DD0x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y2E[];
extern void _ZN3ccc7DD0x3y23abcEv();
extern void _ZN3ccc7DD0x3y23efgEv();
extern void _ZN3ccc7DD0x3y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y23efgEv,_ZTv0_n12_N3ccc7DD0x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y23efgEv,_ZThn4_N3ccc7DD0x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y23pqrEv,_ZTv0_n16_N3ccc7DD0x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y23pqrEv,_ZThn4_N3ccc7DD0x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y23abcEv,_ZTv0_n20_N3ccc7DD0x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y23abcEv,_ZThn4_N3ccc7DD0x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y23efgEv,_ZTv0_n12_N3ccc7DD0x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y23pqrEv,_ZTv0_n16_N3ccc7DD0x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y23abcEv,_ZTv0_n20_N3ccc7DD0x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y2E[] = {
  {&(_ZTVN3ccc7DD0x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y2E[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y23abcEv,_ZTv0_n20_N3ccc7DD0x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y23abcEv,_ZThn4_N3ccc7DD0x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y23pqrEv,_ZTv0_n16_N3ccc7DD0x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y23pqrEv,_ZThn4_N3ccc7DD0x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y23efgEv,_ZTv0_n12_N3ccc7DD0x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y23efgEv,_ZThn4_N3ccc7DD0x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y2E = {  "_ZN3ccc7DD0x3y2E", // class name
  bases__ZN3ccc7DD0x3y2E, 2,
  &(vtc__ZN3ccc7DD0x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y2E),3, //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  CC0x3y3  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x3y33abcEv
  ~CC0x3y3(); // tgen
  CC0x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y3E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y33efgEv");}
void  ccc::CC0x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y33pqrEv");}
void  ccc::CC0x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y33abcEv");}
ccc::CC0x3y3 ::~CC0x3y3(){ note_dtor("_ZN3ccc7CC0x3y3E", this);} // tgen
ccc::CC0x3y3 ::CC0x3y3(){ note_ctor("_ZN3ccc7CC0x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y3E, buf);
    ::ccc::CC0x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y3E);
    dp->::ccc::CC0x3y3::~CC0x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y3E(Test__ZN3ccc7CC0x3y3E, "_ZN3ccc7CC0x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y3C1Ev();
extern void _ZN3ccc7CC0x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y3E[] = {
  NSPAIR(_ZN3ccc7CC0x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y3E[];
extern void _ZN3ccc7CC0x3y33efgEv();
extern void _ZN3ccc7CC0x3y33pqrEv();
extern void _ZN3ccc7CC0x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y33abcEv,_ZTv0_n12_N3ccc7CC0x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33abcEv,_ZThn4_N3ccc7CC0x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y33efgEv,_ZTv0_n16_N3ccc7CC0x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33efgEv,_ZThn4_N3ccc7CC0x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y33pqrEv,_ZTv0_n20_N3ccc7CC0x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33pqrEv,_ZThn4_N3ccc7CC0x3y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y33abcEv,_ZTv0_n12_N3ccc7CC0x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y33efgEv,_ZTv0_n16_N3ccc7CC0x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y33pqrEv,_ZTv0_n20_N3ccc7CC0x3y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y3E[] = {
  {&(_ZTVN3ccc7CC0x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y3E[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y33pqrEv,_ZTv0_n20_N3ccc7CC0x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y33pqrEv,_ZThn4_N3ccc7CC0x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y33efgEv,_ZTv0_n16_N3ccc7CC0x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y33efgEv,_ZThn4_N3ccc7CC0x3y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y33abcEv,_ZTv0_n12_N3ccc7CC0x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y33abcEv,_ZThn4_N3ccc7CC0x3y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y3E = {  "_ZN3ccc7CC0x3y3E", // class name
  bases__ZN3ccc7CC0x3y3E, 2,
  &(vtc__ZN3ccc7CC0x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y3E),2, //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  DD0x3y3  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD0x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x3y33abcEv
  ~DD0x3y3(); // tgen
  DD0x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y33efgEv");}
void  ccc::DD0x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y33pqrEv");}
void  ccc::DD0x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y33abcEv");}
ccc::DD0x3y3 ::~DD0x3y3(){ note_dtor("_ZN3ccc7DD0x3y3E", this);} // tgen
ccc::DD0x3y3 ::DD0x3y3(){ note_ctor("_ZN3ccc7DD0x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y3E, buf);
    ::ccc::DD0x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y3E);
    dp->::ccc::DD0x3y3::~DD0x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y3E(Test__ZN3ccc7DD0x3y3E, "_ZN3ccc7DD0x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y3C1Ev();
extern void _ZN3ccc7DD0x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y3E[] = {
  NSPAIR(_ZN3ccc7DD0x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y3E[];
extern void _ZN3ccc7DD0x3y33abcEv();
extern void _ZN3ccc7DD0x3y33efgEv();
extern void _ZN3ccc7DD0x3y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y33efgEv,_ZTv0_n12_N3ccc7DD0x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y33efgEv,_ZThn4_N3ccc7DD0x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y33pqrEv,_ZTv0_n16_N3ccc7DD0x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y33pqrEv,_ZThn4_N3ccc7DD0x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y33abcEv,_ZTv0_n20_N3ccc7DD0x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y33abcEv,_ZThn4_N3ccc7DD0x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y33efgEv,_ZTv0_n12_N3ccc7DD0x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y33pqrEv,_ZTv0_n16_N3ccc7DD0x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y33abcEv,_ZTv0_n20_N3ccc7DD0x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y3E[] = {
  {&(_ZTVN3ccc7DD0x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y3E[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y33abcEv,_ZTv0_n20_N3ccc7DD0x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y33abcEv,_ZThn4_N3ccc7DD0x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y33pqrEv,_ZTv0_n16_N3ccc7DD0x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y33pqrEv,_ZThn4_N3ccc7DD0x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y33efgEv,_ZTv0_n12_N3ccc7DD0x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y33efgEv,_ZThn4_N3ccc7DD0x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y3E = {  "_ZN3ccc7DD0x3y3E", // class name
  bases__ZN3ccc7DD0x3y3E, 2,
  &(vtc__ZN3ccc7DD0x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y3E),3, //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  CC0x3y4  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC0x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y43efgEv
  ~CC0x3y4(); // tgen
  CC0x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y4E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y43pqrEv");}
void  ccc::CC0x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y43abcEv");}
void  ccc::CC0x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y43efgEv");}
ccc::CC0x3y4 ::~CC0x3y4(){ note_dtor("_ZN3ccc7CC0x3y4E", this);} // tgen
ccc::CC0x3y4 ::CC0x3y4(){ note_ctor("_ZN3ccc7CC0x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y4E, buf);
    ::ccc::CC0x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y4E);
    dp->::ccc::CC0x3y4::~CC0x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y4E(Test__ZN3ccc7CC0x3y4E, "_ZN3ccc7CC0x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y4C1Ev();
extern void _ZN3ccc7CC0x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y4E[] = {
  NSPAIR(_ZN3ccc7CC0x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y4E[];
extern void _ZN3ccc7CC0x3y43efgEv();
extern void _ZN3ccc7CC0x3y43pqrEv();
extern void _ZN3ccc7CC0x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y43abcEv,_ZTv0_n12_N3ccc7CC0x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43abcEv,_ZThn4_N3ccc7CC0x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y43efgEv,_ZTv0_n16_N3ccc7CC0x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43efgEv,_ZThn4_N3ccc7CC0x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y43pqrEv,_ZTv0_n20_N3ccc7CC0x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43pqrEv,_ZThn4_N3ccc7CC0x3y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y43abcEv,_ZTv0_n12_N3ccc7CC0x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y43efgEv,_ZTv0_n16_N3ccc7CC0x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y43pqrEv,_ZTv0_n20_N3ccc7CC0x3y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y4E[] = {
  {&(_ZTVN3ccc7CC0x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y4E[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y43pqrEv,_ZTv0_n20_N3ccc7CC0x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y43pqrEv,_ZThn4_N3ccc7CC0x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y43efgEv,_ZTv0_n16_N3ccc7CC0x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y43efgEv,_ZThn4_N3ccc7CC0x3y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y43abcEv,_ZTv0_n12_N3ccc7CC0x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y43abcEv,_ZThn4_N3ccc7CC0x3y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y4E = {  "_ZN3ccc7CC0x3y4E", // class name
  bases__ZN3ccc7CC0x3y4E, 2,
  &(vtc__ZN3ccc7CC0x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y4E),2, //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  DD0x3y4  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD0x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x3y43efgEv
  ~DD0x3y4(); // tgen
  DD0x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y43pqrEv");}
void  ccc::DD0x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y43abcEv");}
void  ccc::DD0x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y43efgEv");}
ccc::DD0x3y4 ::~DD0x3y4(){ note_dtor("_ZN3ccc7DD0x3y4E", this);} // tgen
ccc::DD0x3y4 ::DD0x3y4(){ note_ctor("_ZN3ccc7DD0x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y4E, buf);
    ::ccc::DD0x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y4E);
    dp->::ccc::DD0x3y4::~DD0x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y4E(Test__ZN3ccc7DD0x3y4E, "_ZN3ccc7DD0x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y4C1Ev();
extern void _ZN3ccc7DD0x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y4E[] = {
  NSPAIR(_ZN3ccc7DD0x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y4E[];
extern void _ZN3ccc7DD0x3y43abcEv();
extern void _ZN3ccc7DD0x3y43efgEv();
extern void _ZN3ccc7DD0x3y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y43efgEv,_ZTv0_n12_N3ccc7DD0x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y43efgEv,_ZThn4_N3ccc7DD0x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y43pqrEv,_ZTv0_n16_N3ccc7DD0x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y43pqrEv,_ZThn4_N3ccc7DD0x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y43abcEv,_ZTv0_n20_N3ccc7DD0x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y43abcEv,_ZThn4_N3ccc7DD0x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y43efgEv,_ZTv0_n12_N3ccc7DD0x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y43pqrEv,_ZTv0_n16_N3ccc7DD0x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y43abcEv,_ZTv0_n20_N3ccc7DD0x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y4E[] = {
  {&(_ZTVN3ccc7DD0x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y4E[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y43abcEv,_ZTv0_n20_N3ccc7DD0x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y43abcEv,_ZThn4_N3ccc7DD0x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y43pqrEv,_ZTv0_n16_N3ccc7DD0x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y43pqrEv,_ZThn4_N3ccc7DD0x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y43efgEv,_ZTv0_n12_N3ccc7DD0x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y43efgEv,_ZThn4_N3ccc7DD0x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y4E = {  "_ZN3ccc7DD0x3y4E", // class name
  bases__ZN3ccc7DD0x3y4E, 2,
  &(vtc__ZN3ccc7DD0x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y4E),3, //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  CC0x3y5  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC0x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y53abcEv
  ~CC0x3y5(); // tgen
  CC0x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y5E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y53pqrEv");}
void  ccc::CC0x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y53efgEv");}
void  ccc::CC0x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y53abcEv");}
ccc::CC0x3y5 ::~CC0x3y5(){ note_dtor("_ZN3ccc7CC0x3y5E", this);} // tgen
ccc::CC0x3y5 ::CC0x3y5(){ note_ctor("_ZN3ccc7CC0x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y5E, buf);
    ::ccc::CC0x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y5E);
    dp->::ccc::CC0x3y5::~CC0x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y5E(Test__ZN3ccc7CC0x3y5E, "_ZN3ccc7CC0x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y5C1Ev();
extern void _ZN3ccc7CC0x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y5E[] = {
  NSPAIR(_ZN3ccc7CC0x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y5E[];
extern void _ZN3ccc7CC0x3y53efgEv();
extern void _ZN3ccc7CC0x3y53pqrEv();
extern void _ZN3ccc7CC0x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y53abcEv,_ZTv0_n12_N3ccc7CC0x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53abcEv,_ZThn4_N3ccc7CC0x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y53efgEv,_ZTv0_n16_N3ccc7CC0x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53efgEv,_ZThn4_N3ccc7CC0x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y53pqrEv,_ZTv0_n20_N3ccc7CC0x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53pqrEv,_ZThn4_N3ccc7CC0x3y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y53abcEv,_ZTv0_n12_N3ccc7CC0x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y53efgEv,_ZTv0_n16_N3ccc7CC0x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y53pqrEv,_ZTv0_n20_N3ccc7CC0x3y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y5E[] = {
  {&(_ZTVN3ccc7CC0x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y5E[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y53pqrEv,_ZTv0_n20_N3ccc7CC0x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y53pqrEv,_ZThn4_N3ccc7CC0x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y53efgEv,_ZTv0_n16_N3ccc7CC0x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y53efgEv,_ZThn4_N3ccc7CC0x3y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y53abcEv,_ZTv0_n12_N3ccc7CC0x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y53abcEv,_ZThn4_N3ccc7CC0x3y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y5E = {  "_ZN3ccc7CC0x3y5E", // class name
  bases__ZN3ccc7CC0x3y5E, 2,
  &(vtc__ZN3ccc7CC0x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y5E),2, //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  DD0x3y5  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD0x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x3y53abcEv
  ~DD0x3y5(); // tgen
  DD0x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y53pqrEv");}
void  ccc::DD0x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y53efgEv");}
void  ccc::DD0x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y53abcEv");}
ccc::DD0x3y5 ::~DD0x3y5(){ note_dtor("_ZN3ccc7DD0x3y5E", this);} // tgen
ccc::DD0x3y5 ::DD0x3y5(){ note_ctor("_ZN3ccc7DD0x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y5E, buf);
    ::ccc::DD0x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y5E);
    dp->::ccc::DD0x3y5::~DD0x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y5E(Test__ZN3ccc7DD0x3y5E, "_ZN3ccc7DD0x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y5C1Ev();
extern void _ZN3ccc7DD0x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y5E[] = {
  NSPAIR(_ZN3ccc7DD0x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y5E[];
extern void _ZN3ccc7DD0x3y53abcEv();
extern void _ZN3ccc7DD0x3y53efgEv();
extern void _ZN3ccc7DD0x3y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y53efgEv,_ZTv0_n12_N3ccc7DD0x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y53efgEv,_ZThn4_N3ccc7DD0x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y53pqrEv,_ZTv0_n16_N3ccc7DD0x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y53pqrEv,_ZThn4_N3ccc7DD0x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y53abcEv,_ZTv0_n20_N3ccc7DD0x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y53abcEv,_ZThn4_N3ccc7DD0x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y53efgEv,_ZTv0_n12_N3ccc7DD0x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y53pqrEv,_ZTv0_n16_N3ccc7DD0x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y53abcEv,_ZTv0_n20_N3ccc7DD0x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y5E[] = {
  {&(_ZTVN3ccc7DD0x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y5E[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y53abcEv,_ZTv0_n20_N3ccc7DD0x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y53abcEv,_ZThn4_N3ccc7DD0x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y53pqrEv,_ZTv0_n16_N3ccc7DD0x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y53pqrEv,_ZThn4_N3ccc7DD0x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y53efgEv,_ZTv0_n12_N3ccc7DD0x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y53efgEv,_ZThn4_N3ccc7DD0x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y5E = {  "_ZN3ccc7DD0x3y5E", // class name
  bases__ZN3ccc7DD0x3y5E, 2,
  &(vtc__ZN3ccc7DD0x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y5E),3, //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  CC0x3y6  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y63efgEv
  ~CC0x3y6(); // tgen
  CC0x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y6E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y63abcEv");}
void  ccc::CC0x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y63efgEv");}
ccc::CC0x3y6 ::~CC0x3y6(){ note_dtor("_ZN3ccc7CC0x3y6E", this);} // tgen
ccc::CC0x3y6 ::CC0x3y6(){ note_ctor("_ZN3ccc7CC0x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y6E, buf);
    ::ccc::CC0x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y6E);
    dp->::ccc::CC0x3y6::~CC0x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y6E(Test__ZN3ccc7CC0x3y6E, "_ZN3ccc7CC0x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y6C1Ev();
extern void _ZN3ccc7CC0x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y6E[] = {
  NSPAIR(_ZN3ccc7CC0x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y6E[];
extern void _ZN3ccc7CC0x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC0x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y63abcEv,_ZTv0_n12_N3ccc7CC0x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y63abcEv,_ZThn4_N3ccc7CC0x3y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y63efgEv,_ZTv0_n16_N3ccc7CC0x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y63efgEv,_ZThn4_N3ccc7CC0x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y63abcEv,_ZTv0_n12_N3ccc7CC0x3y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y63efgEv,_ZTv0_n16_N3ccc7CC0x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y6E[] = {
  {&(_ZTVN3ccc7CC0x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y6E[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y63efgEv,_ZTv0_n16_N3ccc7CC0x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y63efgEv,_ZThn4_N3ccc7CC0x3y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y63abcEv,_ZTv0_n12_N3ccc7CC0x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y63abcEv,_ZThn4_N3ccc7CC0x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y6E = {  "_ZN3ccc7CC0x3y6E", // class name
  bases__ZN3ccc7CC0x3y6E, 2,
  &(vtc__ZN3ccc7CC0x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y6E),2, //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  DD0x3y6  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD0x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x3y63efgEv
  ~DD0x3y6(); // tgen
  DD0x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y63abcEv");}
void  ccc::DD0x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y63efgEv");}
ccc::DD0x3y6 ::~DD0x3y6(){ note_dtor("_ZN3ccc7DD0x3y6E", this);} // tgen
ccc::DD0x3y6 ::DD0x3y6(){ note_ctor("_ZN3ccc7DD0x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y6E, buf);
    ::ccc::DD0x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y6E);
    dp->::ccc::DD0x3y6::~DD0x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y6E(Test__ZN3ccc7DD0x3y6E, "_ZN3ccc7DD0x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y6C1Ev();
extern void _ZN3ccc7DD0x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y6E[] = {
  NSPAIR(_ZN3ccc7DD0x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y6E[];
extern void _ZN3ccc7DD0x3y63abcEv();
extern void _ZN3ccc7DD0x3y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y63efgEv,_ZTv0_n12_N3ccc7DD0x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y63efgEv,_ZThn4_N3ccc7DD0x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y63abcEv,_ZTv0_n20_N3ccc7DD0x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y63abcEv,_ZThn4_N3ccc7DD0x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y63efgEv,_ZTv0_n12_N3ccc7DD0x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y63abcEv,_ZTv0_n20_N3ccc7DD0x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y6E[] = {
  {&(_ZTVN3ccc7DD0x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y6E[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y63abcEv,_ZTv0_n20_N3ccc7DD0x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y63abcEv,_ZThn4_N3ccc7DD0x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y63efgEv,_ZTv0_n12_N3ccc7DD0x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y63efgEv,_ZThn4_N3ccc7DD0x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y6E = {  "_ZN3ccc7DD0x3y6E", // class name
  bases__ZN3ccc7DD0x3y6E, 2,
  &(vtc__ZN3ccc7DD0x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y6E),3, //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  CC0x3y7  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y73pqrEv
  ~CC0x3y7(); // tgen
  CC0x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y7E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y73abcEv");}
void  ccc::CC0x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y73pqrEv");}
ccc::CC0x3y7 ::~CC0x3y7(){ note_dtor("_ZN3ccc7CC0x3y7E", this);} // tgen
ccc::CC0x3y7 ::CC0x3y7(){ note_ctor("_ZN3ccc7CC0x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y7E, buf);
    ::ccc::CC0x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y7E);
    dp->::ccc::CC0x3y7::~CC0x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y7E(Test__ZN3ccc7CC0x3y7E, "_ZN3ccc7CC0x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y7C1Ev();
extern void _ZN3ccc7CC0x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y7E[] = {
  NSPAIR(_ZN3ccc7CC0x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC0x3y73pqrEv();
extern void _ZN3ccc7CC0x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y73abcEv,_ZTv0_n12_N3ccc7CC0x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y73abcEv,_ZThn4_N3ccc7CC0x3y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y73pqrEv,_ZTv0_n20_N3ccc7CC0x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y73pqrEv,_ZThn4_N3ccc7CC0x3y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y73abcEv,_ZTv0_n12_N3ccc7CC0x3y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y73pqrEv,_ZTv0_n20_N3ccc7CC0x3y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y7E[] = {
  {&(_ZTVN3ccc7CC0x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y7E[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y73pqrEv,_ZTv0_n20_N3ccc7CC0x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y73pqrEv,_ZThn4_N3ccc7CC0x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y73abcEv,_ZTv0_n12_N3ccc7CC0x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y73abcEv,_ZThn4_N3ccc7CC0x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y7E = {  "_ZN3ccc7CC0x3y7E", // class name
  bases__ZN3ccc7CC0x3y7E, 2,
  &(vtc__ZN3ccc7CC0x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y7E),2, //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  DD0x3y7  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD0x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y73pqrEv
  ~DD0x3y7(); // tgen
  DD0x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y73abcEv");}
void  ccc::DD0x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y73pqrEv");}
ccc::DD0x3y7 ::~DD0x3y7(){ note_dtor("_ZN3ccc7DD0x3y7E", this);} // tgen
ccc::DD0x3y7 ::DD0x3y7(){ note_ctor("_ZN3ccc7DD0x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y7E, buf);
    ::ccc::DD0x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y7E);
    dp->::ccc::DD0x3y7::~DD0x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y7E(Test__ZN3ccc7DD0x3y7E, "_ZN3ccc7DD0x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y7C1Ev();
extern void _ZN3ccc7DD0x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y7E[] = {
  NSPAIR(_ZN3ccc7DD0x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y7E[];
extern void _ZN3ccc7DD0x3y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y73pqrEv,_ZTv0_n16_N3ccc7DD0x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y73pqrEv,_ZThn4_N3ccc7DD0x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y73abcEv,_ZTv0_n20_N3ccc7DD0x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y73abcEv,_ZThn4_N3ccc7DD0x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y73pqrEv,_ZTv0_n16_N3ccc7DD0x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y73abcEv,_ZTv0_n20_N3ccc7DD0x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y7E[] = {
  {&(_ZTVN3ccc7DD0x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y7E[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y73abcEv,_ZTv0_n20_N3ccc7DD0x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y73abcEv,_ZThn4_N3ccc7DD0x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y73pqrEv,_ZTv0_n16_N3ccc7DD0x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y73pqrEv,_ZThn4_N3ccc7DD0x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y7E = {  "_ZN3ccc7DD0x3y7E", // class name
  bases__ZN3ccc7DD0x3y7E, 2,
  &(vtc__ZN3ccc7DD0x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y7E),3, //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  CC0x3y8  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y83abcEv
  ~CC0x3y8(); // tgen
  CC0x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y8E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y83efgEv");}
void  ccc::CC0x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y83abcEv");}
ccc::CC0x3y8 ::~CC0x3y8(){ note_dtor("_ZN3ccc7CC0x3y8E", this);} // tgen
ccc::CC0x3y8 ::CC0x3y8(){ note_ctor("_ZN3ccc7CC0x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y8E, buf);
    ::ccc::CC0x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y8E);
    dp->::ccc::CC0x3y8::~CC0x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y8E(Test__ZN3ccc7CC0x3y8E, "_ZN3ccc7CC0x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y8C1Ev();
extern void _ZN3ccc7CC0x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y8E[] = {
  NSPAIR(_ZN3ccc7CC0x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y8E[];
extern void _ZN3ccc7CC0x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC0x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x3y83abcEv,_ZTv0_n12_N3ccc7CC0x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y83abcEv,_ZThn4_N3ccc7CC0x3y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y83efgEv,_ZTv0_n16_N3ccc7CC0x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y83efgEv,_ZThn4_N3ccc7CC0x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x3y83abcEv,_ZTv0_n12_N3ccc7CC0x3y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y83efgEv,_ZTv0_n16_N3ccc7CC0x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y8E[] = {
  {&(_ZTVN3ccc7CC0x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y8E[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y83efgEv,_ZTv0_n16_N3ccc7CC0x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y83efgEv,_ZThn4_N3ccc7CC0x3y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x3y83abcEv,_ZTv0_n12_N3ccc7CC0x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y83abcEv,_ZThn4_N3ccc7CC0x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y8E = {  "_ZN3ccc7CC0x3y8E", // class name
  bases__ZN3ccc7CC0x3y8E, 2,
  &(vtc__ZN3ccc7CC0x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y8E),2, //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  DD0x3y8  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD0x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x3y83abcEv
  ~DD0x3y8(); // tgen
  DD0x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y83efgEv");}
void  ccc::DD0x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x3y83abcEv");}
ccc::DD0x3y8 ::~DD0x3y8(){ note_dtor("_ZN3ccc7DD0x3y8E", this);} // tgen
ccc::DD0x3y8 ::DD0x3y8(){ note_ctor("_ZN3ccc7DD0x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y8E, buf);
    ::ccc::DD0x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y8E);
    dp->::ccc::DD0x3y8::~DD0x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y8E(Test__ZN3ccc7DD0x3y8E, "_ZN3ccc7DD0x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y8C1Ev();
extern void _ZN3ccc7DD0x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y8E[] = {
  NSPAIR(_ZN3ccc7DD0x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y8E[];
extern void _ZN3ccc7DD0x3y83abcEv();
extern void _ZN3ccc7DD0x3y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y83efgEv,_ZTv0_n12_N3ccc7DD0x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y83efgEv,_ZThn4_N3ccc7DD0x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x3y83abcEv,_ZTv0_n20_N3ccc7DD0x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y83abcEv,_ZThn4_N3ccc7DD0x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y83efgEv,_ZTv0_n12_N3ccc7DD0x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x3y83abcEv,_ZTv0_n20_N3ccc7DD0x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y8E[] = {
  {&(_ZTVN3ccc7DD0x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y8E[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x3y83abcEv,_ZTv0_n20_N3ccc7DD0x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y83abcEv,_ZThn4_N3ccc7DD0x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y83efgEv,_ZTv0_n12_N3ccc7DD0x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y83efgEv,_ZThn4_N3ccc7DD0x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y8E = {  "_ZN3ccc7DD0x3y8E", // class name
  bases__ZN3ccc7DD0x3y8E, 2,
  &(vtc__ZN3ccc7DD0x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y8E),3, //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  CC0x3y9  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y93pqrEv
  ~CC0x3y9(); // tgen
  CC0x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y9E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y93efgEv");}
void  ccc::CC0x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y93pqrEv");}
ccc::CC0x3y9 ::~CC0x3y9(){ note_dtor("_ZN3ccc7CC0x3y9E", this);} // tgen
ccc::CC0x3y9 ::CC0x3y9(){ note_ctor("_ZN3ccc7CC0x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y9E, buf);
    ::ccc::CC0x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC0x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y9E);
    dp->::ccc::CC0x3y9::~CC0x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y9E(Test__ZN3ccc7CC0x3y9E, "_ZN3ccc7CC0x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y9C1Ev();
extern void _ZN3ccc7CC0x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y9E[] = {
  NSPAIR(_ZN3ccc7CC0x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y9E[];
extern void _ZN3ccc7CC0x3y93efgEv();
extern void _ZN3ccc7CC0x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x3y93efgEv,_ZTv0_n16_N3ccc7CC0x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y93efgEv,_ZThn4_N3ccc7CC0x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x3y93pqrEv,_ZTv0_n20_N3ccc7CC0x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y93pqrEv,_ZThn4_N3ccc7CC0x3y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x3y93efgEv,_ZTv0_n16_N3ccc7CC0x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x3y93pqrEv,_ZTv0_n20_N3ccc7CC0x3y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x3y9E[] = {
  {&(_ZTVN3ccc7CC0x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x3y9E[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x3y93pqrEv,_ZTv0_n20_N3ccc7CC0x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y93pqrEv,_ZThn4_N3ccc7CC0x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x3y93efgEv,_ZTv0_n16_N3ccc7CC0x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x3y93efgEv,_ZThn4_N3ccc7CC0x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x3y9E = {  "_ZN3ccc7CC0x3y9E", // class name
  bases__ZN3ccc7CC0x3y9E, 2,
  &(vtc__ZN3ccc7CC0x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x3y9E),2, //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  DD0x3y9  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD0x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x3y93pqrEv
  ~DD0x3y9(); // tgen
  DD0x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x3y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x3y93efgEv");}
void  ccc::DD0x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x3y93pqrEv");}
ccc::DD0x3y9 ::~DD0x3y9(){ note_dtor("_ZN3ccc7DD0x3y9E", this);} // tgen
ccc::DD0x3y9 ::DD0x3y9(){ note_ctor("_ZN3ccc7DD0x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x3y9E, buf);
    ::ccc::DD0x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x3y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD0x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x3y9E);
    dp->::ccc::DD0x3y9::~DD0x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x3y9E(Test__ZN3ccc7DD0x3y9E, "_ZN3ccc7DD0x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x3y9C1Ev();
extern void _ZN3ccc7DD0x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x3y9E[] = {
  NSPAIR(_ZN3ccc7DD0x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD0x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x3y93efgEv();
extern void _ZN3ccc7DD0x3y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x3y93efgEv,_ZTv0_n12_N3ccc7DD0x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y93efgEv,_ZThn4_N3ccc7DD0x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x3y93pqrEv,_ZTv0_n16_N3ccc7DD0x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x3y93pqrEv,_ZThn4_N3ccc7DD0x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x3y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x3y93efgEv,_ZTv0_n12_N3ccc7DD0x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x3y93pqrEv,_ZTv0_n16_N3ccc7DD0x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x3y9E[] = {
  {&(_ZTVN3ccc7DD0x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x3y9E[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x3y93pqrEv,_ZTv0_n16_N3ccc7DD0x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y93pqrEv,_ZThn4_N3ccc7DD0x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x3y93efgEv,_ZTv0_n12_N3ccc7DD0x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x3y93efgEv,_ZThn4_N3ccc7DD0x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x3y9E = {  "_ZN3ccc7DD0x3y9E", // class name
  bases__ZN3ccc7DD0x3y9E, 2,
  &(vtc__ZN3ccc7DD0x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x3y9E),3, //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  CC0x3y10  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x3y103abcEv
  ~CC0x3y10(); // tgen
  CC0x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y10E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y103pqrEv");}
void  ccc::CC0x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x3y103abcEv");}
ccc::CC0x3y10 ::~CC0x3y10(){ note_dtor("_ZN3ccc8CC0x3y10E", this);} // tgen
ccc::CC0x3y10 ::CC0x3y10(){ note_ctor("_ZN3ccc8CC0x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y10E, buf);
    ::ccc::CC0x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y10E);
    dp->::ccc::CC0x3y10::~CC0x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y10E(Test__ZN3ccc8CC0x3y10E, "_ZN3ccc8CC0x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y10C1Ev();
extern void _ZN3ccc8CC0x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y10E[] = {
  NSPAIR(_ZN3ccc8CC0x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC0x3y103pqrEv();
extern void _ZN3ccc8CC0x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x3y103abcEv,_ZTv0_n12_N3ccc8CC0x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y103abcEv,_ZThn4_N3ccc8CC0x3y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x3y103pqrEv,_ZTv0_n20_N3ccc8CC0x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y103pqrEv,_ZThn4_N3ccc8CC0x3y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x3y103abcEv,_ZTv0_n12_N3ccc8CC0x3y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x3y103pqrEv,_ZTv0_n20_N3ccc8CC0x3y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y10E[] = {
  {&(_ZTVN3ccc8CC0x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y10E[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x3y103pqrEv,_ZTv0_n20_N3ccc8CC0x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y103pqrEv,_ZThn4_N3ccc8CC0x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x3y103abcEv,_ZTv0_n12_N3ccc8CC0x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y103abcEv,_ZThn4_N3ccc8CC0x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x3y10E = {  "_ZN3ccc8CC0x3y10E", // class name
  bases__ZN3ccc8CC0x3y10E, 2,
  &(vtc__ZN3ccc8CC0x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y10E),2, //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  DD0x3y10  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD0x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x3y103abcEv
  ~DD0x3y10(); // tgen
  DD0x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x3y103pqrEv");}
void  ccc::DD0x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x3y103abcEv");}
ccc::DD0x3y10 ::~DD0x3y10(){ note_dtor("_ZN3ccc8DD0x3y10E", this);} // tgen
ccc::DD0x3y10 ::DD0x3y10(){ note_ctor("_ZN3ccc8DD0x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y10E, buf);
    ::ccc::DD0x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y10E);
    dp->::ccc::DD0x3y10::~DD0x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y10E(Test__ZN3ccc8DD0x3y10E, "_ZN3ccc8DD0x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y10C1Ev();
extern void _ZN3ccc8DD0x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y10E[] = {
  NSPAIR(_ZN3ccc8DD0x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y10E[];
extern void _ZN3ccc8DD0x3y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x3y103pqrEv,_ZTv0_n16_N3ccc8DD0x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y103pqrEv,_ZThn4_N3ccc8DD0x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x3y103abcEv,_ZTv0_n20_N3ccc8DD0x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y103abcEv,_ZThn4_N3ccc8DD0x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x3y103pqrEv,_ZTv0_n16_N3ccc8DD0x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x3y103abcEv,_ZTv0_n20_N3ccc8DD0x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y10E[] = {
  {&(_ZTVN3ccc8DD0x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y10E[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x3y103abcEv,_ZTv0_n20_N3ccc8DD0x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y103abcEv,_ZThn4_N3ccc8DD0x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x3y103pqrEv,_ZTv0_n16_N3ccc8DD0x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y103pqrEv,_ZThn4_N3ccc8DD0x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x3y10E = {  "_ZN3ccc8DD0x3y10E", // class name
  bases__ZN3ccc8DD0x3y10E, 2,
  &(vtc__ZN3ccc8DD0x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y10E),3, //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  CC0x3y11  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x3y113efgEv
  ~CC0x3y11(); // tgen
  CC0x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y11E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y113pqrEv");}
void  ccc::CC0x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x3y113efgEv");}
ccc::CC0x3y11 ::~CC0x3y11(){ note_dtor("_ZN3ccc8CC0x3y11E", this);} // tgen
ccc::CC0x3y11 ::CC0x3y11(){ note_ctor("_ZN3ccc8CC0x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y11E, buf);
    ::ccc::CC0x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y11E);
    dp->::ccc::CC0x3y11::~CC0x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y11E(Test__ZN3ccc8CC0x3y11E, "_ZN3ccc8CC0x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y11C1Ev();
extern void _ZN3ccc8CC0x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y11E[] = {
  NSPAIR(_ZN3ccc8CC0x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y11E[];
extern void _ZN3ccc8CC0x3y113efgEv();
extern void _ZN3ccc8CC0x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x3y113efgEv,_ZTv0_n16_N3ccc8CC0x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y113efgEv,_ZThn4_N3ccc8CC0x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x3y113pqrEv,_ZTv0_n20_N3ccc8CC0x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y113pqrEv,_ZThn4_N3ccc8CC0x3y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x3y113efgEv,_ZTv0_n16_N3ccc8CC0x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x3y113pqrEv,_ZTv0_n20_N3ccc8CC0x3y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y11E[] = {
  {&(_ZTVN3ccc8CC0x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y11E[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x3y113pqrEv,_ZTv0_n20_N3ccc8CC0x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y113pqrEv,_ZThn4_N3ccc8CC0x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x3y113efgEv,_ZTv0_n16_N3ccc8CC0x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y113efgEv,_ZThn4_N3ccc8CC0x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x3y11E = {  "_ZN3ccc8CC0x3y11E", // class name
  bases__ZN3ccc8CC0x3y11E, 2,
  &(vtc__ZN3ccc8CC0x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y11E),2, //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  DD0x3y11  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD0x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x3y113efgEv
  ~DD0x3y11(); // tgen
  DD0x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x3y113pqrEv");}
void  ccc::DD0x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x3y113efgEv");}
ccc::DD0x3y11 ::~DD0x3y11(){ note_dtor("_ZN3ccc8DD0x3y11E", this);} // tgen
ccc::DD0x3y11 ::DD0x3y11(){ note_ctor("_ZN3ccc8DD0x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y11E, buf);
    ::ccc::DD0x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y11E);
    dp->::ccc::DD0x3y11::~DD0x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y11E(Test__ZN3ccc8DD0x3y11E, "_ZN3ccc8DD0x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y11C1Ev();
extern void _ZN3ccc8DD0x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y11E[] = {
  NSPAIR(_ZN3ccc8DD0x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x3y113efgEv();
extern void _ZN3ccc8DD0x3y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x3y113efgEv,_ZTv0_n12_N3ccc8DD0x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y113efgEv,_ZThn4_N3ccc8DD0x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x3y113pqrEv,_ZTv0_n16_N3ccc8DD0x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y113pqrEv,_ZThn4_N3ccc8DD0x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x3y113efgEv,_ZTv0_n12_N3ccc8DD0x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x3y113pqrEv,_ZTv0_n16_N3ccc8DD0x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y11E[] = {
  {&(_ZTVN3ccc8DD0x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y11E[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x3y113pqrEv,_ZTv0_n16_N3ccc8DD0x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y113pqrEv,_ZThn4_N3ccc8DD0x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x3y113efgEv,_ZTv0_n12_N3ccc8DD0x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y113efgEv,_ZThn4_N3ccc8DD0x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x3y11E = {  "_ZN3ccc8DD0x3y11E", // class name
  bases__ZN3ccc8DD0x3y11E, 2,
  &(vtc__ZN3ccc8DD0x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y11E),3, //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  CC0x3y12  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC0x3y123abcEv
  ~CC0x3y12(); // tgen
  CC0x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x3y123abcEv");}
ccc::CC0x3y12 ::~CC0x3y12(){ note_dtor("_ZN3ccc8CC0x3y12E", this);} // tgen
ccc::CC0x3y12 ::CC0x3y12(){ note_ctor("_ZN3ccc8CC0x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y12E, buf);
    ::ccc::CC0x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y12E);
    dp->::ccc::CC0x3y12::~CC0x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y12E(Test__ZN3ccc8CC0x3y12E, "_ZN3ccc8CC0x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y12C1Ev();
extern void _ZN3ccc8CC0x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y12E[] = {
  NSPAIR(_ZN3ccc8CC0x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC0x3y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x3y123abcEv,_ZTv0_n12_N3ccc8CC0x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y123abcEv,_ZThn4_N3ccc8CC0x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x3y123abcEv,_ZTv0_n12_N3ccc8CC0x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y12E[] = {
  {&(_ZTVN3ccc8CC0x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y12E[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x3y123abcEv,_ZTv0_n12_N3ccc8CC0x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y123abcEv,_ZThn4_N3ccc8CC0x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x3y12E = {  "_ZN3ccc8CC0x3y12E", // class name
  bases__ZN3ccc8CC0x3y12E, 2,
  &(vtc__ZN3ccc8CC0x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y12E),2, //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  DD0x3y12  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD0x3y123abcEv
  ~DD0x3y12(); // tgen
  DD0x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x3y123abcEv");}
ccc::DD0x3y12 ::~DD0x3y12(){ note_dtor("_ZN3ccc8DD0x3y12E", this);} // tgen
ccc::DD0x3y12 ::DD0x3y12(){ note_ctor("_ZN3ccc8DD0x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y12E, buf);
    ::ccc::DD0x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y12E);
    dp->::ccc::DD0x3y12::~DD0x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y12E(Test__ZN3ccc8DD0x3y12E, "_ZN3ccc8DD0x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y12C1Ev();
extern void _ZN3ccc8DD0x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y12E[] = {
  NSPAIR(_ZN3ccc8DD0x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y12E[];
extern void _ZN3ccc8DD0x3y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x3y123abcEv,_ZTv0_n20_N3ccc8DD0x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y123abcEv,_ZThn4_N3ccc8DD0x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x3y123abcEv,_ZTv0_n20_N3ccc8DD0x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y12E[] = {
  {&(_ZTVN3ccc8DD0x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y12E[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x3y123abcEv,_ZTv0_n20_N3ccc8DD0x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y123abcEv,_ZThn4_N3ccc8DD0x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x3y12E = {  "_ZN3ccc8DD0x3y12E", // class name
  bases__ZN3ccc8DD0x3y12E, 2,
  &(vtc__ZN3ccc8DD0x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y12E),3, //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  CC0x3y13  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC0x3y133efgEv
  ~CC0x3y13(); // tgen
  CC0x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x3y133efgEv");}
ccc::CC0x3y13 ::~CC0x3y13(){ note_dtor("_ZN3ccc8CC0x3y13E", this);} // tgen
ccc::CC0x3y13 ::CC0x3y13(){ note_ctor("_ZN3ccc8CC0x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y13E, buf);
    ::ccc::CC0x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y13E);
    dp->::ccc::CC0x3y13::~CC0x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y13E(Test__ZN3ccc8CC0x3y13E, "_ZN3ccc8CC0x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y13C1Ev();
extern void _ZN3ccc8CC0x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y13E[] = {
  NSPAIR(_ZN3ccc8CC0x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y13E[];
extern void _ZN3ccc8CC0x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x3y133efgEv,_ZTv0_n16_N3ccc8CC0x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y133efgEv,_ZThn4_N3ccc8CC0x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x3y133efgEv,_ZTv0_n16_N3ccc8CC0x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y13E[] = {
  {&(_ZTVN3ccc8CC0x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y13E[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x3y133efgEv,_ZTv0_n16_N3ccc8CC0x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y133efgEv,_ZThn4_N3ccc8CC0x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x3y13E = {  "_ZN3ccc8CC0x3y13E", // class name
  bases__ZN3ccc8CC0x3y13E, 2,
  &(vtc__ZN3ccc8CC0x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y13E),2, //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  DD0x3y13  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD0x3y133efgEv
  ~DD0x3y13(); // tgen
  DD0x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x3y133efgEv");}
ccc::DD0x3y13 ::~DD0x3y13(){ note_dtor("_ZN3ccc8DD0x3y13E", this);} // tgen
ccc::DD0x3y13 ::DD0x3y13(){ note_ctor("_ZN3ccc8DD0x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y13E, buf);
    ::ccc::DD0x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y13E);
    dp->::ccc::DD0x3y13::~DD0x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y13E(Test__ZN3ccc8DD0x3y13E, "_ZN3ccc8DD0x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y13C1Ev();
extern void _ZN3ccc8DD0x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y13E[] = {
  NSPAIR(_ZN3ccc8DD0x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x3y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x3y133efgEv,_ZTv0_n12_N3ccc8DD0x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y133efgEv,_ZThn4_N3ccc8DD0x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x3y133efgEv,_ZTv0_n12_N3ccc8DD0x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y13E[] = {
  {&(_ZTVN3ccc8DD0x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y13E[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x3y133efgEv,_ZTv0_n12_N3ccc8DD0x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y133efgEv,_ZThn4_N3ccc8DD0x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x3y13E = {  "_ZN3ccc8DD0x3y13E", // class name
  bases__ZN3ccc8DD0x3y13E, 2,
  &(vtc__ZN3ccc8DD0x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y13E),3, //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  CC0x3y14  : virtual ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y143pqrEv
  ~CC0x3y14(); // tgen
  CC0x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y143pqrEv");}
ccc::CC0x3y14 ::~CC0x3y14(){ note_dtor("_ZN3ccc8CC0x3y14E", this);} // tgen
ccc::CC0x3y14 ::CC0x3y14(){ note_ctor("_ZN3ccc8CC0x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y14E, buf);
    ::ccc::CC0x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y14E);
    dp->::ccc::CC0x3y14::~CC0x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y14E(Test__ZN3ccc8CC0x3y14E, "_ZN3ccc8CC0x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y14C1Ev();
extern void _ZN3ccc8CC0x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y14E[] = {
  NSPAIR(_ZN3ccc8CC0x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC0x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x3y143pqrEv,_ZTv0_n20_N3ccc8CC0x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y143pqrEv,_ZThn4_N3ccc8CC0x3y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x3y143pqrEv,_ZTv0_n20_N3ccc8CC0x3y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y14E[] = {
  {&(_ZTVN3ccc8CC0x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y14E[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x3y143pqrEv,_ZTv0_n20_N3ccc8CC0x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x3y143pqrEv,_ZThn4_N3ccc8CC0x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x3y14E = {  "_ZN3ccc8CC0x3y14E", // class name
  bases__ZN3ccc8CC0x3y14E, 2,
  &(vtc__ZN3ccc8CC0x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y14E),2, //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  DD0x3y14  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD0x3y143pqrEv
  ~DD0x3y14(); // tgen
  DD0x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x3y143pqrEv");}
ccc::DD0x3y14 ::~DD0x3y14(){ note_dtor("_ZN3ccc8DD0x3y14E", this);} // tgen
ccc::DD0x3y14 ::DD0x3y14(){ note_ctor("_ZN3ccc8DD0x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y14E, buf);
    ::ccc::DD0x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y14E);
    dp->::ccc::DD0x3y14::~DD0x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y14E(Test__ZN3ccc8DD0x3y14E, "_ZN3ccc8DD0x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y14C1Ev();
extern void _ZN3ccc8DD0x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y14E[] = {
  NSPAIR(_ZN3ccc8DD0x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x3y143pqrEv,_ZTv0_n16_N3ccc8DD0x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x3y143pqrEv,_ZThn4_N3ccc8DD0x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x3y143pqrEv,_ZTv0_n16_N3ccc8DD0x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y14E[] = {
  {&(_ZTVN3ccc8DD0x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y14E[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x3y143pqrEv,_ZTv0_n16_N3ccc8DD0x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x3y143pqrEv,_ZThn4_N3ccc8DD0x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x3y14E = {  "_ZN3ccc8DD0x3y14E", // class name
  bases__ZN3ccc8DD0x3y14E, 2,
  &(vtc__ZN3ccc8DD0x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y14E),3, //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  CC0x3y15  : virtual ::ccc::AA0 , ::ccc::BB3 {
  ~CC0x3y15(); // tgen
  CC0x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x3y15 ::~CC0x3y15(){ note_dtor("_ZN3ccc8CC0x3y15E", this);} // tgen
ccc::CC0x3y15 ::CC0x3y15(){ note_ctor("_ZN3ccc8CC0x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y15E, buf);
    ::ccc::CC0x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC0x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y15E);
    dp->::ccc::CC0x3y15::~CC0x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y15E(Test__ZN3ccc8CC0x3y15E, "_ZN3ccc8CC0x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y15C1Ev();
extern void _ZN3ccc8CC0x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y15E[] = {
  NSPAIR(_ZN3ccc8CC0x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x3y15E[] = {
  {&(_ZTVN3ccc8CC0x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x3y15E[];
Class_Descriptor cd__ZN3ccc8CC0x3y15E = {  "_ZN3ccc8CC0x3y15E", // class name
  bases__ZN3ccc8CC0x3y15E, 2,
  &(vtc__ZN3ccc8CC0x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x3y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x3y15  : virtual ::ccc::AA0 , virtual ::ccc::BB3 {
  ~DD0x3y15(); // tgen
  DD0x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x3y15 ::~DD0x3y15(){ note_dtor("_ZN3ccc8DD0x3y15E", this);} // tgen
ccc::DD0x3y15 ::DD0x3y15(){ note_ctor("_ZN3ccc8DD0x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x3y15E, buf);
    ::ccc::DD0x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x3y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD0x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x3y15E);
    dp->::ccc::DD0x3y15::~DD0x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x3y15E(Test__ZN3ccc8DD0x3y15E, "_ZN3ccc8DD0x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x3y15C1Ev();
extern void _ZN3ccc8DD0x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x3y15E[] = {
  NSPAIR(_ZN3ccc8DD0x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD0x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x3y15E[] = {
  {&(_ZTVN3ccc8DD0x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x3y15E[];
Class_Descriptor cd__ZN3ccc8DD0x3y15E = {  "_ZN3ccc8DD0x3y15E", // class name
  bases__ZN3ccc8DD0x3y15E, 2,
  &(vtc__ZN3ccc8DD0x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x3y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y0  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y03pqrEv
  ~CC0x4y0(); // tgen
  CC0x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y0E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y03abcEv");}
void  ccc::CC0x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y03efgEv");}
void  ccc::CC0x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y03pqrEv");}
ccc::CC0x4y0 ::~CC0x4y0(){ note_dtor("_ZN3ccc7CC0x4y0E", this);} // tgen
ccc::CC0x4y0 ::CC0x4y0(){ note_ctor("_ZN3ccc7CC0x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y0E, buf);
    ::ccc::CC0x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y0E);
    dp->::ccc::CC0x4y0::~CC0x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y0E(Test__ZN3ccc7CC0x4y0E, "_ZN3ccc7CC0x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y0C1Ev();
extern void _ZN3ccc7CC0x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y0E[] = {
  NSPAIR(_ZN3ccc7CC0x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y0E[];
extern void _ZN3ccc7CC0x4y03pqrEv();
extern void _ZN3ccc7CC0x4y03abcEv();
extern void _ZN3ccc7CC0x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y03abcEv,_ZTv0_n12_N3ccc7CC0x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03abcEv,_ZThn4_N3ccc7CC0x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y03efgEv,_ZTv0_n16_N3ccc7CC0x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03efgEv,_ZThn4_N3ccc7CC0x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y03pqrEv,_ZTv0_n20_N3ccc7CC0x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03pqrEv,_ZThn4_N3ccc7CC0x4y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y03abcEv,_ZTv0_n12_N3ccc7CC0x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y03efgEv,_ZTv0_n16_N3ccc7CC0x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y03pqrEv,_ZTv0_n20_N3ccc7CC0x4y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y0E[] = {
  {&(_ZTVN3ccc7CC0x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y0E[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y03pqrEv,_ZTv0_n20_N3ccc7CC0x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y03pqrEv,_ZThn4_N3ccc7CC0x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y03efgEv,_ZTv0_n16_N3ccc7CC0x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y03efgEv,_ZThn4_N3ccc7CC0x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y03abcEv,_ZTv0_n12_N3ccc7CC0x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y03abcEv,_ZThn4_N3ccc7CC0x4y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y0E = {  "_ZN3ccc7CC0x4y0E", // class name
  bases__ZN3ccc7CC0x4y0E, 2,
  &(vtc__ZN3ccc7CC0x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y0E),2, //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  DD0x4y0  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD0x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y03pqrEv
  ~DD0x4y0(); // tgen
  DD0x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y03abcEv");}
void  ccc::DD0x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y03efgEv");}
void  ccc::DD0x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y03pqrEv");}
ccc::DD0x4y0 ::~DD0x4y0(){ note_dtor("_ZN3ccc7DD0x4y0E", this);} // tgen
ccc::DD0x4y0 ::DD0x4y0(){ note_ctor("_ZN3ccc7DD0x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y0E, buf);
    ::ccc::DD0x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y0E);
    dp->::ccc::DD0x4y0::~DD0x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y0E(Test__ZN3ccc7DD0x4y0E, "_ZN3ccc7DD0x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y0C1Ev();
extern void _ZN3ccc7DD0x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y0E[] = {
  NSPAIR(_ZN3ccc7DD0x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y0E[];
extern void _ZN3ccc7DD0x4y03abcEv();
extern void _ZN3ccc7DD0x4y03efgEv();
extern void _ZN3ccc7DD0x4y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y03pqrEv,_ZTv0_n12_N3ccc7DD0x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y03pqrEv,_ZThn4_N3ccc7DD0x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y03abcEv,_ZTv0_n16_N3ccc7DD0x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y03abcEv,_ZThn4_N3ccc7DD0x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y03efgEv,_ZTv0_n20_N3ccc7DD0x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y03efgEv,_ZThn4_N3ccc7DD0x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y03pqrEv,_ZTv0_n12_N3ccc7DD0x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y03abcEv,_ZTv0_n16_N3ccc7DD0x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y03efgEv,_ZTv0_n20_N3ccc7DD0x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y0E[] = {
  {&(_ZTVN3ccc7DD0x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y0E[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y03efgEv,_ZTv0_n20_N3ccc7DD0x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y03efgEv,_ZThn4_N3ccc7DD0x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y03abcEv,_ZTv0_n16_N3ccc7DD0x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y03abcEv,_ZThn4_N3ccc7DD0x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y03pqrEv,_ZTv0_n12_N3ccc7DD0x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y03pqrEv,_ZThn4_N3ccc7DD0x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y0E = {  "_ZN3ccc7DD0x4y0E", // class name
  bases__ZN3ccc7DD0x4y0E, 2,
  &(vtc__ZN3ccc7DD0x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y0E),3, //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  CC0x4y1  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x4y13efgEv
  ~CC0x4y1(); // tgen
  CC0x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y1E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y13abcEv");}
void  ccc::CC0x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y13pqrEv");}
void  ccc::CC0x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y13efgEv");}
ccc::CC0x4y1 ::~CC0x4y1(){ note_dtor("_ZN3ccc7CC0x4y1E", this);} // tgen
ccc::CC0x4y1 ::CC0x4y1(){ note_ctor("_ZN3ccc7CC0x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y1E, buf);
    ::ccc::CC0x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y1E);
    dp->::ccc::CC0x4y1::~CC0x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y1E(Test__ZN3ccc7CC0x4y1E, "_ZN3ccc7CC0x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y1C1Ev();
extern void _ZN3ccc7CC0x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y1E[] = {
  NSPAIR(_ZN3ccc7CC0x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y1E[];
extern void _ZN3ccc7CC0x4y13pqrEv();
extern void _ZN3ccc7CC0x4y13abcEv();
extern void _ZN3ccc7CC0x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y13abcEv,_ZTv0_n12_N3ccc7CC0x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13abcEv,_ZThn4_N3ccc7CC0x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y13efgEv,_ZTv0_n16_N3ccc7CC0x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13efgEv,_ZThn4_N3ccc7CC0x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y13pqrEv,_ZTv0_n20_N3ccc7CC0x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13pqrEv,_ZThn4_N3ccc7CC0x4y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y13abcEv,_ZTv0_n12_N3ccc7CC0x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y13efgEv,_ZTv0_n16_N3ccc7CC0x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y13pqrEv,_ZTv0_n20_N3ccc7CC0x4y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y1E[] = {
  {&(_ZTVN3ccc7CC0x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y1E[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y13pqrEv,_ZTv0_n20_N3ccc7CC0x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y13pqrEv,_ZThn4_N3ccc7CC0x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y13efgEv,_ZTv0_n16_N3ccc7CC0x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y13efgEv,_ZThn4_N3ccc7CC0x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y13abcEv,_ZTv0_n12_N3ccc7CC0x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y13abcEv,_ZThn4_N3ccc7CC0x4y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y1E = {  "_ZN3ccc7CC0x4y1E", // class name
  bases__ZN3ccc7CC0x4y1E, 2,
  &(vtc__ZN3ccc7CC0x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y1E),2, //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  DD0x4y1  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD0x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x4y13efgEv
  ~DD0x4y1(); // tgen
  DD0x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y13abcEv");}
void  ccc::DD0x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y13pqrEv");}
void  ccc::DD0x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y13efgEv");}
ccc::DD0x4y1 ::~DD0x4y1(){ note_dtor("_ZN3ccc7DD0x4y1E", this);} // tgen
ccc::DD0x4y1 ::DD0x4y1(){ note_ctor("_ZN3ccc7DD0x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y1E, buf);
    ::ccc::DD0x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y1E);
    dp->::ccc::DD0x4y1::~DD0x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y1E(Test__ZN3ccc7DD0x4y1E, "_ZN3ccc7DD0x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y1C1Ev();
extern void _ZN3ccc7DD0x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y1E[] = {
  NSPAIR(_ZN3ccc7DD0x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y1E[];
extern void _ZN3ccc7DD0x4y13abcEv();
extern void _ZN3ccc7DD0x4y13efgEv();
extern void _ZN3ccc7DD0x4y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y13pqrEv,_ZTv0_n12_N3ccc7DD0x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y13pqrEv,_ZThn4_N3ccc7DD0x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y13abcEv,_ZTv0_n16_N3ccc7DD0x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y13abcEv,_ZThn4_N3ccc7DD0x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y13efgEv,_ZTv0_n20_N3ccc7DD0x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y13efgEv,_ZThn4_N3ccc7DD0x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y13pqrEv,_ZTv0_n12_N3ccc7DD0x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y13abcEv,_ZTv0_n16_N3ccc7DD0x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y13efgEv,_ZTv0_n20_N3ccc7DD0x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y1E[] = {
  {&(_ZTVN3ccc7DD0x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y1E[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y13efgEv,_ZTv0_n20_N3ccc7DD0x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y13efgEv,_ZThn4_N3ccc7DD0x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y13abcEv,_ZTv0_n16_N3ccc7DD0x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y13abcEv,_ZThn4_N3ccc7DD0x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y13pqrEv,_ZTv0_n12_N3ccc7DD0x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y13pqrEv,_ZThn4_N3ccc7DD0x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y1E = {  "_ZN3ccc7DD0x4y1E", // class name
  bases__ZN3ccc7DD0x4y1E, 2,
  &(vtc__ZN3ccc7DD0x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y1E),3, //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  CC0x4y2  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y23pqrEv
  ~CC0x4y2(); // tgen
  CC0x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y2E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y23efgEv");}
void  ccc::CC0x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y23abcEv");}
void  ccc::CC0x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y23pqrEv");}
ccc::CC0x4y2 ::~CC0x4y2(){ note_dtor("_ZN3ccc7CC0x4y2E", this);} // tgen
ccc::CC0x4y2 ::CC0x4y2(){ note_ctor("_ZN3ccc7CC0x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y2E, buf);
    ::ccc::CC0x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y2E);
    dp->::ccc::CC0x4y2::~CC0x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y2E(Test__ZN3ccc7CC0x4y2E, "_ZN3ccc7CC0x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y2C1Ev();
extern void _ZN3ccc7CC0x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y2E[] = {
  NSPAIR(_ZN3ccc7CC0x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y2E[];
extern void _ZN3ccc7CC0x4y23pqrEv();
extern void _ZN3ccc7CC0x4y23abcEv();
extern void _ZN3ccc7CC0x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y23abcEv,_ZTv0_n12_N3ccc7CC0x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23abcEv,_ZThn4_N3ccc7CC0x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y23efgEv,_ZTv0_n16_N3ccc7CC0x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23efgEv,_ZThn4_N3ccc7CC0x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y23pqrEv,_ZTv0_n20_N3ccc7CC0x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23pqrEv,_ZThn4_N3ccc7CC0x4y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y23abcEv,_ZTv0_n12_N3ccc7CC0x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y23efgEv,_ZTv0_n16_N3ccc7CC0x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y23pqrEv,_ZTv0_n20_N3ccc7CC0x4y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y2E[] = {
  {&(_ZTVN3ccc7CC0x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y2E[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y23pqrEv,_ZTv0_n20_N3ccc7CC0x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y23pqrEv,_ZThn4_N3ccc7CC0x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y23efgEv,_ZTv0_n16_N3ccc7CC0x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y23efgEv,_ZThn4_N3ccc7CC0x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y23abcEv,_ZTv0_n12_N3ccc7CC0x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y23abcEv,_ZThn4_N3ccc7CC0x4y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y2E = {  "_ZN3ccc7CC0x4y2E", // class name
  bases__ZN3ccc7CC0x4y2E, 2,
  &(vtc__ZN3ccc7CC0x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y2E),2, //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  DD0x4y2  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD0x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y23pqrEv
  ~DD0x4y2(); // tgen
  DD0x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y23efgEv");}
void  ccc::DD0x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y23abcEv");}
void  ccc::DD0x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y23pqrEv");}
ccc::DD0x4y2 ::~DD0x4y2(){ note_dtor("_ZN3ccc7DD0x4y2E", this);} // tgen
ccc::DD0x4y2 ::DD0x4y2(){ note_ctor("_ZN3ccc7DD0x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y2E, buf);
    ::ccc::DD0x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y2E);
    dp->::ccc::DD0x4y2::~DD0x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y2E(Test__ZN3ccc7DD0x4y2E, "_ZN3ccc7DD0x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y2C1Ev();
extern void _ZN3ccc7DD0x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y2E[] = {
  NSPAIR(_ZN3ccc7DD0x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y2E[];
extern void _ZN3ccc7DD0x4y23abcEv();
extern void _ZN3ccc7DD0x4y23efgEv();
extern void _ZN3ccc7DD0x4y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y23pqrEv,_ZTv0_n12_N3ccc7DD0x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y23pqrEv,_ZThn4_N3ccc7DD0x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y23abcEv,_ZTv0_n16_N3ccc7DD0x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y23abcEv,_ZThn4_N3ccc7DD0x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y23efgEv,_ZTv0_n20_N3ccc7DD0x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y23efgEv,_ZThn4_N3ccc7DD0x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y23pqrEv,_ZTv0_n12_N3ccc7DD0x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y23abcEv,_ZTv0_n16_N3ccc7DD0x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y23efgEv,_ZTv0_n20_N3ccc7DD0x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y2E[] = {
  {&(_ZTVN3ccc7DD0x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y2E[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y23efgEv,_ZTv0_n20_N3ccc7DD0x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y23efgEv,_ZThn4_N3ccc7DD0x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y23abcEv,_ZTv0_n16_N3ccc7DD0x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y23abcEv,_ZThn4_N3ccc7DD0x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y23pqrEv,_ZTv0_n12_N3ccc7DD0x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y23pqrEv,_ZThn4_N3ccc7DD0x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y2E = {  "_ZN3ccc7DD0x4y2E", // class name
  bases__ZN3ccc7DD0x4y2E, 2,
  &(vtc__ZN3ccc7DD0x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y2E),3, //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  CC0x4y3  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x4y33abcEv
  ~CC0x4y3(); // tgen
  CC0x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y3E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y33efgEv");}
void  ccc::CC0x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y33pqrEv");}
void  ccc::CC0x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y33abcEv");}
ccc::CC0x4y3 ::~CC0x4y3(){ note_dtor("_ZN3ccc7CC0x4y3E", this);} // tgen
ccc::CC0x4y3 ::CC0x4y3(){ note_ctor("_ZN3ccc7CC0x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y3E, buf);
    ::ccc::CC0x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y3E);
    dp->::ccc::CC0x4y3::~CC0x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y3E(Test__ZN3ccc7CC0x4y3E, "_ZN3ccc7CC0x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y3C1Ev();
extern void _ZN3ccc7CC0x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y3E[] = {
  NSPAIR(_ZN3ccc7CC0x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y3E[];
extern void _ZN3ccc7CC0x4y33pqrEv();
extern void _ZN3ccc7CC0x4y33abcEv();
extern void _ZN3ccc7CC0x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y33abcEv,_ZTv0_n12_N3ccc7CC0x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33abcEv,_ZThn4_N3ccc7CC0x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y33efgEv,_ZTv0_n16_N3ccc7CC0x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33efgEv,_ZThn4_N3ccc7CC0x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y33pqrEv,_ZTv0_n20_N3ccc7CC0x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33pqrEv,_ZThn4_N3ccc7CC0x4y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y33abcEv,_ZTv0_n12_N3ccc7CC0x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y33efgEv,_ZTv0_n16_N3ccc7CC0x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y33pqrEv,_ZTv0_n20_N3ccc7CC0x4y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y3E[] = {
  {&(_ZTVN3ccc7CC0x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y3E[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y33pqrEv,_ZTv0_n20_N3ccc7CC0x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y33pqrEv,_ZThn4_N3ccc7CC0x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y33efgEv,_ZTv0_n16_N3ccc7CC0x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y33efgEv,_ZThn4_N3ccc7CC0x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y33abcEv,_ZTv0_n12_N3ccc7CC0x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y33abcEv,_ZThn4_N3ccc7CC0x4y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y3E = {  "_ZN3ccc7CC0x4y3E", // class name
  bases__ZN3ccc7CC0x4y3E, 2,
  &(vtc__ZN3ccc7CC0x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y3E),2, //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  DD0x4y3  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD0x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x4y33abcEv
  ~DD0x4y3(); // tgen
  DD0x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y33efgEv");}
void  ccc::DD0x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y33pqrEv");}
void  ccc::DD0x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y33abcEv");}
ccc::DD0x4y3 ::~DD0x4y3(){ note_dtor("_ZN3ccc7DD0x4y3E", this);} // tgen
ccc::DD0x4y3 ::DD0x4y3(){ note_ctor("_ZN3ccc7DD0x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y3E, buf);
    ::ccc::DD0x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y3E);
    dp->::ccc::DD0x4y3::~DD0x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y3E(Test__ZN3ccc7DD0x4y3E, "_ZN3ccc7DD0x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y3C1Ev();
extern void _ZN3ccc7DD0x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y3E[] = {
  NSPAIR(_ZN3ccc7DD0x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y3E[];
extern void _ZN3ccc7DD0x4y33abcEv();
extern void _ZN3ccc7DD0x4y33efgEv();
extern void _ZN3ccc7DD0x4y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y33pqrEv,_ZTv0_n12_N3ccc7DD0x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y33pqrEv,_ZThn4_N3ccc7DD0x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y33abcEv,_ZTv0_n16_N3ccc7DD0x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y33abcEv,_ZThn4_N3ccc7DD0x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y33efgEv,_ZTv0_n20_N3ccc7DD0x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y33efgEv,_ZThn4_N3ccc7DD0x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y33pqrEv,_ZTv0_n12_N3ccc7DD0x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y33abcEv,_ZTv0_n16_N3ccc7DD0x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y33efgEv,_ZTv0_n20_N3ccc7DD0x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y3E[] = {
  {&(_ZTVN3ccc7DD0x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y3E[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y33efgEv,_ZTv0_n20_N3ccc7DD0x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y33efgEv,_ZThn4_N3ccc7DD0x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y33abcEv,_ZTv0_n16_N3ccc7DD0x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y33abcEv,_ZThn4_N3ccc7DD0x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y33pqrEv,_ZTv0_n12_N3ccc7DD0x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y33pqrEv,_ZThn4_N3ccc7DD0x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y3E = {  "_ZN3ccc7DD0x4y3E", // class name
  bases__ZN3ccc7DD0x4y3E, 2,
  &(vtc__ZN3ccc7DD0x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y3E),3, //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  CC0x4y4  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC0x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y43efgEv
  ~CC0x4y4(); // tgen
  CC0x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y4E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y43pqrEv");}
void  ccc::CC0x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y43abcEv");}
void  ccc::CC0x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y43efgEv");}
ccc::CC0x4y4 ::~CC0x4y4(){ note_dtor("_ZN3ccc7CC0x4y4E", this);} // tgen
ccc::CC0x4y4 ::CC0x4y4(){ note_ctor("_ZN3ccc7CC0x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y4E, buf);
    ::ccc::CC0x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y4E);
    dp->::ccc::CC0x4y4::~CC0x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y4E(Test__ZN3ccc7CC0x4y4E, "_ZN3ccc7CC0x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y4C1Ev();
extern void _ZN3ccc7CC0x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y4E[] = {
  NSPAIR(_ZN3ccc7CC0x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y4E[];
extern void _ZN3ccc7CC0x4y43pqrEv();
extern void _ZN3ccc7CC0x4y43abcEv();
extern void _ZN3ccc7CC0x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y43abcEv,_ZTv0_n12_N3ccc7CC0x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43abcEv,_ZThn4_N3ccc7CC0x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y43efgEv,_ZTv0_n16_N3ccc7CC0x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43efgEv,_ZThn4_N3ccc7CC0x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y43pqrEv,_ZTv0_n20_N3ccc7CC0x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43pqrEv,_ZThn4_N3ccc7CC0x4y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y43abcEv,_ZTv0_n12_N3ccc7CC0x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y43efgEv,_ZTv0_n16_N3ccc7CC0x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y43pqrEv,_ZTv0_n20_N3ccc7CC0x4y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y4E[] = {
  {&(_ZTVN3ccc7CC0x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y4E[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y43pqrEv,_ZTv0_n20_N3ccc7CC0x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y43pqrEv,_ZThn4_N3ccc7CC0x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y43efgEv,_ZTv0_n16_N3ccc7CC0x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y43efgEv,_ZThn4_N3ccc7CC0x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y43abcEv,_ZTv0_n12_N3ccc7CC0x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y43abcEv,_ZThn4_N3ccc7CC0x4y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y4E = {  "_ZN3ccc7CC0x4y4E", // class name
  bases__ZN3ccc7CC0x4y4E, 2,
  &(vtc__ZN3ccc7CC0x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y4E),2, //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  DD0x4y4  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD0x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x4y43efgEv
  ~DD0x4y4(); // tgen
  DD0x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y43pqrEv");}
void  ccc::DD0x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y43abcEv");}
void  ccc::DD0x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y43efgEv");}
ccc::DD0x4y4 ::~DD0x4y4(){ note_dtor("_ZN3ccc7DD0x4y4E", this);} // tgen
ccc::DD0x4y4 ::DD0x4y4(){ note_ctor("_ZN3ccc7DD0x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y4E, buf);
    ::ccc::DD0x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y4E);
    dp->::ccc::DD0x4y4::~DD0x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y4E(Test__ZN3ccc7DD0x4y4E, "_ZN3ccc7DD0x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y4C1Ev();
extern void _ZN3ccc7DD0x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y4E[] = {
  NSPAIR(_ZN3ccc7DD0x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y4E[];
extern void _ZN3ccc7DD0x4y43abcEv();
extern void _ZN3ccc7DD0x4y43efgEv();
extern void _ZN3ccc7DD0x4y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y43pqrEv,_ZTv0_n12_N3ccc7DD0x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y43pqrEv,_ZThn4_N3ccc7DD0x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y43abcEv,_ZTv0_n16_N3ccc7DD0x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y43abcEv,_ZThn4_N3ccc7DD0x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y43efgEv,_ZTv0_n20_N3ccc7DD0x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y43efgEv,_ZThn4_N3ccc7DD0x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y43pqrEv,_ZTv0_n12_N3ccc7DD0x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y43abcEv,_ZTv0_n16_N3ccc7DD0x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y43efgEv,_ZTv0_n20_N3ccc7DD0x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y4E[] = {
  {&(_ZTVN3ccc7DD0x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y4E[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y43efgEv,_ZTv0_n20_N3ccc7DD0x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y43efgEv,_ZThn4_N3ccc7DD0x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y43abcEv,_ZTv0_n16_N3ccc7DD0x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y43abcEv,_ZThn4_N3ccc7DD0x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y43pqrEv,_ZTv0_n12_N3ccc7DD0x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y43pqrEv,_ZThn4_N3ccc7DD0x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y4E = {  "_ZN3ccc7DD0x4y4E", // class name
  bases__ZN3ccc7DD0x4y4E, 2,
  &(vtc__ZN3ccc7DD0x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y4E),3, //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  CC0x4y5  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC0x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y53abcEv
  ~CC0x4y5(); // tgen
  CC0x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y5E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y53pqrEv");}
void  ccc::CC0x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y53efgEv");}
void  ccc::CC0x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y53abcEv");}
ccc::CC0x4y5 ::~CC0x4y5(){ note_dtor("_ZN3ccc7CC0x4y5E", this);} // tgen
ccc::CC0x4y5 ::CC0x4y5(){ note_ctor("_ZN3ccc7CC0x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y5E, buf);
    ::ccc::CC0x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y5E);
    dp->::ccc::CC0x4y5::~CC0x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y5E(Test__ZN3ccc7CC0x4y5E, "_ZN3ccc7CC0x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y5C1Ev();
extern void _ZN3ccc7CC0x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y5E[] = {
  NSPAIR(_ZN3ccc7CC0x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y5E[];
extern void _ZN3ccc7CC0x4y53pqrEv();
extern void _ZN3ccc7CC0x4y53abcEv();
extern void _ZN3ccc7CC0x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y53abcEv,_ZTv0_n12_N3ccc7CC0x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53abcEv,_ZThn4_N3ccc7CC0x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y53efgEv,_ZTv0_n16_N3ccc7CC0x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53efgEv,_ZThn4_N3ccc7CC0x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y53pqrEv,_ZTv0_n20_N3ccc7CC0x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53pqrEv,_ZThn4_N3ccc7CC0x4y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y53abcEv,_ZTv0_n12_N3ccc7CC0x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y53efgEv,_ZTv0_n16_N3ccc7CC0x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y53pqrEv,_ZTv0_n20_N3ccc7CC0x4y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y5E[] = {
  {&(_ZTVN3ccc7CC0x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y5E[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y53pqrEv,_ZTv0_n20_N3ccc7CC0x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y53pqrEv,_ZThn4_N3ccc7CC0x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y53efgEv,_ZTv0_n16_N3ccc7CC0x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y53efgEv,_ZThn4_N3ccc7CC0x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y53abcEv,_ZTv0_n12_N3ccc7CC0x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y53abcEv,_ZThn4_N3ccc7CC0x4y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y5E = {  "_ZN3ccc7CC0x4y5E", // class name
  bases__ZN3ccc7CC0x4y5E, 2,
  &(vtc__ZN3ccc7CC0x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y5E),2, //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  DD0x4y5  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD0x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x4y53abcEv
  ~DD0x4y5(); // tgen
  DD0x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y53pqrEv");}
void  ccc::DD0x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y53efgEv");}
void  ccc::DD0x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y53abcEv");}
ccc::DD0x4y5 ::~DD0x4y5(){ note_dtor("_ZN3ccc7DD0x4y5E", this);} // tgen
ccc::DD0x4y5 ::DD0x4y5(){ note_ctor("_ZN3ccc7DD0x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y5E, buf);
    ::ccc::DD0x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y5E);
    dp->::ccc::DD0x4y5::~DD0x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y5E(Test__ZN3ccc7DD0x4y5E, "_ZN3ccc7DD0x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y5C1Ev();
extern void _ZN3ccc7DD0x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y5E[] = {
  NSPAIR(_ZN3ccc7DD0x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y5E[];
extern void _ZN3ccc7DD0x4y53abcEv();
extern void _ZN3ccc7DD0x4y53efgEv();
extern void _ZN3ccc7DD0x4y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y53pqrEv,_ZTv0_n12_N3ccc7DD0x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y53pqrEv,_ZThn4_N3ccc7DD0x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y53abcEv,_ZTv0_n16_N3ccc7DD0x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y53abcEv,_ZThn4_N3ccc7DD0x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y53efgEv,_ZTv0_n20_N3ccc7DD0x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y53efgEv,_ZThn4_N3ccc7DD0x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y53pqrEv,_ZTv0_n12_N3ccc7DD0x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y53abcEv,_ZTv0_n16_N3ccc7DD0x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y53efgEv,_ZTv0_n20_N3ccc7DD0x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y5E[] = {
  {&(_ZTVN3ccc7DD0x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y5E[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y53efgEv,_ZTv0_n20_N3ccc7DD0x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y53efgEv,_ZThn4_N3ccc7DD0x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y53abcEv,_ZTv0_n16_N3ccc7DD0x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y53abcEv,_ZThn4_N3ccc7DD0x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y53pqrEv,_ZTv0_n12_N3ccc7DD0x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y53pqrEv,_ZThn4_N3ccc7DD0x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y5E = {  "_ZN3ccc7DD0x4y5E", // class name
  bases__ZN3ccc7DD0x4y5E, 2,
  &(vtc__ZN3ccc7DD0x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y5E),3, //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  CC0x4y6  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y63efgEv
  ~CC0x4y6(); // tgen
  CC0x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y6E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y63abcEv");}
void  ccc::CC0x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y63efgEv");}
ccc::CC0x4y6 ::~CC0x4y6(){ note_dtor("_ZN3ccc7CC0x4y6E", this);} // tgen
ccc::CC0x4y6 ::CC0x4y6(){ note_ctor("_ZN3ccc7CC0x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y6E, buf);
    ::ccc::CC0x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y6E);
    dp->::ccc::CC0x4y6::~CC0x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y6E(Test__ZN3ccc7CC0x4y6E, "_ZN3ccc7CC0x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y6C1Ev();
extern void _ZN3ccc7CC0x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y6E[] = {
  NSPAIR(_ZN3ccc7CC0x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC0x4y63abcEv();
extern void _ZN3ccc7CC0x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y63abcEv,_ZTv0_n12_N3ccc7CC0x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y63abcEv,_ZThn4_N3ccc7CC0x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y63efgEv,_ZTv0_n16_N3ccc7CC0x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y63efgEv,_ZThn4_N3ccc7CC0x4y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y63abcEv,_ZTv0_n12_N3ccc7CC0x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y63efgEv,_ZTv0_n16_N3ccc7CC0x4y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y6E[] = {
  {&(_ZTVN3ccc7CC0x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y6E[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y63efgEv,_ZTv0_n16_N3ccc7CC0x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y63efgEv,_ZThn4_N3ccc7CC0x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y63abcEv,_ZTv0_n12_N3ccc7CC0x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y63abcEv,_ZThn4_N3ccc7CC0x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y6E = {  "_ZN3ccc7CC0x4y6E", // class name
  bases__ZN3ccc7CC0x4y6E, 2,
  &(vtc__ZN3ccc7CC0x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y6E),2, //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  DD0x4y6  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD0x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x4y63efgEv
  ~DD0x4y6(); // tgen
  DD0x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y63abcEv");}
void  ccc::DD0x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y63efgEv");}
ccc::DD0x4y6 ::~DD0x4y6(){ note_dtor("_ZN3ccc7DD0x4y6E", this);} // tgen
ccc::DD0x4y6 ::DD0x4y6(){ note_ctor("_ZN3ccc7DD0x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y6E, buf);
    ::ccc::DD0x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y6E);
    dp->::ccc::DD0x4y6::~DD0x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y6E(Test__ZN3ccc7DD0x4y6E, "_ZN3ccc7DD0x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y6C1Ev();
extern void _ZN3ccc7DD0x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y6E[] = {
  NSPAIR(_ZN3ccc7DD0x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y6E[];
extern void _ZN3ccc7DD0x4y63abcEv();
extern void _ZN3ccc7DD0x4y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y63abcEv,_ZTv0_n16_N3ccc7DD0x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y63abcEv,_ZThn4_N3ccc7DD0x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y63efgEv,_ZTv0_n20_N3ccc7DD0x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y63efgEv,_ZThn4_N3ccc7DD0x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y63abcEv,_ZTv0_n16_N3ccc7DD0x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y63efgEv,_ZTv0_n20_N3ccc7DD0x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y6E[] = {
  {&(_ZTVN3ccc7DD0x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y6E[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y63efgEv,_ZTv0_n20_N3ccc7DD0x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y63efgEv,_ZThn4_N3ccc7DD0x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y63abcEv,_ZTv0_n16_N3ccc7DD0x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y63abcEv,_ZThn4_N3ccc7DD0x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y6E = {  "_ZN3ccc7DD0x4y6E", // class name
  bases__ZN3ccc7DD0x4y6E, 2,
  &(vtc__ZN3ccc7DD0x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y6E),3, //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  CC0x4y7  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y73pqrEv
  ~CC0x4y7(); // tgen
  CC0x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y7E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y73abcEv");}
void  ccc::CC0x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y73pqrEv");}
ccc::CC0x4y7 ::~CC0x4y7(){ note_dtor("_ZN3ccc7CC0x4y7E", this);} // tgen
ccc::CC0x4y7 ::CC0x4y7(){ note_ctor("_ZN3ccc7CC0x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y7E, buf);
    ::ccc::CC0x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y7E);
    dp->::ccc::CC0x4y7::~CC0x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y7E(Test__ZN3ccc7CC0x4y7E, "_ZN3ccc7CC0x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y7C1Ev();
extern void _ZN3ccc7CC0x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y7E[] = {
  NSPAIR(_ZN3ccc7CC0x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y7E[];
extern void _ZN3ccc7CC0x4y73pqrEv();
extern void _ZN3ccc7CC0x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y73abcEv,_ZTv0_n12_N3ccc7CC0x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y73abcEv,_ZThn4_N3ccc7CC0x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y73pqrEv,_ZTv0_n20_N3ccc7CC0x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y73pqrEv,_ZThn4_N3ccc7CC0x4y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y73abcEv,_ZTv0_n12_N3ccc7CC0x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y73pqrEv,_ZTv0_n20_N3ccc7CC0x4y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y7E[] = {
  {&(_ZTVN3ccc7CC0x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y7E[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y73pqrEv,_ZTv0_n20_N3ccc7CC0x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y73pqrEv,_ZThn4_N3ccc7CC0x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y73abcEv,_ZTv0_n12_N3ccc7CC0x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y73abcEv,_ZThn4_N3ccc7CC0x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y7E = {  "_ZN3ccc7CC0x4y7E", // class name
  bases__ZN3ccc7CC0x4y7E, 2,
  &(vtc__ZN3ccc7CC0x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y7E),2, //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  DD0x4y7  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD0x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y73pqrEv
  ~DD0x4y7(); // tgen
  DD0x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y73abcEv");}
void  ccc::DD0x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y73pqrEv");}
ccc::DD0x4y7 ::~DD0x4y7(){ note_dtor("_ZN3ccc7DD0x4y7E", this);} // tgen
ccc::DD0x4y7 ::DD0x4y7(){ note_ctor("_ZN3ccc7DD0x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y7E, buf);
    ::ccc::DD0x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y7E);
    dp->::ccc::DD0x4y7::~DD0x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y7E(Test__ZN3ccc7DD0x4y7E, "_ZN3ccc7DD0x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y7C1Ev();
extern void _ZN3ccc7DD0x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y7E[] = {
  NSPAIR(_ZN3ccc7DD0x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y7E[];
extern void _ZN3ccc7DD0x4y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x4y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y73pqrEv,_ZTv0_n12_N3ccc7DD0x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y73pqrEv,_ZThn4_N3ccc7DD0x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y73abcEv,_ZTv0_n16_N3ccc7DD0x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y73abcEv,_ZThn4_N3ccc7DD0x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y73pqrEv,_ZTv0_n12_N3ccc7DD0x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y73abcEv,_ZTv0_n16_N3ccc7DD0x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y7E[] = {
  {&(_ZTVN3ccc7DD0x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y7E[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y73abcEv,_ZTv0_n16_N3ccc7DD0x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y73abcEv,_ZThn4_N3ccc7DD0x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y73pqrEv,_ZTv0_n12_N3ccc7DD0x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y73pqrEv,_ZThn4_N3ccc7DD0x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y7E = {  "_ZN3ccc7DD0x4y7E", // class name
  bases__ZN3ccc7DD0x4y7E, 2,
  &(vtc__ZN3ccc7DD0x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y7E),3, //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  CC0x4y8  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y83abcEv
  ~CC0x4y8(); // tgen
  CC0x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y8E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y83efgEv");}
void  ccc::CC0x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y83abcEv");}
ccc::CC0x4y8 ::~CC0x4y8(){ note_dtor("_ZN3ccc7CC0x4y8E", this);} // tgen
ccc::CC0x4y8 ::CC0x4y8(){ note_ctor("_ZN3ccc7CC0x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y8E, buf);
    ::ccc::CC0x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y8E);
    dp->::ccc::CC0x4y8::~CC0x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y8E(Test__ZN3ccc7CC0x4y8E, "_ZN3ccc7CC0x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y8C1Ev();
extern void _ZN3ccc7CC0x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y8E[] = {
  NSPAIR(_ZN3ccc7CC0x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC0x4y83abcEv();
extern void _ZN3ccc7CC0x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x4y83abcEv,_ZTv0_n12_N3ccc7CC0x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y83abcEv,_ZThn4_N3ccc7CC0x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y83efgEv,_ZTv0_n16_N3ccc7CC0x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y83efgEv,_ZThn4_N3ccc7CC0x4y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x4y83abcEv,_ZTv0_n12_N3ccc7CC0x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y83efgEv,_ZTv0_n16_N3ccc7CC0x4y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y8E[] = {
  {&(_ZTVN3ccc7CC0x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y8E[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y83efgEv,_ZTv0_n16_N3ccc7CC0x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y83efgEv,_ZThn4_N3ccc7CC0x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x4y83abcEv,_ZTv0_n12_N3ccc7CC0x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y83abcEv,_ZThn4_N3ccc7CC0x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y8E = {  "_ZN3ccc7CC0x4y8E", // class name
  bases__ZN3ccc7CC0x4y8E, 2,
  &(vtc__ZN3ccc7CC0x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y8E),2, //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  DD0x4y8  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD0x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x4y83abcEv
  ~DD0x4y8(); // tgen
  DD0x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y83efgEv");}
void  ccc::DD0x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x4y83abcEv");}
ccc::DD0x4y8 ::~DD0x4y8(){ note_dtor("_ZN3ccc7DD0x4y8E", this);} // tgen
ccc::DD0x4y8 ::DD0x4y8(){ note_ctor("_ZN3ccc7DD0x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y8E, buf);
    ::ccc::DD0x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y8E);
    dp->::ccc::DD0x4y8::~DD0x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y8E(Test__ZN3ccc7DD0x4y8E, "_ZN3ccc7DD0x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y8C1Ev();
extern void _ZN3ccc7DD0x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y8E[] = {
  NSPAIR(_ZN3ccc7DD0x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y8E[];
extern void _ZN3ccc7DD0x4y83abcEv();
extern void _ZN3ccc7DD0x4y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x4y83abcEv,_ZTv0_n16_N3ccc7DD0x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y83abcEv,_ZThn4_N3ccc7DD0x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y83efgEv,_ZTv0_n20_N3ccc7DD0x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y83efgEv,_ZThn4_N3ccc7DD0x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x4y83abcEv,_ZTv0_n16_N3ccc7DD0x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y83efgEv,_ZTv0_n20_N3ccc7DD0x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y8E[] = {
  {&(_ZTVN3ccc7DD0x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y8E[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y83efgEv,_ZTv0_n20_N3ccc7DD0x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y83efgEv,_ZThn4_N3ccc7DD0x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x4y83abcEv,_ZTv0_n16_N3ccc7DD0x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y83abcEv,_ZThn4_N3ccc7DD0x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y8E = {  "_ZN3ccc7DD0x4y8E", // class name
  bases__ZN3ccc7DD0x4y8E, 2,
  &(vtc__ZN3ccc7DD0x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y8E),3, //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  CC0x4y9  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y93pqrEv
  ~CC0x4y9(); // tgen
  CC0x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y9E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y93efgEv");}
void  ccc::CC0x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y93pqrEv");}
ccc::CC0x4y9 ::~CC0x4y9(){ note_dtor("_ZN3ccc7CC0x4y9E", this);} // tgen
ccc::CC0x4y9 ::CC0x4y9(){ note_ctor("_ZN3ccc7CC0x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y9E, buf);
    ::ccc::CC0x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC0x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y9E);
    dp->::ccc::CC0x4y9::~CC0x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y9E(Test__ZN3ccc7CC0x4y9E, "_ZN3ccc7CC0x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y9C1Ev();
extern void _ZN3ccc7CC0x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y9E[] = {
  NSPAIR(_ZN3ccc7CC0x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y9E[];
extern void _ZN3ccc7CC0x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC0x4y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x4y93efgEv,_ZTv0_n16_N3ccc7CC0x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y93efgEv,_ZThn4_N3ccc7CC0x4y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x4y93pqrEv,_ZTv0_n20_N3ccc7CC0x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y93pqrEv,_ZThn4_N3ccc7CC0x4y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x4y93efgEv,_ZTv0_n16_N3ccc7CC0x4y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x4y93pqrEv,_ZTv0_n20_N3ccc7CC0x4y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x4y9E[] = {
  {&(_ZTVN3ccc7CC0x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x4y9E[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x4y93pqrEv,_ZTv0_n20_N3ccc7CC0x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y93pqrEv,_ZThn4_N3ccc7CC0x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x4y93efgEv,_ZTv0_n16_N3ccc7CC0x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x4y93efgEv,_ZThn4_N3ccc7CC0x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x4y9E = {  "_ZN3ccc7CC0x4y9E", // class name
  bases__ZN3ccc7CC0x4y9E, 2,
  &(vtc__ZN3ccc7CC0x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x4y9E),2, //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  DD0x4y9  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD0x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x4y93pqrEv
  ~DD0x4y9(); // tgen
  DD0x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x4y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x4y93efgEv");}
void  ccc::DD0x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x4y93pqrEv");}
ccc::DD0x4y9 ::~DD0x4y9(){ note_dtor("_ZN3ccc7DD0x4y9E", this);} // tgen
ccc::DD0x4y9 ::DD0x4y9(){ note_ctor("_ZN3ccc7DD0x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x4y9E, buf);
    ::ccc::DD0x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x4y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD0x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x4y9E);
    dp->::ccc::DD0x4y9::~DD0x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x4y9E(Test__ZN3ccc7DD0x4y9E, "_ZN3ccc7DD0x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x4y9C1Ev();
extern void _ZN3ccc7DD0x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x4y9E[] = {
  NSPAIR(_ZN3ccc7DD0x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD0x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x4y93efgEv();
extern void _ZN3ccc7DD0x4y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x4y93pqrEv,_ZTv0_n12_N3ccc7DD0x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y93pqrEv,_ZThn4_N3ccc7DD0x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x4y93efgEv,_ZTv0_n20_N3ccc7DD0x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x4y93efgEv,_ZThn4_N3ccc7DD0x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x4y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x4y93pqrEv,_ZTv0_n12_N3ccc7DD0x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x4y93efgEv,_ZTv0_n20_N3ccc7DD0x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x4y9E[] = {
  {&(_ZTVN3ccc7DD0x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x4y9E[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x4y93efgEv,_ZTv0_n20_N3ccc7DD0x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y93efgEv,_ZThn4_N3ccc7DD0x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x4y93pqrEv,_ZTv0_n12_N3ccc7DD0x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x4y93pqrEv,_ZThn4_N3ccc7DD0x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x4y9E = {  "_ZN3ccc7DD0x4y9E", // class name
  bases__ZN3ccc7DD0x4y9E, 2,
  &(vtc__ZN3ccc7DD0x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x4y9E),3, //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  CC0x4y10  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x4y103abcEv
  ~CC0x4y10(); // tgen
  CC0x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y10E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y103pqrEv");}
void  ccc::CC0x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x4y103abcEv");}
ccc::CC0x4y10 ::~CC0x4y10(){ note_dtor("_ZN3ccc8CC0x4y10E", this);} // tgen
ccc::CC0x4y10 ::CC0x4y10(){ note_ctor("_ZN3ccc8CC0x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y10E, buf);
    ::ccc::CC0x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y10E);
    dp->::ccc::CC0x4y10::~CC0x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y10E(Test__ZN3ccc8CC0x4y10E, "_ZN3ccc8CC0x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y10C1Ev();
extern void _ZN3ccc8CC0x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y10E[] = {
  NSPAIR(_ZN3ccc8CC0x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y10E[];
extern void _ZN3ccc8CC0x4y103pqrEv();
extern void _ZN3ccc8CC0x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x4y103abcEv,_ZTv0_n12_N3ccc8CC0x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y103abcEv,_ZThn4_N3ccc8CC0x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x4y103pqrEv,_ZTv0_n20_N3ccc8CC0x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y103pqrEv,_ZThn4_N3ccc8CC0x4y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x4y103abcEv,_ZTv0_n12_N3ccc8CC0x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x4y103pqrEv,_ZTv0_n20_N3ccc8CC0x4y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y10E[] = {
  {&(_ZTVN3ccc8CC0x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y10E[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x4y103pqrEv,_ZTv0_n20_N3ccc8CC0x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y103pqrEv,_ZThn4_N3ccc8CC0x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x4y103abcEv,_ZTv0_n12_N3ccc8CC0x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y103abcEv,_ZThn4_N3ccc8CC0x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x4y10E = {  "_ZN3ccc8CC0x4y10E", // class name
  bases__ZN3ccc8CC0x4y10E, 2,
  &(vtc__ZN3ccc8CC0x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y10E),2, //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  DD0x4y10  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD0x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x4y103abcEv
  ~DD0x4y10(); // tgen
  DD0x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x4y103pqrEv");}
void  ccc::DD0x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x4y103abcEv");}
ccc::DD0x4y10 ::~DD0x4y10(){ note_dtor("_ZN3ccc8DD0x4y10E", this);} // tgen
ccc::DD0x4y10 ::DD0x4y10(){ note_ctor("_ZN3ccc8DD0x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y10E, buf);
    ::ccc::DD0x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y10E);
    dp->::ccc::DD0x4y10::~DD0x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y10E(Test__ZN3ccc8DD0x4y10E, "_ZN3ccc8DD0x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y10C1Ev();
extern void _ZN3ccc8DD0x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y10E[] = {
  NSPAIR(_ZN3ccc8DD0x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y10E[];
extern void _ZN3ccc8DD0x4y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x4y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x4y103pqrEv,_ZTv0_n12_N3ccc8DD0x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y103pqrEv,_ZThn4_N3ccc8DD0x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x4y103abcEv,_ZTv0_n16_N3ccc8DD0x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y103abcEv,_ZThn4_N3ccc8DD0x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x4y103pqrEv,_ZTv0_n12_N3ccc8DD0x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x4y103abcEv,_ZTv0_n16_N3ccc8DD0x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y10E[] = {
  {&(_ZTVN3ccc8DD0x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y10E[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x4y103abcEv,_ZTv0_n16_N3ccc8DD0x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y103abcEv,_ZThn4_N3ccc8DD0x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x4y103pqrEv,_ZTv0_n12_N3ccc8DD0x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y103pqrEv,_ZThn4_N3ccc8DD0x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x4y10E = {  "_ZN3ccc8DD0x4y10E", // class name
  bases__ZN3ccc8DD0x4y10E, 2,
  &(vtc__ZN3ccc8DD0x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y10E),3, //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  CC0x4y11  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x4y113efgEv
  ~CC0x4y11(); // tgen
  CC0x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y11E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y113pqrEv");}
void  ccc::CC0x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x4y113efgEv");}
ccc::CC0x4y11 ::~CC0x4y11(){ note_dtor("_ZN3ccc8CC0x4y11E", this);} // tgen
ccc::CC0x4y11 ::CC0x4y11(){ note_ctor("_ZN3ccc8CC0x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y11E, buf);
    ::ccc::CC0x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y11E);
    dp->::ccc::CC0x4y11::~CC0x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y11E(Test__ZN3ccc8CC0x4y11E, "_ZN3ccc8CC0x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y11C1Ev();
extern void _ZN3ccc8CC0x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y11E[] = {
  NSPAIR(_ZN3ccc8CC0x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y11E[];
extern void _ZN3ccc8CC0x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC0x4y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x4y113efgEv,_ZTv0_n16_N3ccc8CC0x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y113efgEv,_ZThn4_N3ccc8CC0x4y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x4y113pqrEv,_ZTv0_n20_N3ccc8CC0x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y113pqrEv,_ZThn4_N3ccc8CC0x4y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x4y113efgEv,_ZTv0_n16_N3ccc8CC0x4y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x4y113pqrEv,_ZTv0_n20_N3ccc8CC0x4y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y11E[] = {
  {&(_ZTVN3ccc8CC0x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y11E[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x4y113pqrEv,_ZTv0_n20_N3ccc8CC0x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y113pqrEv,_ZThn4_N3ccc8CC0x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x4y113efgEv,_ZTv0_n16_N3ccc8CC0x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y113efgEv,_ZThn4_N3ccc8CC0x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x4y11E = {  "_ZN3ccc8CC0x4y11E", // class name
  bases__ZN3ccc8CC0x4y11E, 2,
  &(vtc__ZN3ccc8CC0x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y11E),2, //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  DD0x4y11  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD0x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x4y113efgEv
  ~DD0x4y11(); // tgen
  DD0x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x4y113pqrEv");}
void  ccc::DD0x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x4y113efgEv");}
ccc::DD0x4y11 ::~DD0x4y11(){ note_dtor("_ZN3ccc8DD0x4y11E", this);} // tgen
ccc::DD0x4y11 ::DD0x4y11(){ note_ctor("_ZN3ccc8DD0x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y11E, buf);
    ::ccc::DD0x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y11E);
    dp->::ccc::DD0x4y11::~DD0x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y11E(Test__ZN3ccc8DD0x4y11E, "_ZN3ccc8DD0x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y11C1Ev();
extern void _ZN3ccc8DD0x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y11E[] = {
  NSPAIR(_ZN3ccc8DD0x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x4y113efgEv();
extern void _ZN3ccc8DD0x4y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x4y113pqrEv,_ZTv0_n12_N3ccc8DD0x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y113pqrEv,_ZThn4_N3ccc8DD0x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x4y113efgEv,_ZTv0_n20_N3ccc8DD0x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y113efgEv,_ZThn4_N3ccc8DD0x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x4y113pqrEv,_ZTv0_n12_N3ccc8DD0x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x4y113efgEv,_ZTv0_n20_N3ccc8DD0x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y11E[] = {
  {&(_ZTVN3ccc8DD0x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y11E[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x4y113efgEv,_ZTv0_n20_N3ccc8DD0x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y113efgEv,_ZThn4_N3ccc8DD0x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x4y113pqrEv,_ZTv0_n12_N3ccc8DD0x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y113pqrEv,_ZThn4_N3ccc8DD0x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x4y11E = {  "_ZN3ccc8DD0x4y11E", // class name
  bases__ZN3ccc8DD0x4y11E, 2,
  &(vtc__ZN3ccc8DD0x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y11E),3, //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  CC0x4y12  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC0x4y123abcEv
  ~CC0x4y12(); // tgen
  CC0x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x4y123abcEv");}
ccc::CC0x4y12 ::~CC0x4y12(){ note_dtor("_ZN3ccc8CC0x4y12E", this);} // tgen
ccc::CC0x4y12 ::CC0x4y12(){ note_ctor("_ZN3ccc8CC0x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y12E, buf);
    ::ccc::CC0x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y12E);
    dp->::ccc::CC0x4y12::~CC0x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y12E(Test__ZN3ccc8CC0x4y12E, "_ZN3ccc8CC0x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y12C1Ev();
extern void _ZN3ccc8CC0x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y12E[] = {
  NSPAIR(_ZN3ccc8CC0x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC0x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x4y123abcEv,_ZTv0_n12_N3ccc8CC0x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y123abcEv,_ZThn4_N3ccc8CC0x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x4y123abcEv,_ZTv0_n12_N3ccc8CC0x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y12E[] = {
  {&(_ZTVN3ccc8CC0x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y12E[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x4y123abcEv,_ZTv0_n12_N3ccc8CC0x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y123abcEv,_ZThn4_N3ccc8CC0x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x4y12E = {  "_ZN3ccc8CC0x4y12E", // class name
  bases__ZN3ccc8CC0x4y12E, 2,
  &(vtc__ZN3ccc8CC0x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y12E),2, //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  DD0x4y12  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD0x4y123abcEv
  ~DD0x4y12(); // tgen
  DD0x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x4y123abcEv");}
ccc::DD0x4y12 ::~DD0x4y12(){ note_dtor("_ZN3ccc8DD0x4y12E", this);} // tgen
ccc::DD0x4y12 ::DD0x4y12(){ note_ctor("_ZN3ccc8DD0x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y12E, buf);
    ::ccc::DD0x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y12E);
    dp->::ccc::DD0x4y12::~DD0x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y12E(Test__ZN3ccc8DD0x4y12E, "_ZN3ccc8DD0x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y12C1Ev();
extern void _ZN3ccc8DD0x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y12E[] = {
  NSPAIR(_ZN3ccc8DD0x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y12E[];
extern void _ZN3ccc8DD0x4y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x4y123abcEv,_ZTv0_n16_N3ccc8DD0x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y123abcEv,_ZThn4_N3ccc8DD0x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x4y123abcEv,_ZTv0_n16_N3ccc8DD0x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y12E[] = {
  {&(_ZTVN3ccc8DD0x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y12E[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x4y123abcEv,_ZTv0_n16_N3ccc8DD0x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y123abcEv,_ZThn4_N3ccc8DD0x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x4y12E = {  "_ZN3ccc8DD0x4y12E", // class name
  bases__ZN3ccc8DD0x4y12E, 2,
  &(vtc__ZN3ccc8DD0x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y12E),3, //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  CC0x4y13  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC0x4y133efgEv
  ~CC0x4y13(); // tgen
  CC0x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x4y133efgEv");}
ccc::CC0x4y13 ::~CC0x4y13(){ note_dtor("_ZN3ccc8CC0x4y13E", this);} // tgen
ccc::CC0x4y13 ::CC0x4y13(){ note_ctor("_ZN3ccc8CC0x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y13E, buf);
    ::ccc::CC0x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y13E);
    dp->::ccc::CC0x4y13::~CC0x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y13E(Test__ZN3ccc8CC0x4y13E, "_ZN3ccc8CC0x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y13C1Ev();
extern void _ZN3ccc8CC0x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y13E[] = {
  NSPAIR(_ZN3ccc8CC0x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC0x4y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x4y133efgEv,_ZTv0_n16_N3ccc8CC0x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y133efgEv,_ZThn4_N3ccc8CC0x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x4y133efgEv,_ZTv0_n16_N3ccc8CC0x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y13E[] = {
  {&(_ZTVN3ccc8CC0x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y13E[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x4y133efgEv,_ZTv0_n16_N3ccc8CC0x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y133efgEv,_ZThn4_N3ccc8CC0x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x4y13E = {  "_ZN3ccc8CC0x4y13E", // class name
  bases__ZN3ccc8CC0x4y13E, 2,
  &(vtc__ZN3ccc8CC0x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y13E),2, //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  DD0x4y13  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD0x4y133efgEv
  ~DD0x4y13(); // tgen
  DD0x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x4y133efgEv");}
ccc::DD0x4y13 ::~DD0x4y13(){ note_dtor("_ZN3ccc8DD0x4y13E", this);} // tgen
ccc::DD0x4y13 ::DD0x4y13(){ note_ctor("_ZN3ccc8DD0x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y13E, buf);
    ::ccc::DD0x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y13E);
    dp->::ccc::DD0x4y13::~DD0x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y13E(Test__ZN3ccc8DD0x4y13E, "_ZN3ccc8DD0x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y13C1Ev();
extern void _ZN3ccc8DD0x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y13E[] = {
  NSPAIR(_ZN3ccc8DD0x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x4y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x4y133efgEv,_ZTv0_n20_N3ccc8DD0x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y133efgEv,_ZThn4_N3ccc8DD0x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x4y133efgEv,_ZTv0_n20_N3ccc8DD0x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y13E[] = {
  {&(_ZTVN3ccc8DD0x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y13E[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x4y133efgEv,_ZTv0_n20_N3ccc8DD0x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y133efgEv,_ZThn4_N3ccc8DD0x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x4y13E = {  "_ZN3ccc8DD0x4y13E", // class name
  bases__ZN3ccc8DD0x4y13E, 2,
  &(vtc__ZN3ccc8DD0x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y13E),3, //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  CC0x4y14  : virtual ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y143pqrEv
  ~CC0x4y14(); // tgen
  CC0x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y143pqrEv");}
ccc::CC0x4y14 ::~CC0x4y14(){ note_dtor("_ZN3ccc8CC0x4y14E", this);} // tgen
ccc::CC0x4y14 ::CC0x4y14(){ note_ctor("_ZN3ccc8CC0x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y14E, buf);
    ::ccc::CC0x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y14E);
    dp->::ccc::CC0x4y14::~CC0x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y14E(Test__ZN3ccc8CC0x4y14E, "_ZN3ccc8CC0x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y14C1Ev();
extern void _ZN3ccc8CC0x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y14E[] = {
  NSPAIR(_ZN3ccc8CC0x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y14E[];
extern void _ZN3ccc8CC0x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x4y143pqrEv,_ZTv0_n20_N3ccc8CC0x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y143pqrEv,_ZThn4_N3ccc8CC0x4y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x4y143pqrEv,_ZTv0_n20_N3ccc8CC0x4y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y14E[] = {
  {&(_ZTVN3ccc8CC0x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y14E[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x4y143pqrEv,_ZTv0_n20_N3ccc8CC0x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x4y143pqrEv,_ZThn4_N3ccc8CC0x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x4y14E = {  "_ZN3ccc8CC0x4y14E", // class name
  bases__ZN3ccc8CC0x4y14E, 2,
  &(vtc__ZN3ccc8CC0x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y14E),2, //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  DD0x4y14  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD0x4y143pqrEv
  ~DD0x4y14(); // tgen
  DD0x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x4y143pqrEv");}
ccc::DD0x4y14 ::~DD0x4y14(){ note_dtor("_ZN3ccc8DD0x4y14E", this);} // tgen
ccc::DD0x4y14 ::DD0x4y14(){ note_ctor("_ZN3ccc8DD0x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y14E, buf);
    ::ccc::DD0x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y14E);
    dp->::ccc::DD0x4y14::~DD0x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y14E(Test__ZN3ccc8DD0x4y14E, "_ZN3ccc8DD0x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y14C1Ev();
extern void _ZN3ccc8DD0x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y14E[] = {
  NSPAIR(_ZN3ccc8DD0x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x4y143pqrEv,_ZTv0_n12_N3ccc8DD0x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x4y143pqrEv,_ZThn4_N3ccc8DD0x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x4y143pqrEv,_ZTv0_n12_N3ccc8DD0x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y14E[] = {
  {&(_ZTVN3ccc8DD0x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y14E[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x4y143pqrEv,_ZTv0_n12_N3ccc8DD0x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x4y143pqrEv,_ZThn4_N3ccc8DD0x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x4y14E = {  "_ZN3ccc8DD0x4y14E", // class name
  bases__ZN3ccc8DD0x4y14E, 2,
  &(vtc__ZN3ccc8DD0x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y14E),3, //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  CC0x4y15  : virtual ::ccc::AA0 , ::ccc::BB4 {
  ~CC0x4y15(); // tgen
  CC0x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x4y15 ::~CC0x4y15(){ note_dtor("_ZN3ccc8CC0x4y15E", this);} // tgen
ccc::CC0x4y15 ::CC0x4y15(){ note_ctor("_ZN3ccc8CC0x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y15E, buf);
    ::ccc::CC0x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC0x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y15E);
    dp->::ccc::CC0x4y15::~CC0x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y15E(Test__ZN3ccc8CC0x4y15E, "_ZN3ccc8CC0x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y15C1Ev();
extern void _ZN3ccc8CC0x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y15E[] = {
  NSPAIR(_ZN3ccc8CC0x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x4y15E[] = {
  {&(_ZTVN3ccc8CC0x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x4y15E[];
Class_Descriptor cd__ZN3ccc8CC0x4y15E = {  "_ZN3ccc8CC0x4y15E", // class name
  bases__ZN3ccc8CC0x4y15E, 2,
  &(vtc__ZN3ccc8CC0x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x4y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x4y15  : virtual ::ccc::AA0 , virtual ::ccc::BB4 {
  ~DD0x4y15(); // tgen
  DD0x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x4y15 ::~DD0x4y15(){ note_dtor("_ZN3ccc8DD0x4y15E", this);} // tgen
ccc::DD0x4y15 ::DD0x4y15(){ note_ctor("_ZN3ccc8DD0x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x4y15E, buf);
    ::ccc::DD0x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x4y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD0x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x4y15E);
    dp->::ccc::DD0x4y15::~DD0x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x4y15E(Test__ZN3ccc8DD0x4y15E, "_ZN3ccc8DD0x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x4y15C1Ev();
extern void _ZN3ccc8DD0x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x4y15E[] = {
  NSPAIR(_ZN3ccc8DD0x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD0x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x4y15E[] = {
  {&(_ZTVN3ccc8DD0x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x4y15E[];
Class_Descriptor cd__ZN3ccc8DD0x4y15E = {  "_ZN3ccc8DD0x4y15E", // class name
  bases__ZN3ccc8DD0x4y15E, 2,
  &(vtc__ZN3ccc8DD0x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x4y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y0  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y03pqrEv
  ~CC0x5y0(); // tgen
  CC0x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y0E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y03abcEv");}
void  ccc::CC0x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y03efgEv");}
void  ccc::CC0x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y03pqrEv");}
ccc::CC0x5y0 ::~CC0x5y0(){ note_dtor("_ZN3ccc7CC0x5y0E", this);} // tgen
ccc::CC0x5y0 ::CC0x5y0(){ note_ctor("_ZN3ccc7CC0x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y0E, buf);
    ::ccc::CC0x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y0E);
    dp->::ccc::CC0x5y0::~CC0x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y0E(Test__ZN3ccc7CC0x5y0E, "_ZN3ccc7CC0x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y0C1Ev();
extern void _ZN3ccc7CC0x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y0E[] = {
  NSPAIR(_ZN3ccc7CC0x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y0E[];
extern void _ZN3ccc7CC0x5y03pqrEv();
extern void _ZN3ccc7CC0x5y03efgEv();
extern void _ZN3ccc7CC0x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y03abcEv,_ZTv0_n12_N3ccc7CC0x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03abcEv,_ZThn4_N3ccc7CC0x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y03efgEv,_ZTv0_n16_N3ccc7CC0x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03efgEv,_ZThn4_N3ccc7CC0x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y03pqrEv,_ZTv0_n20_N3ccc7CC0x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03pqrEv,_ZThn4_N3ccc7CC0x5y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y03abcEv,_ZTv0_n12_N3ccc7CC0x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y03efgEv,_ZTv0_n16_N3ccc7CC0x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y03pqrEv,_ZTv0_n20_N3ccc7CC0x5y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y0E[] = {
  {&(_ZTVN3ccc7CC0x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y0E[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y03pqrEv,_ZTv0_n20_N3ccc7CC0x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y03pqrEv,_ZThn4_N3ccc7CC0x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y03efgEv,_ZTv0_n16_N3ccc7CC0x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y03efgEv,_ZThn4_N3ccc7CC0x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y03abcEv,_ZTv0_n12_N3ccc7CC0x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y03abcEv,_ZThn4_N3ccc7CC0x5y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y0E = {  "_ZN3ccc7CC0x5y0E", // class name
  bases__ZN3ccc7CC0x5y0E, 2,
  &(vtc__ZN3ccc7CC0x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y0E),2, //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  DD0x5y0  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD0x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y03pqrEv
  ~DD0x5y0(); // tgen
  DD0x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y03abcEv");}
void  ccc::DD0x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y03efgEv");}
void  ccc::DD0x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y03pqrEv");}
ccc::DD0x5y0 ::~DD0x5y0(){ note_dtor("_ZN3ccc7DD0x5y0E", this);} // tgen
ccc::DD0x5y0 ::DD0x5y0(){ note_ctor("_ZN3ccc7DD0x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y0E, buf);
    ::ccc::DD0x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y0E);
    dp->::ccc::DD0x5y0::~DD0x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y0E(Test__ZN3ccc7DD0x5y0E, "_ZN3ccc7DD0x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y0C1Ev();
extern void _ZN3ccc7DD0x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y0E[] = {
  NSPAIR(_ZN3ccc7DD0x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y0E[];
extern void _ZN3ccc7DD0x5y03abcEv();
extern void _ZN3ccc7DD0x5y03efgEv();
extern void _ZN3ccc7DD0x5y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y03pqrEv,_ZTv0_n12_N3ccc7DD0x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y03pqrEv,_ZThn4_N3ccc7DD0x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y03efgEv,_ZTv0_n16_N3ccc7DD0x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y03efgEv,_ZThn4_N3ccc7DD0x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y03abcEv,_ZTv0_n20_N3ccc7DD0x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y03abcEv,_ZThn4_N3ccc7DD0x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y03pqrEv,_ZTv0_n12_N3ccc7DD0x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y03efgEv,_ZTv0_n16_N3ccc7DD0x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y03abcEv,_ZTv0_n20_N3ccc7DD0x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y0E[] = {
  {&(_ZTVN3ccc7DD0x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y0E[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y03abcEv,_ZTv0_n20_N3ccc7DD0x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y03abcEv,_ZThn4_N3ccc7DD0x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y03efgEv,_ZTv0_n16_N3ccc7DD0x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y03efgEv,_ZThn4_N3ccc7DD0x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y03pqrEv,_ZTv0_n12_N3ccc7DD0x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y03pqrEv,_ZThn4_N3ccc7DD0x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y0E = {  "_ZN3ccc7DD0x5y0E", // class name
  bases__ZN3ccc7DD0x5y0E, 2,
  &(vtc__ZN3ccc7DD0x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y0E),3, //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  CC0x5y1  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x5y13efgEv
  ~CC0x5y1(); // tgen
  CC0x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y1E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y13abcEv");}
void  ccc::CC0x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y13pqrEv");}
void  ccc::CC0x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y13efgEv");}
ccc::CC0x5y1 ::~CC0x5y1(){ note_dtor("_ZN3ccc7CC0x5y1E", this);} // tgen
ccc::CC0x5y1 ::CC0x5y1(){ note_ctor("_ZN3ccc7CC0x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y1E, buf);
    ::ccc::CC0x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y1E);
    dp->::ccc::CC0x5y1::~CC0x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y1E(Test__ZN3ccc7CC0x5y1E, "_ZN3ccc7CC0x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y1C1Ev();
extern void _ZN3ccc7CC0x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y1E[] = {
  NSPAIR(_ZN3ccc7CC0x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y1E[];
extern void _ZN3ccc7CC0x5y13pqrEv();
extern void _ZN3ccc7CC0x5y13efgEv();
extern void _ZN3ccc7CC0x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y13abcEv,_ZTv0_n12_N3ccc7CC0x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13abcEv,_ZThn4_N3ccc7CC0x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y13efgEv,_ZTv0_n16_N3ccc7CC0x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13efgEv,_ZThn4_N3ccc7CC0x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y13pqrEv,_ZTv0_n20_N3ccc7CC0x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13pqrEv,_ZThn4_N3ccc7CC0x5y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y13abcEv,_ZTv0_n12_N3ccc7CC0x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y13efgEv,_ZTv0_n16_N3ccc7CC0x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y13pqrEv,_ZTv0_n20_N3ccc7CC0x5y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y1E[] = {
  {&(_ZTVN3ccc7CC0x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y1E[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y13pqrEv,_ZTv0_n20_N3ccc7CC0x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y13pqrEv,_ZThn4_N3ccc7CC0x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y13efgEv,_ZTv0_n16_N3ccc7CC0x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y13efgEv,_ZThn4_N3ccc7CC0x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y13abcEv,_ZTv0_n12_N3ccc7CC0x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y13abcEv,_ZThn4_N3ccc7CC0x5y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y1E = {  "_ZN3ccc7CC0x5y1E", // class name
  bases__ZN3ccc7CC0x5y1E, 2,
  &(vtc__ZN3ccc7CC0x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y1E),2, //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  DD0x5y1  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD0x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x5y13efgEv
  ~DD0x5y1(); // tgen
  DD0x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y13abcEv");}
void  ccc::DD0x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y13pqrEv");}
void  ccc::DD0x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y13efgEv");}
ccc::DD0x5y1 ::~DD0x5y1(){ note_dtor("_ZN3ccc7DD0x5y1E", this);} // tgen
ccc::DD0x5y1 ::DD0x5y1(){ note_ctor("_ZN3ccc7DD0x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y1E, buf);
    ::ccc::DD0x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y1E);
    dp->::ccc::DD0x5y1::~DD0x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y1E(Test__ZN3ccc7DD0x5y1E, "_ZN3ccc7DD0x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y1C1Ev();
extern void _ZN3ccc7DD0x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y1E[] = {
  NSPAIR(_ZN3ccc7DD0x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y1E[];
extern void _ZN3ccc7DD0x5y13abcEv();
extern void _ZN3ccc7DD0x5y13efgEv();
extern void _ZN3ccc7DD0x5y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y13pqrEv,_ZTv0_n12_N3ccc7DD0x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y13pqrEv,_ZThn4_N3ccc7DD0x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y13efgEv,_ZTv0_n16_N3ccc7DD0x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y13efgEv,_ZThn4_N3ccc7DD0x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y13abcEv,_ZTv0_n20_N3ccc7DD0x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y13abcEv,_ZThn4_N3ccc7DD0x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y13pqrEv,_ZTv0_n12_N3ccc7DD0x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y13efgEv,_ZTv0_n16_N3ccc7DD0x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y13abcEv,_ZTv0_n20_N3ccc7DD0x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y1E[] = {
  {&(_ZTVN3ccc7DD0x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y1E[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y13abcEv,_ZTv0_n20_N3ccc7DD0x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y13abcEv,_ZThn4_N3ccc7DD0x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y13efgEv,_ZTv0_n16_N3ccc7DD0x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y13efgEv,_ZThn4_N3ccc7DD0x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y13pqrEv,_ZTv0_n12_N3ccc7DD0x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y13pqrEv,_ZThn4_N3ccc7DD0x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y1E = {  "_ZN3ccc7DD0x5y1E", // class name
  bases__ZN3ccc7DD0x5y1E, 2,
  &(vtc__ZN3ccc7DD0x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y1E),3, //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  CC0x5y2  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y23pqrEv
  ~CC0x5y2(); // tgen
  CC0x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y2E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y23efgEv");}
void  ccc::CC0x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y23abcEv");}
void  ccc::CC0x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y23pqrEv");}
ccc::CC0x5y2 ::~CC0x5y2(){ note_dtor("_ZN3ccc7CC0x5y2E", this);} // tgen
ccc::CC0x5y2 ::CC0x5y2(){ note_ctor("_ZN3ccc7CC0x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y2E, buf);
    ::ccc::CC0x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y2E);
    dp->::ccc::CC0x5y2::~CC0x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y2E(Test__ZN3ccc7CC0x5y2E, "_ZN3ccc7CC0x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y2C1Ev();
extern void _ZN3ccc7CC0x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y2E[] = {
  NSPAIR(_ZN3ccc7CC0x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y2E[];
extern void _ZN3ccc7CC0x5y23pqrEv();
extern void _ZN3ccc7CC0x5y23efgEv();
extern void _ZN3ccc7CC0x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y23abcEv,_ZTv0_n12_N3ccc7CC0x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23abcEv,_ZThn4_N3ccc7CC0x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y23efgEv,_ZTv0_n16_N3ccc7CC0x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23efgEv,_ZThn4_N3ccc7CC0x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y23pqrEv,_ZTv0_n20_N3ccc7CC0x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23pqrEv,_ZThn4_N3ccc7CC0x5y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y23abcEv,_ZTv0_n12_N3ccc7CC0x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y23efgEv,_ZTv0_n16_N3ccc7CC0x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y23pqrEv,_ZTv0_n20_N3ccc7CC0x5y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y2E[] = {
  {&(_ZTVN3ccc7CC0x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y2E[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y23pqrEv,_ZTv0_n20_N3ccc7CC0x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y23pqrEv,_ZThn4_N3ccc7CC0x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y23efgEv,_ZTv0_n16_N3ccc7CC0x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y23efgEv,_ZThn4_N3ccc7CC0x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y23abcEv,_ZTv0_n12_N3ccc7CC0x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y23abcEv,_ZThn4_N3ccc7CC0x5y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y2E = {  "_ZN3ccc7CC0x5y2E", // class name
  bases__ZN3ccc7CC0x5y2E, 2,
  &(vtc__ZN3ccc7CC0x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y2E),2, //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  DD0x5y2  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD0x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y23pqrEv
  ~DD0x5y2(); // tgen
  DD0x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y23efgEv");}
void  ccc::DD0x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y23abcEv");}
void  ccc::DD0x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y23pqrEv");}
ccc::DD0x5y2 ::~DD0x5y2(){ note_dtor("_ZN3ccc7DD0x5y2E", this);} // tgen
ccc::DD0x5y2 ::DD0x5y2(){ note_ctor("_ZN3ccc7DD0x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y2E, buf);
    ::ccc::DD0x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y2E);
    dp->::ccc::DD0x5y2::~DD0x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y2E(Test__ZN3ccc7DD0x5y2E, "_ZN3ccc7DD0x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y2C1Ev();
extern void _ZN3ccc7DD0x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y2E[] = {
  NSPAIR(_ZN3ccc7DD0x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y2E[];
extern void _ZN3ccc7DD0x5y23abcEv();
extern void _ZN3ccc7DD0x5y23efgEv();
extern void _ZN3ccc7DD0x5y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y23pqrEv,_ZTv0_n12_N3ccc7DD0x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y23pqrEv,_ZThn4_N3ccc7DD0x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y23efgEv,_ZTv0_n16_N3ccc7DD0x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y23efgEv,_ZThn4_N3ccc7DD0x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y23abcEv,_ZTv0_n20_N3ccc7DD0x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y23abcEv,_ZThn4_N3ccc7DD0x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y23pqrEv,_ZTv0_n12_N3ccc7DD0x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y23efgEv,_ZTv0_n16_N3ccc7DD0x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y23abcEv,_ZTv0_n20_N3ccc7DD0x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y2E[] = {
  {&(_ZTVN3ccc7DD0x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y2E[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y23abcEv,_ZTv0_n20_N3ccc7DD0x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y23abcEv,_ZThn4_N3ccc7DD0x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y23efgEv,_ZTv0_n16_N3ccc7DD0x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y23efgEv,_ZThn4_N3ccc7DD0x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y23pqrEv,_ZTv0_n12_N3ccc7DD0x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y23pqrEv,_ZThn4_N3ccc7DD0x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y2E = {  "_ZN3ccc7DD0x5y2E", // class name
  bases__ZN3ccc7DD0x5y2E, 2,
  &(vtc__ZN3ccc7DD0x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y2E),3, //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  CC0x5y3  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x5y33abcEv
  ~CC0x5y3(); // tgen
  CC0x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y3E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y33efgEv");}
void  ccc::CC0x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y33pqrEv");}
void  ccc::CC0x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y33abcEv");}
ccc::CC0x5y3 ::~CC0x5y3(){ note_dtor("_ZN3ccc7CC0x5y3E", this);} // tgen
ccc::CC0x5y3 ::CC0x5y3(){ note_ctor("_ZN3ccc7CC0x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y3E, buf);
    ::ccc::CC0x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y3E);
    dp->::ccc::CC0x5y3::~CC0x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y3E(Test__ZN3ccc7CC0x5y3E, "_ZN3ccc7CC0x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y3C1Ev();
extern void _ZN3ccc7CC0x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y3E[] = {
  NSPAIR(_ZN3ccc7CC0x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y3E[];
extern void _ZN3ccc7CC0x5y33pqrEv();
extern void _ZN3ccc7CC0x5y33efgEv();
extern void _ZN3ccc7CC0x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y33abcEv,_ZTv0_n12_N3ccc7CC0x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33abcEv,_ZThn4_N3ccc7CC0x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y33efgEv,_ZTv0_n16_N3ccc7CC0x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33efgEv,_ZThn4_N3ccc7CC0x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y33pqrEv,_ZTv0_n20_N3ccc7CC0x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33pqrEv,_ZThn4_N3ccc7CC0x5y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y33abcEv,_ZTv0_n12_N3ccc7CC0x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y33efgEv,_ZTv0_n16_N3ccc7CC0x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y33pqrEv,_ZTv0_n20_N3ccc7CC0x5y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y3E[] = {
  {&(_ZTVN3ccc7CC0x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y3E[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y33pqrEv,_ZTv0_n20_N3ccc7CC0x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y33pqrEv,_ZThn4_N3ccc7CC0x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y33efgEv,_ZTv0_n16_N3ccc7CC0x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y33efgEv,_ZThn4_N3ccc7CC0x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y33abcEv,_ZTv0_n12_N3ccc7CC0x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y33abcEv,_ZThn4_N3ccc7CC0x5y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y3E = {  "_ZN3ccc7CC0x5y3E", // class name
  bases__ZN3ccc7CC0x5y3E, 2,
  &(vtc__ZN3ccc7CC0x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y3E),2, //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  DD0x5y3  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD0x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x5y33abcEv
  ~DD0x5y3(); // tgen
  DD0x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y33efgEv");}
void  ccc::DD0x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y33pqrEv");}
void  ccc::DD0x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y33abcEv");}
ccc::DD0x5y3 ::~DD0x5y3(){ note_dtor("_ZN3ccc7DD0x5y3E", this);} // tgen
ccc::DD0x5y3 ::DD0x5y3(){ note_ctor("_ZN3ccc7DD0x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y3E, buf);
    ::ccc::DD0x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y3E);
    dp->::ccc::DD0x5y3::~DD0x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y3E(Test__ZN3ccc7DD0x5y3E, "_ZN3ccc7DD0x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y3C1Ev();
extern void _ZN3ccc7DD0x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y3E[] = {
  NSPAIR(_ZN3ccc7DD0x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y3E[];
extern void _ZN3ccc7DD0x5y33abcEv();
extern void _ZN3ccc7DD0x5y33efgEv();
extern void _ZN3ccc7DD0x5y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y33pqrEv,_ZTv0_n12_N3ccc7DD0x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y33pqrEv,_ZThn4_N3ccc7DD0x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y33efgEv,_ZTv0_n16_N3ccc7DD0x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y33efgEv,_ZThn4_N3ccc7DD0x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y33abcEv,_ZTv0_n20_N3ccc7DD0x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y33abcEv,_ZThn4_N3ccc7DD0x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y33pqrEv,_ZTv0_n12_N3ccc7DD0x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y33efgEv,_ZTv0_n16_N3ccc7DD0x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y33abcEv,_ZTv0_n20_N3ccc7DD0x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y3E[] = {
  {&(_ZTVN3ccc7DD0x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y3E[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y33abcEv,_ZTv0_n20_N3ccc7DD0x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y33abcEv,_ZThn4_N3ccc7DD0x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y33efgEv,_ZTv0_n16_N3ccc7DD0x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y33efgEv,_ZThn4_N3ccc7DD0x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y33pqrEv,_ZTv0_n12_N3ccc7DD0x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y33pqrEv,_ZThn4_N3ccc7DD0x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y3E = {  "_ZN3ccc7DD0x5y3E", // class name
  bases__ZN3ccc7DD0x5y3E, 2,
  &(vtc__ZN3ccc7DD0x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y3E),3, //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  CC0x5y4  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC0x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y43efgEv
  ~CC0x5y4(); // tgen
  CC0x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y4E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y43pqrEv");}
void  ccc::CC0x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y43abcEv");}
void  ccc::CC0x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y43efgEv");}
ccc::CC0x5y4 ::~CC0x5y4(){ note_dtor("_ZN3ccc7CC0x5y4E", this);} // tgen
ccc::CC0x5y4 ::CC0x5y4(){ note_ctor("_ZN3ccc7CC0x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y4E, buf);
    ::ccc::CC0x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y4E);
    dp->::ccc::CC0x5y4::~CC0x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y4E(Test__ZN3ccc7CC0x5y4E, "_ZN3ccc7CC0x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y4C1Ev();
extern void _ZN3ccc7CC0x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y4E[] = {
  NSPAIR(_ZN3ccc7CC0x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y4E[];
extern void _ZN3ccc7CC0x5y43pqrEv();
extern void _ZN3ccc7CC0x5y43efgEv();
extern void _ZN3ccc7CC0x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y43abcEv,_ZTv0_n12_N3ccc7CC0x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43abcEv,_ZThn4_N3ccc7CC0x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y43efgEv,_ZTv0_n16_N3ccc7CC0x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43efgEv,_ZThn4_N3ccc7CC0x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y43pqrEv,_ZTv0_n20_N3ccc7CC0x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43pqrEv,_ZThn4_N3ccc7CC0x5y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y43abcEv,_ZTv0_n12_N3ccc7CC0x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y43efgEv,_ZTv0_n16_N3ccc7CC0x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y43pqrEv,_ZTv0_n20_N3ccc7CC0x5y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y4E[] = {
  {&(_ZTVN3ccc7CC0x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y4E[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y43pqrEv,_ZTv0_n20_N3ccc7CC0x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y43pqrEv,_ZThn4_N3ccc7CC0x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y43efgEv,_ZTv0_n16_N3ccc7CC0x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y43efgEv,_ZThn4_N3ccc7CC0x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y43abcEv,_ZTv0_n12_N3ccc7CC0x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y43abcEv,_ZThn4_N3ccc7CC0x5y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y4E = {  "_ZN3ccc7CC0x5y4E", // class name
  bases__ZN3ccc7CC0x5y4E, 2,
  &(vtc__ZN3ccc7CC0x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y4E),2, //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  DD0x5y4  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD0x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x5y43efgEv
  ~DD0x5y4(); // tgen
  DD0x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y43pqrEv");}
void  ccc::DD0x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y43abcEv");}
void  ccc::DD0x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y43efgEv");}
ccc::DD0x5y4 ::~DD0x5y4(){ note_dtor("_ZN3ccc7DD0x5y4E", this);} // tgen
ccc::DD0x5y4 ::DD0x5y4(){ note_ctor("_ZN3ccc7DD0x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y4E, buf);
    ::ccc::DD0x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y4E);
    dp->::ccc::DD0x5y4::~DD0x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y4E(Test__ZN3ccc7DD0x5y4E, "_ZN3ccc7DD0x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y4C1Ev();
extern void _ZN3ccc7DD0x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y4E[] = {
  NSPAIR(_ZN3ccc7DD0x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y4E[];
extern void _ZN3ccc7DD0x5y43abcEv();
extern void _ZN3ccc7DD0x5y43efgEv();
extern void _ZN3ccc7DD0x5y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y43pqrEv,_ZTv0_n12_N3ccc7DD0x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y43pqrEv,_ZThn4_N3ccc7DD0x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y43efgEv,_ZTv0_n16_N3ccc7DD0x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y43efgEv,_ZThn4_N3ccc7DD0x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y43abcEv,_ZTv0_n20_N3ccc7DD0x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y43abcEv,_ZThn4_N3ccc7DD0x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y43pqrEv,_ZTv0_n12_N3ccc7DD0x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y43efgEv,_ZTv0_n16_N3ccc7DD0x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y43abcEv,_ZTv0_n20_N3ccc7DD0x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y4E[] = {
  {&(_ZTVN3ccc7DD0x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y4E[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y43abcEv,_ZTv0_n20_N3ccc7DD0x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y43abcEv,_ZThn4_N3ccc7DD0x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y43efgEv,_ZTv0_n16_N3ccc7DD0x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y43efgEv,_ZThn4_N3ccc7DD0x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y43pqrEv,_ZTv0_n12_N3ccc7DD0x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y43pqrEv,_ZThn4_N3ccc7DD0x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y4E = {  "_ZN3ccc7DD0x5y4E", // class name
  bases__ZN3ccc7DD0x5y4E, 2,
  &(vtc__ZN3ccc7DD0x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y4E),3, //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  CC0x5y5  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC0x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y53abcEv
  ~CC0x5y5(); // tgen
  CC0x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y5E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y53pqrEv");}
void  ccc::CC0x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y53efgEv");}
void  ccc::CC0x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y53abcEv");}
ccc::CC0x5y5 ::~CC0x5y5(){ note_dtor("_ZN3ccc7CC0x5y5E", this);} // tgen
ccc::CC0x5y5 ::CC0x5y5(){ note_ctor("_ZN3ccc7CC0x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y5E, buf);
    ::ccc::CC0x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y5E);
    dp->::ccc::CC0x5y5::~CC0x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y5E(Test__ZN3ccc7CC0x5y5E, "_ZN3ccc7CC0x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y5C1Ev();
extern void _ZN3ccc7CC0x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y5E[] = {
  NSPAIR(_ZN3ccc7CC0x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y5E[];
extern void _ZN3ccc7CC0x5y53pqrEv();
extern void _ZN3ccc7CC0x5y53efgEv();
extern void _ZN3ccc7CC0x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y53abcEv,_ZTv0_n12_N3ccc7CC0x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53abcEv,_ZThn4_N3ccc7CC0x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y53efgEv,_ZTv0_n16_N3ccc7CC0x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53efgEv,_ZThn4_N3ccc7CC0x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y53pqrEv,_ZTv0_n20_N3ccc7CC0x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53pqrEv,_ZThn4_N3ccc7CC0x5y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y53abcEv,_ZTv0_n12_N3ccc7CC0x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y53efgEv,_ZTv0_n16_N3ccc7CC0x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y53pqrEv,_ZTv0_n20_N3ccc7CC0x5y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y5E[] = {
  {&(_ZTVN3ccc7CC0x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y5E[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y53pqrEv,_ZTv0_n20_N3ccc7CC0x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y53pqrEv,_ZThn4_N3ccc7CC0x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y53efgEv,_ZTv0_n16_N3ccc7CC0x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y53efgEv,_ZThn4_N3ccc7CC0x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y53abcEv,_ZTv0_n12_N3ccc7CC0x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y53abcEv,_ZThn4_N3ccc7CC0x5y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y5E = {  "_ZN3ccc7CC0x5y5E", // class name
  bases__ZN3ccc7CC0x5y5E, 2,
  &(vtc__ZN3ccc7CC0x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y5E),2, //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  DD0x5y5  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD0x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x5y53abcEv
  ~DD0x5y5(); // tgen
  DD0x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y53pqrEv");}
void  ccc::DD0x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y53efgEv");}
void  ccc::DD0x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y53abcEv");}
ccc::DD0x5y5 ::~DD0x5y5(){ note_dtor("_ZN3ccc7DD0x5y5E", this);} // tgen
ccc::DD0x5y5 ::DD0x5y5(){ note_ctor("_ZN3ccc7DD0x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y5E, buf);
    ::ccc::DD0x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y5E);
    dp->::ccc::DD0x5y5::~DD0x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y5E(Test__ZN3ccc7DD0x5y5E, "_ZN3ccc7DD0x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y5C1Ev();
extern void _ZN3ccc7DD0x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y5E[] = {
  NSPAIR(_ZN3ccc7DD0x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y5E[];
extern void _ZN3ccc7DD0x5y53abcEv();
extern void _ZN3ccc7DD0x5y53efgEv();
extern void _ZN3ccc7DD0x5y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y53pqrEv,_ZTv0_n12_N3ccc7DD0x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y53pqrEv,_ZThn4_N3ccc7DD0x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y53efgEv,_ZTv0_n16_N3ccc7DD0x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y53efgEv,_ZThn4_N3ccc7DD0x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y53abcEv,_ZTv0_n20_N3ccc7DD0x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y53abcEv,_ZThn4_N3ccc7DD0x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y53pqrEv,_ZTv0_n12_N3ccc7DD0x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y53efgEv,_ZTv0_n16_N3ccc7DD0x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y53abcEv,_ZTv0_n20_N3ccc7DD0x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y5E[] = {
  {&(_ZTVN3ccc7DD0x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y5E[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y53abcEv,_ZTv0_n20_N3ccc7DD0x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y53abcEv,_ZThn4_N3ccc7DD0x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y53efgEv,_ZTv0_n16_N3ccc7DD0x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y53efgEv,_ZThn4_N3ccc7DD0x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y53pqrEv,_ZTv0_n12_N3ccc7DD0x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y53pqrEv,_ZThn4_N3ccc7DD0x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y5E = {  "_ZN3ccc7DD0x5y5E", // class name
  bases__ZN3ccc7DD0x5y5E, 2,
  &(vtc__ZN3ccc7DD0x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y5E),3, //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  CC0x5y6  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y63efgEv
  ~CC0x5y6(); // tgen
  CC0x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y6E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y63abcEv");}
void  ccc::CC0x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y63efgEv");}
ccc::CC0x5y6 ::~CC0x5y6(){ note_dtor("_ZN3ccc7CC0x5y6E", this);} // tgen
ccc::CC0x5y6 ::CC0x5y6(){ note_ctor("_ZN3ccc7CC0x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y6E, buf);
    ::ccc::CC0x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y6E);
    dp->::ccc::CC0x5y6::~CC0x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y6E(Test__ZN3ccc7CC0x5y6E, "_ZN3ccc7CC0x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y6C1Ev();
extern void _ZN3ccc7CC0x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y6E[] = {
  NSPAIR(_ZN3ccc7CC0x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC0x5y63efgEv();
extern void _ZN3ccc7CC0x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y63abcEv,_ZTv0_n12_N3ccc7CC0x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y63abcEv,_ZThn4_N3ccc7CC0x5y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y63efgEv,_ZTv0_n16_N3ccc7CC0x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y63efgEv,_ZThn4_N3ccc7CC0x5y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y63abcEv,_ZTv0_n12_N3ccc7CC0x5y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y63efgEv,_ZTv0_n16_N3ccc7CC0x5y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y6E[] = {
  {&(_ZTVN3ccc7CC0x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y6E[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y63efgEv,_ZTv0_n16_N3ccc7CC0x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y63efgEv,_ZThn4_N3ccc7CC0x5y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y63abcEv,_ZTv0_n12_N3ccc7CC0x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y63abcEv,_ZThn4_N3ccc7CC0x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y6E = {  "_ZN3ccc7CC0x5y6E", // class name
  bases__ZN3ccc7CC0x5y6E, 2,
  &(vtc__ZN3ccc7CC0x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y6E),2, //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  DD0x5y6  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD0x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x5y63efgEv
  ~DD0x5y6(); // tgen
  DD0x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y63abcEv");}
void  ccc::DD0x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y63efgEv");}
ccc::DD0x5y6 ::~DD0x5y6(){ note_dtor("_ZN3ccc7DD0x5y6E", this);} // tgen
ccc::DD0x5y6 ::DD0x5y6(){ note_ctor("_ZN3ccc7DD0x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y6E, buf);
    ::ccc::DD0x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y6E);
    dp->::ccc::DD0x5y6::~DD0x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y6E(Test__ZN3ccc7DD0x5y6E, "_ZN3ccc7DD0x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y6C1Ev();
extern void _ZN3ccc7DD0x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y6E[] = {
  NSPAIR(_ZN3ccc7DD0x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y6E[];
extern void _ZN3ccc7DD0x5y63abcEv();
extern void _ZN3ccc7DD0x5y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y63efgEv,_ZTv0_n16_N3ccc7DD0x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y63efgEv,_ZThn4_N3ccc7DD0x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y63abcEv,_ZTv0_n20_N3ccc7DD0x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y63abcEv,_ZThn4_N3ccc7DD0x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y63efgEv,_ZTv0_n16_N3ccc7DD0x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y63abcEv,_ZTv0_n20_N3ccc7DD0x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y6E[] = {
  {&(_ZTVN3ccc7DD0x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y6E[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y63abcEv,_ZTv0_n20_N3ccc7DD0x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y63abcEv,_ZThn4_N3ccc7DD0x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y63efgEv,_ZTv0_n16_N3ccc7DD0x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y63efgEv,_ZThn4_N3ccc7DD0x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y6E = {  "_ZN3ccc7DD0x5y6E", // class name
  bases__ZN3ccc7DD0x5y6E, 2,
  &(vtc__ZN3ccc7DD0x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y6E),3, //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  CC0x5y7  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y73pqrEv
  ~CC0x5y7(); // tgen
  CC0x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y7E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y73abcEv");}
void  ccc::CC0x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y73pqrEv");}
ccc::CC0x5y7 ::~CC0x5y7(){ note_dtor("_ZN3ccc7CC0x5y7E", this);} // tgen
ccc::CC0x5y7 ::CC0x5y7(){ note_ctor("_ZN3ccc7CC0x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y7E, buf);
    ::ccc::CC0x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y7E);
    dp->::ccc::CC0x5y7::~CC0x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y7E(Test__ZN3ccc7CC0x5y7E, "_ZN3ccc7CC0x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y7C1Ev();
extern void _ZN3ccc7CC0x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y7E[] = {
  NSPAIR(_ZN3ccc7CC0x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y7E[];
extern void _ZN3ccc7CC0x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC0x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y73abcEv,_ZTv0_n12_N3ccc7CC0x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y73abcEv,_ZThn4_N3ccc7CC0x5y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y73pqrEv,_ZTv0_n20_N3ccc7CC0x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y73pqrEv,_ZThn4_N3ccc7CC0x5y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y73abcEv,_ZTv0_n12_N3ccc7CC0x5y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y73pqrEv,_ZTv0_n20_N3ccc7CC0x5y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y7E[] = {
  {&(_ZTVN3ccc7CC0x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y7E[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y73pqrEv,_ZTv0_n20_N3ccc7CC0x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y73pqrEv,_ZThn4_N3ccc7CC0x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y73abcEv,_ZTv0_n12_N3ccc7CC0x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y73abcEv,_ZThn4_N3ccc7CC0x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y7E = {  "_ZN3ccc7CC0x5y7E", // class name
  bases__ZN3ccc7CC0x5y7E, 2,
  &(vtc__ZN3ccc7CC0x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y7E),2, //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  DD0x5y7  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD0x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y73pqrEv
  ~DD0x5y7(); // tgen
  DD0x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y73abcEv");}
void  ccc::DD0x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y73pqrEv");}
ccc::DD0x5y7 ::~DD0x5y7(){ note_dtor("_ZN3ccc7DD0x5y7E", this);} // tgen
ccc::DD0x5y7 ::DD0x5y7(){ note_ctor("_ZN3ccc7DD0x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y7E, buf);
    ::ccc::DD0x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y7E);
    dp->::ccc::DD0x5y7::~DD0x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y7E(Test__ZN3ccc7DD0x5y7E, "_ZN3ccc7DD0x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y7C1Ev();
extern void _ZN3ccc7DD0x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y7E[] = {
  NSPAIR(_ZN3ccc7DD0x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y7E[];
extern void _ZN3ccc7DD0x5y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x5y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y73pqrEv,_ZTv0_n12_N3ccc7DD0x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y73pqrEv,_ZThn4_N3ccc7DD0x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y73abcEv,_ZTv0_n20_N3ccc7DD0x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y73abcEv,_ZThn4_N3ccc7DD0x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y73pqrEv,_ZTv0_n12_N3ccc7DD0x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y73abcEv,_ZTv0_n20_N3ccc7DD0x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y7E[] = {
  {&(_ZTVN3ccc7DD0x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y7E[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y73abcEv,_ZTv0_n20_N3ccc7DD0x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y73abcEv,_ZThn4_N3ccc7DD0x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y73pqrEv,_ZTv0_n12_N3ccc7DD0x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y73pqrEv,_ZThn4_N3ccc7DD0x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y7E = {  "_ZN3ccc7DD0x5y7E", // class name
  bases__ZN3ccc7DD0x5y7E, 2,
  &(vtc__ZN3ccc7DD0x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y7E),3, //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  CC0x5y8  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y83abcEv
  ~CC0x5y8(); // tgen
  CC0x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y8E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y83efgEv");}
void  ccc::CC0x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y83abcEv");}
ccc::CC0x5y8 ::~CC0x5y8(){ note_dtor("_ZN3ccc7CC0x5y8E", this);} // tgen
ccc::CC0x5y8 ::CC0x5y8(){ note_ctor("_ZN3ccc7CC0x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y8E, buf);
    ::ccc::CC0x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y8E);
    dp->::ccc::CC0x5y8::~CC0x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y8E(Test__ZN3ccc7CC0x5y8E, "_ZN3ccc7CC0x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y8C1Ev();
extern void _ZN3ccc7CC0x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y8E[] = {
  NSPAIR(_ZN3ccc7CC0x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC0x5y83efgEv();
extern void _ZN3ccc7CC0x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x5y83abcEv,_ZTv0_n12_N3ccc7CC0x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y83abcEv,_ZThn4_N3ccc7CC0x5y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y83efgEv,_ZTv0_n16_N3ccc7CC0x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y83efgEv,_ZThn4_N3ccc7CC0x5y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x5y83abcEv,_ZTv0_n12_N3ccc7CC0x5y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y83efgEv,_ZTv0_n16_N3ccc7CC0x5y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y8E[] = {
  {&(_ZTVN3ccc7CC0x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y8E[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y83efgEv,_ZTv0_n16_N3ccc7CC0x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y83efgEv,_ZThn4_N3ccc7CC0x5y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x5y83abcEv,_ZTv0_n12_N3ccc7CC0x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y83abcEv,_ZThn4_N3ccc7CC0x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y8E = {  "_ZN3ccc7CC0x5y8E", // class name
  bases__ZN3ccc7CC0x5y8E, 2,
  &(vtc__ZN3ccc7CC0x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y8E),2, //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  DD0x5y8  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD0x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x5y83abcEv
  ~DD0x5y8(); // tgen
  DD0x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y83efgEv");}
void  ccc::DD0x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x5y83abcEv");}
ccc::DD0x5y8 ::~DD0x5y8(){ note_dtor("_ZN3ccc7DD0x5y8E", this);} // tgen
ccc::DD0x5y8 ::DD0x5y8(){ note_ctor("_ZN3ccc7DD0x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y8E, buf);
    ::ccc::DD0x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y8E);
    dp->::ccc::DD0x5y8::~DD0x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y8E(Test__ZN3ccc7DD0x5y8E, "_ZN3ccc7DD0x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y8C1Ev();
extern void _ZN3ccc7DD0x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y8E[] = {
  NSPAIR(_ZN3ccc7DD0x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y8E[];
extern void _ZN3ccc7DD0x5y83abcEv();
extern void _ZN3ccc7DD0x5y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y83efgEv,_ZTv0_n16_N3ccc7DD0x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y83efgEv,_ZThn4_N3ccc7DD0x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD0x5y83abcEv,_ZTv0_n20_N3ccc7DD0x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y83abcEv,_ZThn4_N3ccc7DD0x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y83efgEv,_ZTv0_n16_N3ccc7DD0x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD0x5y83abcEv,_ZTv0_n20_N3ccc7DD0x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y8E[] = {
  {&(_ZTVN3ccc7DD0x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y8E[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD0x5y83abcEv,_ZTv0_n20_N3ccc7DD0x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y83abcEv,_ZThn4_N3ccc7DD0x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y83efgEv,_ZTv0_n16_N3ccc7DD0x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y83efgEv,_ZThn4_N3ccc7DD0x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y8E = {  "_ZN3ccc7DD0x5y8E", // class name
  bases__ZN3ccc7DD0x5y8E, 2,
  &(vtc__ZN3ccc7DD0x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y8E),3, //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  CC0x5y9  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y93pqrEv
  ~CC0x5y9(); // tgen
  CC0x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y9E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y93efgEv");}
void  ccc::CC0x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y93pqrEv");}
ccc::CC0x5y9 ::~CC0x5y9(){ note_dtor("_ZN3ccc7CC0x5y9E", this);} // tgen
ccc::CC0x5y9 ::CC0x5y9(){ note_ctor("_ZN3ccc7CC0x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y9E, buf);
    ::ccc::CC0x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC0x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y9E);
    dp->::ccc::CC0x5y9::~CC0x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y9E(Test__ZN3ccc7CC0x5y9E, "_ZN3ccc7CC0x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y9C1Ev();
extern void _ZN3ccc7CC0x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y9E[] = {
  NSPAIR(_ZN3ccc7CC0x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y9E[];
extern void _ZN3ccc7CC0x5y93pqrEv();
extern void _ZN3ccc7CC0x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x5y93efgEv,_ZTv0_n16_N3ccc7CC0x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y93efgEv,_ZThn4_N3ccc7CC0x5y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x5y93pqrEv,_ZTv0_n20_N3ccc7CC0x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y93pqrEv,_ZThn4_N3ccc7CC0x5y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x5y93efgEv,_ZTv0_n16_N3ccc7CC0x5y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x5y93pqrEv,_ZTv0_n20_N3ccc7CC0x5y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x5y9E[] = {
  {&(_ZTVN3ccc7CC0x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x5y9E[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x5y93pqrEv,_ZTv0_n20_N3ccc7CC0x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y93pqrEv,_ZThn4_N3ccc7CC0x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x5y93efgEv,_ZTv0_n16_N3ccc7CC0x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x5y93efgEv,_ZThn4_N3ccc7CC0x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x5y9E = {  "_ZN3ccc7CC0x5y9E", // class name
  bases__ZN3ccc7CC0x5y9E, 2,
  &(vtc__ZN3ccc7CC0x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x5y9E),2, //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  DD0x5y9  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD0x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x5y93pqrEv
  ~DD0x5y9(); // tgen
  DD0x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x5y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x5y93efgEv");}
void  ccc::DD0x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x5y93pqrEv");}
ccc::DD0x5y9 ::~DD0x5y9(){ note_dtor("_ZN3ccc7DD0x5y9E", this);} // tgen
ccc::DD0x5y9 ::DD0x5y9(){ note_ctor("_ZN3ccc7DD0x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x5y9E, buf);
    ::ccc::DD0x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x5y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD0x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x5y9E);
    dp->::ccc::DD0x5y9::~DD0x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x5y9E(Test__ZN3ccc7DD0x5y9E, "_ZN3ccc7DD0x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x5y9C1Ev();
extern void _ZN3ccc7DD0x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x5y9E[] = {
  NSPAIR(_ZN3ccc7DD0x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD0x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x5y93efgEv();
extern void _ZN3ccc7DD0x5y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x5y93pqrEv,_ZTv0_n12_N3ccc7DD0x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y93pqrEv,_ZThn4_N3ccc7DD0x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x5y93efgEv,_ZTv0_n16_N3ccc7DD0x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x5y93efgEv,_ZThn4_N3ccc7DD0x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x5y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x5y93pqrEv,_ZTv0_n12_N3ccc7DD0x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x5y93efgEv,_ZTv0_n16_N3ccc7DD0x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x5y9E[] = {
  {&(_ZTVN3ccc7DD0x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD0x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x5y9E[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x5y93efgEv,_ZTv0_n16_N3ccc7DD0x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y93efgEv,_ZThn4_N3ccc7DD0x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x5y93pqrEv,_ZTv0_n12_N3ccc7DD0x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x5y93pqrEv,_ZThn4_N3ccc7DD0x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x5y9E = {  "_ZN3ccc7DD0x5y9E", // class name
  bases__ZN3ccc7DD0x5y9E, 2,
  &(vtc__ZN3ccc7DD0x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x5y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y10  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x5y103abcEv
  ~CC0x5y10(); // tgen
  CC0x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y10E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y103pqrEv");}
void  ccc::CC0x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x5y103abcEv");}
ccc::CC0x5y10 ::~CC0x5y10(){ note_dtor("_ZN3ccc8CC0x5y10E", this);} // tgen
ccc::CC0x5y10 ::CC0x5y10(){ note_ctor("_ZN3ccc8CC0x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y10E, buf);
    ::ccc::CC0x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y10E);
    dp->::ccc::CC0x5y10::~CC0x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y10E(Test__ZN3ccc8CC0x5y10E, "_ZN3ccc8CC0x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y10C1Ev();
extern void _ZN3ccc8CC0x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y10E[] = {
  NSPAIR(_ZN3ccc8CC0x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y10E[];
extern void _ZN3ccc8CC0x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC0x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x5y103abcEv,_ZTv0_n12_N3ccc8CC0x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y103abcEv,_ZThn4_N3ccc8CC0x5y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x5y103pqrEv,_ZTv0_n20_N3ccc8CC0x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y103pqrEv,_ZThn4_N3ccc8CC0x5y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x5y103abcEv,_ZTv0_n12_N3ccc8CC0x5y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x5y103pqrEv,_ZTv0_n20_N3ccc8CC0x5y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y10E[] = {
  {&(_ZTVN3ccc8CC0x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y10E[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x5y103pqrEv,_ZTv0_n20_N3ccc8CC0x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y103pqrEv,_ZThn4_N3ccc8CC0x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x5y103abcEv,_ZTv0_n12_N3ccc8CC0x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y103abcEv,_ZThn4_N3ccc8CC0x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x5y10E = {  "_ZN3ccc8CC0x5y10E", // class name
  bases__ZN3ccc8CC0x5y10E, 2,
  &(vtc__ZN3ccc8CC0x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y10E),2, //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  DD0x5y10  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD0x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x5y103abcEv
  ~DD0x5y10(); // tgen
  DD0x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x5y103pqrEv");}
void  ccc::DD0x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x5y103abcEv");}
ccc::DD0x5y10 ::~DD0x5y10(){ note_dtor("_ZN3ccc8DD0x5y10E", this);} // tgen
ccc::DD0x5y10 ::DD0x5y10(){ note_ctor("_ZN3ccc8DD0x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y10E, buf);
    ::ccc::DD0x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y10E);
    dp->::ccc::DD0x5y10::~DD0x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y10E(Test__ZN3ccc8DD0x5y10E, "_ZN3ccc8DD0x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y10C1Ev();
extern void _ZN3ccc8DD0x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y10E[] = {
  NSPAIR(_ZN3ccc8DD0x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y10E[];
extern void _ZN3ccc8DD0x5y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x5y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x5y103pqrEv,_ZTv0_n12_N3ccc8DD0x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y103pqrEv,_ZThn4_N3ccc8DD0x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x5y103abcEv,_ZTv0_n20_N3ccc8DD0x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y103abcEv,_ZThn4_N3ccc8DD0x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x5y103pqrEv,_ZTv0_n12_N3ccc8DD0x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x5y103abcEv,_ZTv0_n20_N3ccc8DD0x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y10E[] = {
  {&(_ZTVN3ccc8DD0x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y10E[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x5y103abcEv,_ZTv0_n20_N3ccc8DD0x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y103abcEv,_ZThn4_N3ccc8DD0x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x5y103pqrEv,_ZTv0_n12_N3ccc8DD0x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y103pqrEv,_ZThn4_N3ccc8DD0x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x5y10E = {  "_ZN3ccc8DD0x5y10E", // class name
  bases__ZN3ccc8DD0x5y10E, 2,
  &(vtc__ZN3ccc8DD0x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y10E),3, //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  CC0x5y11  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x5y113efgEv
  ~CC0x5y11(); // tgen
  CC0x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y11E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y113pqrEv");}
void  ccc::CC0x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x5y113efgEv");}
ccc::CC0x5y11 ::~CC0x5y11(){ note_dtor("_ZN3ccc8CC0x5y11E", this);} // tgen
ccc::CC0x5y11 ::CC0x5y11(){ note_ctor("_ZN3ccc8CC0x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y11E, buf);
    ::ccc::CC0x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y11E);
    dp->::ccc::CC0x5y11::~CC0x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y11E(Test__ZN3ccc8CC0x5y11E, "_ZN3ccc8CC0x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y11C1Ev();
extern void _ZN3ccc8CC0x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y11E[] = {
  NSPAIR(_ZN3ccc8CC0x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y11E[];
extern void _ZN3ccc8CC0x5y113pqrEv();
extern void _ZN3ccc8CC0x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x5y113efgEv,_ZTv0_n16_N3ccc8CC0x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y113efgEv,_ZThn4_N3ccc8CC0x5y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x5y113pqrEv,_ZTv0_n20_N3ccc8CC0x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y113pqrEv,_ZThn4_N3ccc8CC0x5y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x5y113efgEv,_ZTv0_n16_N3ccc8CC0x5y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x5y113pqrEv,_ZTv0_n20_N3ccc8CC0x5y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y11E[] = {
  {&(_ZTVN3ccc8CC0x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y11E[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x5y113pqrEv,_ZTv0_n20_N3ccc8CC0x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y113pqrEv,_ZThn4_N3ccc8CC0x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x5y113efgEv,_ZTv0_n16_N3ccc8CC0x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y113efgEv,_ZThn4_N3ccc8CC0x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x5y11E = {  "_ZN3ccc8CC0x5y11E", // class name
  bases__ZN3ccc8CC0x5y11E, 2,
  &(vtc__ZN3ccc8CC0x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y11E),2, //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  DD0x5y11  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD0x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x5y113efgEv
  ~DD0x5y11(); // tgen
  DD0x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x5y113pqrEv");}
void  ccc::DD0x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x5y113efgEv");}
ccc::DD0x5y11 ::~DD0x5y11(){ note_dtor("_ZN3ccc8DD0x5y11E", this);} // tgen
ccc::DD0x5y11 ::DD0x5y11(){ note_ctor("_ZN3ccc8DD0x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y11E, buf);
    ::ccc::DD0x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y11E);
    dp->::ccc::DD0x5y11::~DD0x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y11E(Test__ZN3ccc8DD0x5y11E, "_ZN3ccc8DD0x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y11C1Ev();
extern void _ZN3ccc8DD0x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y11E[] = {
  NSPAIR(_ZN3ccc8DD0x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x5y113efgEv();
extern void _ZN3ccc8DD0x5y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x5y113pqrEv,_ZTv0_n12_N3ccc8DD0x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y113pqrEv,_ZThn4_N3ccc8DD0x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x5y113efgEv,_ZTv0_n16_N3ccc8DD0x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y113efgEv,_ZThn4_N3ccc8DD0x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x5y113pqrEv,_ZTv0_n12_N3ccc8DD0x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x5y113efgEv,_ZTv0_n16_N3ccc8DD0x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y11E[] = {
  {&(_ZTVN3ccc8DD0x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y11E[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x5y113efgEv,_ZTv0_n16_N3ccc8DD0x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y113efgEv,_ZThn4_N3ccc8DD0x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x5y113pqrEv,_ZTv0_n12_N3ccc8DD0x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y113pqrEv,_ZThn4_N3ccc8DD0x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x5y11E = {  "_ZN3ccc8DD0x5y11E", // class name
  bases__ZN3ccc8DD0x5y11E, 2,
  &(vtc__ZN3ccc8DD0x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y11E),3, //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  CC0x5y12  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC0x5y123abcEv
  ~CC0x5y12(); // tgen
  CC0x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x5y123abcEv");}
ccc::CC0x5y12 ::~CC0x5y12(){ note_dtor("_ZN3ccc8CC0x5y12E", this);} // tgen
ccc::CC0x5y12 ::CC0x5y12(){ note_ctor("_ZN3ccc8CC0x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y12E, buf);
    ::ccc::CC0x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y12E);
    dp->::ccc::CC0x5y12::~CC0x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y12E(Test__ZN3ccc8CC0x5y12E, "_ZN3ccc8CC0x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y12C1Ev();
extern void _ZN3ccc8CC0x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y12E[] = {
  NSPAIR(_ZN3ccc8CC0x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC0x5y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x5y123abcEv,_ZTv0_n12_N3ccc8CC0x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y123abcEv,_ZThn4_N3ccc8CC0x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x5y123abcEv,_ZTv0_n12_N3ccc8CC0x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y12E[] = {
  {&(_ZTVN3ccc8CC0x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y12E[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x5y123abcEv,_ZTv0_n12_N3ccc8CC0x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y123abcEv,_ZThn4_N3ccc8CC0x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x5y12E = {  "_ZN3ccc8CC0x5y12E", // class name
  bases__ZN3ccc8CC0x5y12E, 2,
  &(vtc__ZN3ccc8CC0x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y12E),2, //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  DD0x5y12  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD0x5y123abcEv
  ~DD0x5y12(); // tgen
  DD0x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD0x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x5y123abcEv");}
ccc::DD0x5y12 ::~DD0x5y12(){ note_dtor("_ZN3ccc8DD0x5y12E", this);} // tgen
ccc::DD0x5y12 ::DD0x5y12(){ note_ctor("_ZN3ccc8DD0x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y12E, buf);
    ::ccc::DD0x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y12E);
    dp->::ccc::DD0x5y12::~DD0x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y12E(Test__ZN3ccc8DD0x5y12E, "_ZN3ccc8DD0x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y12C1Ev();
extern void _ZN3ccc8DD0x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y12E[] = {
  NSPAIR(_ZN3ccc8DD0x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y12E[];
extern void _ZN3ccc8DD0x5y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD0x5y123abcEv,_ZTv0_n20_N3ccc8DD0x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y123abcEv,_ZThn4_N3ccc8DD0x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD0x5y123abcEv,_ZTv0_n20_N3ccc8DD0x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y12E[] = {
  {&(_ZTVN3ccc8DD0x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y12E[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD0x5y123abcEv,_ZTv0_n20_N3ccc8DD0x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y123abcEv,_ZThn4_N3ccc8DD0x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x5y12E = {  "_ZN3ccc8DD0x5y12E", // class name
  bases__ZN3ccc8DD0x5y12E, 2,
  &(vtc__ZN3ccc8DD0x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y12E),3, //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  CC0x5y13  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC0x5y133efgEv
  ~CC0x5y13(); // tgen
  CC0x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x5y133efgEv");}
ccc::CC0x5y13 ::~CC0x5y13(){ note_dtor("_ZN3ccc8CC0x5y13E", this);} // tgen
ccc::CC0x5y13 ::CC0x5y13(){ note_ctor("_ZN3ccc8CC0x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y13E, buf);
    ::ccc::CC0x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y13E);
    dp->::ccc::CC0x5y13::~CC0x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y13E(Test__ZN3ccc8CC0x5y13E, "_ZN3ccc8CC0x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y13C1Ev();
extern void _ZN3ccc8CC0x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y13E[] = {
  NSPAIR(_ZN3ccc8CC0x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC0x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x5y133efgEv,_ZTv0_n16_N3ccc8CC0x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y133efgEv,_ZThn4_N3ccc8CC0x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x5y133efgEv,_ZTv0_n16_N3ccc8CC0x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y13E[] = {
  {&(_ZTVN3ccc8CC0x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y13E[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x5y133efgEv,_ZTv0_n16_N3ccc8CC0x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y133efgEv,_ZThn4_N3ccc8CC0x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x5y13E = {  "_ZN3ccc8CC0x5y13E", // class name
  bases__ZN3ccc8CC0x5y13E, 2,
  &(vtc__ZN3ccc8CC0x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y13E),2, //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  DD0x5y13  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD0x5y133efgEv
  ~DD0x5y13(); // tgen
  DD0x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD0x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x5y133efgEv");}
ccc::DD0x5y13 ::~DD0x5y13(){ note_dtor("_ZN3ccc8DD0x5y13E", this);} // tgen
ccc::DD0x5y13 ::DD0x5y13(){ note_ctor("_ZN3ccc8DD0x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y13E, buf);
    ::ccc::DD0x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y13E);
    dp->::ccc::DD0x5y13::~DD0x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y13E(Test__ZN3ccc8DD0x5y13E, "_ZN3ccc8DD0x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y13C1Ev();
extern void _ZN3ccc8DD0x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y13E[] = {
  NSPAIR(_ZN3ccc8DD0x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x5y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x5y133efgEv,_ZTv0_n16_N3ccc8DD0x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y133efgEv,_ZThn4_N3ccc8DD0x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x5y133efgEv,_ZTv0_n16_N3ccc8DD0x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y13E[] = {
  {&(_ZTVN3ccc8DD0x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y13E[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x5y133efgEv,_ZTv0_n16_N3ccc8DD0x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y133efgEv,_ZThn4_N3ccc8DD0x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x5y13E = {  "_ZN3ccc8DD0x5y13E", // class name
  bases__ZN3ccc8DD0x5y13E, 2,
  &(vtc__ZN3ccc8DD0x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y13E),3, //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  CC0x5y14  : virtual ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y143pqrEv
  ~CC0x5y14(); // tgen
  CC0x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y143pqrEv");}
ccc::CC0x5y14 ::~CC0x5y14(){ note_dtor("_ZN3ccc8CC0x5y14E", this);} // tgen
ccc::CC0x5y14 ::CC0x5y14(){ note_ctor("_ZN3ccc8CC0x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y14E, buf);
    ::ccc::CC0x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y14E);
    dp->::ccc::CC0x5y14::~CC0x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y14E(Test__ZN3ccc8CC0x5y14E, "_ZN3ccc8CC0x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y14C1Ev();
extern void _ZN3ccc8CC0x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y14E[] = {
  NSPAIR(_ZN3ccc8CC0x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y14E[];
extern void _ZN3ccc8CC0x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x5y143pqrEv,_ZTv0_n20_N3ccc8CC0x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y143pqrEv,_ZThn4_N3ccc8CC0x5y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x5y143pqrEv,_ZTv0_n20_N3ccc8CC0x5y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y14E[] = {
  {&(_ZTVN3ccc8CC0x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y14E[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x5y143pqrEv,_ZTv0_n20_N3ccc8CC0x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x5y143pqrEv,_ZThn4_N3ccc8CC0x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x5y14E = {  "_ZN3ccc8CC0x5y14E", // class name
  bases__ZN3ccc8CC0x5y14E, 2,
  &(vtc__ZN3ccc8CC0x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y14E),2, //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  DD0x5y14  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD0x5y143pqrEv
  ~DD0x5y14(); // tgen
  DD0x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x5y143pqrEv");}
ccc::DD0x5y14 ::~DD0x5y14(){ note_dtor("_ZN3ccc8DD0x5y14E", this);} // tgen
ccc::DD0x5y14 ::DD0x5y14(){ note_ctor("_ZN3ccc8DD0x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y14E, buf);
    ::ccc::DD0x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y14E);
    dp->::ccc::DD0x5y14::~DD0x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y14E(Test__ZN3ccc8DD0x5y14E, "_ZN3ccc8DD0x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y14C1Ev();
extern void _ZN3ccc8DD0x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y14E[] = {
  NSPAIR(_ZN3ccc8DD0x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x5y143pqrEv,_ZTv0_n12_N3ccc8DD0x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x5y143pqrEv,_ZThn4_N3ccc8DD0x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x5y143pqrEv,_ZTv0_n12_N3ccc8DD0x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y14E[] = {
  {&(_ZTVN3ccc8DD0x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y14E[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x5y143pqrEv,_ZTv0_n12_N3ccc8DD0x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x5y143pqrEv,_ZThn4_N3ccc8DD0x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x5y14E = {  "_ZN3ccc8DD0x5y14E", // class name
  bases__ZN3ccc8DD0x5y14E, 2,
  &(vtc__ZN3ccc8DD0x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y14E),3, //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  CC0x5y15  : virtual ::ccc::AA0 , ::ccc::BB5 {
  ~CC0x5y15(); // tgen
  CC0x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x5y15 ::~CC0x5y15(){ note_dtor("_ZN3ccc8CC0x5y15E", this);} // tgen
ccc::CC0x5y15 ::CC0x5y15(){ note_ctor("_ZN3ccc8CC0x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y15E, buf);
    ::ccc::CC0x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC0x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y15E);
    dp->::ccc::CC0x5y15::~CC0x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y15E(Test__ZN3ccc8CC0x5y15E, "_ZN3ccc8CC0x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y15C1Ev();
extern void _ZN3ccc8CC0x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y15E[] = {
  NSPAIR(_ZN3ccc8CC0x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x5y15E[] = {
  {&(_ZTVN3ccc8CC0x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x5y15E[];
Class_Descriptor cd__ZN3ccc8CC0x5y15E = {  "_ZN3ccc8CC0x5y15E", // class name
  bases__ZN3ccc8CC0x5y15E, 2,
  &(vtc__ZN3ccc8CC0x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x5y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x5y15  : virtual ::ccc::AA0 , virtual ::ccc::BB5 {
  ~DD0x5y15(); // tgen
  DD0x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD0x5y15 ::~DD0x5y15(){ note_dtor("_ZN3ccc8DD0x5y15E", this);} // tgen
ccc::DD0x5y15 ::DD0x5y15(){ note_ctor("_ZN3ccc8DD0x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x5y15E, buf);
    ::ccc::DD0x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x5y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD0x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x5y15E);
    dp->::ccc::DD0x5y15::~DD0x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x5y15E(Test__ZN3ccc8DD0x5y15E, "_ZN3ccc8DD0x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x5y15C1Ev();
extern void _ZN3ccc8DD0x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x5y15E[] = {
  NSPAIR(_ZN3ccc8DD0x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD0x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x5y15E[] = {
  {&(_ZTVN3ccc8DD0x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD0x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x5y15E[];
Class_Descriptor cd__ZN3ccc8DD0x5y15E = {  "_ZN3ccc8DD0x5y15E", // class name
  bases__ZN3ccc8DD0x5y15E, 2,
  &(vtc__ZN3ccc8DD0x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x5y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y0  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y03pqrEv
  ~CC0x6y0(); // tgen
  CC0x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y0E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y03abcEv");}
void  ccc::CC0x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y03efgEv");}
void  ccc::CC0x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y03pqrEv");}
ccc::CC0x6y0 ::~CC0x6y0(){ note_dtor("_ZN3ccc7CC0x6y0E", this);} // tgen
ccc::CC0x6y0 ::CC0x6y0(){ note_ctor("_ZN3ccc7CC0x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y0E, buf);
    ::ccc::CC0x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y0E);
    dp->::ccc::CC0x6y0::~CC0x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y0E(Test__ZN3ccc7CC0x6y0E, "_ZN3ccc7CC0x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y0C1Ev();
extern void _ZN3ccc7CC0x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y0E[] = {
  NSPAIR(_ZN3ccc7CC0x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y0E[];
extern void _ZN3ccc7CC0x6y03abcEv();
extern void _ZN3ccc7CC0x6y03efgEv();
extern void _ZN3ccc7CC0x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y03abcEv,_ZTv0_n12_N3ccc7CC0x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y03abcEv,_ZThn4_N3ccc7CC0x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y03efgEv,_ZTv0_n16_N3ccc7CC0x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y03efgEv,_ZThn4_N3ccc7CC0x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y03pqrEv,_ZTv0_n20_N3ccc7CC0x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y03pqrEv,_ZThn4_N3ccc7CC0x6y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y03abcEv,_ZTv0_n12_N3ccc7CC0x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y03efgEv,_ZTv0_n16_N3ccc7CC0x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y03pqrEv,_ZTv0_n20_N3ccc7CC0x6y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y0E[] = {
  {&(_ZTVN3ccc7CC0x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y0E[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y03pqrEv,_ZTv0_n20_N3ccc7CC0x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y03pqrEv,_ZThn4_N3ccc7CC0x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y03efgEv,_ZTv0_n16_N3ccc7CC0x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y03efgEv,_ZThn4_N3ccc7CC0x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y03abcEv,_ZTv0_n12_N3ccc7CC0x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y03abcEv,_ZThn4_N3ccc7CC0x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y0E = {  "_ZN3ccc7CC0x6y0E", // class name
  bases__ZN3ccc7CC0x6y0E, 2,
  &(vtc__ZN3ccc7CC0x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y0E),2, //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  DD0x6y0  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD0x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y03pqrEv
  ~DD0x6y0(); // tgen
  DD0x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y03abcEv");}
void  ccc::DD0x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y03efgEv");}
void  ccc::DD0x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y03pqrEv");}
ccc::DD0x6y0 ::~DD0x6y0(){ note_dtor("_ZN3ccc7DD0x6y0E", this);} // tgen
ccc::DD0x6y0 ::DD0x6y0(){ note_ctor("_ZN3ccc7DD0x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y0E, buf);
    ::ccc::DD0x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y0E);
    dp->::ccc::DD0x6y0::~DD0x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y0E(Test__ZN3ccc7DD0x6y0E, "_ZN3ccc7DD0x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y0C1Ev();
extern void _ZN3ccc7DD0x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y0E[] = {
  NSPAIR(_ZN3ccc7DD0x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y0E[];
extern void _ZN3ccc7DD0x6y03abcEv();
extern void _ZN3ccc7DD0x6y03efgEv();
extern void _ZN3ccc7DD0x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y03abcEv,_ZTv0_n12_N3ccc7DD0x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y03abcEv,_ZThn4_N3ccc7DD0x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y03efgEv,_ZTv0_n16_N3ccc7DD0x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y03efgEv,_ZThn4_N3ccc7DD0x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y03abcEv,_ZTv0_n12_N3ccc7DD0x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y03efgEv,_ZTv0_n16_N3ccc7DD0x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y0E[] = {
  {&(_ZTVN3ccc7DD0x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y0E[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y03efgEv,_ZTv0_n16_N3ccc7DD0x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y03efgEv,_ZThn4_N3ccc7DD0x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y03abcEv,_ZTv0_n12_N3ccc7DD0x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y03abcEv,_ZThn4_N3ccc7DD0x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y0E = {  "_ZN3ccc7DD0x6y0E", // class name
  bases__ZN3ccc7DD0x6y0E, 2,
  &(vtc__ZN3ccc7DD0x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y0E),3, //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  CC0x6y1  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x6y13efgEv
  ~CC0x6y1(); // tgen
  CC0x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y1E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y13abcEv");}
void  ccc::CC0x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y13pqrEv");}
void  ccc::CC0x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y13efgEv");}
ccc::CC0x6y1 ::~CC0x6y1(){ note_dtor("_ZN3ccc7CC0x6y1E", this);} // tgen
ccc::CC0x6y1 ::CC0x6y1(){ note_ctor("_ZN3ccc7CC0x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y1E, buf);
    ::ccc::CC0x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y1E);
    dp->::ccc::CC0x6y1::~CC0x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y1E(Test__ZN3ccc7CC0x6y1E, "_ZN3ccc7CC0x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y1C1Ev();
extern void _ZN3ccc7CC0x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y1E[] = {
  NSPAIR(_ZN3ccc7CC0x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y1E[];
extern void _ZN3ccc7CC0x6y13abcEv();
extern void _ZN3ccc7CC0x6y13efgEv();
extern void _ZN3ccc7CC0x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y13abcEv,_ZTv0_n12_N3ccc7CC0x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y13abcEv,_ZThn4_N3ccc7CC0x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y13efgEv,_ZTv0_n16_N3ccc7CC0x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y13efgEv,_ZThn4_N3ccc7CC0x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y13pqrEv,_ZTv0_n20_N3ccc7CC0x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y13pqrEv,_ZThn4_N3ccc7CC0x6y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y13abcEv,_ZTv0_n12_N3ccc7CC0x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y13efgEv,_ZTv0_n16_N3ccc7CC0x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y13pqrEv,_ZTv0_n20_N3ccc7CC0x6y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y1E[] = {
  {&(_ZTVN3ccc7CC0x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y1E[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y13pqrEv,_ZTv0_n20_N3ccc7CC0x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y13pqrEv,_ZThn4_N3ccc7CC0x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y13efgEv,_ZTv0_n16_N3ccc7CC0x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y13efgEv,_ZThn4_N3ccc7CC0x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y13abcEv,_ZTv0_n12_N3ccc7CC0x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y13abcEv,_ZThn4_N3ccc7CC0x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y1E = {  "_ZN3ccc7CC0x6y1E", // class name
  bases__ZN3ccc7CC0x6y1E, 2,
  &(vtc__ZN3ccc7CC0x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y1E),2, //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  DD0x6y1  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD0x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x6y13efgEv
  ~DD0x6y1(); // tgen
  DD0x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y13abcEv");}
void  ccc::DD0x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y13pqrEv");}
void  ccc::DD0x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y13efgEv");}
ccc::DD0x6y1 ::~DD0x6y1(){ note_dtor("_ZN3ccc7DD0x6y1E", this);} // tgen
ccc::DD0x6y1 ::DD0x6y1(){ note_ctor("_ZN3ccc7DD0x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y1E, buf);
    ::ccc::DD0x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y1E);
    dp->::ccc::DD0x6y1::~DD0x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y1E(Test__ZN3ccc7DD0x6y1E, "_ZN3ccc7DD0x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y1C1Ev();
extern void _ZN3ccc7DD0x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y1E[] = {
  NSPAIR(_ZN3ccc7DD0x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y1E[];
extern void _ZN3ccc7DD0x6y13abcEv();
extern void _ZN3ccc7DD0x6y13efgEv();
extern void _ZN3ccc7DD0x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y13abcEv,_ZTv0_n12_N3ccc7DD0x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y13abcEv,_ZThn4_N3ccc7DD0x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y13efgEv,_ZTv0_n16_N3ccc7DD0x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y13efgEv,_ZThn4_N3ccc7DD0x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y13abcEv,_ZTv0_n12_N3ccc7DD0x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y13efgEv,_ZTv0_n16_N3ccc7DD0x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y1E[] = {
  {&(_ZTVN3ccc7DD0x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y1E[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y13efgEv,_ZTv0_n16_N3ccc7DD0x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y13efgEv,_ZThn4_N3ccc7DD0x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y13abcEv,_ZTv0_n12_N3ccc7DD0x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y13abcEv,_ZThn4_N3ccc7DD0x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y1E = {  "_ZN3ccc7DD0x6y1E", // class name
  bases__ZN3ccc7DD0x6y1E, 2,
  &(vtc__ZN3ccc7DD0x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y1E),3, //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  CC0x6y2  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y23pqrEv
  ~CC0x6y2(); // tgen
  CC0x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y2E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y23efgEv");}
void  ccc::CC0x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y23abcEv");}
void  ccc::CC0x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y23pqrEv");}
ccc::CC0x6y2 ::~CC0x6y2(){ note_dtor("_ZN3ccc7CC0x6y2E", this);} // tgen
ccc::CC0x6y2 ::CC0x6y2(){ note_ctor("_ZN3ccc7CC0x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y2E, buf);
    ::ccc::CC0x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y2E);
    dp->::ccc::CC0x6y2::~CC0x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y2E(Test__ZN3ccc7CC0x6y2E, "_ZN3ccc7CC0x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y2C1Ev();
extern void _ZN3ccc7CC0x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y2E[] = {
  NSPAIR(_ZN3ccc7CC0x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y2E[];
extern void _ZN3ccc7CC0x6y23abcEv();
extern void _ZN3ccc7CC0x6y23efgEv();
extern void _ZN3ccc7CC0x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y23abcEv,_ZTv0_n12_N3ccc7CC0x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y23abcEv,_ZThn4_N3ccc7CC0x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y23efgEv,_ZTv0_n16_N3ccc7CC0x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y23efgEv,_ZThn4_N3ccc7CC0x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y23pqrEv,_ZTv0_n20_N3ccc7CC0x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y23pqrEv,_ZThn4_N3ccc7CC0x6y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y23abcEv,_ZTv0_n12_N3ccc7CC0x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y23efgEv,_ZTv0_n16_N3ccc7CC0x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y23pqrEv,_ZTv0_n20_N3ccc7CC0x6y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y2E[] = {
  {&(_ZTVN3ccc7CC0x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y2E[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y23pqrEv,_ZTv0_n20_N3ccc7CC0x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y23pqrEv,_ZThn4_N3ccc7CC0x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y23efgEv,_ZTv0_n16_N3ccc7CC0x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y23efgEv,_ZThn4_N3ccc7CC0x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y23abcEv,_ZTv0_n12_N3ccc7CC0x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y23abcEv,_ZThn4_N3ccc7CC0x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y2E = {  "_ZN3ccc7CC0x6y2E", // class name
  bases__ZN3ccc7CC0x6y2E, 2,
  &(vtc__ZN3ccc7CC0x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y2E),2, //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  DD0x6y2  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD0x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y23pqrEv
  ~DD0x6y2(); // tgen
  DD0x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y23efgEv");}
void  ccc::DD0x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y23abcEv");}
void  ccc::DD0x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y23pqrEv");}
ccc::DD0x6y2 ::~DD0x6y2(){ note_dtor("_ZN3ccc7DD0x6y2E", this);} // tgen
ccc::DD0x6y2 ::DD0x6y2(){ note_ctor("_ZN3ccc7DD0x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y2E, buf);
    ::ccc::DD0x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y2E);
    dp->::ccc::DD0x6y2::~DD0x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y2E(Test__ZN3ccc7DD0x6y2E, "_ZN3ccc7DD0x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y2C1Ev();
extern void _ZN3ccc7DD0x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y2E[] = {
  NSPAIR(_ZN3ccc7DD0x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y2E[];
extern void _ZN3ccc7DD0x6y23abcEv();
extern void _ZN3ccc7DD0x6y23efgEv();
extern void _ZN3ccc7DD0x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y23abcEv,_ZTv0_n12_N3ccc7DD0x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y23abcEv,_ZThn4_N3ccc7DD0x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y23efgEv,_ZTv0_n16_N3ccc7DD0x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y23efgEv,_ZThn4_N3ccc7DD0x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y23abcEv,_ZTv0_n12_N3ccc7DD0x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y23efgEv,_ZTv0_n16_N3ccc7DD0x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y2E[] = {
  {&(_ZTVN3ccc7DD0x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y2E[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y23efgEv,_ZTv0_n16_N3ccc7DD0x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y23efgEv,_ZThn4_N3ccc7DD0x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y23abcEv,_ZTv0_n12_N3ccc7DD0x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y23abcEv,_ZThn4_N3ccc7DD0x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y2E = {  "_ZN3ccc7DD0x6y2E", // class name
  bases__ZN3ccc7DD0x6y2E, 2,
  &(vtc__ZN3ccc7DD0x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y2E),3, //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  CC0x6y3  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x6y33abcEv
  ~CC0x6y3(); // tgen
  CC0x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y3E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y33efgEv");}
void  ccc::CC0x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y33pqrEv");}
void  ccc::CC0x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y33abcEv");}
ccc::CC0x6y3 ::~CC0x6y3(){ note_dtor("_ZN3ccc7CC0x6y3E", this);} // tgen
ccc::CC0x6y3 ::CC0x6y3(){ note_ctor("_ZN3ccc7CC0x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y3E, buf);
    ::ccc::CC0x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y3E);
    dp->::ccc::CC0x6y3::~CC0x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y3E(Test__ZN3ccc7CC0x6y3E, "_ZN3ccc7CC0x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y3C1Ev();
extern void _ZN3ccc7CC0x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y3E[] = {
  NSPAIR(_ZN3ccc7CC0x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y3E[];
extern void _ZN3ccc7CC0x6y33abcEv();
extern void _ZN3ccc7CC0x6y33efgEv();
extern void _ZN3ccc7CC0x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y33abcEv,_ZTv0_n12_N3ccc7CC0x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y33abcEv,_ZThn4_N3ccc7CC0x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y33efgEv,_ZTv0_n16_N3ccc7CC0x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y33efgEv,_ZThn4_N3ccc7CC0x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y33pqrEv,_ZTv0_n20_N3ccc7CC0x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y33pqrEv,_ZThn4_N3ccc7CC0x6y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y33abcEv,_ZTv0_n12_N3ccc7CC0x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y33efgEv,_ZTv0_n16_N3ccc7CC0x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y33pqrEv,_ZTv0_n20_N3ccc7CC0x6y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y3E[] = {
  {&(_ZTVN3ccc7CC0x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y3E[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y33pqrEv,_ZTv0_n20_N3ccc7CC0x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y33pqrEv,_ZThn4_N3ccc7CC0x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y33efgEv,_ZTv0_n16_N3ccc7CC0x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y33efgEv,_ZThn4_N3ccc7CC0x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y33abcEv,_ZTv0_n12_N3ccc7CC0x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y33abcEv,_ZThn4_N3ccc7CC0x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y3E = {  "_ZN3ccc7CC0x6y3E", // class name
  bases__ZN3ccc7CC0x6y3E, 2,
  &(vtc__ZN3ccc7CC0x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y3E),2, //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  DD0x6y3  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD0x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x6y33abcEv
  ~DD0x6y3(); // tgen
  DD0x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y33efgEv");}
void  ccc::DD0x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y33pqrEv");}
void  ccc::DD0x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y33abcEv");}
ccc::DD0x6y3 ::~DD0x6y3(){ note_dtor("_ZN3ccc7DD0x6y3E", this);} // tgen
ccc::DD0x6y3 ::DD0x6y3(){ note_ctor("_ZN3ccc7DD0x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y3E, buf);
    ::ccc::DD0x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y3E);
    dp->::ccc::DD0x6y3::~DD0x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y3E(Test__ZN3ccc7DD0x6y3E, "_ZN3ccc7DD0x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y3C1Ev();
extern void _ZN3ccc7DD0x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y3E[] = {
  NSPAIR(_ZN3ccc7DD0x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y3E[];
extern void _ZN3ccc7DD0x6y33abcEv();
extern void _ZN3ccc7DD0x6y33efgEv();
extern void _ZN3ccc7DD0x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y33abcEv,_ZTv0_n12_N3ccc7DD0x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y33abcEv,_ZThn4_N3ccc7DD0x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y33efgEv,_ZTv0_n16_N3ccc7DD0x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y33efgEv,_ZThn4_N3ccc7DD0x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y33abcEv,_ZTv0_n12_N3ccc7DD0x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y33efgEv,_ZTv0_n16_N3ccc7DD0x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y3E[] = {
  {&(_ZTVN3ccc7DD0x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y3E[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y33efgEv,_ZTv0_n16_N3ccc7DD0x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y33efgEv,_ZThn4_N3ccc7DD0x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y33abcEv,_ZTv0_n12_N3ccc7DD0x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y33abcEv,_ZThn4_N3ccc7DD0x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y3E = {  "_ZN3ccc7DD0x6y3E", // class name
  bases__ZN3ccc7DD0x6y3E, 2,
  &(vtc__ZN3ccc7DD0x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y4  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC0x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y43efgEv
  ~CC0x6y4(); // tgen
  CC0x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y4E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y43pqrEv");}
void  ccc::CC0x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y43abcEv");}
void  ccc::CC0x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y43efgEv");}
ccc::CC0x6y4 ::~CC0x6y4(){ note_dtor("_ZN3ccc7CC0x6y4E", this);} // tgen
ccc::CC0x6y4 ::CC0x6y4(){ note_ctor("_ZN3ccc7CC0x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y4E, buf);
    ::ccc::CC0x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y4E);
    dp->::ccc::CC0x6y4::~CC0x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y4E(Test__ZN3ccc7CC0x6y4E, "_ZN3ccc7CC0x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y4C1Ev();
extern void _ZN3ccc7CC0x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y4E[] = {
  NSPAIR(_ZN3ccc7CC0x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y4E[];
extern void _ZN3ccc7CC0x6y43abcEv();
extern void _ZN3ccc7CC0x6y43efgEv();
extern void _ZN3ccc7CC0x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y43abcEv,_ZTv0_n12_N3ccc7CC0x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y43abcEv,_ZThn4_N3ccc7CC0x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y43efgEv,_ZTv0_n16_N3ccc7CC0x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y43efgEv,_ZThn4_N3ccc7CC0x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y43pqrEv,_ZTv0_n20_N3ccc7CC0x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y43pqrEv,_ZThn4_N3ccc7CC0x6y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y43abcEv,_ZTv0_n12_N3ccc7CC0x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y43efgEv,_ZTv0_n16_N3ccc7CC0x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y43pqrEv,_ZTv0_n20_N3ccc7CC0x6y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y4E[] = {
  {&(_ZTVN3ccc7CC0x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y4E[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y43pqrEv,_ZTv0_n20_N3ccc7CC0x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y43pqrEv,_ZThn4_N3ccc7CC0x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y43efgEv,_ZTv0_n16_N3ccc7CC0x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y43efgEv,_ZThn4_N3ccc7CC0x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y43abcEv,_ZTv0_n12_N3ccc7CC0x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y43abcEv,_ZThn4_N3ccc7CC0x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y4E = {  "_ZN3ccc7CC0x6y4E", // class name
  bases__ZN3ccc7CC0x6y4E, 2,
  &(vtc__ZN3ccc7CC0x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y4E),2, //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  DD0x6y4  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD0x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x6y43efgEv
  ~DD0x6y4(); // tgen
  DD0x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y43pqrEv");}
void  ccc::DD0x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y43abcEv");}
void  ccc::DD0x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y43efgEv");}
ccc::DD0x6y4 ::~DD0x6y4(){ note_dtor("_ZN3ccc7DD0x6y4E", this);} // tgen
ccc::DD0x6y4 ::DD0x6y4(){ note_ctor("_ZN3ccc7DD0x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y4E, buf);
    ::ccc::DD0x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y4E);
    dp->::ccc::DD0x6y4::~DD0x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y4E(Test__ZN3ccc7DD0x6y4E, "_ZN3ccc7DD0x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y4C1Ev();
extern void _ZN3ccc7DD0x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y4E[] = {
  NSPAIR(_ZN3ccc7DD0x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y4E[];
extern void _ZN3ccc7DD0x6y43abcEv();
extern void _ZN3ccc7DD0x6y43efgEv();
extern void _ZN3ccc7DD0x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y43abcEv,_ZTv0_n12_N3ccc7DD0x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y43abcEv,_ZThn4_N3ccc7DD0x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y43efgEv,_ZTv0_n16_N3ccc7DD0x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y43efgEv,_ZThn4_N3ccc7DD0x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y43abcEv,_ZTv0_n12_N3ccc7DD0x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y43efgEv,_ZTv0_n16_N3ccc7DD0x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y4E[] = {
  {&(_ZTVN3ccc7DD0x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y4E[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y43efgEv,_ZTv0_n16_N3ccc7DD0x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y43efgEv,_ZThn4_N3ccc7DD0x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y43abcEv,_ZTv0_n12_N3ccc7DD0x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y43abcEv,_ZThn4_N3ccc7DD0x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y4E = {  "_ZN3ccc7DD0x6y4E", // class name
  bases__ZN3ccc7DD0x6y4E, 2,
  &(vtc__ZN3ccc7DD0x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y4E),3, //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  CC0x6y5  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC0x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y53abcEv
  ~CC0x6y5(); // tgen
  CC0x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y5E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y53pqrEv");}
void  ccc::CC0x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y53efgEv");}
void  ccc::CC0x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y53abcEv");}
ccc::CC0x6y5 ::~CC0x6y5(){ note_dtor("_ZN3ccc7CC0x6y5E", this);} // tgen
ccc::CC0x6y5 ::CC0x6y5(){ note_ctor("_ZN3ccc7CC0x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y5E, buf);
    ::ccc::CC0x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y5E);
    dp->::ccc::CC0x6y5::~CC0x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y5E(Test__ZN3ccc7CC0x6y5E, "_ZN3ccc7CC0x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y5C1Ev();
extern void _ZN3ccc7CC0x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y5E[] = {
  NSPAIR(_ZN3ccc7CC0x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y5E[];
extern void _ZN3ccc7CC0x6y53abcEv();
extern void _ZN3ccc7CC0x6y53efgEv();
extern void _ZN3ccc7CC0x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y53abcEv,_ZTv0_n12_N3ccc7CC0x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y53abcEv,_ZThn4_N3ccc7CC0x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y53efgEv,_ZTv0_n16_N3ccc7CC0x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y53efgEv,_ZThn4_N3ccc7CC0x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y53pqrEv,_ZTv0_n20_N3ccc7CC0x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y53pqrEv,_ZThn4_N3ccc7CC0x6y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y53abcEv,_ZTv0_n12_N3ccc7CC0x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y53efgEv,_ZTv0_n16_N3ccc7CC0x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y53pqrEv,_ZTv0_n20_N3ccc7CC0x6y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y5E[] = {
  {&(_ZTVN3ccc7CC0x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y5E[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y53pqrEv,_ZTv0_n20_N3ccc7CC0x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y53pqrEv,_ZThn4_N3ccc7CC0x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y53efgEv,_ZTv0_n16_N3ccc7CC0x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y53efgEv,_ZThn4_N3ccc7CC0x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y53abcEv,_ZTv0_n12_N3ccc7CC0x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y53abcEv,_ZThn4_N3ccc7CC0x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y5E = {  "_ZN3ccc7CC0x6y5E", // class name
  bases__ZN3ccc7CC0x6y5E, 2,
  &(vtc__ZN3ccc7CC0x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y5E),2, //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  DD0x6y5  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD0x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x6y53abcEv
  ~DD0x6y5(); // tgen
  DD0x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y53pqrEv");}
void  ccc::DD0x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y53efgEv");}
void  ccc::DD0x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y53abcEv");}
ccc::DD0x6y5 ::~DD0x6y5(){ note_dtor("_ZN3ccc7DD0x6y5E", this);} // tgen
ccc::DD0x6y5 ::DD0x6y5(){ note_ctor("_ZN3ccc7DD0x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y5E, buf);
    ::ccc::DD0x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y5E);
    dp->::ccc::DD0x6y5::~DD0x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y5E(Test__ZN3ccc7DD0x6y5E, "_ZN3ccc7DD0x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y5C1Ev();
extern void _ZN3ccc7DD0x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y5E[] = {
  NSPAIR(_ZN3ccc7DD0x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y5E[];
extern void _ZN3ccc7DD0x6y53abcEv();
extern void _ZN3ccc7DD0x6y53efgEv();
extern void _ZN3ccc7DD0x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y53abcEv,_ZTv0_n12_N3ccc7DD0x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y53abcEv,_ZThn4_N3ccc7DD0x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y53efgEv,_ZTv0_n16_N3ccc7DD0x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y53efgEv,_ZThn4_N3ccc7DD0x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y53abcEv,_ZTv0_n12_N3ccc7DD0x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y53efgEv,_ZTv0_n16_N3ccc7DD0x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y5E[] = {
  {&(_ZTVN3ccc7DD0x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y5E[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y53efgEv,_ZTv0_n16_N3ccc7DD0x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y53efgEv,_ZThn4_N3ccc7DD0x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y53abcEv,_ZTv0_n12_N3ccc7DD0x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y53abcEv,_ZThn4_N3ccc7DD0x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y5E = {  "_ZN3ccc7DD0x6y5E", // class name
  bases__ZN3ccc7DD0x6y5E, 2,
  &(vtc__ZN3ccc7DD0x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y5E),3, //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  CC0x6y6  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y63efgEv
  ~CC0x6y6(); // tgen
  CC0x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y6E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y63abcEv");}
void  ccc::CC0x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y63efgEv");}
ccc::CC0x6y6 ::~CC0x6y6(){ note_dtor("_ZN3ccc7CC0x6y6E", this);} // tgen
ccc::CC0x6y6 ::CC0x6y6(){ note_ctor("_ZN3ccc7CC0x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y6E, buf);
    ::ccc::CC0x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y6E);
    dp->::ccc::CC0x6y6::~CC0x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y6E(Test__ZN3ccc7CC0x6y6E, "_ZN3ccc7CC0x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y6C1Ev();
extern void _ZN3ccc7CC0x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y6E[] = {
  NSPAIR(_ZN3ccc7CC0x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y6E[];
extern void _ZN3ccc7CC0x6y63abcEv();
extern void _ZN3ccc7CC0x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y63abcEv,_ZTv0_n12_N3ccc7CC0x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y63abcEv,_ZThn4_N3ccc7CC0x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y63efgEv,_ZTv0_n16_N3ccc7CC0x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y63efgEv,_ZThn4_N3ccc7CC0x6y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y63abcEv,_ZTv0_n12_N3ccc7CC0x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y63efgEv,_ZTv0_n16_N3ccc7CC0x6y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y6E[] = {
  {&(_ZTVN3ccc7CC0x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y6E[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y63efgEv,_ZTv0_n16_N3ccc7CC0x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y63efgEv,_ZThn4_N3ccc7CC0x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y63abcEv,_ZTv0_n12_N3ccc7CC0x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y63abcEv,_ZThn4_N3ccc7CC0x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y6E = {  "_ZN3ccc7CC0x6y6E", // class name
  bases__ZN3ccc7CC0x6y6E, 2,
  &(vtc__ZN3ccc7CC0x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y6E),2, //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  DD0x6y6  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD0x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x6y63efgEv
  ~DD0x6y6(); // tgen
  DD0x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y63abcEv");}
void  ccc::DD0x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y63efgEv");}
ccc::DD0x6y6 ::~DD0x6y6(){ note_dtor("_ZN3ccc7DD0x6y6E", this);} // tgen
ccc::DD0x6y6 ::DD0x6y6(){ note_ctor("_ZN3ccc7DD0x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y6E, buf);
    ::ccc::DD0x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y6E);
    dp->::ccc::DD0x6y6::~DD0x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y6E(Test__ZN3ccc7DD0x6y6E, "_ZN3ccc7DD0x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y6C1Ev();
extern void _ZN3ccc7DD0x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y6E[] = {
  NSPAIR(_ZN3ccc7DD0x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y6E[];
extern void _ZN3ccc7DD0x6y63abcEv();
extern void _ZN3ccc7DD0x6y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y63abcEv,_ZTv0_n12_N3ccc7DD0x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y63abcEv,_ZThn4_N3ccc7DD0x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y63efgEv,_ZTv0_n16_N3ccc7DD0x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y63efgEv,_ZThn4_N3ccc7DD0x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y63abcEv,_ZTv0_n12_N3ccc7DD0x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y63efgEv,_ZTv0_n16_N3ccc7DD0x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y6E[] = {
  {&(_ZTVN3ccc7DD0x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y6E[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y63efgEv,_ZTv0_n16_N3ccc7DD0x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y63efgEv,_ZThn4_N3ccc7DD0x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y63abcEv,_ZTv0_n12_N3ccc7DD0x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y63abcEv,_ZThn4_N3ccc7DD0x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y6E = {  "_ZN3ccc7DD0x6y6E", // class name
  bases__ZN3ccc7DD0x6y6E, 2,
  &(vtc__ZN3ccc7DD0x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y6E),3, //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  CC0x6y7  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y73pqrEv
  ~CC0x6y7(); // tgen
  CC0x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y7E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y73abcEv");}
void  ccc::CC0x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y73pqrEv");}
ccc::CC0x6y7 ::~CC0x6y7(){ note_dtor("_ZN3ccc7CC0x6y7E", this);} // tgen
ccc::CC0x6y7 ::CC0x6y7(){ note_ctor("_ZN3ccc7CC0x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y7E, buf);
    ::ccc::CC0x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y7E);
    dp->::ccc::CC0x6y7::~CC0x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y7E(Test__ZN3ccc7CC0x6y7E, "_ZN3ccc7CC0x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y7C1Ev();
extern void _ZN3ccc7CC0x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y7E[] = {
  NSPAIR(_ZN3ccc7CC0x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y7E[];
extern void _ZN3ccc7CC0x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC0x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y73abcEv,_ZTv0_n12_N3ccc7CC0x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y73abcEv,_ZThn4_N3ccc7CC0x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y73pqrEv,_ZTv0_n20_N3ccc7CC0x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y73pqrEv,_ZThn4_N3ccc7CC0x6y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y73abcEv,_ZTv0_n12_N3ccc7CC0x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y73pqrEv,_ZTv0_n20_N3ccc7CC0x6y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y7E[] = {
  {&(_ZTVN3ccc7CC0x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y7E[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y73pqrEv,_ZTv0_n20_N3ccc7CC0x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y73pqrEv,_ZThn4_N3ccc7CC0x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y73abcEv,_ZTv0_n12_N3ccc7CC0x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y73abcEv,_ZThn4_N3ccc7CC0x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y7E = {  "_ZN3ccc7CC0x6y7E", // class name
  bases__ZN3ccc7CC0x6y7E, 2,
  &(vtc__ZN3ccc7CC0x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y7E),2, //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  DD0x6y7  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD0x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y73pqrEv
  ~DD0x6y7(); // tgen
  DD0x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y73abcEv");}
void  ccc::DD0x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y73pqrEv");}
ccc::DD0x6y7 ::~DD0x6y7(){ note_dtor("_ZN3ccc7DD0x6y7E", this);} // tgen
ccc::DD0x6y7 ::DD0x6y7(){ note_ctor("_ZN3ccc7DD0x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y7E, buf);
    ::ccc::DD0x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y7E);
    dp->::ccc::DD0x6y7::~DD0x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y7E(Test__ZN3ccc7DD0x6y7E, "_ZN3ccc7DD0x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y7C1Ev();
extern void _ZN3ccc7DD0x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y7E[] = {
  NSPAIR(_ZN3ccc7DD0x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y7E[];
extern void _ZN3ccc7DD0x6y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y73abcEv,_ZTv0_n12_N3ccc7DD0x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y73abcEv,_ZThn4_N3ccc7DD0x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y73abcEv,_ZTv0_n12_N3ccc7DD0x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y7E[] = {
  {&(_ZTVN3ccc7DD0x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y7E[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y73abcEv,_ZTv0_n12_N3ccc7DD0x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y73abcEv,_ZThn4_N3ccc7DD0x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y7E = {  "_ZN3ccc7DD0x6y7E", // class name
  bases__ZN3ccc7DD0x6y7E, 2,
  &(vtc__ZN3ccc7DD0x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y7E),3, //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  CC0x6y8  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y83abcEv
  ~CC0x6y8(); // tgen
  CC0x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y8E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y83efgEv");}
void  ccc::CC0x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y83abcEv");}
ccc::CC0x6y8 ::~CC0x6y8(){ note_dtor("_ZN3ccc7CC0x6y8E", this);} // tgen
ccc::CC0x6y8 ::CC0x6y8(){ note_ctor("_ZN3ccc7CC0x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y8E, buf);
    ::ccc::CC0x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y8E);
    dp->::ccc::CC0x6y8::~CC0x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y8E(Test__ZN3ccc7CC0x6y8E, "_ZN3ccc7CC0x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y8C1Ev();
extern void _ZN3ccc7CC0x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y8E[] = {
  NSPAIR(_ZN3ccc7CC0x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y8E[];
extern void _ZN3ccc7CC0x6y83abcEv();
extern void _ZN3ccc7CC0x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x6y83abcEv,_ZTv0_n12_N3ccc7CC0x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y83abcEv,_ZThn4_N3ccc7CC0x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y83efgEv,_ZTv0_n16_N3ccc7CC0x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y83efgEv,_ZThn4_N3ccc7CC0x6y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x6y83abcEv,_ZTv0_n12_N3ccc7CC0x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y83efgEv,_ZTv0_n16_N3ccc7CC0x6y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y8E[] = {
  {&(_ZTVN3ccc7CC0x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y8E[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y83efgEv,_ZTv0_n16_N3ccc7CC0x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y83efgEv,_ZThn4_N3ccc7CC0x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x6y83abcEv,_ZTv0_n12_N3ccc7CC0x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y83abcEv,_ZThn4_N3ccc7CC0x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y8E = {  "_ZN3ccc7CC0x6y8E", // class name
  bases__ZN3ccc7CC0x6y8E, 2,
  &(vtc__ZN3ccc7CC0x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y8E),2, //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  DD0x6y8  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD0x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x6y83abcEv
  ~DD0x6y8(); // tgen
  DD0x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y83efgEv");}
void  ccc::DD0x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x6y83abcEv");}
ccc::DD0x6y8 ::~DD0x6y8(){ note_dtor("_ZN3ccc7DD0x6y8E", this);} // tgen
ccc::DD0x6y8 ::DD0x6y8(){ note_ctor("_ZN3ccc7DD0x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y8E, buf);
    ::ccc::DD0x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y8E);
    dp->::ccc::DD0x6y8::~DD0x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y8E(Test__ZN3ccc7DD0x6y8E, "_ZN3ccc7DD0x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y8C1Ev();
extern void _ZN3ccc7DD0x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y8E[] = {
  NSPAIR(_ZN3ccc7DD0x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y8E[];
extern void _ZN3ccc7DD0x6y83abcEv();
extern void _ZN3ccc7DD0x6y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x6y83abcEv,_ZTv0_n12_N3ccc7DD0x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y83abcEv,_ZThn4_N3ccc7DD0x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y83efgEv,_ZTv0_n16_N3ccc7DD0x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y83efgEv,_ZThn4_N3ccc7DD0x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x6y83abcEv,_ZTv0_n12_N3ccc7DD0x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y83efgEv,_ZTv0_n16_N3ccc7DD0x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y8E[] = {
  {&(_ZTVN3ccc7DD0x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y8E[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y83efgEv,_ZTv0_n16_N3ccc7DD0x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y83efgEv,_ZThn4_N3ccc7DD0x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x6y83abcEv,_ZTv0_n12_N3ccc7DD0x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y83abcEv,_ZThn4_N3ccc7DD0x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y8E = {  "_ZN3ccc7DD0x6y8E", // class name
  bases__ZN3ccc7DD0x6y8E, 2,
  &(vtc__ZN3ccc7DD0x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y8E),3, //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  CC0x6y9  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y93pqrEv
  ~CC0x6y9(); // tgen
  CC0x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y9E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y93efgEv");}
void  ccc::CC0x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y93pqrEv");}
ccc::CC0x6y9 ::~CC0x6y9(){ note_dtor("_ZN3ccc7CC0x6y9E", this);} // tgen
ccc::CC0x6y9 ::CC0x6y9(){ note_ctor("_ZN3ccc7CC0x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y9E, buf);
    ::ccc::CC0x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC0x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y9E);
    dp->::ccc::CC0x6y9::~CC0x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y9E(Test__ZN3ccc7CC0x6y9E, "_ZN3ccc7CC0x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y9C1Ev();
extern void _ZN3ccc7CC0x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y9E[] = {
  NSPAIR(_ZN3ccc7CC0x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC0x6y93efgEv();
extern void _ZN3ccc7CC0x6y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x6y93efgEv,_ZTv0_n16_N3ccc7CC0x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y93efgEv,_ZThn4_N3ccc7CC0x6y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x6y93pqrEv,_ZTv0_n20_N3ccc7CC0x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y93pqrEv,_ZThn4_N3ccc7CC0x6y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x6y93efgEv,_ZTv0_n16_N3ccc7CC0x6y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x6y93pqrEv,_ZTv0_n20_N3ccc7CC0x6y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x6y9E[] = {
  {&(_ZTVN3ccc7CC0x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x6y9E[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x6y93pqrEv,_ZTv0_n20_N3ccc7CC0x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y93pqrEv,_ZThn4_N3ccc7CC0x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x6y93efgEv,_ZTv0_n16_N3ccc7CC0x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x6y93efgEv,_ZThn4_N3ccc7CC0x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x6y9E = {  "_ZN3ccc7CC0x6y9E", // class name
  bases__ZN3ccc7CC0x6y9E, 2,
  &(vtc__ZN3ccc7CC0x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x6y9E),2, //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  DD0x6y9  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD0x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x6y93pqrEv
  ~DD0x6y9(); // tgen
  DD0x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x6y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x6y93efgEv");}
void  ccc::DD0x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x6y93pqrEv");}
ccc::DD0x6y9 ::~DD0x6y9(){ note_dtor("_ZN3ccc7DD0x6y9E", this);} // tgen
ccc::DD0x6y9 ::DD0x6y9(){ note_ctor("_ZN3ccc7DD0x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x6y9E, buf);
    ::ccc::DD0x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x6y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD0x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x6y9E);
    dp->::ccc::DD0x6y9::~DD0x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x6y9E(Test__ZN3ccc7DD0x6y9E, "_ZN3ccc7DD0x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x6y9C1Ev();
extern void _ZN3ccc7DD0x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x6y9E[] = {
  NSPAIR(_ZN3ccc7DD0x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD0x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x6y93efgEv();
extern void _ZN3ccc7DD0x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x6y93efgEv,_ZTv0_n16_N3ccc7DD0x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x6y93efgEv,_ZThn4_N3ccc7DD0x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x6y93efgEv,_ZTv0_n16_N3ccc7DD0x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x6y9E[] = {
  {&(_ZTVN3ccc7DD0x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x6y9E[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x6y93efgEv,_ZTv0_n16_N3ccc7DD0x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x6y93efgEv,_ZThn4_N3ccc7DD0x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x6y9E = {  "_ZN3ccc7DD0x6y9E", // class name
  bases__ZN3ccc7DD0x6y9E, 2,
  &(vtc__ZN3ccc7DD0x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x6y9E),3, //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  CC0x6y10  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x6y103abcEv
  ~CC0x6y10(); // tgen
  CC0x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y10E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y103pqrEv");}
void  ccc::CC0x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x6y103abcEv");}
ccc::CC0x6y10 ::~CC0x6y10(){ note_dtor("_ZN3ccc8CC0x6y10E", this);} // tgen
ccc::CC0x6y10 ::CC0x6y10(){ note_ctor("_ZN3ccc8CC0x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y10E, buf);
    ::ccc::CC0x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y10E);
    dp->::ccc::CC0x6y10::~CC0x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y10E(Test__ZN3ccc8CC0x6y10E, "_ZN3ccc8CC0x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y10C1Ev();
extern void _ZN3ccc8CC0x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y10E[] = {
  NSPAIR(_ZN3ccc8CC0x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y10E[];
extern void _ZN3ccc8CC0x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC0x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x6y103abcEv,_ZTv0_n12_N3ccc8CC0x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y103abcEv,_ZThn4_N3ccc8CC0x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x6y103pqrEv,_ZTv0_n20_N3ccc8CC0x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y103pqrEv,_ZThn4_N3ccc8CC0x6y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x6y103abcEv,_ZTv0_n12_N3ccc8CC0x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x6y103pqrEv,_ZTv0_n20_N3ccc8CC0x6y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y10E[] = {
  {&(_ZTVN3ccc8CC0x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y10E[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x6y103pqrEv,_ZTv0_n20_N3ccc8CC0x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y103pqrEv,_ZThn4_N3ccc8CC0x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x6y103abcEv,_ZTv0_n12_N3ccc8CC0x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y103abcEv,_ZThn4_N3ccc8CC0x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x6y10E = {  "_ZN3ccc8CC0x6y10E", // class name
  bases__ZN3ccc8CC0x6y10E, 2,
  &(vtc__ZN3ccc8CC0x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y10E),2, //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  DD0x6y10  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD0x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x6y103abcEv
  ~DD0x6y10(); // tgen
  DD0x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x6y103pqrEv");}
void  ccc::DD0x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x6y103abcEv");}
ccc::DD0x6y10 ::~DD0x6y10(){ note_dtor("_ZN3ccc8DD0x6y10E", this);} // tgen
ccc::DD0x6y10 ::DD0x6y10(){ note_ctor("_ZN3ccc8DD0x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y10E, buf);
    ::ccc::DD0x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y10E);
    dp->::ccc::DD0x6y10::~DD0x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y10E(Test__ZN3ccc8DD0x6y10E, "_ZN3ccc8DD0x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y10C1Ev();
extern void _ZN3ccc8DD0x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y10E[] = {
  NSPAIR(_ZN3ccc8DD0x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y10E[];
extern void _ZN3ccc8DD0x6y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x6y103abcEv,_ZTv0_n12_N3ccc8DD0x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x6y103abcEv,_ZThn4_N3ccc8DD0x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x6y103abcEv,_ZTv0_n12_N3ccc8DD0x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y10E[] = {
  {&(_ZTVN3ccc8DD0x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y10E[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x6y103abcEv,_ZTv0_n12_N3ccc8DD0x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x6y103abcEv,_ZThn4_N3ccc8DD0x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x6y10E = {  "_ZN3ccc8DD0x6y10E", // class name
  bases__ZN3ccc8DD0x6y10E, 2,
  &(vtc__ZN3ccc8DD0x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y10E),3, //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  CC0x6y11  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x6y113efgEv
  ~CC0x6y11(); // tgen
  CC0x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y11E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y113pqrEv");}
void  ccc::CC0x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x6y113efgEv");}
ccc::CC0x6y11 ::~CC0x6y11(){ note_dtor("_ZN3ccc8CC0x6y11E", this);} // tgen
ccc::CC0x6y11 ::CC0x6y11(){ note_ctor("_ZN3ccc8CC0x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y11E, buf);
    ::ccc::CC0x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y11E);
    dp->::ccc::CC0x6y11::~CC0x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y11E(Test__ZN3ccc8CC0x6y11E, "_ZN3ccc8CC0x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y11C1Ev();
extern void _ZN3ccc8CC0x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y11E[] = {
  NSPAIR(_ZN3ccc8CC0x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC0x6y113efgEv();
extern void _ZN3ccc8CC0x6y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x6y113efgEv,_ZTv0_n16_N3ccc8CC0x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y113efgEv,_ZThn4_N3ccc8CC0x6y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x6y113pqrEv,_ZTv0_n20_N3ccc8CC0x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y113pqrEv,_ZThn4_N3ccc8CC0x6y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x6y113efgEv,_ZTv0_n16_N3ccc8CC0x6y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x6y113pqrEv,_ZTv0_n20_N3ccc8CC0x6y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y11E[] = {
  {&(_ZTVN3ccc8CC0x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y11E[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x6y113pqrEv,_ZTv0_n20_N3ccc8CC0x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y113pqrEv,_ZThn4_N3ccc8CC0x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x6y113efgEv,_ZTv0_n16_N3ccc8CC0x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y113efgEv,_ZThn4_N3ccc8CC0x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x6y11E = {  "_ZN3ccc8CC0x6y11E", // class name
  bases__ZN3ccc8CC0x6y11E, 2,
  &(vtc__ZN3ccc8CC0x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y11E),2, //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  DD0x6y11  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD0x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x6y113efgEv
  ~DD0x6y11(); // tgen
  DD0x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x6y113pqrEv");}
void  ccc::DD0x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x6y113efgEv");}
ccc::DD0x6y11 ::~DD0x6y11(){ note_dtor("_ZN3ccc8DD0x6y11E", this);} // tgen
ccc::DD0x6y11 ::DD0x6y11(){ note_ctor("_ZN3ccc8DD0x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y11E, buf);
    ::ccc::DD0x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y11E);
    dp->::ccc::DD0x6y11::~DD0x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y11E(Test__ZN3ccc8DD0x6y11E, "_ZN3ccc8DD0x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y11C1Ev();
extern void _ZN3ccc8DD0x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y11E[] = {
  NSPAIR(_ZN3ccc8DD0x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x6y113efgEv();
extern void _ZN3ccc8DD0x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x6y113efgEv,_ZTv0_n16_N3ccc8DD0x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x6y113efgEv,_ZThn4_N3ccc8DD0x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x6y113efgEv,_ZTv0_n16_N3ccc8DD0x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y11E[] = {
  {&(_ZTVN3ccc8DD0x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y11E[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x6y113efgEv,_ZTv0_n16_N3ccc8DD0x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x6y113efgEv,_ZThn4_N3ccc8DD0x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x6y11E = {  "_ZN3ccc8DD0x6y11E", // class name
  bases__ZN3ccc8DD0x6y11E, 2,
  &(vtc__ZN3ccc8DD0x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y11E),3, //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  CC0x6y12  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC0x6y123abcEv
  ~CC0x6y12(); // tgen
  CC0x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x6y123abcEv");}
ccc::CC0x6y12 ::~CC0x6y12(){ note_dtor("_ZN3ccc8CC0x6y12E", this);} // tgen
ccc::CC0x6y12 ::CC0x6y12(){ note_ctor("_ZN3ccc8CC0x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y12E, buf);
    ::ccc::CC0x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y12E);
    dp->::ccc::CC0x6y12::~CC0x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y12E(Test__ZN3ccc8CC0x6y12E, "_ZN3ccc8CC0x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y12C1Ev();
extern void _ZN3ccc8CC0x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y12E[] = {
  NSPAIR(_ZN3ccc8CC0x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y12E[];
extern void _ZN3ccc8CC0x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x6y123abcEv,_ZTv0_n12_N3ccc8CC0x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y123abcEv,_ZThn4_N3ccc8CC0x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x6y123abcEv,_ZTv0_n12_N3ccc8CC0x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y12E[] = {
  {&(_ZTVN3ccc8CC0x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y12E[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x6y123abcEv,_ZTv0_n12_N3ccc8CC0x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y123abcEv,_ZThn4_N3ccc8CC0x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x6y12E = {  "_ZN3ccc8CC0x6y12E", // class name
  bases__ZN3ccc8CC0x6y12E, 2,
  &(vtc__ZN3ccc8CC0x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y12E),2, //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  DD0x6y12  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD0x6y123abcEv
  ~DD0x6y12(); // tgen
  DD0x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x6y123abcEv");}
ccc::DD0x6y12 ::~DD0x6y12(){ note_dtor("_ZN3ccc8DD0x6y12E", this);} // tgen
ccc::DD0x6y12 ::DD0x6y12(){ note_ctor("_ZN3ccc8DD0x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y12E, buf);
    ::ccc::DD0x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y12E);
    dp->::ccc::DD0x6y12::~DD0x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y12E(Test__ZN3ccc8DD0x6y12E, "_ZN3ccc8DD0x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y12C1Ev();
extern void _ZN3ccc8DD0x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y12E[] = {
  NSPAIR(_ZN3ccc8DD0x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y12E[];
extern void _ZN3ccc8DD0x6y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x6y123abcEv,_ZTv0_n12_N3ccc8DD0x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x6y123abcEv,_ZThn4_N3ccc8DD0x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x6y123abcEv,_ZTv0_n12_N3ccc8DD0x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y12E[] = {
  {&(_ZTVN3ccc8DD0x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y12E[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x6y123abcEv,_ZTv0_n12_N3ccc8DD0x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x6y123abcEv,_ZThn4_N3ccc8DD0x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x6y12E = {  "_ZN3ccc8DD0x6y12E", // class name
  bases__ZN3ccc8DD0x6y12E, 2,
  &(vtc__ZN3ccc8DD0x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y12E),3, //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  CC0x6y13  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC0x6y133efgEv
  ~CC0x6y13(); // tgen
  CC0x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x6y133efgEv");}
ccc::CC0x6y13 ::~CC0x6y13(){ note_dtor("_ZN3ccc8CC0x6y13E", this);} // tgen
ccc::CC0x6y13 ::CC0x6y13(){ note_ctor("_ZN3ccc8CC0x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y13E, buf);
    ::ccc::CC0x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y13E);
    dp->::ccc::CC0x6y13::~CC0x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y13E(Test__ZN3ccc8CC0x6y13E, "_ZN3ccc8CC0x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y13C1Ev();
extern void _ZN3ccc8CC0x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y13E[] = {
  NSPAIR(_ZN3ccc8CC0x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC0x6y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x6y133efgEv,_ZTv0_n16_N3ccc8CC0x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y133efgEv,_ZThn4_N3ccc8CC0x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x6y133efgEv,_ZTv0_n16_N3ccc8CC0x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y13E[] = {
  {&(_ZTVN3ccc8CC0x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y13E[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x6y133efgEv,_ZTv0_n16_N3ccc8CC0x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y133efgEv,_ZThn4_N3ccc8CC0x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x6y13E = {  "_ZN3ccc8CC0x6y13E", // class name
  bases__ZN3ccc8CC0x6y13E, 2,
  &(vtc__ZN3ccc8CC0x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y13E),2, //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  DD0x6y13  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD0x6y133efgEv
  ~DD0x6y13(); // tgen
  DD0x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x6y133efgEv");}
ccc::DD0x6y13 ::~DD0x6y13(){ note_dtor("_ZN3ccc8DD0x6y13E", this);} // tgen
ccc::DD0x6y13 ::DD0x6y13(){ note_ctor("_ZN3ccc8DD0x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y13E, buf);
    ::ccc::DD0x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y13E);
    dp->::ccc::DD0x6y13::~DD0x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y13E(Test__ZN3ccc8DD0x6y13E, "_ZN3ccc8DD0x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y13C1Ev();
extern void _ZN3ccc8DD0x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y13E[] = {
  NSPAIR(_ZN3ccc8DD0x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x6y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x6y133efgEv,_ZTv0_n16_N3ccc8DD0x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x6y133efgEv,_ZThn4_N3ccc8DD0x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x6y133efgEv,_ZTv0_n16_N3ccc8DD0x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y13E[] = {
  {&(_ZTVN3ccc8DD0x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y13E[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x6y133efgEv,_ZTv0_n16_N3ccc8DD0x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x6y133efgEv,_ZThn4_N3ccc8DD0x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x6y13E = {  "_ZN3ccc8DD0x6y13E", // class name
  bases__ZN3ccc8DD0x6y13E, 2,
  &(vtc__ZN3ccc8DD0x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y13E),3, //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  CC0x6y14  : virtual ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y143pqrEv
  ~CC0x6y14(); // tgen
  CC0x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y143pqrEv");}
ccc::CC0x6y14 ::~CC0x6y14(){ note_dtor("_ZN3ccc8CC0x6y14E", this);} // tgen
ccc::CC0x6y14 ::CC0x6y14(){ note_ctor("_ZN3ccc8CC0x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y14E, buf);
    ::ccc::CC0x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y14E);
    dp->::ccc::CC0x6y14::~CC0x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y14E(Test__ZN3ccc8CC0x6y14E, "_ZN3ccc8CC0x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y14C1Ev();
extern void _ZN3ccc8CC0x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y14E[] = {
  NSPAIR(_ZN3ccc8CC0x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC0x6y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x6y143pqrEv,_ZTv0_n20_N3ccc8CC0x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y143pqrEv,_ZThn4_N3ccc8CC0x6y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x6y143pqrEv,_ZTv0_n20_N3ccc8CC0x6y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y14E[] = {
  {&(_ZTVN3ccc8CC0x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y14E[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x6y143pqrEv,_ZTv0_n20_N3ccc8CC0x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x6y143pqrEv,_ZThn4_N3ccc8CC0x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x6y14E = {  "_ZN3ccc8CC0x6y14E", // class name
  bases__ZN3ccc8CC0x6y14E, 2,
  &(vtc__ZN3ccc8CC0x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y14E),2, //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  DD0x6y14  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD0x6y143pqrEv
  ~DD0x6y14(); // tgen
  DD0x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x6y143pqrEv");}
ccc::DD0x6y14 ::~DD0x6y14(){ note_dtor("_ZN3ccc8DD0x6y14E", this);} // tgen
ccc::DD0x6y14 ::DD0x6y14(){ note_ctor("_ZN3ccc8DD0x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y14E, buf);
    ::ccc::DD0x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y14E);
    dp->::ccc::DD0x6y14::~DD0x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y14E(Test__ZN3ccc8DD0x6y14E, "_ZN3ccc8DD0x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y14C1Ev();
extern void _ZN3ccc8DD0x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y14E[] = {
  NSPAIR(_ZN3ccc8DD0x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y14E[] = {
  {&(_ZTVN3ccc8DD0x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y14E[];
Class_Descriptor cd__ZN3ccc8DD0x6y14E = {  "_ZN3ccc8DD0x6y14E", // class name
  bases__ZN3ccc8DD0x6y14E, 2,
  &(vtc__ZN3ccc8DD0x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y15  : virtual ::ccc::AA0 , ::ccc::BB6 {
  ~CC0x6y15(); // tgen
  CC0x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x6y15 ::~CC0x6y15(){ note_dtor("_ZN3ccc8CC0x6y15E", this);} // tgen
ccc::CC0x6y15 ::CC0x6y15(){ note_ctor("_ZN3ccc8CC0x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y15E, buf);
    ::ccc::CC0x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC0x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y15E);
    dp->::ccc::CC0x6y15::~CC0x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y15E(Test__ZN3ccc8CC0x6y15E, "_ZN3ccc8CC0x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y15C1Ev();
extern void _ZN3ccc8CC0x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y15E[] = {
  NSPAIR(_ZN3ccc8CC0x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x6y15E[] = {
  {&(_ZTVN3ccc8CC0x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x6y15E[];
Class_Descriptor cd__ZN3ccc8CC0x6y15E = {  "_ZN3ccc8CC0x6y15E", // class name
  bases__ZN3ccc8CC0x6y15E, 2,
  &(vtc__ZN3ccc8CC0x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x6y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x6y15  : virtual ::ccc::AA0 , virtual ::ccc::BB6 {
  ~DD0x6y15(); // tgen
  DD0x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x6y15 ::~DD0x6y15(){ note_dtor("_ZN3ccc8DD0x6y15E", this);} // tgen
ccc::DD0x6y15 ::DD0x6y15(){ note_ctor("_ZN3ccc8DD0x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x6y15E, buf);
    ::ccc::DD0x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x6y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD0x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x6y15E);
    dp->::ccc::DD0x6y15::~DD0x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x6y15E(Test__ZN3ccc8DD0x6y15E, "_ZN3ccc8DD0x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x6y15C1Ev();
extern void _ZN3ccc8DD0x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x6y15E[] = {
  NSPAIR(_ZN3ccc8DD0x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD0x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x6y15E[] = {
  {&(_ZTVN3ccc8DD0x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x6y15E[];
Class_Descriptor cd__ZN3ccc8DD0x6y15E = {  "_ZN3ccc8DD0x6y15E", // class name
  bases__ZN3ccc8DD0x6y15E, 2,
  &(vtc__ZN3ccc8DD0x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x6y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y0  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y03pqrEv
  ~CC0x7y0(); // tgen
  CC0x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y0E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y03abcEv");}
void  ccc::CC0x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y03efgEv");}
void  ccc::CC0x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y03pqrEv");}
ccc::CC0x7y0 ::~CC0x7y0(){ note_dtor("_ZN3ccc7CC0x7y0E", this);} // tgen
ccc::CC0x7y0 ::CC0x7y0(){ note_ctor("_ZN3ccc7CC0x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y0E, buf);
    ::ccc::CC0x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y0E);
    dp->::ccc::CC0x7y0::~CC0x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y0E(Test__ZN3ccc7CC0x7y0E, "_ZN3ccc7CC0x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y0C1Ev();
extern void _ZN3ccc7CC0x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y0E[] = {
  NSPAIR(_ZN3ccc7CC0x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y0E[];
extern void _ZN3ccc7CC0x7y03abcEv();
extern void _ZN3ccc7CC0x7y03pqrEv();
extern void _ZN3ccc7CC0x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y03abcEv,_ZTv0_n12_N3ccc7CC0x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y03abcEv,_ZThn4_N3ccc7CC0x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y03efgEv,_ZTv0_n16_N3ccc7CC0x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y03efgEv,_ZThn4_N3ccc7CC0x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y03pqrEv,_ZTv0_n20_N3ccc7CC0x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y03pqrEv,_ZThn4_N3ccc7CC0x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y03abcEv,_ZTv0_n12_N3ccc7CC0x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y03efgEv,_ZTv0_n16_N3ccc7CC0x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y03pqrEv,_ZTv0_n20_N3ccc7CC0x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y0E[] = {
  {&(_ZTVN3ccc7CC0x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y0E[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y03pqrEv,_ZTv0_n20_N3ccc7CC0x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y03pqrEv,_ZThn4_N3ccc7CC0x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y03efgEv,_ZTv0_n16_N3ccc7CC0x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y03efgEv,_ZThn4_N3ccc7CC0x7y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y03abcEv,_ZTv0_n12_N3ccc7CC0x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y03abcEv,_ZThn4_N3ccc7CC0x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y0E = {  "_ZN3ccc7CC0x7y0E", // class name
  bases__ZN3ccc7CC0x7y0E, 2,
  &(vtc__ZN3ccc7CC0x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y0E),2, //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  DD0x7y0  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD0x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y03pqrEv
  ~DD0x7y0(); // tgen
  DD0x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y03abcEv");}
void  ccc::DD0x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y03efgEv");}
void  ccc::DD0x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y03pqrEv");}
ccc::DD0x7y0 ::~DD0x7y0(){ note_dtor("_ZN3ccc7DD0x7y0E", this);} // tgen
ccc::DD0x7y0 ::DD0x7y0(){ note_ctor("_ZN3ccc7DD0x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y0E, buf);
    ::ccc::DD0x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y0E);
    dp->::ccc::DD0x7y0::~DD0x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y0E(Test__ZN3ccc7DD0x7y0E, "_ZN3ccc7DD0x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y0C1Ev();
extern void _ZN3ccc7DD0x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y0E[] = {
  NSPAIR(_ZN3ccc7DD0x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y0E[];
extern void _ZN3ccc7DD0x7y03abcEv();
extern void _ZN3ccc7DD0x7y03efgEv();
extern void _ZN3ccc7DD0x7y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y03abcEv,_ZTv0_n12_N3ccc7DD0x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y03abcEv,_ZThn4_N3ccc7DD0x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y03pqrEv,_ZTv0_n16_N3ccc7DD0x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y03pqrEv,_ZThn4_N3ccc7DD0x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y03abcEv,_ZTv0_n12_N3ccc7DD0x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y03pqrEv,_ZTv0_n16_N3ccc7DD0x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y0E[] = {
  {&(_ZTVN3ccc7DD0x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y0E[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y03pqrEv,_ZTv0_n16_N3ccc7DD0x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y03pqrEv,_ZThn4_N3ccc7DD0x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y03abcEv,_ZTv0_n12_N3ccc7DD0x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y03abcEv,_ZThn4_N3ccc7DD0x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y0E = {  "_ZN3ccc7DD0x7y0E", // class name
  bases__ZN3ccc7DD0x7y0E, 2,
  &(vtc__ZN3ccc7DD0x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y0E),3, //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  CC0x7y1  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x7y13efgEv
  ~CC0x7y1(); // tgen
  CC0x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y1E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y13abcEv");}
void  ccc::CC0x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y13pqrEv");}
void  ccc::CC0x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y13efgEv");}
ccc::CC0x7y1 ::~CC0x7y1(){ note_dtor("_ZN3ccc7CC0x7y1E", this);} // tgen
ccc::CC0x7y1 ::CC0x7y1(){ note_ctor("_ZN3ccc7CC0x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y1E, buf);
    ::ccc::CC0x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y1E);
    dp->::ccc::CC0x7y1::~CC0x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y1E(Test__ZN3ccc7CC0x7y1E, "_ZN3ccc7CC0x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y1C1Ev();
extern void _ZN3ccc7CC0x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y1E[] = {
  NSPAIR(_ZN3ccc7CC0x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y1E[];
extern void _ZN3ccc7CC0x7y13abcEv();
extern void _ZN3ccc7CC0x7y13pqrEv();
extern void _ZN3ccc7CC0x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y13abcEv,_ZTv0_n12_N3ccc7CC0x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y13abcEv,_ZThn4_N3ccc7CC0x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y13efgEv,_ZTv0_n16_N3ccc7CC0x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y13efgEv,_ZThn4_N3ccc7CC0x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y13pqrEv,_ZTv0_n20_N3ccc7CC0x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y13pqrEv,_ZThn4_N3ccc7CC0x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y13abcEv,_ZTv0_n12_N3ccc7CC0x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y13efgEv,_ZTv0_n16_N3ccc7CC0x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y13pqrEv,_ZTv0_n20_N3ccc7CC0x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y1E[] = {
  {&(_ZTVN3ccc7CC0x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y1E[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y13pqrEv,_ZTv0_n20_N3ccc7CC0x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y13pqrEv,_ZThn4_N3ccc7CC0x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y13efgEv,_ZTv0_n16_N3ccc7CC0x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y13efgEv,_ZThn4_N3ccc7CC0x7y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y13abcEv,_ZTv0_n12_N3ccc7CC0x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y13abcEv,_ZThn4_N3ccc7CC0x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y1E = {  "_ZN3ccc7CC0x7y1E", // class name
  bases__ZN3ccc7CC0x7y1E, 2,
  &(vtc__ZN3ccc7CC0x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y1E),2, //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  DD0x7y1  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD0x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x7y13efgEv
  ~DD0x7y1(); // tgen
  DD0x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y13abcEv");}
void  ccc::DD0x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y13pqrEv");}
void  ccc::DD0x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y13efgEv");}
ccc::DD0x7y1 ::~DD0x7y1(){ note_dtor("_ZN3ccc7DD0x7y1E", this);} // tgen
ccc::DD0x7y1 ::DD0x7y1(){ note_ctor("_ZN3ccc7DD0x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y1E, buf);
    ::ccc::DD0x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y1E);
    dp->::ccc::DD0x7y1::~DD0x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y1E(Test__ZN3ccc7DD0x7y1E, "_ZN3ccc7DD0x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y1C1Ev();
extern void _ZN3ccc7DD0x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y1E[] = {
  NSPAIR(_ZN3ccc7DD0x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y1E[];
extern void _ZN3ccc7DD0x7y13abcEv();
extern void _ZN3ccc7DD0x7y13efgEv();
extern void _ZN3ccc7DD0x7y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y13abcEv,_ZTv0_n12_N3ccc7DD0x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y13abcEv,_ZThn4_N3ccc7DD0x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y13pqrEv,_ZTv0_n16_N3ccc7DD0x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y13pqrEv,_ZThn4_N3ccc7DD0x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y13abcEv,_ZTv0_n12_N3ccc7DD0x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y13pqrEv,_ZTv0_n16_N3ccc7DD0x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y1E[] = {
  {&(_ZTVN3ccc7DD0x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y1E[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y13pqrEv,_ZTv0_n16_N3ccc7DD0x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y13pqrEv,_ZThn4_N3ccc7DD0x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y13abcEv,_ZTv0_n12_N3ccc7DD0x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y13abcEv,_ZThn4_N3ccc7DD0x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y1E = {  "_ZN3ccc7DD0x7y1E", // class name
  bases__ZN3ccc7DD0x7y1E, 2,
  &(vtc__ZN3ccc7DD0x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y1E),3, //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  CC0x7y2  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y23pqrEv
  ~CC0x7y2(); // tgen
  CC0x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y2E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y23efgEv");}
void  ccc::CC0x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y23abcEv");}
void  ccc::CC0x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y23pqrEv");}
ccc::CC0x7y2 ::~CC0x7y2(){ note_dtor("_ZN3ccc7CC0x7y2E", this);} // tgen
ccc::CC0x7y2 ::CC0x7y2(){ note_ctor("_ZN3ccc7CC0x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y2E, buf);
    ::ccc::CC0x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y2E);
    dp->::ccc::CC0x7y2::~CC0x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y2E(Test__ZN3ccc7CC0x7y2E, "_ZN3ccc7CC0x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y2C1Ev();
extern void _ZN3ccc7CC0x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y2E[] = {
  NSPAIR(_ZN3ccc7CC0x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y2E[];
extern void _ZN3ccc7CC0x7y23abcEv();
extern void _ZN3ccc7CC0x7y23pqrEv();
extern void _ZN3ccc7CC0x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y23abcEv,_ZTv0_n12_N3ccc7CC0x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y23abcEv,_ZThn4_N3ccc7CC0x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y23efgEv,_ZTv0_n16_N3ccc7CC0x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y23efgEv,_ZThn4_N3ccc7CC0x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y23pqrEv,_ZTv0_n20_N3ccc7CC0x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y23pqrEv,_ZThn4_N3ccc7CC0x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y23abcEv,_ZTv0_n12_N3ccc7CC0x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y23efgEv,_ZTv0_n16_N3ccc7CC0x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y23pqrEv,_ZTv0_n20_N3ccc7CC0x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y2E[] = {
  {&(_ZTVN3ccc7CC0x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y2E[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y23pqrEv,_ZTv0_n20_N3ccc7CC0x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y23pqrEv,_ZThn4_N3ccc7CC0x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y23efgEv,_ZTv0_n16_N3ccc7CC0x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y23efgEv,_ZThn4_N3ccc7CC0x7y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y23abcEv,_ZTv0_n12_N3ccc7CC0x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y23abcEv,_ZThn4_N3ccc7CC0x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y2E = {  "_ZN3ccc7CC0x7y2E", // class name
  bases__ZN3ccc7CC0x7y2E, 2,
  &(vtc__ZN3ccc7CC0x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y2E),2, //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  DD0x7y2  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD0x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y23pqrEv
  ~DD0x7y2(); // tgen
  DD0x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y23efgEv");}
void  ccc::DD0x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y23abcEv");}
void  ccc::DD0x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y23pqrEv");}
ccc::DD0x7y2 ::~DD0x7y2(){ note_dtor("_ZN3ccc7DD0x7y2E", this);} // tgen
ccc::DD0x7y2 ::DD0x7y2(){ note_ctor("_ZN3ccc7DD0x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y2E, buf);
    ::ccc::DD0x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y2E);
    dp->::ccc::DD0x7y2::~DD0x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y2E(Test__ZN3ccc7DD0x7y2E, "_ZN3ccc7DD0x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y2C1Ev();
extern void _ZN3ccc7DD0x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y2E[] = {
  NSPAIR(_ZN3ccc7DD0x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y2E[];
extern void _ZN3ccc7DD0x7y23abcEv();
extern void _ZN3ccc7DD0x7y23efgEv();
extern void _ZN3ccc7DD0x7y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y23abcEv,_ZTv0_n12_N3ccc7DD0x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y23abcEv,_ZThn4_N3ccc7DD0x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y23pqrEv,_ZTv0_n16_N3ccc7DD0x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y23pqrEv,_ZThn4_N3ccc7DD0x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y23abcEv,_ZTv0_n12_N3ccc7DD0x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y23pqrEv,_ZTv0_n16_N3ccc7DD0x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y2E[] = {
  {&(_ZTVN3ccc7DD0x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y2E[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y23pqrEv,_ZTv0_n16_N3ccc7DD0x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y23pqrEv,_ZThn4_N3ccc7DD0x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y23abcEv,_ZTv0_n12_N3ccc7DD0x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y23abcEv,_ZThn4_N3ccc7DD0x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y2E = {  "_ZN3ccc7DD0x7y2E", // class name
  bases__ZN3ccc7DD0x7y2E, 2,
  &(vtc__ZN3ccc7DD0x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y2E),3, //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  CC0x7y3  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x7y33abcEv
  ~CC0x7y3(); // tgen
  CC0x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y3E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y33efgEv");}
void  ccc::CC0x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y33pqrEv");}
void  ccc::CC0x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y33abcEv");}
ccc::CC0x7y3 ::~CC0x7y3(){ note_dtor("_ZN3ccc7CC0x7y3E", this);} // tgen
ccc::CC0x7y3 ::CC0x7y3(){ note_ctor("_ZN3ccc7CC0x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y3E, buf);
    ::ccc::CC0x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y3E);
    dp->::ccc::CC0x7y3::~CC0x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y3E(Test__ZN3ccc7CC0x7y3E, "_ZN3ccc7CC0x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y3C1Ev();
extern void _ZN3ccc7CC0x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y3E[] = {
  NSPAIR(_ZN3ccc7CC0x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y3E[];
extern void _ZN3ccc7CC0x7y33abcEv();
extern void _ZN3ccc7CC0x7y33pqrEv();
extern void _ZN3ccc7CC0x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y33abcEv,_ZTv0_n12_N3ccc7CC0x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y33abcEv,_ZThn4_N3ccc7CC0x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y33efgEv,_ZTv0_n16_N3ccc7CC0x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y33efgEv,_ZThn4_N3ccc7CC0x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y33pqrEv,_ZTv0_n20_N3ccc7CC0x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y33pqrEv,_ZThn4_N3ccc7CC0x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y33abcEv,_ZTv0_n12_N3ccc7CC0x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y33efgEv,_ZTv0_n16_N3ccc7CC0x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y33pqrEv,_ZTv0_n20_N3ccc7CC0x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y3E[] = {
  {&(_ZTVN3ccc7CC0x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y3E[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y33pqrEv,_ZTv0_n20_N3ccc7CC0x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y33pqrEv,_ZThn4_N3ccc7CC0x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y33efgEv,_ZTv0_n16_N3ccc7CC0x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y33efgEv,_ZThn4_N3ccc7CC0x7y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y33abcEv,_ZTv0_n12_N3ccc7CC0x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y33abcEv,_ZThn4_N3ccc7CC0x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y3E = {  "_ZN3ccc7CC0x7y3E", // class name
  bases__ZN3ccc7CC0x7y3E, 2,
  &(vtc__ZN3ccc7CC0x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y3E),2, //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  DD0x7y3  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD0x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x7y33abcEv
  ~DD0x7y3(); // tgen
  DD0x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y33efgEv");}
void  ccc::DD0x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y33pqrEv");}
void  ccc::DD0x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y33abcEv");}
ccc::DD0x7y3 ::~DD0x7y3(){ note_dtor("_ZN3ccc7DD0x7y3E", this);} // tgen
ccc::DD0x7y3 ::DD0x7y3(){ note_ctor("_ZN3ccc7DD0x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y3E, buf);
    ::ccc::DD0x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y3E);
    dp->::ccc::DD0x7y3::~DD0x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y3E(Test__ZN3ccc7DD0x7y3E, "_ZN3ccc7DD0x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y3C1Ev();
extern void _ZN3ccc7DD0x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y3E[] = {
  NSPAIR(_ZN3ccc7DD0x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y3E[];
extern void _ZN3ccc7DD0x7y33abcEv();
extern void _ZN3ccc7DD0x7y33efgEv();
extern void _ZN3ccc7DD0x7y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y33abcEv,_ZTv0_n12_N3ccc7DD0x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y33abcEv,_ZThn4_N3ccc7DD0x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y33pqrEv,_ZTv0_n16_N3ccc7DD0x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y33pqrEv,_ZThn4_N3ccc7DD0x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y33abcEv,_ZTv0_n12_N3ccc7DD0x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y33pqrEv,_ZTv0_n16_N3ccc7DD0x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y3E[] = {
  {&(_ZTVN3ccc7DD0x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y3E[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y33pqrEv,_ZTv0_n16_N3ccc7DD0x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y33pqrEv,_ZThn4_N3ccc7DD0x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y33abcEv,_ZTv0_n12_N3ccc7DD0x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y33abcEv,_ZThn4_N3ccc7DD0x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y3E = {  "_ZN3ccc7DD0x7y3E", // class name
  bases__ZN3ccc7DD0x7y3E, 2,
  &(vtc__ZN3ccc7DD0x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y3E),3, //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  CC0x7y4  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC0x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y43efgEv
  ~CC0x7y4(); // tgen
  CC0x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y4E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y43pqrEv");}
void  ccc::CC0x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y43abcEv");}
void  ccc::CC0x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y43efgEv");}
ccc::CC0x7y4 ::~CC0x7y4(){ note_dtor("_ZN3ccc7CC0x7y4E", this);} // tgen
ccc::CC0x7y4 ::CC0x7y4(){ note_ctor("_ZN3ccc7CC0x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y4E, buf);
    ::ccc::CC0x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y4E);
    dp->::ccc::CC0x7y4::~CC0x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y4E(Test__ZN3ccc7CC0x7y4E, "_ZN3ccc7CC0x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y4C1Ev();
extern void _ZN3ccc7CC0x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y4E[] = {
  NSPAIR(_ZN3ccc7CC0x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y4E[];
extern void _ZN3ccc7CC0x7y43abcEv();
extern void _ZN3ccc7CC0x7y43pqrEv();
extern void _ZN3ccc7CC0x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y43abcEv,_ZTv0_n12_N3ccc7CC0x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y43abcEv,_ZThn4_N3ccc7CC0x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y43efgEv,_ZTv0_n16_N3ccc7CC0x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y43efgEv,_ZThn4_N3ccc7CC0x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y43pqrEv,_ZTv0_n20_N3ccc7CC0x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y43pqrEv,_ZThn4_N3ccc7CC0x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y43abcEv,_ZTv0_n12_N3ccc7CC0x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y43efgEv,_ZTv0_n16_N3ccc7CC0x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y43pqrEv,_ZTv0_n20_N3ccc7CC0x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y4E[] = {
  {&(_ZTVN3ccc7CC0x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y4E[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y43pqrEv,_ZTv0_n20_N3ccc7CC0x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y43pqrEv,_ZThn4_N3ccc7CC0x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y43efgEv,_ZTv0_n16_N3ccc7CC0x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y43efgEv,_ZThn4_N3ccc7CC0x7y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y43abcEv,_ZTv0_n12_N3ccc7CC0x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y43abcEv,_ZThn4_N3ccc7CC0x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y4E = {  "_ZN3ccc7CC0x7y4E", // class name
  bases__ZN3ccc7CC0x7y4E, 2,
  &(vtc__ZN3ccc7CC0x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y4E),2, //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  DD0x7y4  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD0x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x7y43efgEv
  ~DD0x7y4(); // tgen
  DD0x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y43pqrEv");}
void  ccc::DD0x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y43abcEv");}
void  ccc::DD0x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y43efgEv");}
ccc::DD0x7y4 ::~DD0x7y4(){ note_dtor("_ZN3ccc7DD0x7y4E", this);} // tgen
ccc::DD0x7y4 ::DD0x7y4(){ note_ctor("_ZN3ccc7DD0x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y4E, buf);
    ::ccc::DD0x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y4E);
    dp->::ccc::DD0x7y4::~DD0x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y4E(Test__ZN3ccc7DD0x7y4E, "_ZN3ccc7DD0x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y4C1Ev();
extern void _ZN3ccc7DD0x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y4E[] = {
  NSPAIR(_ZN3ccc7DD0x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y4E[];
extern void _ZN3ccc7DD0x7y43abcEv();
extern void _ZN3ccc7DD0x7y43efgEv();
extern void _ZN3ccc7DD0x7y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y43abcEv,_ZTv0_n12_N3ccc7DD0x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y43abcEv,_ZThn4_N3ccc7DD0x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y43pqrEv,_ZTv0_n16_N3ccc7DD0x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y43pqrEv,_ZThn4_N3ccc7DD0x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y43abcEv,_ZTv0_n12_N3ccc7DD0x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y43pqrEv,_ZTv0_n16_N3ccc7DD0x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y4E[] = {
  {&(_ZTVN3ccc7DD0x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y4E[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y43pqrEv,_ZTv0_n16_N3ccc7DD0x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y43pqrEv,_ZThn4_N3ccc7DD0x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y43abcEv,_ZTv0_n12_N3ccc7DD0x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y43abcEv,_ZThn4_N3ccc7DD0x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y4E = {  "_ZN3ccc7DD0x7y4E", // class name
  bases__ZN3ccc7DD0x7y4E, 2,
  &(vtc__ZN3ccc7DD0x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y4E),3, //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  CC0x7y5  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC0x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y53abcEv
  ~CC0x7y5(); // tgen
  CC0x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y5E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y53pqrEv");}
void  ccc::CC0x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y53efgEv");}
void  ccc::CC0x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y53abcEv");}
ccc::CC0x7y5 ::~CC0x7y5(){ note_dtor("_ZN3ccc7CC0x7y5E", this);} // tgen
ccc::CC0x7y5 ::CC0x7y5(){ note_ctor("_ZN3ccc7CC0x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y5E, buf);
    ::ccc::CC0x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y5E);
    dp->::ccc::CC0x7y5::~CC0x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y5E(Test__ZN3ccc7CC0x7y5E, "_ZN3ccc7CC0x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y5C1Ev();
extern void _ZN3ccc7CC0x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y5E[] = {
  NSPAIR(_ZN3ccc7CC0x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y5E[];
extern void _ZN3ccc7CC0x7y53abcEv();
extern void _ZN3ccc7CC0x7y53pqrEv();
extern void _ZN3ccc7CC0x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y53abcEv,_ZTv0_n12_N3ccc7CC0x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y53abcEv,_ZThn4_N3ccc7CC0x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y53efgEv,_ZTv0_n16_N3ccc7CC0x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y53efgEv,_ZThn4_N3ccc7CC0x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y53pqrEv,_ZTv0_n20_N3ccc7CC0x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y53pqrEv,_ZThn4_N3ccc7CC0x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y53abcEv,_ZTv0_n12_N3ccc7CC0x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y53efgEv,_ZTv0_n16_N3ccc7CC0x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y53pqrEv,_ZTv0_n20_N3ccc7CC0x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y5E[] = {
  {&(_ZTVN3ccc7CC0x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y5E[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y53pqrEv,_ZTv0_n20_N3ccc7CC0x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y53pqrEv,_ZThn4_N3ccc7CC0x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y53efgEv,_ZTv0_n16_N3ccc7CC0x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y53efgEv,_ZThn4_N3ccc7CC0x7y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y53abcEv,_ZTv0_n12_N3ccc7CC0x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y53abcEv,_ZThn4_N3ccc7CC0x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y5E = {  "_ZN3ccc7CC0x7y5E", // class name
  bases__ZN3ccc7CC0x7y5E, 2,
  &(vtc__ZN3ccc7CC0x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y5E),2, //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  DD0x7y5  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD0x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x7y53abcEv
  ~DD0x7y5(); // tgen
  DD0x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y53pqrEv");}
void  ccc::DD0x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y53efgEv");}
void  ccc::DD0x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y53abcEv");}
ccc::DD0x7y5 ::~DD0x7y5(){ note_dtor("_ZN3ccc7DD0x7y5E", this);} // tgen
ccc::DD0x7y5 ::DD0x7y5(){ note_ctor("_ZN3ccc7DD0x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y5E, buf);
    ::ccc::DD0x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y5E);
    dp->::ccc::DD0x7y5::~DD0x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y5E(Test__ZN3ccc7DD0x7y5E, "_ZN3ccc7DD0x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y5C1Ev();
extern void _ZN3ccc7DD0x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y5E[] = {
  NSPAIR(_ZN3ccc7DD0x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y5E[];
extern void _ZN3ccc7DD0x7y53abcEv();
extern void _ZN3ccc7DD0x7y53efgEv();
extern void _ZN3ccc7DD0x7y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y53abcEv,_ZTv0_n12_N3ccc7DD0x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y53abcEv,_ZThn4_N3ccc7DD0x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y53pqrEv,_ZTv0_n16_N3ccc7DD0x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y53pqrEv,_ZThn4_N3ccc7DD0x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y53abcEv,_ZTv0_n12_N3ccc7DD0x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y53pqrEv,_ZTv0_n16_N3ccc7DD0x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y5E[] = {
  {&(_ZTVN3ccc7DD0x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y5E[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y53pqrEv,_ZTv0_n16_N3ccc7DD0x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y53pqrEv,_ZThn4_N3ccc7DD0x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y53abcEv,_ZTv0_n12_N3ccc7DD0x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y53abcEv,_ZThn4_N3ccc7DD0x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y5E = {  "_ZN3ccc7DD0x7y5E", // class name
  bases__ZN3ccc7DD0x7y5E, 2,
  &(vtc__ZN3ccc7DD0x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y5E),3, //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  CC0x7y6  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y63efgEv
  ~CC0x7y6(); // tgen
  CC0x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y6E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y63abcEv");}
void  ccc::CC0x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y63efgEv");}
ccc::CC0x7y6 ::~CC0x7y6(){ note_dtor("_ZN3ccc7CC0x7y6E", this);} // tgen
ccc::CC0x7y6 ::CC0x7y6(){ note_ctor("_ZN3ccc7CC0x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y6E, buf);
    ::ccc::CC0x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y6E);
    dp->::ccc::CC0x7y6::~CC0x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y6E(Test__ZN3ccc7CC0x7y6E, "_ZN3ccc7CC0x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y6C1Ev();
extern void _ZN3ccc7CC0x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y6E[] = {
  NSPAIR(_ZN3ccc7CC0x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y6E[];
extern void _ZN3ccc7CC0x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC0x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y63abcEv,_ZTv0_n12_N3ccc7CC0x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y63abcEv,_ZThn4_N3ccc7CC0x7y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y63efgEv,_ZTv0_n16_N3ccc7CC0x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y63efgEv,_ZThn4_N3ccc7CC0x7y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y63abcEv,_ZTv0_n12_N3ccc7CC0x7y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y63efgEv,_ZTv0_n16_N3ccc7CC0x7y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y6E[] = {
  {&(_ZTVN3ccc7CC0x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y6E[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y63efgEv,_ZTv0_n16_N3ccc7CC0x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y63efgEv,_ZThn4_N3ccc7CC0x7y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y63abcEv,_ZTv0_n12_N3ccc7CC0x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y63abcEv,_ZThn4_N3ccc7CC0x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y6E = {  "_ZN3ccc7CC0x7y6E", // class name
  bases__ZN3ccc7CC0x7y6E, 2,
  &(vtc__ZN3ccc7CC0x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y6E),2, //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  DD0x7y6  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD0x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x7y63efgEv
  ~DD0x7y6(); // tgen
  DD0x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y63abcEv");}
void  ccc::DD0x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y63efgEv");}
ccc::DD0x7y6 ::~DD0x7y6(){ note_dtor("_ZN3ccc7DD0x7y6E", this);} // tgen
ccc::DD0x7y6 ::DD0x7y6(){ note_ctor("_ZN3ccc7DD0x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y6E, buf);
    ::ccc::DD0x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y6E);
    dp->::ccc::DD0x7y6::~DD0x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y6E(Test__ZN3ccc7DD0x7y6E, "_ZN3ccc7DD0x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y6C1Ev();
extern void _ZN3ccc7DD0x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y6E[] = {
  NSPAIR(_ZN3ccc7DD0x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y6E[];
extern void _ZN3ccc7DD0x7y63abcEv();
extern void _ZN3ccc7DD0x7y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y63abcEv,_ZTv0_n12_N3ccc7DD0x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y63abcEv,_ZThn4_N3ccc7DD0x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y63abcEv,_ZTv0_n12_N3ccc7DD0x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y6E[] = {
  {&(_ZTVN3ccc7DD0x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y6E[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y63abcEv,_ZTv0_n12_N3ccc7DD0x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y63abcEv,_ZThn4_N3ccc7DD0x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y6E = {  "_ZN3ccc7DD0x7y6E", // class name
  bases__ZN3ccc7DD0x7y6E, 2,
  &(vtc__ZN3ccc7DD0x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y6E),3, //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  CC0x7y7  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y73pqrEv
  ~CC0x7y7(); // tgen
  CC0x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y7E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y73abcEv");}
void  ccc::CC0x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y73pqrEv");}
ccc::CC0x7y7 ::~CC0x7y7(){ note_dtor("_ZN3ccc7CC0x7y7E", this);} // tgen
ccc::CC0x7y7 ::CC0x7y7(){ note_ctor("_ZN3ccc7CC0x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y7E, buf);
    ::ccc::CC0x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y7E);
    dp->::ccc::CC0x7y7::~CC0x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y7E(Test__ZN3ccc7CC0x7y7E, "_ZN3ccc7CC0x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y7C1Ev();
extern void _ZN3ccc7CC0x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y7E[] = {
  NSPAIR(_ZN3ccc7CC0x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y7E[];
extern void _ZN3ccc7CC0x7y73abcEv();
extern void _ZN3ccc7CC0x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y73abcEv,_ZTv0_n12_N3ccc7CC0x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y73abcEv,_ZThn4_N3ccc7CC0x7y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y73pqrEv,_ZTv0_n20_N3ccc7CC0x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y73pqrEv,_ZThn4_N3ccc7CC0x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y73abcEv,_ZTv0_n12_N3ccc7CC0x7y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y73pqrEv,_ZTv0_n20_N3ccc7CC0x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y7E[] = {
  {&(_ZTVN3ccc7CC0x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y7E[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y73pqrEv,_ZTv0_n20_N3ccc7CC0x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y73pqrEv,_ZThn4_N3ccc7CC0x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y73abcEv,_ZTv0_n12_N3ccc7CC0x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y73abcEv,_ZThn4_N3ccc7CC0x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y7E = {  "_ZN3ccc7CC0x7y7E", // class name
  bases__ZN3ccc7CC0x7y7E, 2,
  &(vtc__ZN3ccc7CC0x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y7E),2, //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  DD0x7y7  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD0x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y73pqrEv
  ~DD0x7y7(); // tgen
  DD0x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y73abcEv");}
void  ccc::DD0x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y73pqrEv");}
ccc::DD0x7y7 ::~DD0x7y7(){ note_dtor("_ZN3ccc7DD0x7y7E", this);} // tgen
ccc::DD0x7y7 ::DD0x7y7(){ note_ctor("_ZN3ccc7DD0x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y7E, buf);
    ::ccc::DD0x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y7E);
    dp->::ccc::DD0x7y7::~DD0x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y7E(Test__ZN3ccc7DD0x7y7E, "_ZN3ccc7DD0x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y7C1Ev();
extern void _ZN3ccc7DD0x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y7E[] = {
  NSPAIR(_ZN3ccc7DD0x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y7E[];
extern void _ZN3ccc7DD0x7y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y73abcEv,_ZTv0_n12_N3ccc7DD0x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y73abcEv,_ZThn4_N3ccc7DD0x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y73pqrEv,_ZTv0_n16_N3ccc7DD0x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y73pqrEv,_ZThn4_N3ccc7DD0x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y73abcEv,_ZTv0_n12_N3ccc7DD0x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y73pqrEv,_ZTv0_n16_N3ccc7DD0x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y7E[] = {
  {&(_ZTVN3ccc7DD0x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y7E[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y73pqrEv,_ZTv0_n16_N3ccc7DD0x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y73pqrEv,_ZThn4_N3ccc7DD0x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y73abcEv,_ZTv0_n12_N3ccc7DD0x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y73abcEv,_ZThn4_N3ccc7DD0x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y7E = {  "_ZN3ccc7DD0x7y7E", // class name
  bases__ZN3ccc7DD0x7y7E, 2,
  &(vtc__ZN3ccc7DD0x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y7E),3, //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  CC0x7y8  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y83abcEv
  ~CC0x7y8(); // tgen
  CC0x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y8E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y83efgEv");}
void  ccc::CC0x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y83abcEv");}
ccc::CC0x7y8 ::~CC0x7y8(){ note_dtor("_ZN3ccc7CC0x7y8E", this);} // tgen
ccc::CC0x7y8 ::CC0x7y8(){ note_ctor("_ZN3ccc7CC0x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y8E, buf);
    ::ccc::CC0x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y8E);
    dp->::ccc::CC0x7y8::~CC0x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y8E(Test__ZN3ccc7CC0x7y8E, "_ZN3ccc7CC0x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y8C1Ev();
extern void _ZN3ccc7CC0x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y8E[] = {
  NSPAIR(_ZN3ccc7CC0x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y8E[];
extern void _ZN3ccc7CC0x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC0x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x7y83abcEv,_ZTv0_n12_N3ccc7CC0x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y83abcEv,_ZThn4_N3ccc7CC0x7y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y83efgEv,_ZTv0_n16_N3ccc7CC0x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y83efgEv,_ZThn4_N3ccc7CC0x7y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x7y83abcEv,_ZTv0_n12_N3ccc7CC0x7y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y83efgEv,_ZTv0_n16_N3ccc7CC0x7y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y8E[] = {
  {&(_ZTVN3ccc7CC0x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y8E[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y83efgEv,_ZTv0_n16_N3ccc7CC0x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y83efgEv,_ZThn4_N3ccc7CC0x7y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x7y83abcEv,_ZTv0_n12_N3ccc7CC0x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y83abcEv,_ZThn4_N3ccc7CC0x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y8E = {  "_ZN3ccc7CC0x7y8E", // class name
  bases__ZN3ccc7CC0x7y8E, 2,
  &(vtc__ZN3ccc7CC0x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y8E),2, //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  DD0x7y8  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD0x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x7y83abcEv
  ~DD0x7y8(); // tgen
  DD0x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y83efgEv");}
void  ccc::DD0x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x7y83abcEv");}
ccc::DD0x7y8 ::~DD0x7y8(){ note_dtor("_ZN3ccc7DD0x7y8E", this);} // tgen
ccc::DD0x7y8 ::DD0x7y8(){ note_ctor("_ZN3ccc7DD0x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y8E, buf);
    ::ccc::DD0x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y8E);
    dp->::ccc::DD0x7y8::~DD0x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y8E(Test__ZN3ccc7DD0x7y8E, "_ZN3ccc7DD0x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y8C1Ev();
extern void _ZN3ccc7DD0x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y8E[] = {
  NSPAIR(_ZN3ccc7DD0x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y8E[];
extern void _ZN3ccc7DD0x7y83abcEv();
extern void _ZN3ccc7DD0x7y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x7y83abcEv,_ZTv0_n12_N3ccc7DD0x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y83abcEv,_ZThn4_N3ccc7DD0x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x7y83abcEv,_ZTv0_n12_N3ccc7DD0x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y8E[] = {
  {&(_ZTVN3ccc7DD0x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y8E[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x7y83abcEv,_ZTv0_n12_N3ccc7DD0x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y83abcEv,_ZThn4_N3ccc7DD0x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y8E = {  "_ZN3ccc7DD0x7y8E", // class name
  bases__ZN3ccc7DD0x7y8E, 2,
  &(vtc__ZN3ccc7DD0x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y8E),3, //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  CC0x7y9  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y93pqrEv
  ~CC0x7y9(); // tgen
  CC0x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y9E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y93efgEv");}
void  ccc::CC0x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y93pqrEv");}
ccc::CC0x7y9 ::~CC0x7y9(){ note_dtor("_ZN3ccc7CC0x7y9E", this);} // tgen
ccc::CC0x7y9 ::CC0x7y9(){ note_ctor("_ZN3ccc7CC0x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y9E, buf);
    ::ccc::CC0x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC0x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y9E);
    dp->::ccc::CC0x7y9::~CC0x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y9E(Test__ZN3ccc7CC0x7y9E, "_ZN3ccc7CC0x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y9C1Ev();
extern void _ZN3ccc7CC0x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y9E[] = {
  NSPAIR(_ZN3ccc7CC0x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC0x7y93pqrEv();
extern void _ZN3ccc7CC0x7y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x7y93efgEv,_ZTv0_n16_N3ccc7CC0x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y93efgEv,_ZThn4_N3ccc7CC0x7y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x7y93pqrEv,_ZTv0_n20_N3ccc7CC0x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y93pqrEv,_ZThn4_N3ccc7CC0x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x7y93efgEv,_ZTv0_n16_N3ccc7CC0x7y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x7y93pqrEv,_ZTv0_n20_N3ccc7CC0x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x7y9E[] = {
  {&(_ZTVN3ccc7CC0x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x7y9E[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x7y93pqrEv,_ZTv0_n20_N3ccc7CC0x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y93pqrEv,_ZThn4_N3ccc7CC0x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x7y93efgEv,_ZTv0_n16_N3ccc7CC0x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x7y93efgEv,_ZThn4_N3ccc7CC0x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x7y9E = {  "_ZN3ccc7CC0x7y9E", // class name
  bases__ZN3ccc7CC0x7y9E, 2,
  &(vtc__ZN3ccc7CC0x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x7y9E),2, //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  DD0x7y9  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD0x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x7y93pqrEv
  ~DD0x7y9(); // tgen
  DD0x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x7y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x7y93efgEv");}
void  ccc::DD0x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x7y93pqrEv");}
ccc::DD0x7y9 ::~DD0x7y9(){ note_dtor("_ZN3ccc7DD0x7y9E", this);} // tgen
ccc::DD0x7y9 ::DD0x7y9(){ note_ctor("_ZN3ccc7DD0x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x7y9E, buf);
    ::ccc::DD0x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x7y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD0x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x7y9E);
    dp->::ccc::DD0x7y9::~DD0x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x7y9E(Test__ZN3ccc7DD0x7y9E, "_ZN3ccc7DD0x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x7y9C1Ev();
extern void _ZN3ccc7DD0x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x7y9E[] = {
  NSPAIR(_ZN3ccc7DD0x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD0x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x7y93efgEv();
extern void _ZN3ccc7DD0x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x7y93pqrEv,_ZTv0_n16_N3ccc7DD0x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x7y93pqrEv,_ZThn4_N3ccc7DD0x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x7y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x7y93pqrEv,_ZTv0_n16_N3ccc7DD0x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x7y9E[] = {
  {&(_ZTVN3ccc7DD0x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x7y9E[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x7y93pqrEv,_ZTv0_n16_N3ccc7DD0x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x7y93pqrEv,_ZThn4_N3ccc7DD0x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x7y9E = {  "_ZN3ccc7DD0x7y9E", // class name
  bases__ZN3ccc7DD0x7y9E, 2,
  &(vtc__ZN3ccc7DD0x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x7y9E),3, //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  CC0x7y10  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x7y103abcEv
  ~CC0x7y10(); // tgen
  CC0x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y10E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y103pqrEv");}
void  ccc::CC0x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x7y103abcEv");}
ccc::CC0x7y10 ::~CC0x7y10(){ note_dtor("_ZN3ccc8CC0x7y10E", this);} // tgen
ccc::CC0x7y10 ::CC0x7y10(){ note_ctor("_ZN3ccc8CC0x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y10E, buf);
    ::ccc::CC0x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y10E);
    dp->::ccc::CC0x7y10::~CC0x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y10E(Test__ZN3ccc8CC0x7y10E, "_ZN3ccc8CC0x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y10C1Ev();
extern void _ZN3ccc8CC0x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y10E[] = {
  NSPAIR(_ZN3ccc8CC0x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y10E[];
extern void _ZN3ccc8CC0x7y103abcEv();
extern void _ZN3ccc8CC0x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x7y103abcEv,_ZTv0_n12_N3ccc8CC0x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y103abcEv,_ZThn4_N3ccc8CC0x7y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x7y103pqrEv,_ZTv0_n20_N3ccc8CC0x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y103pqrEv,_ZThn4_N3ccc8CC0x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x7y103abcEv,_ZTv0_n12_N3ccc8CC0x7y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x7y103pqrEv,_ZTv0_n20_N3ccc8CC0x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y10E[] = {
  {&(_ZTVN3ccc8CC0x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y10E[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x7y103pqrEv,_ZTv0_n20_N3ccc8CC0x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y103pqrEv,_ZThn4_N3ccc8CC0x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x7y103abcEv,_ZTv0_n12_N3ccc8CC0x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y103abcEv,_ZThn4_N3ccc8CC0x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x7y10E = {  "_ZN3ccc8CC0x7y10E", // class name
  bases__ZN3ccc8CC0x7y10E, 2,
  &(vtc__ZN3ccc8CC0x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y10E),2, //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  DD0x7y10  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD0x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x7y103abcEv
  ~DD0x7y10(); // tgen
  DD0x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x7y103pqrEv");}
void  ccc::DD0x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x7y103abcEv");}
ccc::DD0x7y10 ::~DD0x7y10(){ note_dtor("_ZN3ccc8DD0x7y10E", this);} // tgen
ccc::DD0x7y10 ::DD0x7y10(){ note_ctor("_ZN3ccc8DD0x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y10E, buf);
    ::ccc::DD0x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y10E);
    dp->::ccc::DD0x7y10::~DD0x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y10E(Test__ZN3ccc8DD0x7y10E, "_ZN3ccc8DD0x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y10C1Ev();
extern void _ZN3ccc8DD0x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y10E[] = {
  NSPAIR(_ZN3ccc8DD0x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y10E[];
extern void _ZN3ccc8DD0x7y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x7y103abcEv,_ZTv0_n12_N3ccc8DD0x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x7y103abcEv,_ZThn4_N3ccc8DD0x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x7y103pqrEv,_ZTv0_n16_N3ccc8DD0x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x7y103pqrEv,_ZThn4_N3ccc8DD0x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x7y103abcEv,_ZTv0_n12_N3ccc8DD0x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x7y103pqrEv,_ZTv0_n16_N3ccc8DD0x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y10E[] = {
  {&(_ZTVN3ccc8DD0x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y10E[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x7y103pqrEv,_ZTv0_n16_N3ccc8DD0x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x7y103pqrEv,_ZThn4_N3ccc8DD0x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x7y103abcEv,_ZTv0_n12_N3ccc8DD0x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x7y103abcEv,_ZThn4_N3ccc8DD0x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x7y10E = {  "_ZN3ccc8DD0x7y10E", // class name
  bases__ZN3ccc8DD0x7y10E, 2,
  &(vtc__ZN3ccc8DD0x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y10E),3, //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  CC0x7y11  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x7y113efgEv
  ~CC0x7y11(); // tgen
  CC0x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y11E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y113pqrEv");}
void  ccc::CC0x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x7y113efgEv");}
ccc::CC0x7y11 ::~CC0x7y11(){ note_dtor("_ZN3ccc8CC0x7y11E", this);} // tgen
ccc::CC0x7y11 ::CC0x7y11(){ note_ctor("_ZN3ccc8CC0x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y11E, buf);
    ::ccc::CC0x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y11E);
    dp->::ccc::CC0x7y11::~CC0x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y11E(Test__ZN3ccc8CC0x7y11E, "_ZN3ccc8CC0x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y11C1Ev();
extern void _ZN3ccc8CC0x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y11E[] = {
  NSPAIR(_ZN3ccc8CC0x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC0x7y113pqrEv();
extern void _ZN3ccc8CC0x7y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x7y113efgEv,_ZTv0_n16_N3ccc8CC0x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y113efgEv,_ZThn4_N3ccc8CC0x7y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x7y113pqrEv,_ZTv0_n20_N3ccc8CC0x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y113pqrEv,_ZThn4_N3ccc8CC0x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x7y113efgEv,_ZTv0_n16_N3ccc8CC0x7y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x7y113pqrEv,_ZTv0_n20_N3ccc8CC0x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y11E[] = {
  {&(_ZTVN3ccc8CC0x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y11E[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x7y113pqrEv,_ZTv0_n20_N3ccc8CC0x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y113pqrEv,_ZThn4_N3ccc8CC0x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x7y113efgEv,_ZTv0_n16_N3ccc8CC0x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y113efgEv,_ZThn4_N3ccc8CC0x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x7y11E = {  "_ZN3ccc8CC0x7y11E", // class name
  bases__ZN3ccc8CC0x7y11E, 2,
  &(vtc__ZN3ccc8CC0x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y11E),2, //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  DD0x7y11  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD0x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x7y113efgEv
  ~DD0x7y11(); // tgen
  DD0x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x7y113pqrEv");}
void  ccc::DD0x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x7y113efgEv");}
ccc::DD0x7y11 ::~DD0x7y11(){ note_dtor("_ZN3ccc8DD0x7y11E", this);} // tgen
ccc::DD0x7y11 ::DD0x7y11(){ note_ctor("_ZN3ccc8DD0x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y11E, buf);
    ::ccc::DD0x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y11E);
    dp->::ccc::DD0x7y11::~DD0x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y11E(Test__ZN3ccc8DD0x7y11E, "_ZN3ccc8DD0x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y11C1Ev();
extern void _ZN3ccc8DD0x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y11E[] = {
  NSPAIR(_ZN3ccc8DD0x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x7y113efgEv();
extern void _ZN3ccc8DD0x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x7y113pqrEv,_ZTv0_n16_N3ccc8DD0x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x7y113pqrEv,_ZThn4_N3ccc8DD0x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x7y113pqrEv,_ZTv0_n16_N3ccc8DD0x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y11E[] = {
  {&(_ZTVN3ccc8DD0x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y11E[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x7y113pqrEv,_ZTv0_n16_N3ccc8DD0x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x7y113pqrEv,_ZThn4_N3ccc8DD0x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x7y11E = {  "_ZN3ccc8DD0x7y11E", // class name
  bases__ZN3ccc8DD0x7y11E, 2,
  &(vtc__ZN3ccc8DD0x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y11E),3, //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  CC0x7y12  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC0x7y123abcEv
  ~CC0x7y12(); // tgen
  CC0x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x7y123abcEv");}
ccc::CC0x7y12 ::~CC0x7y12(){ note_dtor("_ZN3ccc8CC0x7y12E", this);} // tgen
ccc::CC0x7y12 ::CC0x7y12(){ note_ctor("_ZN3ccc8CC0x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y12E, buf);
    ::ccc::CC0x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y12E);
    dp->::ccc::CC0x7y12::~CC0x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y12E(Test__ZN3ccc8CC0x7y12E, "_ZN3ccc8CC0x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y12C1Ev();
extern void _ZN3ccc8CC0x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y12E[] = {
  NSPAIR(_ZN3ccc8CC0x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y12E[];
extern void _ZN3ccc8CC0x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x7y123abcEv,_ZTv0_n12_N3ccc8CC0x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y123abcEv,_ZThn4_N3ccc8CC0x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x7y123abcEv,_ZTv0_n12_N3ccc8CC0x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y12E[] = {
  {&(_ZTVN3ccc8CC0x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y12E[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x7y123abcEv,_ZTv0_n12_N3ccc8CC0x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y123abcEv,_ZThn4_N3ccc8CC0x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x7y12E = {  "_ZN3ccc8CC0x7y12E", // class name
  bases__ZN3ccc8CC0x7y12E, 2,
  &(vtc__ZN3ccc8CC0x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y12E),2, //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  DD0x7y12  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD0x7y123abcEv
  ~DD0x7y12(); // tgen
  DD0x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x7y123abcEv");}
ccc::DD0x7y12 ::~DD0x7y12(){ note_dtor("_ZN3ccc8DD0x7y12E", this);} // tgen
ccc::DD0x7y12 ::DD0x7y12(){ note_ctor("_ZN3ccc8DD0x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y12E, buf);
    ::ccc::DD0x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y12E);
    dp->::ccc::DD0x7y12::~DD0x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y12E(Test__ZN3ccc8DD0x7y12E, "_ZN3ccc8DD0x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y12C1Ev();
extern void _ZN3ccc8DD0x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y12E[] = {
  NSPAIR(_ZN3ccc8DD0x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y12E[];
extern void _ZN3ccc8DD0x7y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x7y123abcEv,_ZTv0_n12_N3ccc8DD0x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x7y123abcEv,_ZThn4_N3ccc8DD0x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x7y123abcEv,_ZTv0_n12_N3ccc8DD0x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y12E[] = {
  {&(_ZTVN3ccc8DD0x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y12E[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x7y123abcEv,_ZTv0_n12_N3ccc8DD0x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x7y123abcEv,_ZThn4_N3ccc8DD0x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x7y12E = {  "_ZN3ccc8DD0x7y12E", // class name
  bases__ZN3ccc8DD0x7y12E, 2,
  &(vtc__ZN3ccc8DD0x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y12E),3, //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  CC0x7y13  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC0x7y133efgEv
  ~CC0x7y13(); // tgen
  CC0x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x7y133efgEv");}
ccc::CC0x7y13 ::~CC0x7y13(){ note_dtor("_ZN3ccc8CC0x7y13E", this);} // tgen
ccc::CC0x7y13 ::CC0x7y13(){ note_ctor("_ZN3ccc8CC0x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y13E, buf);
    ::ccc::CC0x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y13E);
    dp->::ccc::CC0x7y13::~CC0x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y13E(Test__ZN3ccc8CC0x7y13E, "_ZN3ccc8CC0x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y13C1Ev();
extern void _ZN3ccc8CC0x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y13E[] = {
  NSPAIR(_ZN3ccc8CC0x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC0x7y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x7y133efgEv,_ZTv0_n16_N3ccc8CC0x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y133efgEv,_ZThn4_N3ccc8CC0x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x7y133efgEv,_ZTv0_n16_N3ccc8CC0x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y13E[] = {
  {&(_ZTVN3ccc8CC0x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y13E[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x7y133efgEv,_ZTv0_n16_N3ccc8CC0x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y133efgEv,_ZThn4_N3ccc8CC0x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x7y13E = {  "_ZN3ccc8CC0x7y13E", // class name
  bases__ZN3ccc8CC0x7y13E, 2,
  &(vtc__ZN3ccc8CC0x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y13E),2, //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  DD0x7y13  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD0x7y133efgEv
  ~DD0x7y13(); // tgen
  DD0x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x7y133efgEv");}
ccc::DD0x7y13 ::~DD0x7y13(){ note_dtor("_ZN3ccc8DD0x7y13E", this);} // tgen
ccc::DD0x7y13 ::DD0x7y13(){ note_ctor("_ZN3ccc8DD0x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y13E, buf);
    ::ccc::DD0x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y13E);
    dp->::ccc::DD0x7y13::~DD0x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y13E(Test__ZN3ccc8DD0x7y13E, "_ZN3ccc8DD0x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y13C1Ev();
extern void _ZN3ccc8DD0x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y13E[] = {
  NSPAIR(_ZN3ccc8DD0x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x7y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y13E[] = {
  {&(_ZTVN3ccc8DD0x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y13E[];
Class_Descriptor cd__ZN3ccc8DD0x7y13E = {  "_ZN3ccc8DD0x7y13E", // class name
  bases__ZN3ccc8DD0x7y13E, 2,
  &(vtc__ZN3ccc8DD0x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y14  : virtual ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y143pqrEv
  ~CC0x7y14(); // tgen
  CC0x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y143pqrEv");}
ccc::CC0x7y14 ::~CC0x7y14(){ note_dtor("_ZN3ccc8CC0x7y14E", this);} // tgen
ccc::CC0x7y14 ::CC0x7y14(){ note_ctor("_ZN3ccc8CC0x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y14E, buf);
    ::ccc::CC0x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y14E);
    dp->::ccc::CC0x7y14::~CC0x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y14E(Test__ZN3ccc8CC0x7y14E, "_ZN3ccc8CC0x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y14C1Ev();
extern void _ZN3ccc8CC0x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y14E[] = {
  NSPAIR(_ZN3ccc8CC0x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC0x7y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x7y143pqrEv,_ZTv0_n20_N3ccc8CC0x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y143pqrEv,_ZThn4_N3ccc8CC0x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x7y143pqrEv,_ZTv0_n20_N3ccc8CC0x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y14E[] = {
  {&(_ZTVN3ccc8CC0x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y14E[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x7y143pqrEv,_ZTv0_n20_N3ccc8CC0x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x7y143pqrEv,_ZThn4_N3ccc8CC0x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x7y14E = {  "_ZN3ccc8CC0x7y14E", // class name
  bases__ZN3ccc8CC0x7y14E, 2,
  &(vtc__ZN3ccc8CC0x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y14E),2, //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  DD0x7y14  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD0x7y143pqrEv
  ~DD0x7y14(); // tgen
  DD0x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x7y143pqrEv");}
ccc::DD0x7y14 ::~DD0x7y14(){ note_dtor("_ZN3ccc8DD0x7y14E", this);} // tgen
ccc::DD0x7y14 ::DD0x7y14(){ note_ctor("_ZN3ccc8DD0x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y14E, buf);
    ::ccc::DD0x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y14E);
    dp->::ccc::DD0x7y14::~DD0x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y14E(Test__ZN3ccc8DD0x7y14E, "_ZN3ccc8DD0x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y14C1Ev();
extern void _ZN3ccc8DD0x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y14E[] = {
  NSPAIR(_ZN3ccc8DD0x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x7y143pqrEv,_ZTv0_n16_N3ccc8DD0x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x7y143pqrEv,_ZThn4_N3ccc8DD0x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x7y143pqrEv,_ZTv0_n16_N3ccc8DD0x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y14E[] = {
  {&(_ZTVN3ccc8DD0x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y14E[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x7y143pqrEv,_ZTv0_n16_N3ccc8DD0x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x7y143pqrEv,_ZThn4_N3ccc8DD0x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x7y14E = {  "_ZN3ccc8DD0x7y14E", // class name
  bases__ZN3ccc8DD0x7y14E, 2,
  &(vtc__ZN3ccc8DD0x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y14E),3, //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  CC0x7y15  : virtual ::ccc::AA0 , ::ccc::BB7 {
  ~CC0x7y15(); // tgen
  CC0x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x7y15 ::~CC0x7y15(){ note_dtor("_ZN3ccc8CC0x7y15E", this);} // tgen
ccc::CC0x7y15 ::CC0x7y15(){ note_ctor("_ZN3ccc8CC0x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y15E, buf);
    ::ccc::CC0x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC0x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y15E);
    dp->::ccc::CC0x7y15::~CC0x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y15E(Test__ZN3ccc8CC0x7y15E, "_ZN3ccc8CC0x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y15C1Ev();
extern void _ZN3ccc8CC0x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y15E[] = {
  NSPAIR(_ZN3ccc8CC0x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x7y15E[] = {
  {&(_ZTVN3ccc8CC0x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x7y15E[];
Class_Descriptor cd__ZN3ccc8CC0x7y15E = {  "_ZN3ccc8CC0x7y15E", // class name
  bases__ZN3ccc8CC0x7y15E, 2,
  &(vtc__ZN3ccc8CC0x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x7y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x7y15  : virtual ::ccc::AA0 , virtual ::ccc::BB7 {
  ~DD0x7y15(); // tgen
  DD0x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x7y15 ::~DD0x7y15(){ note_dtor("_ZN3ccc8DD0x7y15E", this);} // tgen
ccc::DD0x7y15 ::DD0x7y15(){ note_ctor("_ZN3ccc8DD0x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x7y15E, buf);
    ::ccc::DD0x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x7y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD0x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x7y15E);
    dp->::ccc::DD0x7y15::~DD0x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x7y15E(Test__ZN3ccc8DD0x7y15E, "_ZN3ccc8DD0x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x7y15C1Ev();
extern void _ZN3ccc8DD0x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x7y15E[] = {
  NSPAIR(_ZN3ccc8DD0x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD0x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x7y15E[] = {
  {&(_ZTVN3ccc8DD0x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x7y15E[];
Class_Descriptor cd__ZN3ccc8DD0x7y15E = {  "_ZN3ccc8DD0x7y15E", // class name
  bases__ZN3ccc8DD0x7y15E, 2,
  &(vtc__ZN3ccc8DD0x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x7y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y0  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y03pqrEv
  ~CC0x8y0(); // tgen
  CC0x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y0E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y03abcEv");}
void  ccc::CC0x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y03efgEv");}
void  ccc::CC0x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y03pqrEv");}
ccc::CC0x8y0 ::~CC0x8y0(){ note_dtor("_ZN3ccc7CC0x8y0E", this);} // tgen
ccc::CC0x8y0 ::CC0x8y0(){ note_ctor("_ZN3ccc7CC0x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y0E, buf);
    ::ccc::CC0x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y0E);
    dp->::ccc::CC0x8y0::~CC0x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y0E(Test__ZN3ccc7CC0x8y0E, "_ZN3ccc7CC0x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y0C1Ev();
extern void _ZN3ccc7CC0x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y0E[] = {
  NSPAIR(_ZN3ccc7CC0x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y0E[];
extern void _ZN3ccc7CC0x8y03efgEv();
extern void _ZN3ccc7CC0x8y03abcEv();
extern void _ZN3ccc7CC0x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y03abcEv,_ZTv0_n12_N3ccc7CC0x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y03abcEv,_ZThn4_N3ccc7CC0x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y03efgEv,_ZTv0_n16_N3ccc7CC0x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y03efgEv,_ZThn4_N3ccc7CC0x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y03pqrEv,_ZTv0_n20_N3ccc7CC0x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y03pqrEv,_ZThn4_N3ccc7CC0x8y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y03abcEv,_ZTv0_n12_N3ccc7CC0x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y03efgEv,_ZTv0_n16_N3ccc7CC0x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y03pqrEv,_ZTv0_n20_N3ccc7CC0x8y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y0E[] = {
  {&(_ZTVN3ccc7CC0x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y0E[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y03pqrEv,_ZTv0_n20_N3ccc7CC0x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y03pqrEv,_ZThn4_N3ccc7CC0x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y03efgEv,_ZTv0_n16_N3ccc7CC0x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y03efgEv,_ZThn4_N3ccc7CC0x8y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y03abcEv,_ZTv0_n12_N3ccc7CC0x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y03abcEv,_ZThn4_N3ccc7CC0x8y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y0E = {  "_ZN3ccc7CC0x8y0E", // class name
  bases__ZN3ccc7CC0x8y0E, 2,
  &(vtc__ZN3ccc7CC0x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y0E),2, //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  DD0x8y0  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD0x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y03pqrEv
  ~DD0x8y0(); // tgen
  DD0x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y03abcEv");}
void  ccc::DD0x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y03efgEv");}
void  ccc::DD0x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y03pqrEv");}
ccc::DD0x8y0 ::~DD0x8y0(){ note_dtor("_ZN3ccc7DD0x8y0E", this);} // tgen
ccc::DD0x8y0 ::DD0x8y0(){ note_ctor("_ZN3ccc7DD0x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y0E, buf);
    ::ccc::DD0x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y0E);
    dp->::ccc::DD0x8y0::~DD0x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y0E(Test__ZN3ccc7DD0x8y0E, "_ZN3ccc7DD0x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y0C1Ev();
extern void _ZN3ccc7DD0x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y0E[] = {
  NSPAIR(_ZN3ccc7DD0x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y0E[];
extern void _ZN3ccc7DD0x8y03abcEv();
extern void _ZN3ccc7DD0x8y03efgEv();
extern void _ZN3ccc7DD0x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y03efgEv,_ZTv0_n12_N3ccc7DD0x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y03efgEv,_ZThn4_N3ccc7DD0x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y03abcEv,_ZTv0_n16_N3ccc7DD0x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y03abcEv,_ZThn4_N3ccc7DD0x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y03efgEv,_ZTv0_n12_N3ccc7DD0x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y03abcEv,_ZTv0_n16_N3ccc7DD0x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y0E[] = {
  {&(_ZTVN3ccc7DD0x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y0E[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y03abcEv,_ZTv0_n16_N3ccc7DD0x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y03abcEv,_ZThn4_N3ccc7DD0x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y03efgEv,_ZTv0_n12_N3ccc7DD0x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y03efgEv,_ZThn4_N3ccc7DD0x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y0E = {  "_ZN3ccc7DD0x8y0E", // class name
  bases__ZN3ccc7DD0x8y0E, 2,
  &(vtc__ZN3ccc7DD0x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y0E),3, //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  CC0x8y1  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x8y13efgEv
  ~CC0x8y1(); // tgen
  CC0x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y1E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y13abcEv");}
void  ccc::CC0x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y13pqrEv");}
void  ccc::CC0x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y13efgEv");}
ccc::CC0x8y1 ::~CC0x8y1(){ note_dtor("_ZN3ccc7CC0x8y1E", this);} // tgen
ccc::CC0x8y1 ::CC0x8y1(){ note_ctor("_ZN3ccc7CC0x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y1E, buf);
    ::ccc::CC0x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y1E);
    dp->::ccc::CC0x8y1::~CC0x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y1E(Test__ZN3ccc7CC0x8y1E, "_ZN3ccc7CC0x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y1C1Ev();
extern void _ZN3ccc7CC0x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y1E[] = {
  NSPAIR(_ZN3ccc7CC0x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y1E[];
extern void _ZN3ccc7CC0x8y13efgEv();
extern void _ZN3ccc7CC0x8y13abcEv();
extern void _ZN3ccc7CC0x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y13abcEv,_ZTv0_n12_N3ccc7CC0x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y13abcEv,_ZThn4_N3ccc7CC0x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y13efgEv,_ZTv0_n16_N3ccc7CC0x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y13efgEv,_ZThn4_N3ccc7CC0x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y13pqrEv,_ZTv0_n20_N3ccc7CC0x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y13pqrEv,_ZThn4_N3ccc7CC0x8y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y13abcEv,_ZTv0_n12_N3ccc7CC0x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y13efgEv,_ZTv0_n16_N3ccc7CC0x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y13pqrEv,_ZTv0_n20_N3ccc7CC0x8y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y1E[] = {
  {&(_ZTVN3ccc7CC0x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y1E[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y13pqrEv,_ZTv0_n20_N3ccc7CC0x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y13pqrEv,_ZThn4_N3ccc7CC0x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y13efgEv,_ZTv0_n16_N3ccc7CC0x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y13efgEv,_ZThn4_N3ccc7CC0x8y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y13abcEv,_ZTv0_n12_N3ccc7CC0x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y13abcEv,_ZThn4_N3ccc7CC0x8y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y1E = {  "_ZN3ccc7CC0x8y1E", // class name
  bases__ZN3ccc7CC0x8y1E, 2,
  &(vtc__ZN3ccc7CC0x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y1E),2, //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  DD0x8y1  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD0x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x8y13efgEv
  ~DD0x8y1(); // tgen
  DD0x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y13abcEv");}
void  ccc::DD0x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y13pqrEv");}
void  ccc::DD0x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y13efgEv");}
ccc::DD0x8y1 ::~DD0x8y1(){ note_dtor("_ZN3ccc7DD0x8y1E", this);} // tgen
ccc::DD0x8y1 ::DD0x8y1(){ note_ctor("_ZN3ccc7DD0x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y1E, buf);
    ::ccc::DD0x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y1E);
    dp->::ccc::DD0x8y1::~DD0x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y1E(Test__ZN3ccc7DD0x8y1E, "_ZN3ccc7DD0x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y1C1Ev();
extern void _ZN3ccc7DD0x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y1E[] = {
  NSPAIR(_ZN3ccc7DD0x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y1E[];
extern void _ZN3ccc7DD0x8y13abcEv();
extern void _ZN3ccc7DD0x8y13efgEv();
extern void _ZN3ccc7DD0x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y13efgEv,_ZTv0_n12_N3ccc7DD0x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y13efgEv,_ZThn4_N3ccc7DD0x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y13abcEv,_ZTv0_n16_N3ccc7DD0x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y13abcEv,_ZThn4_N3ccc7DD0x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y13efgEv,_ZTv0_n12_N3ccc7DD0x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y13abcEv,_ZTv0_n16_N3ccc7DD0x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y1E[] = {
  {&(_ZTVN3ccc7DD0x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y1E[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y13abcEv,_ZTv0_n16_N3ccc7DD0x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y13abcEv,_ZThn4_N3ccc7DD0x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y13efgEv,_ZTv0_n12_N3ccc7DD0x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y13efgEv,_ZThn4_N3ccc7DD0x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y1E = {  "_ZN3ccc7DD0x8y1E", // class name
  bases__ZN3ccc7DD0x8y1E, 2,
  &(vtc__ZN3ccc7DD0x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y1E),3, //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  CC0x8y2  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y23pqrEv
  ~CC0x8y2(); // tgen
  CC0x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y2E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y23efgEv");}
void  ccc::CC0x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y23abcEv");}
void  ccc::CC0x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y23pqrEv");}
ccc::CC0x8y2 ::~CC0x8y2(){ note_dtor("_ZN3ccc7CC0x8y2E", this);} // tgen
ccc::CC0x8y2 ::CC0x8y2(){ note_ctor("_ZN3ccc7CC0x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y2E, buf);
    ::ccc::CC0x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y2E);
    dp->::ccc::CC0x8y2::~CC0x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y2E(Test__ZN3ccc7CC0x8y2E, "_ZN3ccc7CC0x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y2C1Ev();
extern void _ZN3ccc7CC0x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y2E[] = {
  NSPAIR(_ZN3ccc7CC0x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y2E[];
extern void _ZN3ccc7CC0x8y23efgEv();
extern void _ZN3ccc7CC0x8y23abcEv();
extern void _ZN3ccc7CC0x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y23abcEv,_ZTv0_n12_N3ccc7CC0x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y23abcEv,_ZThn4_N3ccc7CC0x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y23efgEv,_ZTv0_n16_N3ccc7CC0x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y23efgEv,_ZThn4_N3ccc7CC0x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y23pqrEv,_ZTv0_n20_N3ccc7CC0x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y23pqrEv,_ZThn4_N3ccc7CC0x8y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y23abcEv,_ZTv0_n12_N3ccc7CC0x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y23efgEv,_ZTv0_n16_N3ccc7CC0x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y23pqrEv,_ZTv0_n20_N3ccc7CC0x8y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y2E[] = {
  {&(_ZTVN3ccc7CC0x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y2E[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y23pqrEv,_ZTv0_n20_N3ccc7CC0x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y23pqrEv,_ZThn4_N3ccc7CC0x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y23efgEv,_ZTv0_n16_N3ccc7CC0x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y23efgEv,_ZThn4_N3ccc7CC0x8y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y23abcEv,_ZTv0_n12_N3ccc7CC0x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y23abcEv,_ZThn4_N3ccc7CC0x8y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y2E = {  "_ZN3ccc7CC0x8y2E", // class name
  bases__ZN3ccc7CC0x8y2E, 2,
  &(vtc__ZN3ccc7CC0x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y2E),2, //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  DD0x8y2  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD0x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y23pqrEv
  ~DD0x8y2(); // tgen
  DD0x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y23efgEv");}
void  ccc::DD0x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y23abcEv");}
void  ccc::DD0x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y23pqrEv");}
ccc::DD0x8y2 ::~DD0x8y2(){ note_dtor("_ZN3ccc7DD0x8y2E", this);} // tgen
ccc::DD0x8y2 ::DD0x8y2(){ note_ctor("_ZN3ccc7DD0x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y2E, buf);
    ::ccc::DD0x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y2E);
    dp->::ccc::DD0x8y2::~DD0x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y2E(Test__ZN3ccc7DD0x8y2E, "_ZN3ccc7DD0x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y2C1Ev();
extern void _ZN3ccc7DD0x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y2E[] = {
  NSPAIR(_ZN3ccc7DD0x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y2E[];
extern void _ZN3ccc7DD0x8y23abcEv();
extern void _ZN3ccc7DD0x8y23efgEv();
extern void _ZN3ccc7DD0x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y23efgEv,_ZTv0_n12_N3ccc7DD0x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y23efgEv,_ZThn4_N3ccc7DD0x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y23abcEv,_ZTv0_n16_N3ccc7DD0x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y23abcEv,_ZThn4_N3ccc7DD0x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y23efgEv,_ZTv0_n12_N3ccc7DD0x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y23abcEv,_ZTv0_n16_N3ccc7DD0x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y2E[] = {
  {&(_ZTVN3ccc7DD0x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y2E[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y23abcEv,_ZTv0_n16_N3ccc7DD0x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y23abcEv,_ZThn4_N3ccc7DD0x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y23efgEv,_ZTv0_n12_N3ccc7DD0x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y23efgEv,_ZThn4_N3ccc7DD0x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y2E = {  "_ZN3ccc7DD0x8y2E", // class name
  bases__ZN3ccc7DD0x8y2E, 2,
  &(vtc__ZN3ccc7DD0x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y2E),3, //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  CC0x8y3  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x8y33abcEv
  ~CC0x8y3(); // tgen
  CC0x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y3E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y33efgEv");}
void  ccc::CC0x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y33pqrEv");}
void  ccc::CC0x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y33abcEv");}
ccc::CC0x8y3 ::~CC0x8y3(){ note_dtor("_ZN3ccc7CC0x8y3E", this);} // tgen
ccc::CC0x8y3 ::CC0x8y3(){ note_ctor("_ZN3ccc7CC0x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y3E, buf);
    ::ccc::CC0x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y3E);
    dp->::ccc::CC0x8y3::~CC0x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y3E(Test__ZN3ccc7CC0x8y3E, "_ZN3ccc7CC0x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y3C1Ev();
extern void _ZN3ccc7CC0x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y3E[] = {
  NSPAIR(_ZN3ccc7CC0x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y3E[];
extern void _ZN3ccc7CC0x8y33efgEv();
extern void _ZN3ccc7CC0x8y33abcEv();
extern void _ZN3ccc7CC0x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y33abcEv,_ZTv0_n12_N3ccc7CC0x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y33abcEv,_ZThn4_N3ccc7CC0x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y33efgEv,_ZTv0_n16_N3ccc7CC0x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y33efgEv,_ZThn4_N3ccc7CC0x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y33pqrEv,_ZTv0_n20_N3ccc7CC0x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y33pqrEv,_ZThn4_N3ccc7CC0x8y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y33abcEv,_ZTv0_n12_N3ccc7CC0x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y33efgEv,_ZTv0_n16_N3ccc7CC0x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y33pqrEv,_ZTv0_n20_N3ccc7CC0x8y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y3E[] = {
  {&(_ZTVN3ccc7CC0x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y3E[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y33pqrEv,_ZTv0_n20_N3ccc7CC0x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y33pqrEv,_ZThn4_N3ccc7CC0x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y33efgEv,_ZTv0_n16_N3ccc7CC0x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y33efgEv,_ZThn4_N3ccc7CC0x8y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y33abcEv,_ZTv0_n12_N3ccc7CC0x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y33abcEv,_ZThn4_N3ccc7CC0x8y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y3E = {  "_ZN3ccc7CC0x8y3E", // class name
  bases__ZN3ccc7CC0x8y3E, 2,
  &(vtc__ZN3ccc7CC0x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y3E),2, //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  DD0x8y3  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD0x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x8y33abcEv
  ~DD0x8y3(); // tgen
  DD0x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y33efgEv");}
void  ccc::DD0x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y33pqrEv");}
void  ccc::DD0x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y33abcEv");}
ccc::DD0x8y3 ::~DD0x8y3(){ note_dtor("_ZN3ccc7DD0x8y3E", this);} // tgen
ccc::DD0x8y3 ::DD0x8y3(){ note_ctor("_ZN3ccc7DD0x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y3E, buf);
    ::ccc::DD0x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y3E);
    dp->::ccc::DD0x8y3::~DD0x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y3E(Test__ZN3ccc7DD0x8y3E, "_ZN3ccc7DD0x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y3C1Ev();
extern void _ZN3ccc7DD0x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y3E[] = {
  NSPAIR(_ZN3ccc7DD0x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y3E[];
extern void _ZN3ccc7DD0x8y33abcEv();
extern void _ZN3ccc7DD0x8y33efgEv();
extern void _ZN3ccc7DD0x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y33efgEv,_ZTv0_n12_N3ccc7DD0x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y33efgEv,_ZThn4_N3ccc7DD0x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y33abcEv,_ZTv0_n16_N3ccc7DD0x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y33abcEv,_ZThn4_N3ccc7DD0x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y33efgEv,_ZTv0_n12_N3ccc7DD0x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y33abcEv,_ZTv0_n16_N3ccc7DD0x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y3E[] = {
  {&(_ZTVN3ccc7DD0x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y3E[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y33abcEv,_ZTv0_n16_N3ccc7DD0x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y33abcEv,_ZThn4_N3ccc7DD0x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y33efgEv,_ZTv0_n12_N3ccc7DD0x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y33efgEv,_ZThn4_N3ccc7DD0x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y3E = {  "_ZN3ccc7DD0x8y3E", // class name
  bases__ZN3ccc7DD0x8y3E, 2,
  &(vtc__ZN3ccc7DD0x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y3E),3, //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  CC0x8y4  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC0x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y43efgEv
  ~CC0x8y4(); // tgen
  CC0x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y4E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y43pqrEv");}
void  ccc::CC0x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y43abcEv");}
void  ccc::CC0x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y43efgEv");}
ccc::CC0x8y4 ::~CC0x8y4(){ note_dtor("_ZN3ccc7CC0x8y4E", this);} // tgen
ccc::CC0x8y4 ::CC0x8y4(){ note_ctor("_ZN3ccc7CC0x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y4E, buf);
    ::ccc::CC0x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y4E);
    dp->::ccc::CC0x8y4::~CC0x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y4E(Test__ZN3ccc7CC0x8y4E, "_ZN3ccc7CC0x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y4C1Ev();
extern void _ZN3ccc7CC0x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y4E[] = {
  NSPAIR(_ZN3ccc7CC0x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y4E[];
extern void _ZN3ccc7CC0x8y43efgEv();
extern void _ZN3ccc7CC0x8y43abcEv();
extern void _ZN3ccc7CC0x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y43abcEv,_ZTv0_n12_N3ccc7CC0x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y43abcEv,_ZThn4_N3ccc7CC0x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y43efgEv,_ZTv0_n16_N3ccc7CC0x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y43efgEv,_ZThn4_N3ccc7CC0x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y43pqrEv,_ZTv0_n20_N3ccc7CC0x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y43pqrEv,_ZThn4_N3ccc7CC0x8y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y43abcEv,_ZTv0_n12_N3ccc7CC0x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y43efgEv,_ZTv0_n16_N3ccc7CC0x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y43pqrEv,_ZTv0_n20_N3ccc7CC0x8y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y4E[] = {
  {&(_ZTVN3ccc7CC0x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y4E[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y43pqrEv,_ZTv0_n20_N3ccc7CC0x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y43pqrEv,_ZThn4_N3ccc7CC0x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y43efgEv,_ZTv0_n16_N3ccc7CC0x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y43efgEv,_ZThn4_N3ccc7CC0x8y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y43abcEv,_ZTv0_n12_N3ccc7CC0x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y43abcEv,_ZThn4_N3ccc7CC0x8y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y4E = {  "_ZN3ccc7CC0x8y4E", // class name
  bases__ZN3ccc7CC0x8y4E, 2,
  &(vtc__ZN3ccc7CC0x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y4E),2, //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  DD0x8y4  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD0x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x8y43efgEv
  ~DD0x8y4(); // tgen
  DD0x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y43pqrEv");}
void  ccc::DD0x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y43abcEv");}
void  ccc::DD0x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y43efgEv");}
ccc::DD0x8y4 ::~DD0x8y4(){ note_dtor("_ZN3ccc7DD0x8y4E", this);} // tgen
ccc::DD0x8y4 ::DD0x8y4(){ note_ctor("_ZN3ccc7DD0x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y4E, buf);
    ::ccc::DD0x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y4E);
    dp->::ccc::DD0x8y4::~DD0x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y4E(Test__ZN3ccc7DD0x8y4E, "_ZN3ccc7DD0x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y4C1Ev();
extern void _ZN3ccc7DD0x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y4E[] = {
  NSPAIR(_ZN3ccc7DD0x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y4E[];
extern void _ZN3ccc7DD0x8y43abcEv();
extern void _ZN3ccc7DD0x8y43efgEv();
extern void _ZN3ccc7DD0x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y43efgEv,_ZTv0_n12_N3ccc7DD0x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y43efgEv,_ZThn4_N3ccc7DD0x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y43abcEv,_ZTv0_n16_N3ccc7DD0x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y43abcEv,_ZThn4_N3ccc7DD0x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y43efgEv,_ZTv0_n12_N3ccc7DD0x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y43abcEv,_ZTv0_n16_N3ccc7DD0x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y4E[] = {
  {&(_ZTVN3ccc7DD0x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y4E[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y43abcEv,_ZTv0_n16_N3ccc7DD0x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y43abcEv,_ZThn4_N3ccc7DD0x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y43efgEv,_ZTv0_n12_N3ccc7DD0x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y43efgEv,_ZThn4_N3ccc7DD0x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y4E = {  "_ZN3ccc7DD0x8y4E", // class name
  bases__ZN3ccc7DD0x8y4E, 2,
  &(vtc__ZN3ccc7DD0x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y4E),3, //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  CC0x8y5  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC0x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y53abcEv
  ~CC0x8y5(); // tgen
  CC0x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y5E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y53pqrEv");}
void  ccc::CC0x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y53efgEv");}
void  ccc::CC0x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y53abcEv");}
ccc::CC0x8y5 ::~CC0x8y5(){ note_dtor("_ZN3ccc7CC0x8y5E", this);} // tgen
ccc::CC0x8y5 ::CC0x8y5(){ note_ctor("_ZN3ccc7CC0x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y5E, buf);
    ::ccc::CC0x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y5E);
    dp->::ccc::CC0x8y5::~CC0x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y5E(Test__ZN3ccc7CC0x8y5E, "_ZN3ccc7CC0x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y5C1Ev();
extern void _ZN3ccc7CC0x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y5E[] = {
  NSPAIR(_ZN3ccc7CC0x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y5E[];
extern void _ZN3ccc7CC0x8y53efgEv();
extern void _ZN3ccc7CC0x8y53abcEv();
extern void _ZN3ccc7CC0x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y53abcEv,_ZTv0_n12_N3ccc7CC0x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y53abcEv,_ZThn4_N3ccc7CC0x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y53efgEv,_ZTv0_n16_N3ccc7CC0x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y53efgEv,_ZThn4_N3ccc7CC0x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y53pqrEv,_ZTv0_n20_N3ccc7CC0x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y53pqrEv,_ZThn4_N3ccc7CC0x8y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y53abcEv,_ZTv0_n12_N3ccc7CC0x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y53efgEv,_ZTv0_n16_N3ccc7CC0x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y53pqrEv,_ZTv0_n20_N3ccc7CC0x8y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y5E[] = {
  {&(_ZTVN3ccc7CC0x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y5E[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y53pqrEv,_ZTv0_n20_N3ccc7CC0x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y53pqrEv,_ZThn4_N3ccc7CC0x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y53efgEv,_ZTv0_n16_N3ccc7CC0x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y53efgEv,_ZThn4_N3ccc7CC0x8y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y53abcEv,_ZTv0_n12_N3ccc7CC0x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y53abcEv,_ZThn4_N3ccc7CC0x8y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y5E = {  "_ZN3ccc7CC0x8y5E", // class name
  bases__ZN3ccc7CC0x8y5E, 2,
  &(vtc__ZN3ccc7CC0x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y5E),2, //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  DD0x8y5  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD0x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x8y53abcEv
  ~DD0x8y5(); // tgen
  DD0x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y53pqrEv");}
void  ccc::DD0x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y53efgEv");}
void  ccc::DD0x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y53abcEv");}
ccc::DD0x8y5 ::~DD0x8y5(){ note_dtor("_ZN3ccc7DD0x8y5E", this);} // tgen
ccc::DD0x8y5 ::DD0x8y5(){ note_ctor("_ZN3ccc7DD0x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y5E, buf);
    ::ccc::DD0x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y5E);
    dp->::ccc::DD0x8y5::~DD0x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y5E(Test__ZN3ccc7DD0x8y5E, "_ZN3ccc7DD0x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y5C1Ev();
extern void _ZN3ccc7DD0x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y5E[] = {
  NSPAIR(_ZN3ccc7DD0x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y5E[];
extern void _ZN3ccc7DD0x8y53abcEv();
extern void _ZN3ccc7DD0x8y53efgEv();
extern void _ZN3ccc7DD0x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y53efgEv,_ZTv0_n12_N3ccc7DD0x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y53efgEv,_ZThn4_N3ccc7DD0x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y53abcEv,_ZTv0_n16_N3ccc7DD0x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y53abcEv,_ZThn4_N3ccc7DD0x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y53efgEv,_ZTv0_n12_N3ccc7DD0x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y53abcEv,_ZTv0_n16_N3ccc7DD0x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y5E[] = {
  {&(_ZTVN3ccc7DD0x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y5E[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y53abcEv,_ZTv0_n16_N3ccc7DD0x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y53abcEv,_ZThn4_N3ccc7DD0x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y53efgEv,_ZTv0_n12_N3ccc7DD0x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y53efgEv,_ZThn4_N3ccc7DD0x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y5E = {  "_ZN3ccc7DD0x8y5E", // class name
  bases__ZN3ccc7DD0x8y5E, 2,
  &(vtc__ZN3ccc7DD0x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y5E),3, //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  CC0x8y6  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y63efgEv
  ~CC0x8y6(); // tgen
  CC0x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y6E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y63abcEv");}
void  ccc::CC0x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y63efgEv");}
ccc::CC0x8y6 ::~CC0x8y6(){ note_dtor("_ZN3ccc7CC0x8y6E", this);} // tgen
ccc::CC0x8y6 ::CC0x8y6(){ note_ctor("_ZN3ccc7CC0x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y6E, buf);
    ::ccc::CC0x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y6E);
    dp->::ccc::CC0x8y6::~CC0x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y6E(Test__ZN3ccc7CC0x8y6E, "_ZN3ccc7CC0x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y6C1Ev();
extern void _ZN3ccc7CC0x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y6E[] = {
  NSPAIR(_ZN3ccc7CC0x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y6E[];
extern void _ZN3ccc7CC0x8y63efgEv();
extern void _ZN3ccc7CC0x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y63abcEv,_ZTv0_n12_N3ccc7CC0x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y63abcEv,_ZThn4_N3ccc7CC0x8y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y63efgEv,_ZTv0_n16_N3ccc7CC0x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y63efgEv,_ZThn4_N3ccc7CC0x8y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y63abcEv,_ZTv0_n12_N3ccc7CC0x8y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y63efgEv,_ZTv0_n16_N3ccc7CC0x8y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y6E[] = {
  {&(_ZTVN3ccc7CC0x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y6E[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y63efgEv,_ZTv0_n16_N3ccc7CC0x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y63efgEv,_ZThn4_N3ccc7CC0x8y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y63abcEv,_ZTv0_n12_N3ccc7CC0x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y63abcEv,_ZThn4_N3ccc7CC0x8y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y6E = {  "_ZN3ccc7CC0x8y6E", // class name
  bases__ZN3ccc7CC0x8y6E, 2,
  &(vtc__ZN3ccc7CC0x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x8y6  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD0x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x8y63efgEv
  ~DD0x8y6(); // tgen
  DD0x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y63abcEv");}
void  ccc::DD0x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y63efgEv");}
ccc::DD0x8y6 ::~DD0x8y6(){ note_dtor("_ZN3ccc7DD0x8y6E", this);} // tgen
ccc::DD0x8y6 ::DD0x8y6(){ note_ctor("_ZN3ccc7DD0x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y6E, buf);
    ::ccc::DD0x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y6E);
    dp->::ccc::DD0x8y6::~DD0x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y6E(Test__ZN3ccc7DD0x8y6E, "_ZN3ccc7DD0x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y6C1Ev();
extern void _ZN3ccc7DD0x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y6E[] = {
  NSPAIR(_ZN3ccc7DD0x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y6E[];
extern void _ZN3ccc7DD0x8y63abcEv();
extern void _ZN3ccc7DD0x8y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y63efgEv,_ZTv0_n12_N3ccc7DD0x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y63efgEv,_ZThn4_N3ccc7DD0x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y63abcEv,_ZTv0_n16_N3ccc7DD0x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y63abcEv,_ZThn4_N3ccc7DD0x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y63efgEv,_ZTv0_n12_N3ccc7DD0x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y63abcEv,_ZTv0_n16_N3ccc7DD0x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y6E[] = {
  {&(_ZTVN3ccc7DD0x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y6E[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y63abcEv,_ZTv0_n16_N3ccc7DD0x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y63abcEv,_ZThn4_N3ccc7DD0x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y63efgEv,_ZTv0_n12_N3ccc7DD0x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y63efgEv,_ZThn4_N3ccc7DD0x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y6E = {  "_ZN3ccc7DD0x8y6E", // class name
  bases__ZN3ccc7DD0x8y6E, 2,
  &(vtc__ZN3ccc7DD0x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y6E),3, //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  CC0x8y7  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y73pqrEv
  ~CC0x8y7(); // tgen
  CC0x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y7E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y73abcEv");}
void  ccc::CC0x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y73pqrEv");}
ccc::CC0x8y7 ::~CC0x8y7(){ note_dtor("_ZN3ccc7CC0x8y7E", this);} // tgen
ccc::CC0x8y7 ::CC0x8y7(){ note_ctor("_ZN3ccc7CC0x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y7E, buf);
    ::ccc::CC0x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y7E);
    dp->::ccc::CC0x8y7::~CC0x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y7E(Test__ZN3ccc7CC0x8y7E, "_ZN3ccc7CC0x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y7C1Ev();
extern void _ZN3ccc7CC0x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y7E[] = {
  NSPAIR(_ZN3ccc7CC0x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC0x8y73abcEv();
extern void _ZN3ccc7CC0x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y73abcEv,_ZTv0_n12_N3ccc7CC0x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y73abcEv,_ZThn4_N3ccc7CC0x8y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y73pqrEv,_ZTv0_n20_N3ccc7CC0x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y73pqrEv,_ZThn4_N3ccc7CC0x8y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y73abcEv,_ZTv0_n12_N3ccc7CC0x8y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y73pqrEv,_ZTv0_n20_N3ccc7CC0x8y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y7E[] = {
  {&(_ZTVN3ccc7CC0x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y7E[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y73pqrEv,_ZTv0_n20_N3ccc7CC0x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y73pqrEv,_ZThn4_N3ccc7CC0x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y73abcEv,_ZTv0_n12_N3ccc7CC0x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y73abcEv,_ZThn4_N3ccc7CC0x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y7E = {  "_ZN3ccc7CC0x8y7E", // class name
  bases__ZN3ccc7CC0x8y7E, 2,
  &(vtc__ZN3ccc7CC0x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y7E),2, //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  DD0x8y7  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD0x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y73pqrEv
  ~DD0x8y7(); // tgen
  DD0x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y73abcEv");}
void  ccc::DD0x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y73pqrEv");}
ccc::DD0x8y7 ::~DD0x8y7(){ note_dtor("_ZN3ccc7DD0x8y7E", this);} // tgen
ccc::DD0x8y7 ::DD0x8y7(){ note_ctor("_ZN3ccc7DD0x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y7E, buf);
    ::ccc::DD0x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y7E);
    dp->::ccc::DD0x8y7::~DD0x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y7E(Test__ZN3ccc7DD0x8y7E, "_ZN3ccc7DD0x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y7C1Ev();
extern void _ZN3ccc7DD0x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y7E[] = {
  NSPAIR(_ZN3ccc7DD0x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y7E[];
extern void _ZN3ccc7DD0x8y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y73abcEv,_ZTv0_n16_N3ccc7DD0x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y73abcEv,_ZThn4_N3ccc7DD0x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y73abcEv,_ZTv0_n16_N3ccc7DD0x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y7E[] = {
  {&(_ZTVN3ccc7DD0x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y7E[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y73abcEv,_ZTv0_n16_N3ccc7DD0x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y73abcEv,_ZThn4_N3ccc7DD0x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y7E = {  "_ZN3ccc7DD0x8y7E", // class name
  bases__ZN3ccc7DD0x8y7E, 2,
  &(vtc__ZN3ccc7DD0x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y7E),3, //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  CC0x8y8  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y83abcEv
  ~CC0x8y8(); // tgen
  CC0x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y8E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y83efgEv");}
void  ccc::CC0x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y83abcEv");}
ccc::CC0x8y8 ::~CC0x8y8(){ note_dtor("_ZN3ccc7CC0x8y8E", this);} // tgen
ccc::CC0x8y8 ::CC0x8y8(){ note_ctor("_ZN3ccc7CC0x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y8E, buf);
    ::ccc::CC0x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y8E);
    dp->::ccc::CC0x8y8::~CC0x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y8E(Test__ZN3ccc7CC0x8y8E, "_ZN3ccc7CC0x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y8C1Ev();
extern void _ZN3ccc7CC0x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y8E[] = {
  NSPAIR(_ZN3ccc7CC0x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y8E[];
extern void _ZN3ccc7CC0x8y83efgEv();
extern void _ZN3ccc7CC0x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x8y83abcEv,_ZTv0_n12_N3ccc7CC0x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y83abcEv,_ZThn4_N3ccc7CC0x8y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y83efgEv,_ZTv0_n16_N3ccc7CC0x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y83efgEv,_ZThn4_N3ccc7CC0x8y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x8y83abcEv,_ZTv0_n12_N3ccc7CC0x8y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y83efgEv,_ZTv0_n16_N3ccc7CC0x8y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y8E[] = {
  {&(_ZTVN3ccc7CC0x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y8E[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y83efgEv,_ZTv0_n16_N3ccc7CC0x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y83efgEv,_ZThn4_N3ccc7CC0x8y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x8y83abcEv,_ZTv0_n12_N3ccc7CC0x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y83abcEv,_ZThn4_N3ccc7CC0x8y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y8E = {  "_ZN3ccc7CC0x8y8E", // class name
  bases__ZN3ccc7CC0x8y8E, 2,
  &(vtc__ZN3ccc7CC0x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y8E),2, //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  DD0x8y8  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD0x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x8y83abcEv
  ~DD0x8y8(); // tgen
  DD0x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y83efgEv");}
void  ccc::DD0x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x8y83abcEv");}
ccc::DD0x8y8 ::~DD0x8y8(){ note_dtor("_ZN3ccc7DD0x8y8E", this);} // tgen
ccc::DD0x8y8 ::DD0x8y8(){ note_ctor("_ZN3ccc7DD0x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y8E, buf);
    ::ccc::DD0x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y8E);
    dp->::ccc::DD0x8y8::~DD0x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y8E(Test__ZN3ccc7DD0x8y8E, "_ZN3ccc7DD0x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y8C1Ev();
extern void _ZN3ccc7DD0x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y8E[] = {
  NSPAIR(_ZN3ccc7DD0x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y8E[];
extern void _ZN3ccc7DD0x8y83abcEv();
extern void _ZN3ccc7DD0x8y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y83efgEv,_ZTv0_n12_N3ccc7DD0x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y83efgEv,_ZThn4_N3ccc7DD0x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x8y83abcEv,_ZTv0_n16_N3ccc7DD0x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y83abcEv,_ZThn4_N3ccc7DD0x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y83efgEv,_ZTv0_n12_N3ccc7DD0x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x8y83abcEv,_ZTv0_n16_N3ccc7DD0x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y8E[] = {
  {&(_ZTVN3ccc7DD0x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y8E[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x8y83abcEv,_ZTv0_n16_N3ccc7DD0x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y83abcEv,_ZThn4_N3ccc7DD0x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y83efgEv,_ZTv0_n12_N3ccc7DD0x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y83efgEv,_ZThn4_N3ccc7DD0x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y8E = {  "_ZN3ccc7DD0x8y8E", // class name
  bases__ZN3ccc7DD0x8y8E, 2,
  &(vtc__ZN3ccc7DD0x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y8E),3, //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  CC0x8y9  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y93pqrEv
  ~CC0x8y9(); // tgen
  CC0x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y9E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y93efgEv");}
void  ccc::CC0x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y93pqrEv");}
ccc::CC0x8y9 ::~CC0x8y9(){ note_dtor("_ZN3ccc7CC0x8y9E", this);} // tgen
ccc::CC0x8y9 ::CC0x8y9(){ note_ctor("_ZN3ccc7CC0x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y9E, buf);
    ::ccc::CC0x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC0x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y9E);
    dp->::ccc::CC0x8y9::~CC0x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y9E(Test__ZN3ccc7CC0x8y9E, "_ZN3ccc7CC0x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y9C1Ev();
extern void _ZN3ccc7CC0x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y9E[] = {
  NSPAIR(_ZN3ccc7CC0x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y9E[];
extern void _ZN3ccc7CC0x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC0x8y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x8y93efgEv,_ZTv0_n16_N3ccc7CC0x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y93efgEv,_ZThn4_N3ccc7CC0x8y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x8y93pqrEv,_ZTv0_n20_N3ccc7CC0x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y93pqrEv,_ZThn4_N3ccc7CC0x8y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x8y93efgEv,_ZTv0_n16_N3ccc7CC0x8y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x8y93pqrEv,_ZTv0_n20_N3ccc7CC0x8y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x8y9E[] = {
  {&(_ZTVN3ccc7CC0x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x8y9E[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x8y93pqrEv,_ZTv0_n20_N3ccc7CC0x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y93pqrEv,_ZThn4_N3ccc7CC0x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x8y93efgEv,_ZTv0_n16_N3ccc7CC0x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x8y93efgEv,_ZThn4_N3ccc7CC0x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x8y9E = {  "_ZN3ccc7CC0x8y9E", // class name
  bases__ZN3ccc7CC0x8y9E, 2,
  &(vtc__ZN3ccc7CC0x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x8y9E),2, //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  DD0x8y9  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD0x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x8y93pqrEv
  ~DD0x8y9(); // tgen
  DD0x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x8y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x8y93efgEv");}
void  ccc::DD0x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x8y93pqrEv");}
ccc::DD0x8y9 ::~DD0x8y9(){ note_dtor("_ZN3ccc7DD0x8y9E", this);} // tgen
ccc::DD0x8y9 ::DD0x8y9(){ note_ctor("_ZN3ccc7DD0x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x8y9E, buf);
    ::ccc::DD0x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x8y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD0x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x8y9E);
    dp->::ccc::DD0x8y9::~DD0x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x8y9E(Test__ZN3ccc7DD0x8y9E, "_ZN3ccc7DD0x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x8y9C1Ev();
extern void _ZN3ccc7DD0x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x8y9E[] = {
  NSPAIR(_ZN3ccc7DD0x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD0x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x8y93efgEv();
extern void _ZN3ccc7DD0x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x8y93efgEv,_ZTv0_n12_N3ccc7DD0x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x8y93efgEv,_ZThn4_N3ccc7DD0x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x8y93efgEv,_ZTv0_n12_N3ccc7DD0x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x8y9E[] = {
  {&(_ZTVN3ccc7DD0x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x8y9E[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x8y93efgEv,_ZTv0_n12_N3ccc7DD0x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x8y93efgEv,_ZThn4_N3ccc7DD0x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x8y9E = {  "_ZN3ccc7DD0x8y9E", // class name
  bases__ZN3ccc7DD0x8y9E, 2,
  &(vtc__ZN3ccc7DD0x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x8y9E),3, //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  CC0x8y10  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x8y103abcEv
  ~CC0x8y10(); // tgen
  CC0x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y10E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y103pqrEv");}
void  ccc::CC0x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x8y103abcEv");}
ccc::CC0x8y10 ::~CC0x8y10(){ note_dtor("_ZN3ccc8CC0x8y10E", this);} // tgen
ccc::CC0x8y10 ::CC0x8y10(){ note_ctor("_ZN3ccc8CC0x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y10E, buf);
    ::ccc::CC0x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y10E);
    dp->::ccc::CC0x8y10::~CC0x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y10E(Test__ZN3ccc8CC0x8y10E, "_ZN3ccc8CC0x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y10C1Ev();
extern void _ZN3ccc8CC0x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y10E[] = {
  NSPAIR(_ZN3ccc8CC0x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC0x8y103abcEv();
extern void _ZN3ccc8CC0x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x8y103abcEv,_ZTv0_n12_N3ccc8CC0x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y103abcEv,_ZThn4_N3ccc8CC0x8y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x8y103pqrEv,_ZTv0_n20_N3ccc8CC0x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y103pqrEv,_ZThn4_N3ccc8CC0x8y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x8y103abcEv,_ZTv0_n12_N3ccc8CC0x8y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x8y103pqrEv,_ZTv0_n20_N3ccc8CC0x8y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y10E[] = {
  {&(_ZTVN3ccc8CC0x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y10E[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x8y103pqrEv,_ZTv0_n20_N3ccc8CC0x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y103pqrEv,_ZThn4_N3ccc8CC0x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x8y103abcEv,_ZTv0_n12_N3ccc8CC0x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y103abcEv,_ZThn4_N3ccc8CC0x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x8y10E = {  "_ZN3ccc8CC0x8y10E", // class name
  bases__ZN3ccc8CC0x8y10E, 2,
  &(vtc__ZN3ccc8CC0x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y10E),2, //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  DD0x8y10  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD0x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x8y103abcEv
  ~DD0x8y10(); // tgen
  DD0x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x8y103pqrEv");}
void  ccc::DD0x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x8y103abcEv");}
ccc::DD0x8y10 ::~DD0x8y10(){ note_dtor("_ZN3ccc8DD0x8y10E", this);} // tgen
ccc::DD0x8y10 ::DD0x8y10(){ note_ctor("_ZN3ccc8DD0x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y10E, buf);
    ::ccc::DD0x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y10E);
    dp->::ccc::DD0x8y10::~DD0x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y10E(Test__ZN3ccc8DD0x8y10E, "_ZN3ccc8DD0x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y10C1Ev();
extern void _ZN3ccc8DD0x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y10E[] = {
  NSPAIR(_ZN3ccc8DD0x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y10E[];
extern void _ZN3ccc8DD0x8y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x8y103abcEv,_ZTv0_n16_N3ccc8DD0x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x8y103abcEv,_ZThn4_N3ccc8DD0x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x8y103abcEv,_ZTv0_n16_N3ccc8DD0x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y10E[] = {
  {&(_ZTVN3ccc8DD0x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y10E[];
static VTBL_ENTRY alt_thunk_names260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x8y103abcEv,_ZTv0_n16_N3ccc8DD0x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x8y103abcEv,_ZThn4_N3ccc8DD0x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x8y10E = {  "_ZN3ccc8DD0x8y10E", // class name
  bases__ZN3ccc8DD0x8y10E, 2,
  &(vtc__ZN3ccc8DD0x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y10E),3, //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  CC0x8y11  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x8y113efgEv
  ~CC0x8y11(); // tgen
  CC0x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y11E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y113pqrEv");}
void  ccc::CC0x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x8y113efgEv");}
ccc::CC0x8y11 ::~CC0x8y11(){ note_dtor("_ZN3ccc8CC0x8y11E", this);} // tgen
ccc::CC0x8y11 ::CC0x8y11(){ note_ctor("_ZN3ccc8CC0x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y11E, buf);
    ::ccc::CC0x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y11E);
    dp->::ccc::CC0x8y11::~CC0x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y11E(Test__ZN3ccc8CC0x8y11E, "_ZN3ccc8CC0x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y11C1Ev();
extern void _ZN3ccc8CC0x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y11E[] = {
  NSPAIR(_ZN3ccc8CC0x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y11E[];
extern void _ZN3ccc8CC0x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC0x8y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x8y113efgEv,_ZTv0_n16_N3ccc8CC0x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y113efgEv,_ZThn4_N3ccc8CC0x8y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x8y113pqrEv,_ZTv0_n20_N3ccc8CC0x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y113pqrEv,_ZThn4_N3ccc8CC0x8y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x8y113efgEv,_ZTv0_n16_N3ccc8CC0x8y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x8y113pqrEv,_ZTv0_n20_N3ccc8CC0x8y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y11E[] = {
  {&(_ZTVN3ccc8CC0x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y11E[];
static VTBL_ENTRY alt_thunk_names261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x8y113pqrEv,_ZTv0_n20_N3ccc8CC0x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y113pqrEv,_ZThn4_N3ccc8CC0x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x8y113efgEv,_ZTv0_n16_N3ccc8CC0x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y113efgEv,_ZThn4_N3ccc8CC0x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x8y11E = {  "_ZN3ccc8CC0x8y11E", // class name
  bases__ZN3ccc8CC0x8y11E, 2,
  &(vtc__ZN3ccc8CC0x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y11E),2, //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  DD0x8y11  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD0x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x8y113efgEv
  ~DD0x8y11(); // tgen
  DD0x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x8y113pqrEv");}
void  ccc::DD0x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x8y113efgEv");}
ccc::DD0x8y11 ::~DD0x8y11(){ note_dtor("_ZN3ccc8DD0x8y11E", this);} // tgen
ccc::DD0x8y11 ::DD0x8y11(){ note_ctor("_ZN3ccc8DD0x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y11E, buf);
    ::ccc::DD0x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y11E);
    dp->::ccc::DD0x8y11::~DD0x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y11E(Test__ZN3ccc8DD0x8y11E, "_ZN3ccc8DD0x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y11C1Ev();
extern void _ZN3ccc8DD0x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y11E[] = {
  NSPAIR(_ZN3ccc8DD0x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x8y113efgEv();
extern void _ZN3ccc8DD0x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x8y113efgEv,_ZTv0_n12_N3ccc8DD0x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x8y113efgEv,_ZThn4_N3ccc8DD0x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x8y113efgEv,_ZTv0_n12_N3ccc8DD0x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y11E[] = {
  {&(_ZTVN3ccc8DD0x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y11E[];
static VTBL_ENTRY alt_thunk_names262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x8y113efgEv,_ZTv0_n12_N3ccc8DD0x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x8y113efgEv,_ZThn4_N3ccc8DD0x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x8y11E = {  "_ZN3ccc8DD0x8y11E", // class name
  bases__ZN3ccc8DD0x8y11E, 2,
  &(vtc__ZN3ccc8DD0x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y11E),3, //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  CC0x8y12  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC0x8y123abcEv
  ~CC0x8y12(); // tgen
  CC0x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x8y123abcEv");}
ccc::CC0x8y12 ::~CC0x8y12(){ note_dtor("_ZN3ccc8CC0x8y12E", this);} // tgen
ccc::CC0x8y12 ::CC0x8y12(){ note_ctor("_ZN3ccc8CC0x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y12E, buf);
    ::ccc::CC0x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y12E);
    dp->::ccc::CC0x8y12::~CC0x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y12E(Test__ZN3ccc8CC0x8y12E, "_ZN3ccc8CC0x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y12C1Ev();
extern void _ZN3ccc8CC0x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y12E[] = {
  NSPAIR(_ZN3ccc8CC0x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC0x8y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x8y123abcEv,_ZTv0_n12_N3ccc8CC0x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y123abcEv,_ZThn4_N3ccc8CC0x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x8y123abcEv,_ZTv0_n12_N3ccc8CC0x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y12E[] = {
  {&(_ZTVN3ccc8CC0x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y12E[];
static VTBL_ENTRY alt_thunk_names263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x8y123abcEv,_ZTv0_n12_N3ccc8CC0x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y123abcEv,_ZThn4_N3ccc8CC0x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x8y12E = {  "_ZN3ccc8CC0x8y12E", // class name
  bases__ZN3ccc8CC0x8y12E, 2,
  &(vtc__ZN3ccc8CC0x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y12E),2, //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  DD0x8y12  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD0x8y123abcEv
  ~DD0x8y12(); // tgen
  DD0x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x8y123abcEv");}
ccc::DD0x8y12 ::~DD0x8y12(){ note_dtor("_ZN3ccc8DD0x8y12E", this);} // tgen
ccc::DD0x8y12 ::DD0x8y12(){ note_ctor("_ZN3ccc8DD0x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y12E, buf);
    ::ccc::DD0x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y12E);
    dp->::ccc::DD0x8y12::~DD0x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y12E(Test__ZN3ccc8DD0x8y12E, "_ZN3ccc8DD0x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y12C1Ev();
extern void _ZN3ccc8DD0x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y12E[] = {
  NSPAIR(_ZN3ccc8DD0x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y12E[];
extern void _ZN3ccc8DD0x8y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x8y123abcEv,_ZTv0_n16_N3ccc8DD0x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x8y123abcEv,_ZThn4_N3ccc8DD0x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x8y123abcEv,_ZTv0_n16_N3ccc8DD0x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y12E[] = {
  {&(_ZTVN3ccc8DD0x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y12E[];
static VTBL_ENTRY alt_thunk_names264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x8y123abcEv,_ZTv0_n16_N3ccc8DD0x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x8y123abcEv,_ZThn4_N3ccc8DD0x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x8y12E = {  "_ZN3ccc8DD0x8y12E", // class name
  bases__ZN3ccc8DD0x8y12E, 2,
  &(vtc__ZN3ccc8DD0x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y12E),3, //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  CC0x8y13  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC0x8y133efgEv
  ~CC0x8y13(); // tgen
  CC0x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x8y133efgEv");}
ccc::CC0x8y13 ::~CC0x8y13(){ note_dtor("_ZN3ccc8CC0x8y13E", this);} // tgen
ccc::CC0x8y13 ::CC0x8y13(){ note_ctor("_ZN3ccc8CC0x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y13E, buf);
    ::ccc::CC0x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y13E);
    dp->::ccc::CC0x8y13::~CC0x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y13E(Test__ZN3ccc8CC0x8y13E, "_ZN3ccc8CC0x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y13C1Ev();
extern void _ZN3ccc8CC0x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y13E[] = {
  NSPAIR(_ZN3ccc8CC0x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y13E[];
extern void _ZN3ccc8CC0x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x8y133efgEv,_ZTv0_n16_N3ccc8CC0x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y133efgEv,_ZThn4_N3ccc8CC0x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x8y133efgEv,_ZTv0_n16_N3ccc8CC0x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y13E[] = {
  {&(_ZTVN3ccc8CC0x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y13E[];
static VTBL_ENTRY alt_thunk_names265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x8y133efgEv,_ZTv0_n16_N3ccc8CC0x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y133efgEv,_ZThn4_N3ccc8CC0x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x8y13E = {  "_ZN3ccc8CC0x8y13E", // class name
  bases__ZN3ccc8CC0x8y13E, 2,
  &(vtc__ZN3ccc8CC0x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y13E),2, //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  DD0x8y13  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD0x8y133efgEv
  ~DD0x8y13(); // tgen
  DD0x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x8y133efgEv");}
ccc::DD0x8y13 ::~DD0x8y13(){ note_dtor("_ZN3ccc8DD0x8y13E", this);} // tgen
ccc::DD0x8y13 ::DD0x8y13(){ note_ctor("_ZN3ccc8DD0x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y13E, buf);
    ::ccc::DD0x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y13E);
    dp->::ccc::DD0x8y13::~DD0x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y13E(Test__ZN3ccc8DD0x8y13E, "_ZN3ccc8DD0x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y13C1Ev();
extern void _ZN3ccc8DD0x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y13E[] = {
  NSPAIR(_ZN3ccc8DD0x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x8y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x8y133efgEv,_ZTv0_n12_N3ccc8DD0x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x8y133efgEv,_ZThn4_N3ccc8DD0x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x8y133efgEv,_ZTv0_n12_N3ccc8DD0x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y13E[] = {
  {&(_ZTVN3ccc8DD0x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y13E[];
static VTBL_ENTRY alt_thunk_names266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x8y133efgEv,_ZTv0_n12_N3ccc8DD0x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x8y133efgEv,_ZThn4_N3ccc8DD0x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x8y13E = {  "_ZN3ccc8DD0x8y13E", // class name
  bases__ZN3ccc8DD0x8y13E, 2,
  &(vtc__ZN3ccc8DD0x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y13E),3, //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  CC0x8y14  : virtual ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y143pqrEv
  ~CC0x8y14(); // tgen
  CC0x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y143pqrEv");}
ccc::CC0x8y14 ::~CC0x8y14(){ note_dtor("_ZN3ccc8CC0x8y14E", this);} // tgen
ccc::CC0x8y14 ::CC0x8y14(){ note_ctor("_ZN3ccc8CC0x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y14E, buf);
    ::ccc::CC0x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y14E);
    dp->::ccc::CC0x8y14::~CC0x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y14E(Test__ZN3ccc8CC0x8y14E, "_ZN3ccc8CC0x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y14C1Ev();
extern void _ZN3ccc8CC0x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y14E[] = {
  NSPAIR(_ZN3ccc8CC0x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC0x8y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x8y143pqrEv,_ZTv0_n20_N3ccc8CC0x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y143pqrEv,_ZThn4_N3ccc8CC0x8y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x8y143pqrEv,_ZTv0_n20_N3ccc8CC0x8y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y14E[] = {
  {&(_ZTVN3ccc8CC0x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y14E[];
static VTBL_ENTRY alt_thunk_names267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x8y143pqrEv,_ZTv0_n20_N3ccc8CC0x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x8y143pqrEv,_ZThn4_N3ccc8CC0x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x8y14E = {  "_ZN3ccc8CC0x8y14E", // class name
  bases__ZN3ccc8CC0x8y14E, 2,
  &(vtc__ZN3ccc8CC0x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y14E),2, //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  DD0x8y14  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD0x8y143pqrEv
  ~DD0x8y14(); // tgen
  DD0x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x8y143pqrEv");}
ccc::DD0x8y14 ::~DD0x8y14(){ note_dtor("_ZN3ccc8DD0x8y14E", this);} // tgen
ccc::DD0x8y14 ::DD0x8y14(){ note_ctor("_ZN3ccc8DD0x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y14E, buf);
    ::ccc::DD0x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y14E);
    dp->::ccc::DD0x8y14::~DD0x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y14E(Test__ZN3ccc8DD0x8y14E, "_ZN3ccc8DD0x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y14C1Ev();
extern void _ZN3ccc8DD0x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y14E[] = {
  NSPAIR(_ZN3ccc8DD0x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y14E[] = {
  {&(_ZTVN3ccc8DD0x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y14E[];
Class_Descriptor cd__ZN3ccc8DD0x8y14E = {  "_ZN3ccc8DD0x8y14E", // class name
  bases__ZN3ccc8DD0x8y14E, 2,
  &(vtc__ZN3ccc8DD0x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y15  : virtual ::ccc::AA0 , ::ccc::BB8 {
  ~CC0x8y15(); // tgen
  CC0x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x8y15 ::~CC0x8y15(){ note_dtor("_ZN3ccc8CC0x8y15E", this);} // tgen
ccc::CC0x8y15 ::CC0x8y15(){ note_ctor("_ZN3ccc8CC0x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y15E, buf);
    ::ccc::CC0x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC0x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y15E);
    dp->::ccc::CC0x8y15::~CC0x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y15E(Test__ZN3ccc8CC0x8y15E, "_ZN3ccc8CC0x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y15C1Ev();
extern void _ZN3ccc8CC0x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y15E[] = {
  NSPAIR(_ZN3ccc8CC0x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x8y15E[] = {
  {&(_ZTVN3ccc8CC0x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x8y15E[];
Class_Descriptor cd__ZN3ccc8CC0x8y15E = {  "_ZN3ccc8CC0x8y15E", // class name
  bases__ZN3ccc8CC0x8y15E, 2,
  &(vtc__ZN3ccc8CC0x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x8y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x8y15  : virtual ::ccc::AA0 , virtual ::ccc::BB8 {
  ~DD0x8y15(); // tgen
  DD0x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x8y15 ::~DD0x8y15(){ note_dtor("_ZN3ccc8DD0x8y15E", this);} // tgen
ccc::DD0x8y15 ::DD0x8y15(){ note_ctor("_ZN3ccc8DD0x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x8y15E, buf);
    ::ccc::DD0x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x8y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD0x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x8y15E);
    dp->::ccc::DD0x8y15::~DD0x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x8y15E(Test__ZN3ccc8DD0x8y15E, "_ZN3ccc8DD0x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x8y15C1Ev();
extern void _ZN3ccc8DD0x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x8y15E[] = {
  NSPAIR(_ZN3ccc8DD0x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD0x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x8y15E[] = {
  {&(_ZTVN3ccc8DD0x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x8y15E[];
Class_Descriptor cd__ZN3ccc8DD0x8y15E = {  "_ZN3ccc8DD0x8y15E", // class name
  bases__ZN3ccc8DD0x8y15E, 2,
  &(vtc__ZN3ccc8DD0x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x8y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y0  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y03pqrEv
  ~CC0x9y0(); // tgen
  CC0x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y0E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y03abcEv");}
void  ccc::CC0x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y03efgEv");}
void  ccc::CC0x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y03pqrEv");}
ccc::CC0x9y0 ::~CC0x9y0(){ note_dtor("_ZN3ccc7CC0x9y0E", this);} // tgen
ccc::CC0x9y0 ::CC0x9y0(){ note_ctor("_ZN3ccc7CC0x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y0E, buf);
    ::ccc::CC0x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y0E);
    dp->::ccc::CC0x9y0::~CC0x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y0E(Test__ZN3ccc7CC0x9y0E, "_ZN3ccc7CC0x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y0C1Ev();
extern void _ZN3ccc7CC0x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y0E[] = {
  NSPAIR(_ZN3ccc7CC0x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y0E[];
extern void _ZN3ccc7CC0x9y03efgEv();
extern void _ZN3ccc7CC0x9y03pqrEv();
extern void _ZN3ccc7CC0x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y03abcEv,_ZTv0_n12_N3ccc7CC0x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y03abcEv,_ZThn4_N3ccc7CC0x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y03efgEv,_ZTv0_n16_N3ccc7CC0x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y03efgEv,_ZThn4_N3ccc7CC0x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y03pqrEv,_ZTv0_n20_N3ccc7CC0x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y03pqrEv,_ZThn4_N3ccc7CC0x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y03abcEv,_ZTv0_n12_N3ccc7CC0x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y03efgEv,_ZTv0_n16_N3ccc7CC0x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y03pqrEv,_ZTv0_n20_N3ccc7CC0x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y0E[] = {
  {&(_ZTVN3ccc7CC0x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y0E[];
static VTBL_ENTRY alt_thunk_names268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y03pqrEv,_ZTv0_n20_N3ccc7CC0x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y03pqrEv,_ZThn4_N3ccc7CC0x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y03efgEv,_ZTv0_n16_N3ccc7CC0x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y03efgEv,_ZThn4_N3ccc7CC0x9y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y03abcEv,_ZTv0_n12_N3ccc7CC0x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y03abcEv,_ZThn4_N3ccc7CC0x9y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y0E = {  "_ZN3ccc7CC0x9y0E", // class name
  bases__ZN3ccc7CC0x9y0E, 2,
  &(vtc__ZN3ccc7CC0x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y0E),2, //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  DD0x9y0  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD0x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD0x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y03pqrEv
  ~DD0x9y0(); // tgen
  DD0x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y03abcEv");}
void  ccc::DD0x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y03efgEv");}
void  ccc::DD0x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y03pqrEv");}
ccc::DD0x9y0 ::~DD0x9y0(){ note_dtor("_ZN3ccc7DD0x9y0E", this);} // tgen
ccc::DD0x9y0 ::DD0x9y0(){ note_ctor("_ZN3ccc7DD0x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y0E, buf);
    ::ccc::DD0x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y0E);
    dp->::ccc::DD0x9y0::~DD0x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y0E(Test__ZN3ccc7DD0x9y0E, "_ZN3ccc7DD0x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y0C1Ev();
extern void _ZN3ccc7DD0x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y0E[] = {
  NSPAIR(_ZN3ccc7DD0x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y0E[];
extern void _ZN3ccc7DD0x9y03abcEv();
extern void _ZN3ccc7DD0x9y03efgEv();
extern void _ZN3ccc7DD0x9y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y03efgEv,_ZTv0_n12_N3ccc7DD0x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y03efgEv,_ZThn4_N3ccc7DD0x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y03pqrEv,_ZTv0_n16_N3ccc7DD0x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y03pqrEv,_ZThn4_N3ccc7DD0x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y03efgEv,_ZTv0_n12_N3ccc7DD0x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y03pqrEv,_ZTv0_n16_N3ccc7DD0x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y0E[] = {
  {&(_ZTVN3ccc7DD0x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y0E[];
static VTBL_ENTRY alt_thunk_names269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y03pqrEv,_ZTv0_n16_N3ccc7DD0x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y03pqrEv,_ZThn4_N3ccc7DD0x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y03efgEv,_ZTv0_n12_N3ccc7DD0x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y03efgEv,_ZThn4_N3ccc7DD0x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y0E = {  "_ZN3ccc7DD0x9y0E", // class name
  bases__ZN3ccc7DD0x9y0E, 2,
  &(vtc__ZN3ccc7DD0x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y0E),3, //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  CC0x9y1  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x9y13efgEv
  ~CC0x9y1(); // tgen
  CC0x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y1E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y13abcEv");}
void  ccc::CC0x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y13pqrEv");}
void  ccc::CC0x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y13efgEv");}
ccc::CC0x9y1 ::~CC0x9y1(){ note_dtor("_ZN3ccc7CC0x9y1E", this);} // tgen
ccc::CC0x9y1 ::CC0x9y1(){ note_ctor("_ZN3ccc7CC0x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y1E, buf);
    ::ccc::CC0x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y1E);
    dp->::ccc::CC0x9y1::~CC0x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y1E(Test__ZN3ccc7CC0x9y1E, "_ZN3ccc7CC0x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y1C1Ev();
extern void _ZN3ccc7CC0x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y1E[] = {
  NSPAIR(_ZN3ccc7CC0x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y1E[];
extern void _ZN3ccc7CC0x9y13efgEv();
extern void _ZN3ccc7CC0x9y13pqrEv();
extern void _ZN3ccc7CC0x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y13abcEv,_ZTv0_n12_N3ccc7CC0x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y13abcEv,_ZThn4_N3ccc7CC0x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y13efgEv,_ZTv0_n16_N3ccc7CC0x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y13efgEv,_ZThn4_N3ccc7CC0x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y13pqrEv,_ZTv0_n20_N3ccc7CC0x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y13pqrEv,_ZThn4_N3ccc7CC0x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y13abcEv,_ZTv0_n12_N3ccc7CC0x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y13efgEv,_ZTv0_n16_N3ccc7CC0x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y13pqrEv,_ZTv0_n20_N3ccc7CC0x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y1E[] = {
  {&(_ZTVN3ccc7CC0x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y1E[];
static VTBL_ENTRY alt_thunk_names270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y13pqrEv,_ZTv0_n20_N3ccc7CC0x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y13pqrEv,_ZThn4_N3ccc7CC0x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y13efgEv,_ZTv0_n16_N3ccc7CC0x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y13efgEv,_ZThn4_N3ccc7CC0x9y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y13abcEv,_ZTv0_n12_N3ccc7CC0x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y13abcEv,_ZThn4_N3ccc7CC0x9y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y1E = {  "_ZN3ccc7CC0x9y1E", // class name
  bases__ZN3ccc7CC0x9y1E, 2,
  &(vtc__ZN3ccc7CC0x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y1E),2, //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  DD0x9y1  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD0x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x9y13efgEv
  ~DD0x9y1(); // tgen
  DD0x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y13abcEv");}
void  ccc::DD0x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y13pqrEv");}
void  ccc::DD0x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y13efgEv");}
ccc::DD0x9y1 ::~DD0x9y1(){ note_dtor("_ZN3ccc7DD0x9y1E", this);} // tgen
ccc::DD0x9y1 ::DD0x9y1(){ note_ctor("_ZN3ccc7DD0x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y1E, buf);
    ::ccc::DD0x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y1E);
    dp->::ccc::DD0x9y1::~DD0x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y1E(Test__ZN3ccc7DD0x9y1E, "_ZN3ccc7DD0x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y1C1Ev();
extern void _ZN3ccc7DD0x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y1E[] = {
  NSPAIR(_ZN3ccc7DD0x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y1E[];
extern void _ZN3ccc7DD0x9y13abcEv();
extern void _ZN3ccc7DD0x9y13efgEv();
extern void _ZN3ccc7DD0x9y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y13efgEv,_ZTv0_n12_N3ccc7DD0x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y13efgEv,_ZThn4_N3ccc7DD0x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y13pqrEv,_ZTv0_n16_N3ccc7DD0x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y13pqrEv,_ZThn4_N3ccc7DD0x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y13efgEv,_ZTv0_n12_N3ccc7DD0x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y13pqrEv,_ZTv0_n16_N3ccc7DD0x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y1E[] = {
  {&(_ZTVN3ccc7DD0x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y1E[];
static VTBL_ENTRY alt_thunk_names271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y13pqrEv,_ZTv0_n16_N3ccc7DD0x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y13pqrEv,_ZThn4_N3ccc7DD0x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y13efgEv,_ZTv0_n12_N3ccc7DD0x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y13efgEv,_ZThn4_N3ccc7DD0x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y1E = {  "_ZN3ccc7DD0x9y1E", // class name
  bases__ZN3ccc7DD0x9y1E, 2,
  &(vtc__ZN3ccc7DD0x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y1E),3, //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  CC0x9y2  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y23pqrEv
  ~CC0x9y2(); // tgen
  CC0x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y2E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y23efgEv");}
void  ccc::CC0x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y23abcEv");}
void  ccc::CC0x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y23pqrEv");}
ccc::CC0x9y2 ::~CC0x9y2(){ note_dtor("_ZN3ccc7CC0x9y2E", this);} // tgen
ccc::CC0x9y2 ::CC0x9y2(){ note_ctor("_ZN3ccc7CC0x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y2E, buf);
    ::ccc::CC0x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y2E);
    dp->::ccc::CC0x9y2::~CC0x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y2E(Test__ZN3ccc7CC0x9y2E, "_ZN3ccc7CC0x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y2C1Ev();
extern void _ZN3ccc7CC0x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y2E[] = {
  NSPAIR(_ZN3ccc7CC0x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y2E[];
extern void _ZN3ccc7CC0x9y23efgEv();
extern void _ZN3ccc7CC0x9y23pqrEv();
extern void _ZN3ccc7CC0x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y23abcEv,_ZTv0_n12_N3ccc7CC0x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y23abcEv,_ZThn4_N3ccc7CC0x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y23efgEv,_ZTv0_n16_N3ccc7CC0x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y23efgEv,_ZThn4_N3ccc7CC0x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y23pqrEv,_ZTv0_n20_N3ccc7CC0x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y23pqrEv,_ZThn4_N3ccc7CC0x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y23abcEv,_ZTv0_n12_N3ccc7CC0x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y23efgEv,_ZTv0_n16_N3ccc7CC0x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y23pqrEv,_ZTv0_n20_N3ccc7CC0x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y2E[] = {
  {&(_ZTVN3ccc7CC0x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y2E[];
static VTBL_ENTRY alt_thunk_names272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y23pqrEv,_ZTv0_n20_N3ccc7CC0x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y23pqrEv,_ZThn4_N3ccc7CC0x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y23efgEv,_ZTv0_n16_N3ccc7CC0x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y23efgEv,_ZThn4_N3ccc7CC0x9y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y23abcEv,_ZTv0_n12_N3ccc7CC0x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y23abcEv,_ZThn4_N3ccc7CC0x9y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y2E = {  "_ZN3ccc7CC0x9y2E", // class name
  bases__ZN3ccc7CC0x9y2E, 2,
  &(vtc__ZN3ccc7CC0x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y2E),2, //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  DD0x9y2  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD0x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD0x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y23pqrEv
  ~DD0x9y2(); // tgen
  DD0x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y23efgEv");}
void  ccc::DD0x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y23abcEv");}
void  ccc::DD0x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y23pqrEv");}
ccc::DD0x9y2 ::~DD0x9y2(){ note_dtor("_ZN3ccc7DD0x9y2E", this);} // tgen
ccc::DD0x9y2 ::DD0x9y2(){ note_ctor("_ZN3ccc7DD0x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y2E, buf);
    ::ccc::DD0x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y2E);
    dp->::ccc::DD0x9y2::~DD0x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y2E(Test__ZN3ccc7DD0x9y2E, "_ZN3ccc7DD0x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y2C1Ev();
extern void _ZN3ccc7DD0x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y2E[] = {
  NSPAIR(_ZN3ccc7DD0x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y2E[];
extern void _ZN3ccc7DD0x9y23abcEv();
extern void _ZN3ccc7DD0x9y23efgEv();
extern void _ZN3ccc7DD0x9y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y23efgEv,_ZTv0_n12_N3ccc7DD0x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y23efgEv,_ZThn4_N3ccc7DD0x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y23pqrEv,_ZTv0_n16_N3ccc7DD0x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y23pqrEv,_ZThn4_N3ccc7DD0x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y23efgEv,_ZTv0_n12_N3ccc7DD0x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y23pqrEv,_ZTv0_n16_N3ccc7DD0x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y2E[] = {
  {&(_ZTVN3ccc7DD0x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y2E[];
static VTBL_ENTRY alt_thunk_names273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y23pqrEv,_ZTv0_n16_N3ccc7DD0x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y23pqrEv,_ZThn4_N3ccc7DD0x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y23efgEv,_ZTv0_n12_N3ccc7DD0x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y23efgEv,_ZThn4_N3ccc7DD0x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y2E = {  "_ZN3ccc7DD0x9y2E", // class name
  bases__ZN3ccc7DD0x9y2E, 2,
  &(vtc__ZN3ccc7DD0x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y2E),3, //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  CC0x9y3  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x9y33abcEv
  ~CC0x9y3(); // tgen
  CC0x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y3E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y33efgEv");}
void  ccc::CC0x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y33pqrEv");}
void  ccc::CC0x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y33abcEv");}
ccc::CC0x9y3 ::~CC0x9y3(){ note_dtor("_ZN3ccc7CC0x9y3E", this);} // tgen
ccc::CC0x9y3 ::CC0x9y3(){ note_ctor("_ZN3ccc7CC0x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y3E, buf);
    ::ccc::CC0x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y3E);
    dp->::ccc::CC0x9y3::~CC0x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y3E(Test__ZN3ccc7CC0x9y3E, "_ZN3ccc7CC0x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y3C1Ev();
extern void _ZN3ccc7CC0x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y3E[] = {
  NSPAIR(_ZN3ccc7CC0x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y3E[];
extern void _ZN3ccc7CC0x9y33efgEv();
extern void _ZN3ccc7CC0x9y33pqrEv();
extern void _ZN3ccc7CC0x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y33abcEv,_ZTv0_n12_N3ccc7CC0x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y33abcEv,_ZThn4_N3ccc7CC0x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y33efgEv,_ZTv0_n16_N3ccc7CC0x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y33efgEv,_ZThn4_N3ccc7CC0x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y33pqrEv,_ZTv0_n20_N3ccc7CC0x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y33pqrEv,_ZThn4_N3ccc7CC0x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y33abcEv,_ZTv0_n12_N3ccc7CC0x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y33efgEv,_ZTv0_n16_N3ccc7CC0x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y33pqrEv,_ZTv0_n20_N3ccc7CC0x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y3E[] = {
  {&(_ZTVN3ccc7CC0x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y3E[];
static VTBL_ENTRY alt_thunk_names274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y33pqrEv,_ZTv0_n20_N3ccc7CC0x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y33pqrEv,_ZThn4_N3ccc7CC0x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y33efgEv,_ZTv0_n16_N3ccc7CC0x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y33efgEv,_ZThn4_N3ccc7CC0x9y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y33abcEv,_ZTv0_n12_N3ccc7CC0x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y33abcEv,_ZThn4_N3ccc7CC0x9y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y3E = {  "_ZN3ccc7CC0x9y3E", // class name
  bases__ZN3ccc7CC0x9y3E, 2,
  &(vtc__ZN3ccc7CC0x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y3E),2, //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  DD0x9y3  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD0x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x9y33abcEv
  ~DD0x9y3(); // tgen
  DD0x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y33efgEv");}
void  ccc::DD0x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y33pqrEv");}
void  ccc::DD0x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y33abcEv");}
ccc::DD0x9y3 ::~DD0x9y3(){ note_dtor("_ZN3ccc7DD0x9y3E", this);} // tgen
ccc::DD0x9y3 ::DD0x9y3(){ note_ctor("_ZN3ccc7DD0x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y3E, buf);
    ::ccc::DD0x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y3E);
    dp->::ccc::DD0x9y3::~DD0x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y3E(Test__ZN3ccc7DD0x9y3E, "_ZN3ccc7DD0x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y3C1Ev();
extern void _ZN3ccc7DD0x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y3E[] = {
  NSPAIR(_ZN3ccc7DD0x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y3E[];
extern void _ZN3ccc7DD0x9y33abcEv();
extern void _ZN3ccc7DD0x9y33efgEv();
extern void _ZN3ccc7DD0x9y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y33efgEv,_ZTv0_n12_N3ccc7DD0x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y33efgEv,_ZThn4_N3ccc7DD0x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y33pqrEv,_ZTv0_n16_N3ccc7DD0x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y33pqrEv,_ZThn4_N3ccc7DD0x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y33efgEv,_ZTv0_n12_N3ccc7DD0x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y33pqrEv,_ZTv0_n16_N3ccc7DD0x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y3E[] = {
  {&(_ZTVN3ccc7DD0x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y3E[];
static VTBL_ENTRY alt_thunk_names275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y33pqrEv,_ZTv0_n16_N3ccc7DD0x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y33pqrEv,_ZThn4_N3ccc7DD0x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y33efgEv,_ZTv0_n12_N3ccc7DD0x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y33efgEv,_ZThn4_N3ccc7DD0x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y3E = {  "_ZN3ccc7DD0x9y3E", // class name
  bases__ZN3ccc7DD0x9y3E, 2,
  &(vtc__ZN3ccc7DD0x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y3E),3, //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  CC0x9y4  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC0x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y43efgEv
  ~CC0x9y4(); // tgen
  CC0x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y4E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y43pqrEv");}
void  ccc::CC0x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y43abcEv");}
void  ccc::CC0x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y43efgEv");}
ccc::CC0x9y4 ::~CC0x9y4(){ note_dtor("_ZN3ccc7CC0x9y4E", this);} // tgen
ccc::CC0x9y4 ::CC0x9y4(){ note_ctor("_ZN3ccc7CC0x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y4E, buf);
    ::ccc::CC0x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y4E);
    dp->::ccc::CC0x9y4::~CC0x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y4E(Test__ZN3ccc7CC0x9y4E, "_ZN3ccc7CC0x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y4C1Ev();
extern void _ZN3ccc7CC0x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y4E[] = {
  NSPAIR(_ZN3ccc7CC0x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y4E[];
extern void _ZN3ccc7CC0x9y43efgEv();
extern void _ZN3ccc7CC0x9y43pqrEv();
extern void _ZN3ccc7CC0x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y43abcEv,_ZTv0_n12_N3ccc7CC0x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y43abcEv,_ZThn4_N3ccc7CC0x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y43efgEv,_ZTv0_n16_N3ccc7CC0x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y43efgEv,_ZThn4_N3ccc7CC0x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y43pqrEv,_ZTv0_n20_N3ccc7CC0x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y43pqrEv,_ZThn4_N3ccc7CC0x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y43abcEv,_ZTv0_n12_N3ccc7CC0x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y43efgEv,_ZTv0_n16_N3ccc7CC0x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y43pqrEv,_ZTv0_n20_N3ccc7CC0x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y4E[] = {
  {&(_ZTVN3ccc7CC0x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y4E[];
static VTBL_ENTRY alt_thunk_names276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y43pqrEv,_ZTv0_n20_N3ccc7CC0x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y43pqrEv,_ZThn4_N3ccc7CC0x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y43efgEv,_ZTv0_n16_N3ccc7CC0x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y43efgEv,_ZThn4_N3ccc7CC0x9y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y43abcEv,_ZTv0_n12_N3ccc7CC0x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y43abcEv,_ZThn4_N3ccc7CC0x9y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y4E = {  "_ZN3ccc7CC0x9y4E", // class name
  bases__ZN3ccc7CC0x9y4E, 2,
  &(vtc__ZN3ccc7CC0x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y4E),2, //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  DD0x9y4  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD0x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD0x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD0x9y43efgEv
  ~DD0x9y4(); // tgen
  DD0x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y43pqrEv");}
void  ccc::DD0x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y43abcEv");}
void  ccc::DD0x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y43efgEv");}
ccc::DD0x9y4 ::~DD0x9y4(){ note_dtor("_ZN3ccc7DD0x9y4E", this);} // tgen
ccc::DD0x9y4 ::DD0x9y4(){ note_ctor("_ZN3ccc7DD0x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y4E, buf);
    ::ccc::DD0x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y4E);
    dp->::ccc::DD0x9y4::~DD0x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y4E(Test__ZN3ccc7DD0x9y4E, "_ZN3ccc7DD0x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y4C1Ev();
extern void _ZN3ccc7DD0x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y4E[] = {
  NSPAIR(_ZN3ccc7DD0x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y4E[];
extern void _ZN3ccc7DD0x9y43abcEv();
extern void _ZN3ccc7DD0x9y43efgEv();
extern void _ZN3ccc7DD0x9y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y43efgEv,_ZTv0_n12_N3ccc7DD0x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y43efgEv,_ZThn4_N3ccc7DD0x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y43pqrEv,_ZTv0_n16_N3ccc7DD0x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y43pqrEv,_ZThn4_N3ccc7DD0x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y43efgEv,_ZTv0_n12_N3ccc7DD0x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y43pqrEv,_ZTv0_n16_N3ccc7DD0x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y4E[] = {
  {&(_ZTVN3ccc7DD0x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y4E[];
static VTBL_ENTRY alt_thunk_names277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y43pqrEv,_ZTv0_n16_N3ccc7DD0x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y43pqrEv,_ZThn4_N3ccc7DD0x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y43efgEv,_ZTv0_n12_N3ccc7DD0x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y43efgEv,_ZThn4_N3ccc7DD0x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y4E = {  "_ZN3ccc7DD0x9y4E", // class name
  bases__ZN3ccc7DD0x9y4E, 2,
  &(vtc__ZN3ccc7DD0x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y4E),3, //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  CC0x9y5  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC0x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y53abcEv
  ~CC0x9y5(); // tgen
  CC0x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y5E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y53pqrEv");}
void  ccc::CC0x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y53efgEv");}
void  ccc::CC0x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y53abcEv");}
ccc::CC0x9y5 ::~CC0x9y5(){ note_dtor("_ZN3ccc7CC0x9y5E", this);} // tgen
ccc::CC0x9y5 ::CC0x9y5(){ note_ctor("_ZN3ccc7CC0x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y5E, buf);
    ::ccc::CC0x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y5E);
    dp->::ccc::CC0x9y5::~CC0x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y5E(Test__ZN3ccc7CC0x9y5E, "_ZN3ccc7CC0x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y5C1Ev();
extern void _ZN3ccc7CC0x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y5E[] = {
  NSPAIR(_ZN3ccc7CC0x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y5E[];
extern void _ZN3ccc7CC0x9y53efgEv();
extern void _ZN3ccc7CC0x9y53pqrEv();
extern void _ZN3ccc7CC0x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y53abcEv,_ZTv0_n12_N3ccc7CC0x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y53abcEv,_ZThn4_N3ccc7CC0x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y53efgEv,_ZTv0_n16_N3ccc7CC0x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y53efgEv,_ZThn4_N3ccc7CC0x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y53pqrEv,_ZTv0_n20_N3ccc7CC0x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y53pqrEv,_ZThn4_N3ccc7CC0x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y53abcEv,_ZTv0_n12_N3ccc7CC0x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y53efgEv,_ZTv0_n16_N3ccc7CC0x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y53pqrEv,_ZTv0_n20_N3ccc7CC0x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y5E[] = {
  {&(_ZTVN3ccc7CC0x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y5E[];
static VTBL_ENTRY alt_thunk_names278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y53pqrEv,_ZTv0_n20_N3ccc7CC0x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y53pqrEv,_ZThn4_N3ccc7CC0x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y53efgEv,_ZTv0_n16_N3ccc7CC0x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y53efgEv,_ZThn4_N3ccc7CC0x9y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y53abcEv,_ZTv0_n12_N3ccc7CC0x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y53abcEv,_ZThn4_N3ccc7CC0x9y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y5E = {  "_ZN3ccc7CC0x9y5E", // class name
  bases__ZN3ccc7CC0x9y5E, 2,
  &(vtc__ZN3ccc7CC0x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x9y5  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD0x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD0x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD0x9y53abcEv
  ~DD0x9y5(); // tgen
  DD0x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y53pqrEv");}
void  ccc::DD0x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y53efgEv");}
void  ccc::DD0x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y53abcEv");}
ccc::DD0x9y5 ::~DD0x9y5(){ note_dtor("_ZN3ccc7DD0x9y5E", this);} // tgen
ccc::DD0x9y5 ::DD0x9y5(){ note_ctor("_ZN3ccc7DD0x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y5E, buf);
    ::ccc::DD0x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y5E);
    dp->::ccc::DD0x9y5::~DD0x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y5E(Test__ZN3ccc7DD0x9y5E, "_ZN3ccc7DD0x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y5C1Ev();
extern void _ZN3ccc7DD0x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y5E[] = {
  NSPAIR(_ZN3ccc7DD0x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y5E[];
extern void _ZN3ccc7DD0x9y53abcEv();
extern void _ZN3ccc7DD0x9y53efgEv();
extern void _ZN3ccc7DD0x9y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y53efgEv,_ZTv0_n12_N3ccc7DD0x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y53efgEv,_ZThn4_N3ccc7DD0x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y53pqrEv,_ZTv0_n16_N3ccc7DD0x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y53pqrEv,_ZThn4_N3ccc7DD0x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y53efgEv,_ZTv0_n12_N3ccc7DD0x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y53pqrEv,_ZTv0_n16_N3ccc7DD0x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y5E[] = {
  {&(_ZTVN3ccc7DD0x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y5E[];
static VTBL_ENTRY alt_thunk_names279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y53pqrEv,_ZTv0_n16_N3ccc7DD0x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y53pqrEv,_ZThn4_N3ccc7DD0x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y53efgEv,_ZTv0_n12_N3ccc7DD0x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y53efgEv,_ZThn4_N3ccc7DD0x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y5E = {  "_ZN3ccc7DD0x9y5E", // class name
  bases__ZN3ccc7DD0x9y5E, 2,
  &(vtc__ZN3ccc7DD0x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y5E),3, //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  CC0x9y6  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y63efgEv
  ~CC0x9y6(); // tgen
  CC0x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y6E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y63abcEv");}
void  ccc::CC0x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y63efgEv");}
ccc::CC0x9y6 ::~CC0x9y6(){ note_dtor("_ZN3ccc7CC0x9y6E", this);} // tgen
ccc::CC0x9y6 ::CC0x9y6(){ note_ctor("_ZN3ccc7CC0x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y6E, buf);
    ::ccc::CC0x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y6E);
    dp->::ccc::CC0x9y6::~CC0x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y6E(Test__ZN3ccc7CC0x9y6E, "_ZN3ccc7CC0x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y6C1Ev();
extern void _ZN3ccc7CC0x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y6E[] = {
  NSPAIR(_ZN3ccc7CC0x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y6E[];
extern void _ZN3ccc7CC0x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC0x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y63abcEv,_ZTv0_n12_N3ccc7CC0x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y63abcEv,_ZThn4_N3ccc7CC0x9y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y63efgEv,_ZTv0_n16_N3ccc7CC0x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y63efgEv,_ZThn4_N3ccc7CC0x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y63abcEv,_ZTv0_n12_N3ccc7CC0x9y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y63efgEv,_ZTv0_n16_N3ccc7CC0x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y6E[] = {
  {&(_ZTVN3ccc7CC0x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y6E[];
static VTBL_ENTRY alt_thunk_names280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y63efgEv,_ZTv0_n16_N3ccc7CC0x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y63efgEv,_ZThn4_N3ccc7CC0x9y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y63abcEv,_ZTv0_n12_N3ccc7CC0x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y63abcEv,_ZThn4_N3ccc7CC0x9y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y6E = {  "_ZN3ccc7CC0x9y6E", // class name
  bases__ZN3ccc7CC0x9y6E, 2,
  &(vtc__ZN3ccc7CC0x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y6E),2, //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  DD0x9y6  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD0x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD0x9y63efgEv
  ~DD0x9y6(); // tgen
  DD0x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y63abcEv");}
void  ccc::DD0x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y63efgEv");}
ccc::DD0x9y6 ::~DD0x9y6(){ note_dtor("_ZN3ccc7DD0x9y6E", this);} // tgen
ccc::DD0x9y6 ::DD0x9y6(){ note_ctor("_ZN3ccc7DD0x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y6E, buf);
    ::ccc::DD0x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y6E);
    dp->::ccc::DD0x9y6::~DD0x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y6E(Test__ZN3ccc7DD0x9y6E, "_ZN3ccc7DD0x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y6C1Ev();
extern void _ZN3ccc7DD0x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y6E[] = {
  NSPAIR(_ZN3ccc7DD0x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y6E[];
extern void _ZN3ccc7DD0x9y63abcEv();
extern void _ZN3ccc7DD0x9y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y63efgEv,_ZTv0_n12_N3ccc7DD0x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y63efgEv,_ZThn4_N3ccc7DD0x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y63efgEv,_ZTv0_n12_N3ccc7DD0x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y6E[] = {
  {&(_ZTVN3ccc7DD0x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y6E[];
static VTBL_ENTRY alt_thunk_names281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y63efgEv,_ZTv0_n12_N3ccc7DD0x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y63efgEv,_ZThn4_N3ccc7DD0x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y6E = {  "_ZN3ccc7DD0x9y6E", // class name
  bases__ZN3ccc7DD0x9y6E, 2,
  &(vtc__ZN3ccc7DD0x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y6E),3, //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  CC0x9y7  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y73pqrEv
  ~CC0x9y7(); // tgen
  CC0x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y7E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y73abcEv");}
void  ccc::CC0x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y73pqrEv");}
ccc::CC0x9y7 ::~CC0x9y7(){ note_dtor("_ZN3ccc7CC0x9y7E", this);} // tgen
ccc::CC0x9y7 ::CC0x9y7(){ note_ctor("_ZN3ccc7CC0x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y7E, buf);
    ::ccc::CC0x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y7E);
    dp->::ccc::CC0x9y7::~CC0x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y7E(Test__ZN3ccc7CC0x9y7E, "_ZN3ccc7CC0x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y7C1Ev();
extern void _ZN3ccc7CC0x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y7E[] = {
  NSPAIR(_ZN3ccc7CC0x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC0x9y73pqrEv();
extern void _ZN3ccc7CC0x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y73abcEv,_ZTv0_n12_N3ccc7CC0x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y73abcEv,_ZThn4_N3ccc7CC0x9y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y73pqrEv,_ZTv0_n20_N3ccc7CC0x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y73pqrEv,_ZThn4_N3ccc7CC0x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y73abcEv,_ZTv0_n12_N3ccc7CC0x9y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y73pqrEv,_ZTv0_n20_N3ccc7CC0x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y7E[] = {
  {&(_ZTVN3ccc7CC0x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y7E[];
static VTBL_ENTRY alt_thunk_names282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y73pqrEv,_ZTv0_n20_N3ccc7CC0x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y73pqrEv,_ZThn4_N3ccc7CC0x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y73abcEv,_ZTv0_n12_N3ccc7CC0x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y73abcEv,_ZThn4_N3ccc7CC0x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y7E = {  "_ZN3ccc7CC0x9y7E", // class name
  bases__ZN3ccc7CC0x9y7E, 2,
  &(vtc__ZN3ccc7CC0x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y7E),2, //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  DD0x9y7  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD0x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y73pqrEv
  ~DD0x9y7(); // tgen
  DD0x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y73abcEv");}
void  ccc::DD0x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y73pqrEv");}
ccc::DD0x9y7 ::~DD0x9y7(){ note_dtor("_ZN3ccc7DD0x9y7E", this);} // tgen
ccc::DD0x9y7 ::DD0x9y7(){ note_ctor("_ZN3ccc7DD0x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y7E, buf);
    ::ccc::DD0x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y7E);
    dp->::ccc::DD0x9y7::~DD0x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y7E(Test__ZN3ccc7DD0x9y7E, "_ZN3ccc7DD0x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y7C1Ev();
extern void _ZN3ccc7DD0x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y7E[] = {
  NSPAIR(_ZN3ccc7DD0x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y7E[];
extern void _ZN3ccc7DD0x9y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7DD0x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y73pqrEv,_ZTv0_n16_N3ccc7DD0x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y73pqrEv,_ZThn4_N3ccc7DD0x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y73pqrEv,_ZTv0_n16_N3ccc7DD0x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y7E[] = {
  {&(_ZTVN3ccc7DD0x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y7E[];
static VTBL_ENTRY alt_thunk_names283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y73pqrEv,_ZTv0_n16_N3ccc7DD0x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y73pqrEv,_ZThn4_N3ccc7DD0x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y7E = {  "_ZN3ccc7DD0x9y7E", // class name
  bases__ZN3ccc7DD0x9y7E, 2,
  &(vtc__ZN3ccc7DD0x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y7E),3, //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  CC0x9y8  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y83abcEv
  ~CC0x9y8(); // tgen
  CC0x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y8E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y83efgEv");}
void  ccc::CC0x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y83abcEv");}
ccc::CC0x9y8 ::~CC0x9y8(){ note_dtor("_ZN3ccc7CC0x9y8E", this);} // tgen
ccc::CC0x9y8 ::CC0x9y8(){ note_ctor("_ZN3ccc7CC0x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y8E, buf);
    ::ccc::CC0x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y8E);
    dp->::ccc::CC0x9y8::~CC0x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y8E(Test__ZN3ccc7CC0x9y8E, "_ZN3ccc7CC0x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y8C1Ev();
extern void _ZN3ccc7CC0x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y8E[] = {
  NSPAIR(_ZN3ccc7CC0x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y8E[];
extern void _ZN3ccc7CC0x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC0x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC0x9y83abcEv,_ZTv0_n12_N3ccc7CC0x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y83abcEv,_ZThn4_N3ccc7CC0x9y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y83efgEv,_ZTv0_n16_N3ccc7CC0x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y83efgEv,_ZThn4_N3ccc7CC0x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC0x9y83abcEv,_ZTv0_n12_N3ccc7CC0x9y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y83efgEv,_ZTv0_n16_N3ccc7CC0x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y8E[] = {
  {&(_ZTVN3ccc7CC0x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC0x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y8E[];
static VTBL_ENTRY alt_thunk_names284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y83efgEv,_ZTv0_n16_N3ccc7CC0x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y83efgEv,_ZThn4_N3ccc7CC0x9y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC0x9y83abcEv,_ZTv0_n12_N3ccc7CC0x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y83abcEv,_ZThn4_N3ccc7CC0x9y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y8E = {  "_ZN3ccc7CC0x9y8E", // class name
  bases__ZN3ccc7CC0x9y8E, 2,
  &(vtc__ZN3ccc7CC0x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y8E),2, //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  DD0x9y8  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD0x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD0x9y83abcEv
  ~DD0x9y8(); // tgen
  DD0x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y83efgEv");}
void  ccc::DD0x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD0x9y83abcEv");}
ccc::DD0x9y8 ::~DD0x9y8(){ note_dtor("_ZN3ccc7DD0x9y8E", this);} // tgen
ccc::DD0x9y8 ::DD0x9y8(){ note_ctor("_ZN3ccc7DD0x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y8E, buf);
    ::ccc::DD0x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y8E);
    dp->::ccc::DD0x9y8::~DD0x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y8E(Test__ZN3ccc7DD0x9y8E, "_ZN3ccc7DD0x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y8C1Ev();
extern void _ZN3ccc7DD0x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y8E[] = {
  NSPAIR(_ZN3ccc7DD0x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y8E[];
extern void _ZN3ccc7DD0x9y83abcEv();
extern void _ZN3ccc7DD0x9y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y83efgEv,_ZTv0_n12_N3ccc7DD0x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y83efgEv,_ZThn4_N3ccc7DD0x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y83efgEv,_ZTv0_n12_N3ccc7DD0x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y8E[] = {
  {&(_ZTVN3ccc7DD0x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y8E[];
static VTBL_ENTRY alt_thunk_names285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y83efgEv,_ZTv0_n12_N3ccc7DD0x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y83efgEv,_ZThn4_N3ccc7DD0x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y8E = {  "_ZN3ccc7DD0x9y8E", // class name
  bases__ZN3ccc7DD0x9y8E, 2,
  &(vtc__ZN3ccc7DD0x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y8E),3, //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  CC0x9y9  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y93pqrEv
  ~CC0x9y9(); // tgen
  CC0x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y9E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y93efgEv");}
void  ccc::CC0x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y93pqrEv");}
ccc::CC0x9y9 ::~CC0x9y9(){ note_dtor("_ZN3ccc7CC0x9y9E", this);} // tgen
ccc::CC0x9y9 ::CC0x9y9(){ note_ctor("_ZN3ccc7CC0x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y9E, buf);
    ::ccc::CC0x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc7CC0x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC0x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y9E);
    dp->::ccc::CC0x9y9::~CC0x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y9E(Test__ZN3ccc7CC0x9y9E, "_ZN3ccc7CC0x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y9C1Ev();
extern void _ZN3ccc7CC0x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y9E[] = {
  NSPAIR(_ZN3ccc7CC0x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y9E[];
extern void _ZN3ccc7CC0x9y93efgEv();
extern void _ZN3ccc7CC0x9y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC0x9y93efgEv,_ZTv0_n16_N3ccc7CC0x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y93efgEv,_ZThn4_N3ccc7CC0x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC0x9y93pqrEv,_ZTv0_n20_N3ccc7CC0x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y93pqrEv,_ZThn4_N3ccc7CC0x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC0x9y93efgEv,_ZTv0_n16_N3ccc7CC0x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC0x9y93pqrEv,_ZTv0_n20_N3ccc7CC0x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC0x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC0x9y9E[] = {
  {&(_ZTVN3ccc7CC0x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC0x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC0x9y9E[];
static VTBL_ENTRY alt_thunk_names286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC0x9y93pqrEv,_ZTv0_n20_N3ccc7CC0x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y93pqrEv,_ZThn4_N3ccc7CC0x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC0x9y93efgEv,_ZTv0_n16_N3ccc7CC0x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC0x9y93efgEv,_ZThn4_N3ccc7CC0x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC0x9y9E = {  "_ZN3ccc7CC0x9y9E", // class name
  bases__ZN3ccc7CC0x9y9E, 2,
  &(vtc__ZN3ccc7CC0x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC0x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC0x9y9E),2, //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  DD0x9y9  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD0x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD0x9y93pqrEv
  ~DD0x9y9(); // tgen
  DD0x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD0x9y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD0x9y93efgEv");}
void  ccc::DD0x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD0x9y93pqrEv");}
ccc::DD0x9y9 ::~DD0x9y9(){ note_dtor("_ZN3ccc7DD0x9y9E", this);} // tgen
ccc::DD0x9y9 ::DD0x9y9(){ note_ctor("_ZN3ccc7DD0x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD0x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD0x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD0x9y9E, buf);
    ::ccc::DD0x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD0x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD0x9y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7DD0x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD0x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD0x9y9E);
    dp->::ccc::DD0x9y9::~DD0x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD0x9y9E(Test__ZN3ccc7DD0x9y9E, "_ZN3ccc7DD0x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD0x9y9C1Ev();
extern void _ZN3ccc7DD0x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD0x9y9E[] = {
  NSPAIR(_ZN3ccc7DD0x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD0x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD0x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7DD0x9y93efgEv();
extern void _ZN3ccc7DD0x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD0x9y93efgEv,_ZTv0_n12_N3ccc7DD0x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y93efgEv,_ZThn4_N3ccc7DD0x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD0x9y93pqrEv,_ZTv0_n16_N3ccc7DD0x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD0x9y93pqrEv,_ZThn4_N3ccc7DD0x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD0x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD0x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD0x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD0x9y93efgEv,_ZTv0_n12_N3ccc7DD0x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD0x9y93pqrEv,_ZTv0_n16_N3ccc7DD0x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD0x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD0x9y9E[] = {
  {&(_ZTVN3ccc7DD0x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD0x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD0x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD0x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD0x9y9E[];
static VTBL_ENTRY alt_thunk_names287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD0x9y93pqrEv,_ZTv0_n16_N3ccc7DD0x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y93pqrEv,_ZThn4_N3ccc7DD0x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD0x9y93efgEv,_ZTv0_n12_N3ccc7DD0x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD0x9y93efgEv,_ZThn4_N3ccc7DD0x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD0x9y9E = {  "_ZN3ccc7DD0x9y9E", // class name
  bases__ZN3ccc7DD0x9y9E, 2,
  &(vtc__ZN3ccc7DD0x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD0x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD0x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD0x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD0x9y9E),3, //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  CC0x9y10  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x9y103abcEv
  ~CC0x9y10(); // tgen
  CC0x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y10E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y103pqrEv");}
void  ccc::CC0x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x9y103abcEv");}
ccc::CC0x9y10 ::~CC0x9y10(){ note_dtor("_ZN3ccc8CC0x9y10E", this);} // tgen
ccc::CC0x9y10 ::CC0x9y10(){ note_ctor("_ZN3ccc8CC0x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y10E, buf);
    ::ccc::CC0x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y10E);
    dp->::ccc::CC0x9y10::~CC0x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y10E(Test__ZN3ccc8CC0x9y10E, "_ZN3ccc8CC0x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y10C1Ev();
extern void _ZN3ccc8CC0x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y10E[] = {
  NSPAIR(_ZN3ccc8CC0x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC0x9y103pqrEv();
extern void _ZN3ccc8CC0x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x9y103abcEv,_ZTv0_n12_N3ccc8CC0x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y103abcEv,_ZThn4_N3ccc8CC0x9y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x9y103pqrEv,_ZTv0_n20_N3ccc8CC0x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y103pqrEv,_ZThn4_N3ccc8CC0x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x9y103abcEv,_ZTv0_n12_N3ccc8CC0x9y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x9y103pqrEv,_ZTv0_n20_N3ccc8CC0x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y10E[] = {
  {&(_ZTVN3ccc8CC0x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y10E[];
static VTBL_ENTRY alt_thunk_names288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x9y103pqrEv,_ZTv0_n20_N3ccc8CC0x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y103pqrEv,_ZThn4_N3ccc8CC0x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x9y103abcEv,_ZTv0_n12_N3ccc8CC0x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y103abcEv,_ZThn4_N3ccc8CC0x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x9y10E = {  "_ZN3ccc8CC0x9y10E", // class name
  bases__ZN3ccc8CC0x9y10E, 2,
  &(vtc__ZN3ccc8CC0x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y10E),2, //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  DD0x9y10  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD0x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x9y103abcEv
  ~DD0x9y10(); // tgen
  DD0x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x9y103pqrEv");}
void  ccc::DD0x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x9y103abcEv");}
ccc::DD0x9y10 ::~DD0x9y10(){ note_dtor("_ZN3ccc8DD0x9y10E", this);} // tgen
ccc::DD0x9y10 ::DD0x9y10(){ note_ctor("_ZN3ccc8DD0x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y10E, buf);
    ::ccc::DD0x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y10E);
    dp->::ccc::DD0x9y10::~DD0x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y10E(Test__ZN3ccc8DD0x9y10E, "_ZN3ccc8DD0x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y10C1Ev();
extern void _ZN3ccc8DD0x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y10E[] = {
  NSPAIR(_ZN3ccc8DD0x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y10E[];
extern void _ZN3ccc8DD0x9y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x9y103pqrEv,_ZTv0_n16_N3ccc8DD0x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x9y103pqrEv,_ZThn4_N3ccc8DD0x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x9y103pqrEv,_ZTv0_n16_N3ccc8DD0x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y10E[] = {
  {&(_ZTVN3ccc8DD0x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y10E[];
static VTBL_ENTRY alt_thunk_names289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x9y103pqrEv,_ZTv0_n16_N3ccc8DD0x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x9y103pqrEv,_ZThn4_N3ccc8DD0x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x9y10E = {  "_ZN3ccc8DD0x9y10E", // class name
  bases__ZN3ccc8DD0x9y10E, 2,
  &(vtc__ZN3ccc8DD0x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y10E),3, //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  CC0x9y11  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x9y113efgEv
  ~CC0x9y11(); // tgen
  CC0x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y11E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y113pqrEv");}
void  ccc::CC0x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x9y113efgEv");}
ccc::CC0x9y11 ::~CC0x9y11(){ note_dtor("_ZN3ccc8CC0x9y11E", this);} // tgen
ccc::CC0x9y11 ::CC0x9y11(){ note_ctor("_ZN3ccc8CC0x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y11E, buf);
    ::ccc::CC0x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y11E);
    dp->::ccc::CC0x9y11::~CC0x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y11E(Test__ZN3ccc8CC0x9y11E, "_ZN3ccc8CC0x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y11C1Ev();
extern void _ZN3ccc8CC0x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y11E[] = {
  NSPAIR(_ZN3ccc8CC0x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y11E[];
extern void _ZN3ccc8CC0x9y113efgEv();
extern void _ZN3ccc8CC0x9y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x9y113efgEv,_ZTv0_n16_N3ccc8CC0x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y113efgEv,_ZThn4_N3ccc8CC0x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x9y113pqrEv,_ZTv0_n20_N3ccc8CC0x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y113pqrEv,_ZThn4_N3ccc8CC0x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x9y113efgEv,_ZTv0_n16_N3ccc8CC0x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x9y113pqrEv,_ZTv0_n20_N3ccc8CC0x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y11E[] = {
  {&(_ZTVN3ccc8CC0x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y11E[];
static VTBL_ENTRY alt_thunk_names290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x9y113pqrEv,_ZTv0_n20_N3ccc8CC0x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y113pqrEv,_ZThn4_N3ccc8CC0x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x9y113efgEv,_ZTv0_n16_N3ccc8CC0x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y113efgEv,_ZThn4_N3ccc8CC0x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x9y11E = {  "_ZN3ccc8CC0x9y11E", // class name
  bases__ZN3ccc8CC0x9y11E, 2,
  &(vtc__ZN3ccc8CC0x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y11E),2, //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  DD0x9y11  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD0x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x9y113efgEv
  ~DD0x9y11(); // tgen
  DD0x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x9y113pqrEv");}
void  ccc::DD0x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x9y113efgEv");}
ccc::DD0x9y11 ::~DD0x9y11(){ note_dtor("_ZN3ccc8DD0x9y11E", this);} // tgen
ccc::DD0x9y11 ::DD0x9y11(){ note_ctor("_ZN3ccc8DD0x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y11E, buf);
    ::ccc::DD0x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y11E);
    dp->::ccc::DD0x9y11::~DD0x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y11E(Test__ZN3ccc8DD0x9y11E, "_ZN3ccc8DD0x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y11C1Ev();
extern void _ZN3ccc8DD0x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y11E[] = {
  NSPAIR(_ZN3ccc8DD0x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x9y113efgEv();
extern void _ZN3ccc8DD0x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x9y113efgEv,_ZTv0_n12_N3ccc8DD0x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x9y113efgEv,_ZThn4_N3ccc8DD0x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x9y113pqrEv,_ZTv0_n16_N3ccc8DD0x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x9y113pqrEv,_ZThn4_N3ccc8DD0x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x9y113efgEv,_ZTv0_n12_N3ccc8DD0x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x9y113pqrEv,_ZTv0_n16_N3ccc8DD0x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y11E[] = {
  {&(_ZTVN3ccc8DD0x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y11E[];
static VTBL_ENTRY alt_thunk_names291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x9y113pqrEv,_ZTv0_n16_N3ccc8DD0x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x9y113pqrEv,_ZThn4_N3ccc8DD0x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x9y113efgEv,_ZTv0_n12_N3ccc8DD0x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x9y113efgEv,_ZThn4_N3ccc8DD0x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x9y11E = {  "_ZN3ccc8DD0x9y11E", // class name
  bases__ZN3ccc8DD0x9y11E, 2,
  &(vtc__ZN3ccc8DD0x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y11E),3, //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  CC0x9y12  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC0x9y123abcEv
  ~CC0x9y12(); // tgen
  CC0x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x9y123abcEv");}
ccc::CC0x9y12 ::~CC0x9y12(){ note_dtor("_ZN3ccc8CC0x9y12E", this);} // tgen
ccc::CC0x9y12 ::CC0x9y12(){ note_ctor("_ZN3ccc8CC0x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y12E, buf);
    ::ccc::CC0x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y12E);
    dp->::ccc::CC0x9y12::~CC0x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y12E(Test__ZN3ccc8CC0x9y12E, "_ZN3ccc8CC0x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y12C1Ev();
extern void _ZN3ccc8CC0x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y12E[] = {
  NSPAIR(_ZN3ccc8CC0x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC0x9y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x9y123abcEv,_ZTv0_n12_N3ccc8CC0x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y123abcEv,_ZThn4_N3ccc8CC0x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x9y123abcEv,_ZTv0_n12_N3ccc8CC0x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y12E[] = {
  {&(_ZTVN3ccc8CC0x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y12E[];
static VTBL_ENTRY alt_thunk_names292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x9y123abcEv,_ZTv0_n12_N3ccc8CC0x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y123abcEv,_ZThn4_N3ccc8CC0x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x9y12E = {  "_ZN3ccc8CC0x9y12E", // class name
  bases__ZN3ccc8CC0x9y12E, 2,
  &(vtc__ZN3ccc8CC0x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y12E),2, //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  DD0x9y12  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD0x9y123abcEv
  ~DD0x9y12(); // tgen
  DD0x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x9y123abcEv");}
ccc::DD0x9y12 ::~DD0x9y12(){ note_dtor("_ZN3ccc8DD0x9y12E", this);} // tgen
ccc::DD0x9y12 ::DD0x9y12(){ note_ctor("_ZN3ccc8DD0x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y12E, buf);
    ::ccc::DD0x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y12E);
    dp->::ccc::DD0x9y12::~DD0x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y12E(Test__ZN3ccc8DD0x9y12E, "_ZN3ccc8DD0x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y12C1Ev();
extern void _ZN3ccc8DD0x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y12E[] = {
  NSPAIR(_ZN3ccc8DD0x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y12E[];
extern void _ZN3ccc8DD0x9y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y12E[] = {
  {&(_ZTVN3ccc8DD0x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y12E[];
Class_Descriptor cd__ZN3ccc8DD0x9y12E = {  "_ZN3ccc8DD0x9y12E", // class name
  bases__ZN3ccc8DD0x9y12E, 2,
  &(vtc__ZN3ccc8DD0x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y13  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC0x9y133efgEv
  ~CC0x9y13(); // tgen
  CC0x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x9y133efgEv");}
ccc::CC0x9y13 ::~CC0x9y13(){ note_dtor("_ZN3ccc8CC0x9y13E", this);} // tgen
ccc::CC0x9y13 ::CC0x9y13(){ note_ctor("_ZN3ccc8CC0x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y13E, buf);
    ::ccc::CC0x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y13E);
    dp->::ccc::CC0x9y13::~CC0x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y13E(Test__ZN3ccc8CC0x9y13E, "_ZN3ccc8CC0x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y13C1Ev();
extern void _ZN3ccc8CC0x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y13E[] = {
  NSPAIR(_ZN3ccc8CC0x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y13E[];
extern void _ZN3ccc8CC0x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x9y133efgEv,_ZTv0_n16_N3ccc8CC0x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y133efgEv,_ZThn4_N3ccc8CC0x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x9y133efgEv,_ZTv0_n16_N3ccc8CC0x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y13E[] = {
  {&(_ZTVN3ccc8CC0x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y13E[];
static VTBL_ENTRY alt_thunk_names293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x9y133efgEv,_ZTv0_n16_N3ccc8CC0x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y133efgEv,_ZThn4_N3ccc8CC0x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x9y13E = {  "_ZN3ccc8CC0x9y13E", // class name
  bases__ZN3ccc8CC0x9y13E, 2,
  &(vtc__ZN3ccc8CC0x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y13E),2, //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  DD0x9y13  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD0x9y133efgEv
  ~DD0x9y13(); // tgen
  DD0x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x9y133efgEv");}
ccc::DD0x9y13 ::~DD0x9y13(){ note_dtor("_ZN3ccc8DD0x9y13E", this);} // tgen
ccc::DD0x9y13 ::DD0x9y13(){ note_ctor("_ZN3ccc8DD0x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y13E, buf);
    ::ccc::DD0x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y13E);
    dp->::ccc::DD0x9y13::~DD0x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y13E(Test__ZN3ccc8DD0x9y13E, "_ZN3ccc8DD0x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y13C1Ev();
extern void _ZN3ccc8DD0x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y13E[] = {
  NSPAIR(_ZN3ccc8DD0x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x9y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x9y133efgEv,_ZTv0_n12_N3ccc8DD0x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x9y133efgEv,_ZThn4_N3ccc8DD0x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x9y133efgEv,_ZTv0_n12_N3ccc8DD0x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y13E[] = {
  {&(_ZTVN3ccc8DD0x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y13E[];
static VTBL_ENTRY alt_thunk_names294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x9y133efgEv,_ZTv0_n12_N3ccc8DD0x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x9y133efgEv,_ZThn4_N3ccc8DD0x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x9y13E = {  "_ZN3ccc8DD0x9y13E", // class name
  bases__ZN3ccc8DD0x9y13E, 2,
  &(vtc__ZN3ccc8DD0x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y13E),3, //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  CC0x9y14  : virtual ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y143pqrEv
  ~CC0x9y14(); // tgen
  CC0x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y143pqrEv");}
ccc::CC0x9y14 ::~CC0x9y14(){ note_dtor("_ZN3ccc8CC0x9y14E", this);} // tgen
ccc::CC0x9y14 ::CC0x9y14(){ note_ctor("_ZN3ccc8CC0x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y14E, buf);
    ::ccc::CC0x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y14E);
    dp->::ccc::CC0x9y14::~CC0x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y14E(Test__ZN3ccc8CC0x9y14E, "_ZN3ccc8CC0x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y14C1Ev();
extern void _ZN3ccc8CC0x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y14E[] = {
  NSPAIR(_ZN3ccc8CC0x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC0x9y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x9y143pqrEv,_ZTv0_n20_N3ccc8CC0x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y143pqrEv,_ZThn4_N3ccc8CC0x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x9y143pqrEv,_ZTv0_n20_N3ccc8CC0x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y14E[] = {
  {&(_ZTVN3ccc8CC0x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y14E[];
static VTBL_ENTRY alt_thunk_names295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x9y143pqrEv,_ZTv0_n20_N3ccc8CC0x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x9y143pqrEv,_ZThn4_N3ccc8CC0x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x9y14E = {  "_ZN3ccc8CC0x9y14E", // class name
  bases__ZN3ccc8CC0x9y14E, 2,
  &(vtc__ZN3ccc8CC0x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y14E),2, //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  DD0x9y14  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD0x9y143pqrEv
  ~DD0x9y14(); // tgen
  DD0x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x9y143pqrEv");}
ccc::DD0x9y14 ::~DD0x9y14(){ note_dtor("_ZN3ccc8DD0x9y14E", this);} // tgen
ccc::DD0x9y14 ::DD0x9y14(){ note_ctor("_ZN3ccc8DD0x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y14E, buf);
    ::ccc::DD0x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y14E);
    dp->::ccc::DD0x9y14::~DD0x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y14E(Test__ZN3ccc8DD0x9y14E, "_ZN3ccc8DD0x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y14C1Ev();
extern void _ZN3ccc8DD0x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y14E[] = {
  NSPAIR(_ZN3ccc8DD0x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x9y143pqrEv,_ZTv0_n16_N3ccc8DD0x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x9y143pqrEv,_ZThn4_N3ccc8DD0x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x9y143pqrEv,_ZTv0_n16_N3ccc8DD0x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y14E[] = {
  {&(_ZTVN3ccc8DD0x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y14E[];
static VTBL_ENTRY alt_thunk_names296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x9y143pqrEv,_ZTv0_n16_N3ccc8DD0x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x9y143pqrEv,_ZThn4_N3ccc8DD0x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x9y14E = {  "_ZN3ccc8DD0x9y14E", // class name
  bases__ZN3ccc8DD0x9y14E, 2,
  &(vtc__ZN3ccc8DD0x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y15  : virtual ::ccc::AA0 , ::ccc::BB9 {
  ~CC0x9y15(); // tgen
  CC0x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x9y15 ::~CC0x9y15(){ note_dtor("_ZN3ccc8CC0x9y15E", this);} // tgen
ccc::CC0x9y15 ::CC0x9y15(){ note_ctor("_ZN3ccc8CC0x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y15E, buf);
    ::ccc::CC0x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC0x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y15E);
    dp->::ccc::CC0x9y15::~CC0x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y15E(Test__ZN3ccc8CC0x9y15E, "_ZN3ccc8CC0x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y15C1Ev();
extern void _ZN3ccc8CC0x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y15E[] = {
  NSPAIR(_ZN3ccc8CC0x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x9y15E[] = {
  {&(_ZTVN3ccc8CC0x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x9y15E[];
Class_Descriptor cd__ZN3ccc8CC0x9y15E = {  "_ZN3ccc8CC0x9y15E", // class name
  bases__ZN3ccc8CC0x9y15E, 2,
  &(vtc__ZN3ccc8CC0x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x9y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x9y15  : virtual ::ccc::AA0 , virtual ::ccc::BB9 {
  ~DD0x9y15(); // tgen
  DD0x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD0x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x9y15 ::~DD0x9y15(){ note_dtor("_ZN3ccc8DD0x9y15E", this);} // tgen
ccc::DD0x9y15 ::DD0x9y15(){ note_ctor("_ZN3ccc8DD0x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD0x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x9y15E, buf);
    ::ccc::DD0x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x9y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD0x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x9y15E);
    dp->::ccc::DD0x9y15::~DD0x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x9y15E(Test__ZN3ccc8DD0x9y15E, "_ZN3ccc8DD0x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x9y15C1Ev();
extern void _ZN3ccc8DD0x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD0x9y15E[] = {
  NSPAIR(_ZN3ccc8DD0x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD0x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD0x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x9y15E[] = {
  {&(_ZTVN3ccc8DD0x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x9y15E[];
Class_Descriptor cd__ZN3ccc8DD0x9y15E = {  "_ZN3ccc8DD0x9y15E", // class name
  bases__ZN3ccc8DD0x9y15E, 2,
  &(vtc__ZN3ccc8DD0x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x9y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y0  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y03pqrEv
  ~CC0x10y0(); // tgen
  CC0x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y0E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y03abcEv");}
void  ccc::CC0x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y03efgEv");}
void  ccc::CC0x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y03pqrEv");}
ccc::CC0x10y0 ::~CC0x10y0(){ note_dtor("_ZN3ccc8CC0x10y0E", this);} // tgen
ccc::CC0x10y0 ::CC0x10y0(){ note_ctor("_ZN3ccc8CC0x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y0E, buf);
    ::ccc::CC0x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y0E);
    dp->::ccc::CC0x10y0::~CC0x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y0E(Test__ZN3ccc8CC0x10y0E, "_ZN3ccc8CC0x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y0C1Ev();
extern void _ZN3ccc8CC0x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y0E[] = {
  NSPAIR(_ZN3ccc8CC0x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y0E[];
extern void _ZN3ccc8CC0x10y03pqrEv();
extern void _ZN3ccc8CC0x10y03abcEv();
extern void _ZN3ccc8CC0x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y03abcEv,_ZTv0_n12_N3ccc8CC0x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y03abcEv,_ZThn4_N3ccc8CC0x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y03efgEv,_ZTv0_n16_N3ccc8CC0x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y03efgEv,_ZThn4_N3ccc8CC0x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y03pqrEv,_ZTv0_n20_N3ccc8CC0x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y03pqrEv,_ZThn4_N3ccc8CC0x10y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y03abcEv,_ZTv0_n12_N3ccc8CC0x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y03efgEv,_ZTv0_n16_N3ccc8CC0x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y03pqrEv,_ZTv0_n20_N3ccc8CC0x10y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y0E[] = {
  {&(_ZTVN3ccc8CC0x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y0E[];
static VTBL_ENTRY alt_thunk_names297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y03pqrEv,_ZTv0_n20_N3ccc8CC0x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y03pqrEv,_ZThn4_N3ccc8CC0x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y03efgEv,_ZTv0_n16_N3ccc8CC0x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y03efgEv,_ZThn4_N3ccc8CC0x10y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y03abcEv,_ZTv0_n12_N3ccc8CC0x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y03abcEv,_ZThn4_N3ccc8CC0x10y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y0E = {  "_ZN3ccc8CC0x10y0E", // class name
  bases__ZN3ccc8CC0x10y0E, 2,
  &(vtc__ZN3ccc8CC0x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y0E),2, //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  DD0x10y0  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD0x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y03pqrEv
  ~DD0x10y0(); // tgen
  DD0x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y03abcEv");}
void  ccc::DD0x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y03efgEv");}
void  ccc::DD0x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y03pqrEv");}
ccc::DD0x10y0 ::~DD0x10y0(){ note_dtor("_ZN3ccc8DD0x10y0E", this);} // tgen
ccc::DD0x10y0 ::DD0x10y0(){ note_ctor("_ZN3ccc8DD0x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y0E, buf);
    ::ccc::DD0x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y0E);
    dp->::ccc::DD0x10y0::~DD0x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y0E(Test__ZN3ccc8DD0x10y0E, "_ZN3ccc8DD0x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y0C1Ev();
extern void _ZN3ccc8DD0x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y0E[] = {
  NSPAIR(_ZN3ccc8DD0x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y0E[];
extern void _ZN3ccc8DD0x10y03abcEv();
extern void _ZN3ccc8DD0x10y03efgEv();
extern void _ZN3ccc8DD0x10y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y03pqrEv,_ZTv0_n12_N3ccc8DD0x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y03pqrEv,_ZThn4_N3ccc8DD0x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y03abcEv,_ZTv0_n16_N3ccc8DD0x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y03abcEv,_ZThn4_N3ccc8DD0x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y03pqrEv,_ZTv0_n12_N3ccc8DD0x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y03abcEv,_ZTv0_n16_N3ccc8DD0x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y0E[] = {
  {&(_ZTVN3ccc8DD0x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y0E[];
static VTBL_ENTRY alt_thunk_names298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y03abcEv,_ZTv0_n16_N3ccc8DD0x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y03abcEv,_ZThn4_N3ccc8DD0x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y03pqrEv,_ZTv0_n12_N3ccc8DD0x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y03pqrEv,_ZThn4_N3ccc8DD0x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y0E = {  "_ZN3ccc8DD0x10y0E", // class name
  bases__ZN3ccc8DD0x10y0E, 2,
  &(vtc__ZN3ccc8DD0x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y0E),3, //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  CC0x10y1  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x10y13efgEv
  ~CC0x10y1(); // tgen
  CC0x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y1E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y13abcEv");}
void  ccc::CC0x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y13pqrEv");}
void  ccc::CC0x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y13efgEv");}
ccc::CC0x10y1 ::~CC0x10y1(){ note_dtor("_ZN3ccc8CC0x10y1E", this);} // tgen
ccc::CC0x10y1 ::CC0x10y1(){ note_ctor("_ZN3ccc8CC0x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y1E, buf);
    ::ccc::CC0x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y1E);
    dp->::ccc::CC0x10y1::~CC0x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y1E(Test__ZN3ccc8CC0x10y1E, "_ZN3ccc8CC0x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y1C1Ev();
extern void _ZN3ccc8CC0x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y1E[] = {
  NSPAIR(_ZN3ccc8CC0x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y1E[];
extern void _ZN3ccc8CC0x10y13pqrEv();
extern void _ZN3ccc8CC0x10y13abcEv();
extern void _ZN3ccc8CC0x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y13abcEv,_ZTv0_n12_N3ccc8CC0x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y13abcEv,_ZThn4_N3ccc8CC0x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y13efgEv,_ZTv0_n16_N3ccc8CC0x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y13efgEv,_ZThn4_N3ccc8CC0x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y13pqrEv,_ZTv0_n20_N3ccc8CC0x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y13pqrEv,_ZThn4_N3ccc8CC0x10y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y13abcEv,_ZTv0_n12_N3ccc8CC0x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y13efgEv,_ZTv0_n16_N3ccc8CC0x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y13pqrEv,_ZTv0_n20_N3ccc8CC0x10y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y1E[] = {
  {&(_ZTVN3ccc8CC0x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y1E[];
static VTBL_ENTRY alt_thunk_names299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y13pqrEv,_ZTv0_n20_N3ccc8CC0x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y13pqrEv,_ZThn4_N3ccc8CC0x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y13efgEv,_ZTv0_n16_N3ccc8CC0x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y13efgEv,_ZThn4_N3ccc8CC0x10y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y13abcEv,_ZTv0_n12_N3ccc8CC0x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y13abcEv,_ZThn4_N3ccc8CC0x10y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y1E = {  "_ZN3ccc8CC0x10y1E", // class name
  bases__ZN3ccc8CC0x10y1E, 2,
  &(vtc__ZN3ccc8CC0x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y1E),2, //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  DD0x10y1  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD0x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x10y13efgEv
  ~DD0x10y1(); // tgen
  DD0x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y13abcEv");}
void  ccc::DD0x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y13pqrEv");}
void  ccc::DD0x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y13efgEv");}
ccc::DD0x10y1 ::~DD0x10y1(){ note_dtor("_ZN3ccc8DD0x10y1E", this);} // tgen
ccc::DD0x10y1 ::DD0x10y1(){ note_ctor("_ZN3ccc8DD0x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y1E, buf);
    ::ccc::DD0x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y1E);
    dp->::ccc::DD0x10y1::~DD0x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y1E(Test__ZN3ccc8DD0x10y1E, "_ZN3ccc8DD0x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y1C1Ev();
extern void _ZN3ccc8DD0x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y1E[] = {
  NSPAIR(_ZN3ccc8DD0x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y1E[];
extern void _ZN3ccc8DD0x10y13abcEv();
extern void _ZN3ccc8DD0x10y13efgEv();
extern void _ZN3ccc8DD0x10y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y13pqrEv,_ZTv0_n12_N3ccc8DD0x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y13pqrEv,_ZThn4_N3ccc8DD0x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y13abcEv,_ZTv0_n16_N3ccc8DD0x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y13abcEv,_ZThn4_N3ccc8DD0x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y13pqrEv,_ZTv0_n12_N3ccc8DD0x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y13abcEv,_ZTv0_n16_N3ccc8DD0x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y1E[] = {
  {&(_ZTVN3ccc8DD0x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y1E[];
static VTBL_ENTRY alt_thunk_names300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y13abcEv,_ZTv0_n16_N3ccc8DD0x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y13abcEv,_ZThn4_N3ccc8DD0x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y13pqrEv,_ZTv0_n12_N3ccc8DD0x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y13pqrEv,_ZThn4_N3ccc8DD0x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y1E = {  "_ZN3ccc8DD0x10y1E", // class name
  bases__ZN3ccc8DD0x10y1E, 2,
  &(vtc__ZN3ccc8DD0x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y1E),3, //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  CC0x10y2  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y23pqrEv
  ~CC0x10y2(); // tgen
  CC0x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y2E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y23efgEv");}
void  ccc::CC0x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y23abcEv");}
void  ccc::CC0x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y23pqrEv");}
ccc::CC0x10y2 ::~CC0x10y2(){ note_dtor("_ZN3ccc8CC0x10y2E", this);} // tgen
ccc::CC0x10y2 ::CC0x10y2(){ note_ctor("_ZN3ccc8CC0x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y2E, buf);
    ::ccc::CC0x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y2E);
    dp->::ccc::CC0x10y2::~CC0x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y2E(Test__ZN3ccc8CC0x10y2E, "_ZN3ccc8CC0x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y2C1Ev();
extern void _ZN3ccc8CC0x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y2E[] = {
  NSPAIR(_ZN3ccc8CC0x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y2E[];
extern void _ZN3ccc8CC0x10y23pqrEv();
extern void _ZN3ccc8CC0x10y23abcEv();
extern void _ZN3ccc8CC0x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y23abcEv,_ZTv0_n12_N3ccc8CC0x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y23abcEv,_ZThn4_N3ccc8CC0x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y23efgEv,_ZTv0_n16_N3ccc8CC0x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y23efgEv,_ZThn4_N3ccc8CC0x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y23pqrEv,_ZTv0_n20_N3ccc8CC0x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y23pqrEv,_ZThn4_N3ccc8CC0x10y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y23abcEv,_ZTv0_n12_N3ccc8CC0x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y23efgEv,_ZTv0_n16_N3ccc8CC0x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y23pqrEv,_ZTv0_n20_N3ccc8CC0x10y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y2E[] = {
  {&(_ZTVN3ccc8CC0x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y2E[];
static VTBL_ENTRY alt_thunk_names301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y23pqrEv,_ZTv0_n20_N3ccc8CC0x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y23pqrEv,_ZThn4_N3ccc8CC0x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y23efgEv,_ZTv0_n16_N3ccc8CC0x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y23efgEv,_ZThn4_N3ccc8CC0x10y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y23abcEv,_ZTv0_n12_N3ccc8CC0x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y23abcEv,_ZThn4_N3ccc8CC0x10y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y2E = {  "_ZN3ccc8CC0x10y2E", // class name
  bases__ZN3ccc8CC0x10y2E, 2,
  &(vtc__ZN3ccc8CC0x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y2E),2, //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  DD0x10y2  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD0x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y23pqrEv
  ~DD0x10y2(); // tgen
  DD0x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y23efgEv");}
void  ccc::DD0x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y23abcEv");}
void  ccc::DD0x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y23pqrEv");}
ccc::DD0x10y2 ::~DD0x10y2(){ note_dtor("_ZN3ccc8DD0x10y2E", this);} // tgen
ccc::DD0x10y2 ::DD0x10y2(){ note_ctor("_ZN3ccc8DD0x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y2E, buf);
    ::ccc::DD0x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y2E);
    dp->::ccc::DD0x10y2::~DD0x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y2E(Test__ZN3ccc8DD0x10y2E, "_ZN3ccc8DD0x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y2C1Ev();
extern void _ZN3ccc8DD0x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y2E[] = {
  NSPAIR(_ZN3ccc8DD0x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y2E[];
extern void _ZN3ccc8DD0x10y23abcEv();
extern void _ZN3ccc8DD0x10y23efgEv();
extern void _ZN3ccc8DD0x10y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y23pqrEv,_ZTv0_n12_N3ccc8DD0x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y23pqrEv,_ZThn4_N3ccc8DD0x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y23abcEv,_ZTv0_n16_N3ccc8DD0x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y23abcEv,_ZThn4_N3ccc8DD0x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y23pqrEv,_ZTv0_n12_N3ccc8DD0x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y23abcEv,_ZTv0_n16_N3ccc8DD0x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y2E[] = {
  {&(_ZTVN3ccc8DD0x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y2E[];
static VTBL_ENTRY alt_thunk_names302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y23abcEv,_ZTv0_n16_N3ccc8DD0x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y23abcEv,_ZThn4_N3ccc8DD0x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y23pqrEv,_ZTv0_n12_N3ccc8DD0x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y23pqrEv,_ZThn4_N3ccc8DD0x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y2E = {  "_ZN3ccc8DD0x10y2E", // class name
  bases__ZN3ccc8DD0x10y2E, 2,
  &(vtc__ZN3ccc8DD0x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y2E),3, //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  CC0x10y3  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x10y33abcEv
  ~CC0x10y3(); // tgen
  CC0x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y3E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y33efgEv");}
void  ccc::CC0x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y33pqrEv");}
void  ccc::CC0x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y33abcEv");}
ccc::CC0x10y3 ::~CC0x10y3(){ note_dtor("_ZN3ccc8CC0x10y3E", this);} // tgen
ccc::CC0x10y3 ::CC0x10y3(){ note_ctor("_ZN3ccc8CC0x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y3E, buf);
    ::ccc::CC0x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y3E);
    dp->::ccc::CC0x10y3::~CC0x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y3E(Test__ZN3ccc8CC0x10y3E, "_ZN3ccc8CC0x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y3C1Ev();
extern void _ZN3ccc8CC0x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y3E[] = {
  NSPAIR(_ZN3ccc8CC0x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y3E[];
extern void _ZN3ccc8CC0x10y33pqrEv();
extern void _ZN3ccc8CC0x10y33abcEv();
extern void _ZN3ccc8CC0x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y33abcEv,_ZTv0_n12_N3ccc8CC0x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y33abcEv,_ZThn4_N3ccc8CC0x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y33efgEv,_ZTv0_n16_N3ccc8CC0x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y33efgEv,_ZThn4_N3ccc8CC0x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y33pqrEv,_ZTv0_n20_N3ccc8CC0x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y33pqrEv,_ZThn4_N3ccc8CC0x10y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y33abcEv,_ZTv0_n12_N3ccc8CC0x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y33efgEv,_ZTv0_n16_N3ccc8CC0x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y33pqrEv,_ZTv0_n20_N3ccc8CC0x10y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y3E[] = {
  {&(_ZTVN3ccc8CC0x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y3E[];
static VTBL_ENTRY alt_thunk_names303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y33pqrEv,_ZTv0_n20_N3ccc8CC0x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y33pqrEv,_ZThn4_N3ccc8CC0x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y33efgEv,_ZTv0_n16_N3ccc8CC0x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y33efgEv,_ZThn4_N3ccc8CC0x10y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y33abcEv,_ZTv0_n12_N3ccc8CC0x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y33abcEv,_ZThn4_N3ccc8CC0x10y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y3E = {  "_ZN3ccc8CC0x10y3E", // class name
  bases__ZN3ccc8CC0x10y3E, 2,
  &(vtc__ZN3ccc8CC0x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y3E),2, //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  DD0x10y3  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD0x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x10y33abcEv
  ~DD0x10y3(); // tgen
  DD0x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y33efgEv");}
void  ccc::DD0x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y33pqrEv");}
void  ccc::DD0x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y33abcEv");}
ccc::DD0x10y3 ::~DD0x10y3(){ note_dtor("_ZN3ccc8DD0x10y3E", this);} // tgen
ccc::DD0x10y3 ::DD0x10y3(){ note_ctor("_ZN3ccc8DD0x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y3E, buf);
    ::ccc::DD0x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y3E);
    dp->::ccc::DD0x10y3::~DD0x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y3E(Test__ZN3ccc8DD0x10y3E, "_ZN3ccc8DD0x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y3C1Ev();
extern void _ZN3ccc8DD0x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y3E[] = {
  NSPAIR(_ZN3ccc8DD0x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y3E[];
extern void _ZN3ccc8DD0x10y33abcEv();
extern void _ZN3ccc8DD0x10y33efgEv();
extern void _ZN3ccc8DD0x10y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y33pqrEv,_ZTv0_n12_N3ccc8DD0x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y33pqrEv,_ZThn4_N3ccc8DD0x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y33abcEv,_ZTv0_n16_N3ccc8DD0x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y33abcEv,_ZThn4_N3ccc8DD0x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y33pqrEv,_ZTv0_n12_N3ccc8DD0x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y33abcEv,_ZTv0_n16_N3ccc8DD0x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y3E[] = {
  {&(_ZTVN3ccc8DD0x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y3E[];
static VTBL_ENTRY alt_thunk_names304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y33abcEv,_ZTv0_n16_N3ccc8DD0x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y33abcEv,_ZThn4_N3ccc8DD0x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y33pqrEv,_ZTv0_n12_N3ccc8DD0x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y33pqrEv,_ZThn4_N3ccc8DD0x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y3E = {  "_ZN3ccc8DD0x10y3E", // class name
  bases__ZN3ccc8DD0x10y3E, 2,
  &(vtc__ZN3ccc8DD0x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y3E),3, //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  CC0x10y4  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC0x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y43efgEv
  ~CC0x10y4(); // tgen
  CC0x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y4E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y43pqrEv");}
void  ccc::CC0x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y43abcEv");}
void  ccc::CC0x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y43efgEv");}
ccc::CC0x10y4 ::~CC0x10y4(){ note_dtor("_ZN3ccc8CC0x10y4E", this);} // tgen
ccc::CC0x10y4 ::CC0x10y4(){ note_ctor("_ZN3ccc8CC0x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y4E, buf);
    ::ccc::CC0x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y4E);
    dp->::ccc::CC0x10y4::~CC0x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y4E(Test__ZN3ccc8CC0x10y4E, "_ZN3ccc8CC0x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y4C1Ev();
extern void _ZN3ccc8CC0x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y4E[] = {
  NSPAIR(_ZN3ccc8CC0x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y4E[];
extern void _ZN3ccc8CC0x10y43pqrEv();
extern void _ZN3ccc8CC0x10y43abcEv();
extern void _ZN3ccc8CC0x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y43abcEv,_ZTv0_n12_N3ccc8CC0x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y43abcEv,_ZThn4_N3ccc8CC0x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y43efgEv,_ZTv0_n16_N3ccc8CC0x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y43efgEv,_ZThn4_N3ccc8CC0x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y43pqrEv,_ZTv0_n20_N3ccc8CC0x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y43pqrEv,_ZThn4_N3ccc8CC0x10y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y43abcEv,_ZTv0_n12_N3ccc8CC0x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y43efgEv,_ZTv0_n16_N3ccc8CC0x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y43pqrEv,_ZTv0_n20_N3ccc8CC0x10y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y4E[] = {
  {&(_ZTVN3ccc8CC0x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y4E[];
static VTBL_ENTRY alt_thunk_names305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y43pqrEv,_ZTv0_n20_N3ccc8CC0x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y43pqrEv,_ZThn4_N3ccc8CC0x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y43efgEv,_ZTv0_n16_N3ccc8CC0x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y43efgEv,_ZThn4_N3ccc8CC0x10y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y43abcEv,_ZTv0_n12_N3ccc8CC0x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y43abcEv,_ZThn4_N3ccc8CC0x10y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y4E = {  "_ZN3ccc8CC0x10y4E", // class name
  bases__ZN3ccc8CC0x10y4E, 2,
  &(vtc__ZN3ccc8CC0x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y4E),2, //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  DD0x10y4  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD0x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x10y43efgEv
  ~DD0x10y4(); // tgen
  DD0x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y43pqrEv");}
void  ccc::DD0x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y43abcEv");}
void  ccc::DD0x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y43efgEv");}
ccc::DD0x10y4 ::~DD0x10y4(){ note_dtor("_ZN3ccc8DD0x10y4E", this);} // tgen
ccc::DD0x10y4 ::DD0x10y4(){ note_ctor("_ZN3ccc8DD0x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y4E, buf);
    ::ccc::DD0x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y4E);
    dp->::ccc::DD0x10y4::~DD0x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y4E(Test__ZN3ccc8DD0x10y4E, "_ZN3ccc8DD0x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y4C1Ev();
extern void _ZN3ccc8DD0x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y4E[] = {
  NSPAIR(_ZN3ccc8DD0x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y4E[];
extern void _ZN3ccc8DD0x10y43abcEv();
extern void _ZN3ccc8DD0x10y43efgEv();
extern void _ZN3ccc8DD0x10y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y43pqrEv,_ZTv0_n12_N3ccc8DD0x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y43pqrEv,_ZThn4_N3ccc8DD0x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y43abcEv,_ZTv0_n16_N3ccc8DD0x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y43abcEv,_ZThn4_N3ccc8DD0x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y43pqrEv,_ZTv0_n12_N3ccc8DD0x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y43abcEv,_ZTv0_n16_N3ccc8DD0x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y4E[] = {
  {&(_ZTVN3ccc8DD0x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y4E[];
static VTBL_ENTRY alt_thunk_names306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y43abcEv,_ZTv0_n16_N3ccc8DD0x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y43abcEv,_ZThn4_N3ccc8DD0x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y43pqrEv,_ZTv0_n12_N3ccc8DD0x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y43pqrEv,_ZThn4_N3ccc8DD0x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y4E = {  "_ZN3ccc8DD0x10y4E", // class name
  bases__ZN3ccc8DD0x10y4E, 2,
  &(vtc__ZN3ccc8DD0x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y4E),3, //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  CC0x10y5  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC0x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y53abcEv
  ~CC0x10y5(); // tgen
  CC0x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y5E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y53pqrEv");}
void  ccc::CC0x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y53efgEv");}
void  ccc::CC0x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y53abcEv");}
ccc::CC0x10y5 ::~CC0x10y5(){ note_dtor("_ZN3ccc8CC0x10y5E", this);} // tgen
ccc::CC0x10y5 ::CC0x10y5(){ note_ctor("_ZN3ccc8CC0x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y5E, buf);
    ::ccc::CC0x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y5E);
    dp->::ccc::CC0x10y5::~CC0x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y5E(Test__ZN3ccc8CC0x10y5E, "_ZN3ccc8CC0x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y5C1Ev();
extern void _ZN3ccc8CC0x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y5E[] = {
  NSPAIR(_ZN3ccc8CC0x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y5E[];
extern void _ZN3ccc8CC0x10y53pqrEv();
extern void _ZN3ccc8CC0x10y53abcEv();
extern void _ZN3ccc8CC0x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y53abcEv,_ZTv0_n12_N3ccc8CC0x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y53abcEv,_ZThn4_N3ccc8CC0x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y53efgEv,_ZTv0_n16_N3ccc8CC0x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y53efgEv,_ZThn4_N3ccc8CC0x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y53pqrEv,_ZTv0_n20_N3ccc8CC0x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y53pqrEv,_ZThn4_N3ccc8CC0x10y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y53abcEv,_ZTv0_n12_N3ccc8CC0x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y53efgEv,_ZTv0_n16_N3ccc8CC0x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y53pqrEv,_ZTv0_n20_N3ccc8CC0x10y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y5E[] = {
  {&(_ZTVN3ccc8CC0x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y5E[];
static VTBL_ENTRY alt_thunk_names307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y53pqrEv,_ZTv0_n20_N3ccc8CC0x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y53pqrEv,_ZThn4_N3ccc8CC0x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y53efgEv,_ZTv0_n16_N3ccc8CC0x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y53efgEv,_ZThn4_N3ccc8CC0x10y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y53abcEv,_ZTv0_n12_N3ccc8CC0x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y53abcEv,_ZThn4_N3ccc8CC0x10y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y5E = {  "_ZN3ccc8CC0x10y5E", // class name
  bases__ZN3ccc8CC0x10y5E, 2,
  &(vtc__ZN3ccc8CC0x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y5E),2, //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  DD0x10y5  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD0x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x10y53abcEv
  ~DD0x10y5(); // tgen
  DD0x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y53pqrEv");}
void  ccc::DD0x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y53efgEv");}
void  ccc::DD0x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y53abcEv");}
ccc::DD0x10y5 ::~DD0x10y5(){ note_dtor("_ZN3ccc8DD0x10y5E", this);} // tgen
ccc::DD0x10y5 ::DD0x10y5(){ note_ctor("_ZN3ccc8DD0x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y5E, buf);
    ::ccc::DD0x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y5E);
    dp->::ccc::DD0x10y5::~DD0x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y5E(Test__ZN3ccc8DD0x10y5E, "_ZN3ccc8DD0x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y5C1Ev();
extern void _ZN3ccc8DD0x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y5E[] = {
  NSPAIR(_ZN3ccc8DD0x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y5E[];
extern void _ZN3ccc8DD0x10y53abcEv();
extern void _ZN3ccc8DD0x10y53efgEv();
extern void _ZN3ccc8DD0x10y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y53pqrEv,_ZTv0_n12_N3ccc8DD0x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y53pqrEv,_ZThn4_N3ccc8DD0x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y53abcEv,_ZTv0_n16_N3ccc8DD0x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y53abcEv,_ZThn4_N3ccc8DD0x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y53pqrEv,_ZTv0_n12_N3ccc8DD0x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y53abcEv,_ZTv0_n16_N3ccc8DD0x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y5E[] = {
  {&(_ZTVN3ccc8DD0x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y5E[];
static VTBL_ENTRY alt_thunk_names308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y53abcEv,_ZTv0_n16_N3ccc8DD0x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y53abcEv,_ZThn4_N3ccc8DD0x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y53pqrEv,_ZTv0_n12_N3ccc8DD0x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y53pqrEv,_ZThn4_N3ccc8DD0x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y5E = {  "_ZN3ccc8DD0x10y5E", // class name
  bases__ZN3ccc8DD0x10y5E, 2,
  &(vtc__ZN3ccc8DD0x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y5E),3, //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  CC0x10y6  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y63efgEv
  ~CC0x10y6(); // tgen
  CC0x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y6E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y63abcEv");}
void  ccc::CC0x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y63efgEv");}
ccc::CC0x10y6 ::~CC0x10y6(){ note_dtor("_ZN3ccc8CC0x10y6E", this);} // tgen
ccc::CC0x10y6 ::CC0x10y6(){ note_ctor("_ZN3ccc8CC0x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y6E, buf);
    ::ccc::CC0x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y6E);
    dp->::ccc::CC0x10y6::~CC0x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y6E(Test__ZN3ccc8CC0x10y6E, "_ZN3ccc8CC0x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y6C1Ev();
extern void _ZN3ccc8CC0x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y6E[] = {
  NSPAIR(_ZN3ccc8CC0x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC0x10y63abcEv();
extern void _ZN3ccc8CC0x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y63abcEv,_ZTv0_n12_N3ccc8CC0x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y63abcEv,_ZThn4_N3ccc8CC0x10y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y63efgEv,_ZTv0_n16_N3ccc8CC0x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y63efgEv,_ZThn4_N3ccc8CC0x10y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y63abcEv,_ZTv0_n12_N3ccc8CC0x10y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y63efgEv,_ZTv0_n16_N3ccc8CC0x10y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y6E[] = {
  {&(_ZTVN3ccc8CC0x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y6E[];
static VTBL_ENTRY alt_thunk_names309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y63efgEv,_ZTv0_n16_N3ccc8CC0x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y63efgEv,_ZThn4_N3ccc8CC0x10y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y63abcEv,_ZTv0_n12_N3ccc8CC0x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y63abcEv,_ZThn4_N3ccc8CC0x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y6E = {  "_ZN3ccc8CC0x10y6E", // class name
  bases__ZN3ccc8CC0x10y6E, 2,
  &(vtc__ZN3ccc8CC0x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y6E),2, //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  DD0x10y6  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD0x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x10y63efgEv
  ~DD0x10y6(); // tgen
  DD0x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y63abcEv");}
void  ccc::DD0x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y63efgEv");}
ccc::DD0x10y6 ::~DD0x10y6(){ note_dtor("_ZN3ccc8DD0x10y6E", this);} // tgen
ccc::DD0x10y6 ::DD0x10y6(){ note_ctor("_ZN3ccc8DD0x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y6E, buf);
    ::ccc::DD0x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y6E);
    dp->::ccc::DD0x10y6::~DD0x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y6E(Test__ZN3ccc8DD0x10y6E, "_ZN3ccc8DD0x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y6C1Ev();
extern void _ZN3ccc8DD0x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y6E[] = {
  NSPAIR(_ZN3ccc8DD0x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y6E[];
extern void _ZN3ccc8DD0x10y63abcEv();
extern void _ZN3ccc8DD0x10y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y63abcEv,_ZTv0_n16_N3ccc8DD0x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y63abcEv,_ZThn4_N3ccc8DD0x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y63abcEv,_ZTv0_n16_N3ccc8DD0x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y6E[] = {
  {&(_ZTVN3ccc8DD0x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y6E[];
static VTBL_ENTRY alt_thunk_names310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y63abcEv,_ZTv0_n16_N3ccc8DD0x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y63abcEv,_ZThn4_N3ccc8DD0x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y6E = {  "_ZN3ccc8DD0x10y6E", // class name
  bases__ZN3ccc8DD0x10y6E, 2,
  &(vtc__ZN3ccc8DD0x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y6E),3, //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  CC0x10y7  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y73pqrEv
  ~CC0x10y7(); // tgen
  CC0x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y7E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y73abcEv");}
void  ccc::CC0x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y73pqrEv");}
ccc::CC0x10y7 ::~CC0x10y7(){ note_dtor("_ZN3ccc8CC0x10y7E", this);} // tgen
ccc::CC0x10y7 ::CC0x10y7(){ note_ctor("_ZN3ccc8CC0x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y7E, buf);
    ::ccc::CC0x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y7E);
    dp->::ccc::CC0x10y7::~CC0x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y7E(Test__ZN3ccc8CC0x10y7E, "_ZN3ccc8CC0x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y7C1Ev();
extern void _ZN3ccc8CC0x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y7E[] = {
  NSPAIR(_ZN3ccc8CC0x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y7E[];
extern void _ZN3ccc8CC0x10y73pqrEv();
extern void _ZN3ccc8CC0x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y73abcEv,_ZTv0_n12_N3ccc8CC0x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y73abcEv,_ZThn4_N3ccc8CC0x10y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y73pqrEv,_ZTv0_n20_N3ccc8CC0x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y73pqrEv,_ZThn4_N3ccc8CC0x10y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y73abcEv,_ZTv0_n12_N3ccc8CC0x10y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y73pqrEv,_ZTv0_n20_N3ccc8CC0x10y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y7E[] = {
  {&(_ZTVN3ccc8CC0x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y7E[];
static VTBL_ENTRY alt_thunk_names311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y73pqrEv,_ZTv0_n20_N3ccc8CC0x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y73pqrEv,_ZThn4_N3ccc8CC0x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y73abcEv,_ZTv0_n12_N3ccc8CC0x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y73abcEv,_ZThn4_N3ccc8CC0x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y7E = {  "_ZN3ccc8CC0x10y7E", // class name
  bases__ZN3ccc8CC0x10y7E, 2,
  &(vtc__ZN3ccc8CC0x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y7E),2, //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  DD0x10y7  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD0x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y73pqrEv
  ~DD0x10y7(); // tgen
  DD0x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y73abcEv");}
void  ccc::DD0x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y73pqrEv");}
ccc::DD0x10y7 ::~DD0x10y7(){ note_dtor("_ZN3ccc8DD0x10y7E", this);} // tgen
ccc::DD0x10y7 ::DD0x10y7(){ note_ctor("_ZN3ccc8DD0x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y7E, buf);
    ::ccc::DD0x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y7E);
    dp->::ccc::DD0x10y7::~DD0x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y7E(Test__ZN3ccc8DD0x10y7E, "_ZN3ccc8DD0x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y7C1Ev();
extern void _ZN3ccc8DD0x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y7E[] = {
  NSPAIR(_ZN3ccc8DD0x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y7E[];
extern void _ZN3ccc8DD0x10y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x10y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y73pqrEv,_ZTv0_n12_N3ccc8DD0x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y73pqrEv,_ZThn4_N3ccc8DD0x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y73abcEv,_ZTv0_n16_N3ccc8DD0x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y73abcEv,_ZThn4_N3ccc8DD0x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y73pqrEv,_ZTv0_n12_N3ccc8DD0x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y73abcEv,_ZTv0_n16_N3ccc8DD0x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y7E[] = {
  {&(_ZTVN3ccc8DD0x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y7E[];
static VTBL_ENTRY alt_thunk_names312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y73abcEv,_ZTv0_n16_N3ccc8DD0x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y73abcEv,_ZThn4_N3ccc8DD0x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y73pqrEv,_ZTv0_n12_N3ccc8DD0x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y73pqrEv,_ZThn4_N3ccc8DD0x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y7E = {  "_ZN3ccc8DD0x10y7E", // class name
  bases__ZN3ccc8DD0x10y7E, 2,
  &(vtc__ZN3ccc8DD0x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y7E),3, //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  CC0x10y8  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y83abcEv
  ~CC0x10y8(); // tgen
  CC0x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y8E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y83efgEv");}
void  ccc::CC0x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y83abcEv");}
ccc::CC0x10y8 ::~CC0x10y8(){ note_dtor("_ZN3ccc8CC0x10y8E", this);} // tgen
ccc::CC0x10y8 ::CC0x10y8(){ note_ctor("_ZN3ccc8CC0x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y8E, buf);
    ::ccc::CC0x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y8E);
    dp->::ccc::CC0x10y8::~CC0x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y8E(Test__ZN3ccc8CC0x10y8E, "_ZN3ccc8CC0x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y8C1Ev();
extern void _ZN3ccc8CC0x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y8E[] = {
  NSPAIR(_ZN3ccc8CC0x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC0x10y83abcEv();
extern void _ZN3ccc8CC0x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x10y83abcEv,_ZTv0_n12_N3ccc8CC0x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y83abcEv,_ZThn4_N3ccc8CC0x10y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y83efgEv,_ZTv0_n16_N3ccc8CC0x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y83efgEv,_ZThn4_N3ccc8CC0x10y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x10y83abcEv,_ZTv0_n12_N3ccc8CC0x10y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y83efgEv,_ZTv0_n16_N3ccc8CC0x10y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y8E[] = {
  {&(_ZTVN3ccc8CC0x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y8E[];
static VTBL_ENTRY alt_thunk_names313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y83efgEv,_ZTv0_n16_N3ccc8CC0x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y83efgEv,_ZThn4_N3ccc8CC0x10y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x10y83abcEv,_ZTv0_n12_N3ccc8CC0x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y83abcEv,_ZThn4_N3ccc8CC0x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y8E = {  "_ZN3ccc8CC0x10y8E", // class name
  bases__ZN3ccc8CC0x10y8E, 2,
  &(vtc__ZN3ccc8CC0x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y8E),2, //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  DD0x10y8  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD0x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x10y83abcEv
  ~DD0x10y8(); // tgen
  DD0x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y83efgEv");}
void  ccc::DD0x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x10y83abcEv");}
ccc::DD0x10y8 ::~DD0x10y8(){ note_dtor("_ZN3ccc8DD0x10y8E", this);} // tgen
ccc::DD0x10y8 ::DD0x10y8(){ note_ctor("_ZN3ccc8DD0x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y8E, buf);
    ::ccc::DD0x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y8E);
    dp->::ccc::DD0x10y8::~DD0x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y8E(Test__ZN3ccc8DD0x10y8E, "_ZN3ccc8DD0x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y8C1Ev();
extern void _ZN3ccc8DD0x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y8E[] = {
  NSPAIR(_ZN3ccc8DD0x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y8E[];
extern void _ZN3ccc8DD0x10y83abcEv();
extern void _ZN3ccc8DD0x10y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x10y83abcEv,_ZTv0_n16_N3ccc8DD0x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y83abcEv,_ZThn4_N3ccc8DD0x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x10y83abcEv,_ZTv0_n16_N3ccc8DD0x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y8E[] = {
  {&(_ZTVN3ccc8DD0x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y8E[];
static VTBL_ENTRY alt_thunk_names314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x10y83abcEv,_ZTv0_n16_N3ccc8DD0x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y83abcEv,_ZThn4_N3ccc8DD0x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y8E = {  "_ZN3ccc8DD0x10y8E", // class name
  bases__ZN3ccc8DD0x10y8E, 2,
  &(vtc__ZN3ccc8DD0x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y8E),3, //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  CC0x10y9  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y93pqrEv
  ~CC0x10y9(); // tgen
  CC0x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y9E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y93efgEv");}
void  ccc::CC0x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y93pqrEv");}
ccc::CC0x10y9 ::~CC0x10y9(){ note_dtor("_ZN3ccc8CC0x10y9E", this);} // tgen
ccc::CC0x10y9 ::CC0x10y9(){ note_ctor("_ZN3ccc8CC0x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y9E, buf);
    ::ccc::CC0x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC0x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y9E);
    dp->::ccc::CC0x10y9::~CC0x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y9E(Test__ZN3ccc8CC0x10y9E, "_ZN3ccc8CC0x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y9C1Ev();
extern void _ZN3ccc8CC0x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y9E[] = {
  NSPAIR(_ZN3ccc8CC0x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y9E[];
extern void _ZN3ccc8CC0x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC0x10y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x10y93efgEv,_ZTv0_n16_N3ccc8CC0x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y93efgEv,_ZThn4_N3ccc8CC0x10y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x10y93pqrEv,_ZTv0_n20_N3ccc8CC0x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y93pqrEv,_ZThn4_N3ccc8CC0x10y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x10y93efgEv,_ZTv0_n16_N3ccc8CC0x10y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x10y93pqrEv,_ZTv0_n20_N3ccc8CC0x10y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x10y9E[] = {
  {&(_ZTVN3ccc8CC0x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x10y9E[];
static VTBL_ENTRY alt_thunk_names315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x10y93pqrEv,_ZTv0_n20_N3ccc8CC0x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y93pqrEv,_ZThn4_N3ccc8CC0x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x10y93efgEv,_ZTv0_n16_N3ccc8CC0x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x10y93efgEv,_ZThn4_N3ccc8CC0x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x10y9E = {  "_ZN3ccc8CC0x10y9E", // class name
  bases__ZN3ccc8CC0x10y9E, 2,
  &(vtc__ZN3ccc8CC0x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x10y9E),2, //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  DD0x10y9  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD0x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x10y93pqrEv
  ~DD0x10y9(); // tgen
  DD0x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x10y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x10y93efgEv");}
void  ccc::DD0x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x10y93pqrEv");}
ccc::DD0x10y9 ::~DD0x10y9(){ note_dtor("_ZN3ccc8DD0x10y9E", this);} // tgen
ccc::DD0x10y9 ::DD0x10y9(){ note_ctor("_ZN3ccc8DD0x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x10y9E, buf);
    ::ccc::DD0x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x10y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD0x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x10y9E);
    dp->::ccc::DD0x10y9::~DD0x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x10y9E(Test__ZN3ccc8DD0x10y9E, "_ZN3ccc8DD0x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x10y9C1Ev();
extern void _ZN3ccc8DD0x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x10y9E[] = {
  NSPAIR(_ZN3ccc8DD0x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD0x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x10y93efgEv();
extern void _ZN3ccc8DD0x10y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x10y93pqrEv,_ZTv0_n12_N3ccc8DD0x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x10y93pqrEv,_ZThn4_N3ccc8DD0x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x10y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x10y93pqrEv,_ZTv0_n12_N3ccc8DD0x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x10y9E[] = {
  {&(_ZTVN3ccc8DD0x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x10y9E[];
static VTBL_ENTRY alt_thunk_names316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x10y93pqrEv,_ZTv0_n12_N3ccc8DD0x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x10y93pqrEv,_ZThn4_N3ccc8DD0x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x10y9E = {  "_ZN3ccc8DD0x10y9E", // class name
  bases__ZN3ccc8DD0x10y9E, 2,
  &(vtc__ZN3ccc8DD0x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x10y9E),3, //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  CC0x10y10  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x10y103abcEv
  ~CC0x10y10(); // tgen
  CC0x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y10E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y103pqrEv");}
void  ccc::CC0x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x10y103abcEv");}
ccc::CC0x10y10 ::~CC0x10y10(){ note_dtor("_ZN3ccc9CC0x10y10E", this);} // tgen
ccc::CC0x10y10 ::CC0x10y10(){ note_ctor("_ZN3ccc9CC0x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y10E, buf);
    ::ccc::CC0x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y10E);
    dp->::ccc::CC0x10y10::~CC0x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y10E(Test__ZN3ccc9CC0x10y10E, "_ZN3ccc9CC0x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y10C1Ev();
extern void _ZN3ccc9CC0x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y10E[] = {
  NSPAIR(_ZN3ccc9CC0x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y10E[];
extern void _ZN3ccc9CC0x10y103pqrEv();
extern void _ZN3ccc9CC0x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x10y103abcEv,_ZTv0_n12_N3ccc9CC0x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y103abcEv,_ZThn4_N3ccc9CC0x10y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x10y103pqrEv,_ZTv0_n20_N3ccc9CC0x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y103pqrEv,_ZThn4_N3ccc9CC0x10y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x10y103abcEv,_ZTv0_n12_N3ccc9CC0x10y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x10y103pqrEv,_ZTv0_n20_N3ccc9CC0x10y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y10E[] = {
  {&(_ZTVN3ccc9CC0x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y10E[];
static VTBL_ENTRY alt_thunk_names317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x10y103pqrEv,_ZTv0_n20_N3ccc9CC0x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y103pqrEv,_ZThn4_N3ccc9CC0x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x10y103abcEv,_ZTv0_n12_N3ccc9CC0x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y103abcEv,_ZThn4_N3ccc9CC0x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x10y10E = {  "_ZN3ccc9CC0x10y10E", // class name
  bases__ZN3ccc9CC0x10y10E, 2,
  &(vtc__ZN3ccc9CC0x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y10E),2, //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  DD0x10y10  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD0x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x10y103abcEv
  ~DD0x10y10(); // tgen
  DD0x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x10y103pqrEv");}
void  ccc::DD0x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x10y103abcEv");}
ccc::DD0x10y10 ::~DD0x10y10(){ note_dtor("_ZN3ccc9DD0x10y10E", this);} // tgen
ccc::DD0x10y10 ::DD0x10y10(){ note_ctor("_ZN3ccc9DD0x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y10E, buf);
    ::ccc::DD0x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y10E);
    dp->::ccc::DD0x10y10::~DD0x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y10E(Test__ZN3ccc9DD0x10y10E, "_ZN3ccc9DD0x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y10C1Ev();
extern void _ZN3ccc9DD0x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y10E[] = {
  NSPAIR(_ZN3ccc9DD0x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y10E[];
extern void _ZN3ccc9DD0x10y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x10y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x10y103pqrEv,_ZTv0_n12_N3ccc9DD0x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x10y103pqrEv,_ZThn4_N3ccc9DD0x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD0x10y103abcEv,_ZTv0_n16_N3ccc9DD0x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x10y103abcEv,_ZThn4_N3ccc9DD0x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x10y103pqrEv,_ZTv0_n12_N3ccc9DD0x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD0x10y103abcEv,_ZTv0_n16_N3ccc9DD0x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y10E[] = {
  {&(_ZTVN3ccc9DD0x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y10E[];
static VTBL_ENTRY alt_thunk_names318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD0x10y103abcEv,_ZTv0_n16_N3ccc9DD0x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x10y103abcEv,_ZThn4_N3ccc9DD0x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x10y103pqrEv,_ZTv0_n12_N3ccc9DD0x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x10y103pqrEv,_ZThn4_N3ccc9DD0x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x10y10E = {  "_ZN3ccc9DD0x10y10E", // class name
  bases__ZN3ccc9DD0x10y10E, 2,
  &(vtc__ZN3ccc9DD0x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y10E),3, //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  CC0x10y11  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x10y113efgEv
  ~CC0x10y11(); // tgen
  CC0x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y11E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y113pqrEv");}
void  ccc::CC0x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x10y113efgEv");}
ccc::CC0x10y11 ::~CC0x10y11(){ note_dtor("_ZN3ccc9CC0x10y11E", this);} // tgen
ccc::CC0x10y11 ::CC0x10y11(){ note_ctor("_ZN3ccc9CC0x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y11E, buf);
    ::ccc::CC0x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y11E);
    dp->::ccc::CC0x10y11::~CC0x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y11E(Test__ZN3ccc9CC0x10y11E, "_ZN3ccc9CC0x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y11C1Ev();
extern void _ZN3ccc9CC0x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y11E[] = {
  NSPAIR(_ZN3ccc9CC0x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y11E[];
extern void _ZN3ccc9CC0x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC0x10y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x10y113efgEv,_ZTv0_n16_N3ccc9CC0x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y113efgEv,_ZThn4_N3ccc9CC0x10y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x10y113pqrEv,_ZTv0_n20_N3ccc9CC0x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y113pqrEv,_ZThn4_N3ccc9CC0x10y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x10y113efgEv,_ZTv0_n16_N3ccc9CC0x10y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x10y113pqrEv,_ZTv0_n20_N3ccc9CC0x10y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y11E[] = {
  {&(_ZTVN3ccc9CC0x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y11E[];
static VTBL_ENTRY alt_thunk_names319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x10y113pqrEv,_ZTv0_n20_N3ccc9CC0x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y113pqrEv,_ZThn4_N3ccc9CC0x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x10y113efgEv,_ZTv0_n16_N3ccc9CC0x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y113efgEv,_ZThn4_N3ccc9CC0x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x10y11E = {  "_ZN3ccc9CC0x10y11E", // class name
  bases__ZN3ccc9CC0x10y11E, 2,
  &(vtc__ZN3ccc9CC0x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y11E),2, //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  DD0x10y11  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD0x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x10y113efgEv
  ~DD0x10y11(); // tgen
  DD0x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x10y113pqrEv");}
void  ccc::DD0x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x10y113efgEv");}
ccc::DD0x10y11 ::~DD0x10y11(){ note_dtor("_ZN3ccc9DD0x10y11E", this);} // tgen
ccc::DD0x10y11 ::DD0x10y11(){ note_ctor("_ZN3ccc9DD0x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y11E, buf);
    ::ccc::DD0x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y11E);
    dp->::ccc::DD0x10y11::~DD0x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y11E(Test__ZN3ccc9DD0x10y11E, "_ZN3ccc9DD0x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y11C1Ev();
extern void _ZN3ccc9DD0x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y11E[] = {
  NSPAIR(_ZN3ccc9DD0x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x10y113efgEv();
extern void _ZN3ccc9DD0x10y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x10y113pqrEv,_ZTv0_n12_N3ccc9DD0x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x10y113pqrEv,_ZThn4_N3ccc9DD0x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x10y113pqrEv,_ZTv0_n12_N3ccc9DD0x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y11E[] = {
  {&(_ZTVN3ccc9DD0x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y11E[];
static VTBL_ENTRY alt_thunk_names320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x10y113pqrEv,_ZTv0_n12_N3ccc9DD0x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x10y113pqrEv,_ZThn4_N3ccc9DD0x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x10y11E = {  "_ZN3ccc9DD0x10y11E", // class name
  bases__ZN3ccc9DD0x10y11E, 2,
  &(vtc__ZN3ccc9DD0x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y11E),3, //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  CC0x10y12  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC0x10y123abcEv
  ~CC0x10y12(); // tgen
  CC0x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x10y123abcEv");}
ccc::CC0x10y12 ::~CC0x10y12(){ note_dtor("_ZN3ccc9CC0x10y12E", this);} // tgen
ccc::CC0x10y12 ::CC0x10y12(){ note_ctor("_ZN3ccc9CC0x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y12E, buf);
    ::ccc::CC0x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y12E);
    dp->::ccc::CC0x10y12::~CC0x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y12E(Test__ZN3ccc9CC0x10y12E, "_ZN3ccc9CC0x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y12C1Ev();
extern void _ZN3ccc9CC0x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y12E[] = {
  NSPAIR(_ZN3ccc9CC0x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC0x10y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x10y123abcEv,_ZTv0_n12_N3ccc9CC0x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y123abcEv,_ZThn4_N3ccc9CC0x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x10y123abcEv,_ZTv0_n12_N3ccc9CC0x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y12E[] = {
  {&(_ZTVN3ccc9CC0x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y12E[];
static VTBL_ENTRY alt_thunk_names321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x10y123abcEv,_ZTv0_n12_N3ccc9CC0x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y123abcEv,_ZThn4_N3ccc9CC0x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x10y12E = {  "_ZN3ccc9CC0x10y12E", // class name
  bases__ZN3ccc9CC0x10y12E, 2,
  &(vtc__ZN3ccc9CC0x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y12E),2, //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  DD0x10y12  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD0x10y123abcEv
  ~DD0x10y12(); // tgen
  DD0x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x10y123abcEv");}
ccc::DD0x10y12 ::~DD0x10y12(){ note_dtor("_ZN3ccc9DD0x10y12E", this);} // tgen
ccc::DD0x10y12 ::DD0x10y12(){ note_ctor("_ZN3ccc9DD0x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y12E, buf);
    ::ccc::DD0x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y12E);
    dp->::ccc::DD0x10y12::~DD0x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y12E(Test__ZN3ccc9DD0x10y12E, "_ZN3ccc9DD0x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y12C1Ev();
extern void _ZN3ccc9DD0x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y12E[] = {
  NSPAIR(_ZN3ccc9DD0x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y12E[];
extern void _ZN3ccc9DD0x10y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD0x10y123abcEv,_ZTv0_n16_N3ccc9DD0x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x10y123abcEv,_ZThn4_N3ccc9DD0x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD0x10y123abcEv,_ZTv0_n16_N3ccc9DD0x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y12E[] = {
  {&(_ZTVN3ccc9DD0x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y12E[];
static VTBL_ENTRY alt_thunk_names322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD0x10y123abcEv,_ZTv0_n16_N3ccc9DD0x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x10y123abcEv,_ZThn4_N3ccc9DD0x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x10y12E = {  "_ZN3ccc9DD0x10y12E", // class name
  bases__ZN3ccc9DD0x10y12E, 2,
  &(vtc__ZN3ccc9DD0x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y12E),3, //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  CC0x10y13  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC0x10y133efgEv
  ~CC0x10y13(); // tgen
  CC0x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x10y133efgEv");}
ccc::CC0x10y13 ::~CC0x10y13(){ note_dtor("_ZN3ccc9CC0x10y13E", this);} // tgen
ccc::CC0x10y13 ::CC0x10y13(){ note_ctor("_ZN3ccc9CC0x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y13E, buf);
    ::ccc::CC0x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y13E);
    dp->::ccc::CC0x10y13::~CC0x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y13E(Test__ZN3ccc9CC0x10y13E, "_ZN3ccc9CC0x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y13C1Ev();
extern void _ZN3ccc9CC0x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y13E[] = {
  NSPAIR(_ZN3ccc9CC0x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC0x10y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x10y133efgEv,_ZTv0_n16_N3ccc9CC0x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y133efgEv,_ZThn4_N3ccc9CC0x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x10y133efgEv,_ZTv0_n16_N3ccc9CC0x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y13E[] = {
  {&(_ZTVN3ccc9CC0x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y13E[];
static VTBL_ENTRY alt_thunk_names323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x10y133efgEv,_ZTv0_n16_N3ccc9CC0x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y133efgEv,_ZThn4_N3ccc9CC0x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x10y13E = {  "_ZN3ccc9CC0x10y13E", // class name
  bases__ZN3ccc9CC0x10y13E, 2,
  &(vtc__ZN3ccc9CC0x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y13E),2, //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  DD0x10y13  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD0x10y133efgEv
  ~DD0x10y13(); // tgen
  DD0x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x10y133efgEv");}
ccc::DD0x10y13 ::~DD0x10y13(){ note_dtor("_ZN3ccc9DD0x10y13E", this);} // tgen
ccc::DD0x10y13 ::DD0x10y13(){ note_ctor("_ZN3ccc9DD0x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y13E, buf);
    ::ccc::DD0x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y13E);
    dp->::ccc::DD0x10y13::~DD0x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y13E(Test__ZN3ccc9DD0x10y13E, "_ZN3ccc9DD0x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y13C1Ev();
extern void _ZN3ccc9DD0x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y13E[] = {
  NSPAIR(_ZN3ccc9DD0x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x10y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y13E[] = {
  {&(_ZTVN3ccc9DD0x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y13E[];
Class_Descriptor cd__ZN3ccc9DD0x10y13E = {  "_ZN3ccc9DD0x10y13E", // class name
  bases__ZN3ccc9DD0x10y13E, 2,
  &(vtc__ZN3ccc9DD0x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y14  : virtual ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y143pqrEv
  ~CC0x10y14(); // tgen
  CC0x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y143pqrEv");}
ccc::CC0x10y14 ::~CC0x10y14(){ note_dtor("_ZN3ccc9CC0x10y14E", this);} // tgen
ccc::CC0x10y14 ::CC0x10y14(){ note_ctor("_ZN3ccc9CC0x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y14E, buf);
    ::ccc::CC0x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y14E);
    dp->::ccc::CC0x10y14::~CC0x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y14E(Test__ZN3ccc9CC0x10y14E, "_ZN3ccc9CC0x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y14C1Ev();
extern void _ZN3ccc9CC0x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y14E[] = {
  NSPAIR(_ZN3ccc9CC0x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y14E[];
extern void _ZN3ccc9CC0x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x10y143pqrEv,_ZTv0_n20_N3ccc9CC0x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y143pqrEv,_ZThn4_N3ccc9CC0x10y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x10y143pqrEv,_ZTv0_n20_N3ccc9CC0x10y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y14E[] = {
  {&(_ZTVN3ccc9CC0x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y14E[];
static VTBL_ENTRY alt_thunk_names324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x10y143pqrEv,_ZTv0_n20_N3ccc9CC0x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x10y143pqrEv,_ZThn4_N3ccc9CC0x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x10y14E = {  "_ZN3ccc9CC0x10y14E", // class name
  bases__ZN3ccc9CC0x10y14E, 2,
  &(vtc__ZN3ccc9CC0x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y14E),2, //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  DD0x10y14  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD0x10y143pqrEv
  ~DD0x10y14(); // tgen
  DD0x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x10y143pqrEv");}
ccc::DD0x10y14 ::~DD0x10y14(){ note_dtor("_ZN3ccc9DD0x10y14E", this);} // tgen
ccc::DD0x10y14 ::DD0x10y14(){ note_ctor("_ZN3ccc9DD0x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y14E, buf);
    ::ccc::DD0x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y14E);
    dp->::ccc::DD0x10y14::~DD0x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y14E(Test__ZN3ccc9DD0x10y14E, "_ZN3ccc9DD0x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y14C1Ev();
extern void _ZN3ccc9DD0x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y14E[] = {
  NSPAIR(_ZN3ccc9DD0x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x10y143pqrEv,_ZTv0_n12_N3ccc9DD0x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x10y143pqrEv,_ZThn4_N3ccc9DD0x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x10y143pqrEv,_ZTv0_n12_N3ccc9DD0x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y14E[] = {
  {&(_ZTVN3ccc9DD0x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y14E[];
static VTBL_ENTRY alt_thunk_names325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x10y143pqrEv,_ZTv0_n12_N3ccc9DD0x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x10y143pqrEv,_ZThn4_N3ccc9DD0x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x10y14E = {  "_ZN3ccc9DD0x10y14E", // class name
  bases__ZN3ccc9DD0x10y14E, 2,
  &(vtc__ZN3ccc9DD0x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y14E),3, //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  CC0x10y15  : virtual ::ccc::AA0 , ::ccc::BB10 {
  ~CC0x10y15(); // tgen
  CC0x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x10y15 ::~CC0x10y15(){ note_dtor("_ZN3ccc9CC0x10y15E", this);} // tgen
ccc::CC0x10y15 ::CC0x10y15(){ note_ctor("_ZN3ccc9CC0x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y15E, buf);
    ::ccc::CC0x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC0x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y15E);
    dp->::ccc::CC0x10y15::~CC0x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y15E(Test__ZN3ccc9CC0x10y15E, "_ZN3ccc9CC0x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y15C1Ev();
extern void _ZN3ccc9CC0x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y15E[] = {
  NSPAIR(_ZN3ccc9CC0x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x10y15E[] = {
  {&(_ZTVN3ccc9CC0x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x10y15E[];
Class_Descriptor cd__ZN3ccc9CC0x10y15E = {  "_ZN3ccc9CC0x10y15E", // class name
  bases__ZN3ccc9CC0x10y15E, 2,
  &(vtc__ZN3ccc9CC0x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x10y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x10y15  : virtual ::ccc::AA0 , virtual ::ccc::BB10 {
  ~DD0x10y15(); // tgen
  DD0x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x10y15 ::~DD0x10y15(){ note_dtor("_ZN3ccc9DD0x10y15E", this);} // tgen
ccc::DD0x10y15 ::DD0x10y15(){ note_ctor("_ZN3ccc9DD0x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x10y15E, buf);
    ::ccc::DD0x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x10y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD0x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x10y15E);
    dp->::ccc::DD0x10y15::~DD0x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x10y15E(Test__ZN3ccc9DD0x10y15E, "_ZN3ccc9DD0x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x10y15C1Ev();
extern void _ZN3ccc9DD0x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x10y15E[] = {
  NSPAIR(_ZN3ccc9DD0x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD0x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x10y15E[] = {
  {&(_ZTVN3ccc9DD0x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x10y15E[];
Class_Descriptor cd__ZN3ccc9DD0x10y15E = {  "_ZN3ccc9DD0x10y15E", // class name
  bases__ZN3ccc9DD0x10y15E, 2,
  &(vtc__ZN3ccc9DD0x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x10y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y0  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y03pqrEv
  ~CC0x11y0(); // tgen
  CC0x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y0E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y03abcEv");}
void  ccc::CC0x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y03efgEv");}
void  ccc::CC0x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y03pqrEv");}
ccc::CC0x11y0 ::~CC0x11y0(){ note_dtor("_ZN3ccc8CC0x11y0E", this);} // tgen
ccc::CC0x11y0 ::CC0x11y0(){ note_ctor("_ZN3ccc8CC0x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y0E, buf);
    ::ccc::CC0x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y0E);
    dp->::ccc::CC0x11y0::~CC0x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y0E(Test__ZN3ccc8CC0x11y0E, "_ZN3ccc8CC0x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y0C1Ev();
extern void _ZN3ccc8CC0x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y0E[] = {
  NSPAIR(_ZN3ccc8CC0x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y0E[];
extern void _ZN3ccc8CC0x11y03pqrEv();
extern void _ZN3ccc8CC0x11y03efgEv();
extern void _ZN3ccc8CC0x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y03abcEv,_ZTv0_n12_N3ccc8CC0x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y03abcEv,_ZThn4_N3ccc8CC0x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y03efgEv,_ZTv0_n16_N3ccc8CC0x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y03efgEv,_ZThn4_N3ccc8CC0x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y03pqrEv,_ZTv0_n20_N3ccc8CC0x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y03pqrEv,_ZThn4_N3ccc8CC0x11y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y03abcEv,_ZTv0_n12_N3ccc8CC0x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y03efgEv,_ZTv0_n16_N3ccc8CC0x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y03pqrEv,_ZTv0_n20_N3ccc8CC0x11y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y0E[] = {
  {&(_ZTVN3ccc8CC0x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y0E[];
static VTBL_ENTRY alt_thunk_names326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y03pqrEv,_ZTv0_n20_N3ccc8CC0x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y03pqrEv,_ZThn4_N3ccc8CC0x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y03efgEv,_ZTv0_n16_N3ccc8CC0x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y03efgEv,_ZThn4_N3ccc8CC0x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y03abcEv,_ZTv0_n12_N3ccc8CC0x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y03abcEv,_ZThn4_N3ccc8CC0x11y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y0E = {  "_ZN3ccc8CC0x11y0E", // class name
  bases__ZN3ccc8CC0x11y0E, 2,
  &(vtc__ZN3ccc8CC0x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y0E),2, //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  DD0x11y0  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD0x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y03pqrEv
  ~DD0x11y0(); // tgen
  DD0x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y03abcEv");}
void  ccc::DD0x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y03efgEv");}
void  ccc::DD0x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y03pqrEv");}
ccc::DD0x11y0 ::~DD0x11y0(){ note_dtor("_ZN3ccc8DD0x11y0E", this);} // tgen
ccc::DD0x11y0 ::DD0x11y0(){ note_ctor("_ZN3ccc8DD0x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y0E, buf);
    ::ccc::DD0x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y0E);
    dp->::ccc::DD0x11y0::~DD0x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y0E(Test__ZN3ccc8DD0x11y0E, "_ZN3ccc8DD0x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y0C1Ev();
extern void _ZN3ccc8DD0x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y0E[] = {
  NSPAIR(_ZN3ccc8DD0x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y0E[];
extern void _ZN3ccc8DD0x11y03abcEv();
extern void _ZN3ccc8DD0x11y03efgEv();
extern void _ZN3ccc8DD0x11y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y03pqrEv,_ZTv0_n12_N3ccc8DD0x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y03pqrEv,_ZThn4_N3ccc8DD0x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y03efgEv,_ZTv0_n16_N3ccc8DD0x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y03efgEv,_ZThn4_N3ccc8DD0x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y03pqrEv,_ZTv0_n12_N3ccc8DD0x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y03efgEv,_ZTv0_n16_N3ccc8DD0x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y0E[] = {
  {&(_ZTVN3ccc8DD0x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y0E[];
static VTBL_ENTRY alt_thunk_names327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y03efgEv,_ZTv0_n16_N3ccc8DD0x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y03efgEv,_ZThn4_N3ccc8DD0x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y03pqrEv,_ZTv0_n12_N3ccc8DD0x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y03pqrEv,_ZThn4_N3ccc8DD0x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y0E = {  "_ZN3ccc8DD0x11y0E", // class name
  bases__ZN3ccc8DD0x11y0E, 2,
  &(vtc__ZN3ccc8DD0x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y0E),3, //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  CC0x11y1  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x11y13efgEv
  ~CC0x11y1(); // tgen
  CC0x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y1E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y13abcEv");}
void  ccc::CC0x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y13pqrEv");}
void  ccc::CC0x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y13efgEv");}
ccc::CC0x11y1 ::~CC0x11y1(){ note_dtor("_ZN3ccc8CC0x11y1E", this);} // tgen
ccc::CC0x11y1 ::CC0x11y1(){ note_ctor("_ZN3ccc8CC0x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y1E, buf);
    ::ccc::CC0x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y1E);
    dp->::ccc::CC0x11y1::~CC0x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y1E(Test__ZN3ccc8CC0x11y1E, "_ZN3ccc8CC0x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y1C1Ev();
extern void _ZN3ccc8CC0x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y1E[] = {
  NSPAIR(_ZN3ccc8CC0x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y1E[];
extern void _ZN3ccc8CC0x11y13pqrEv();
extern void _ZN3ccc8CC0x11y13efgEv();
extern void _ZN3ccc8CC0x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y13abcEv,_ZTv0_n12_N3ccc8CC0x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y13abcEv,_ZThn4_N3ccc8CC0x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y13efgEv,_ZTv0_n16_N3ccc8CC0x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y13efgEv,_ZThn4_N3ccc8CC0x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y13pqrEv,_ZTv0_n20_N3ccc8CC0x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y13pqrEv,_ZThn4_N3ccc8CC0x11y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y13abcEv,_ZTv0_n12_N3ccc8CC0x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y13efgEv,_ZTv0_n16_N3ccc8CC0x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y13pqrEv,_ZTv0_n20_N3ccc8CC0x11y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y1E[] = {
  {&(_ZTVN3ccc8CC0x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y1E[];
static VTBL_ENTRY alt_thunk_names328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y13pqrEv,_ZTv0_n20_N3ccc8CC0x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y13pqrEv,_ZThn4_N3ccc8CC0x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y13efgEv,_ZTv0_n16_N3ccc8CC0x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y13efgEv,_ZThn4_N3ccc8CC0x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y13abcEv,_ZTv0_n12_N3ccc8CC0x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y13abcEv,_ZThn4_N3ccc8CC0x11y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y1E = {  "_ZN3ccc8CC0x11y1E", // class name
  bases__ZN3ccc8CC0x11y1E, 2,
  &(vtc__ZN3ccc8CC0x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y1E),2, //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  DD0x11y1  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD0x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x11y13efgEv
  ~DD0x11y1(); // tgen
  DD0x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y13abcEv");}
void  ccc::DD0x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y13pqrEv");}
void  ccc::DD0x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y13efgEv");}
ccc::DD0x11y1 ::~DD0x11y1(){ note_dtor("_ZN3ccc8DD0x11y1E", this);} // tgen
ccc::DD0x11y1 ::DD0x11y1(){ note_ctor("_ZN3ccc8DD0x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y1E, buf);
    ::ccc::DD0x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y1E);
    dp->::ccc::DD0x11y1::~DD0x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y1E(Test__ZN3ccc8DD0x11y1E, "_ZN3ccc8DD0x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y1C1Ev();
extern void _ZN3ccc8DD0x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y1E[] = {
  NSPAIR(_ZN3ccc8DD0x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y1E[];
extern void _ZN3ccc8DD0x11y13abcEv();
extern void _ZN3ccc8DD0x11y13efgEv();
extern void _ZN3ccc8DD0x11y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y13pqrEv,_ZTv0_n12_N3ccc8DD0x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y13pqrEv,_ZThn4_N3ccc8DD0x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y13efgEv,_ZTv0_n16_N3ccc8DD0x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y13efgEv,_ZThn4_N3ccc8DD0x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y13pqrEv,_ZTv0_n12_N3ccc8DD0x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y13efgEv,_ZTv0_n16_N3ccc8DD0x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y1E[] = {
  {&(_ZTVN3ccc8DD0x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y1E[];
static VTBL_ENTRY alt_thunk_names329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y13efgEv,_ZTv0_n16_N3ccc8DD0x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y13efgEv,_ZThn4_N3ccc8DD0x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y13pqrEv,_ZTv0_n12_N3ccc8DD0x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y13pqrEv,_ZThn4_N3ccc8DD0x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y1E = {  "_ZN3ccc8DD0x11y1E", // class name
  bases__ZN3ccc8DD0x11y1E, 2,
  &(vtc__ZN3ccc8DD0x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y1E),3, //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  CC0x11y2  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y23pqrEv
  ~CC0x11y2(); // tgen
  CC0x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y2E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y23efgEv");}
void  ccc::CC0x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y23abcEv");}
void  ccc::CC0x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y23pqrEv");}
ccc::CC0x11y2 ::~CC0x11y2(){ note_dtor("_ZN3ccc8CC0x11y2E", this);} // tgen
ccc::CC0x11y2 ::CC0x11y2(){ note_ctor("_ZN3ccc8CC0x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y2E, buf);
    ::ccc::CC0x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y2E);
    dp->::ccc::CC0x11y2::~CC0x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y2E(Test__ZN3ccc8CC0x11y2E, "_ZN3ccc8CC0x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y2C1Ev();
extern void _ZN3ccc8CC0x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y2E[] = {
  NSPAIR(_ZN3ccc8CC0x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y2E[];
extern void _ZN3ccc8CC0x11y23pqrEv();
extern void _ZN3ccc8CC0x11y23efgEv();
extern void _ZN3ccc8CC0x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y23abcEv,_ZTv0_n12_N3ccc8CC0x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y23abcEv,_ZThn4_N3ccc8CC0x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y23efgEv,_ZTv0_n16_N3ccc8CC0x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y23efgEv,_ZThn4_N3ccc8CC0x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y23pqrEv,_ZTv0_n20_N3ccc8CC0x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y23pqrEv,_ZThn4_N3ccc8CC0x11y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y23abcEv,_ZTv0_n12_N3ccc8CC0x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y23efgEv,_ZTv0_n16_N3ccc8CC0x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y23pqrEv,_ZTv0_n20_N3ccc8CC0x11y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y2E[] = {
  {&(_ZTVN3ccc8CC0x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y2E[];
static VTBL_ENTRY alt_thunk_names330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y23pqrEv,_ZTv0_n20_N3ccc8CC0x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y23pqrEv,_ZThn4_N3ccc8CC0x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y23efgEv,_ZTv0_n16_N3ccc8CC0x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y23efgEv,_ZThn4_N3ccc8CC0x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y23abcEv,_ZTv0_n12_N3ccc8CC0x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y23abcEv,_ZThn4_N3ccc8CC0x11y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y2E = {  "_ZN3ccc8CC0x11y2E", // class name
  bases__ZN3ccc8CC0x11y2E, 2,
  &(vtc__ZN3ccc8CC0x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y2E),2, //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  DD0x11y2  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD0x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y23pqrEv
  ~DD0x11y2(); // tgen
  DD0x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y23efgEv");}
void  ccc::DD0x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y23abcEv");}
void  ccc::DD0x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y23pqrEv");}
ccc::DD0x11y2 ::~DD0x11y2(){ note_dtor("_ZN3ccc8DD0x11y2E", this);} // tgen
ccc::DD0x11y2 ::DD0x11y2(){ note_ctor("_ZN3ccc8DD0x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y2E, buf);
    ::ccc::DD0x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y2E);
    dp->::ccc::DD0x11y2::~DD0x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y2E(Test__ZN3ccc8DD0x11y2E, "_ZN3ccc8DD0x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y2C1Ev();
extern void _ZN3ccc8DD0x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y2E[] = {
  NSPAIR(_ZN3ccc8DD0x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y2E[];
extern void _ZN3ccc8DD0x11y23abcEv();
extern void _ZN3ccc8DD0x11y23efgEv();
extern void _ZN3ccc8DD0x11y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y23pqrEv,_ZTv0_n12_N3ccc8DD0x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y23pqrEv,_ZThn4_N3ccc8DD0x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y23efgEv,_ZTv0_n16_N3ccc8DD0x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y23efgEv,_ZThn4_N3ccc8DD0x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y23pqrEv,_ZTv0_n12_N3ccc8DD0x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y23efgEv,_ZTv0_n16_N3ccc8DD0x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y2E[] = {
  {&(_ZTVN3ccc8DD0x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y2E[];
static VTBL_ENTRY alt_thunk_names331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y23efgEv,_ZTv0_n16_N3ccc8DD0x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y23efgEv,_ZThn4_N3ccc8DD0x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y23pqrEv,_ZTv0_n12_N3ccc8DD0x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y23pqrEv,_ZThn4_N3ccc8DD0x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y2E = {  "_ZN3ccc8DD0x11y2E", // class name
  bases__ZN3ccc8DD0x11y2E, 2,
  &(vtc__ZN3ccc8DD0x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y2E),3, //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  CC0x11y3  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x11y33abcEv
  ~CC0x11y3(); // tgen
  CC0x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y3E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y33efgEv");}
void  ccc::CC0x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y33pqrEv");}
void  ccc::CC0x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y33abcEv");}
ccc::CC0x11y3 ::~CC0x11y3(){ note_dtor("_ZN3ccc8CC0x11y3E", this);} // tgen
ccc::CC0x11y3 ::CC0x11y3(){ note_ctor("_ZN3ccc8CC0x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y3E, buf);
    ::ccc::CC0x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y3E);
    dp->::ccc::CC0x11y3::~CC0x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y3E(Test__ZN3ccc8CC0x11y3E, "_ZN3ccc8CC0x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y3C1Ev();
extern void _ZN3ccc8CC0x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y3E[] = {
  NSPAIR(_ZN3ccc8CC0x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y3E[];
extern void _ZN3ccc8CC0x11y33pqrEv();
extern void _ZN3ccc8CC0x11y33efgEv();
extern void _ZN3ccc8CC0x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y33abcEv,_ZTv0_n12_N3ccc8CC0x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y33abcEv,_ZThn4_N3ccc8CC0x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y33efgEv,_ZTv0_n16_N3ccc8CC0x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y33efgEv,_ZThn4_N3ccc8CC0x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y33pqrEv,_ZTv0_n20_N3ccc8CC0x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y33pqrEv,_ZThn4_N3ccc8CC0x11y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y33abcEv,_ZTv0_n12_N3ccc8CC0x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y33efgEv,_ZTv0_n16_N3ccc8CC0x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y33pqrEv,_ZTv0_n20_N3ccc8CC0x11y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y3E[] = {
  {&(_ZTVN3ccc8CC0x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y3E[];
static VTBL_ENTRY alt_thunk_names332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y33pqrEv,_ZTv0_n20_N3ccc8CC0x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y33pqrEv,_ZThn4_N3ccc8CC0x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y33efgEv,_ZTv0_n16_N3ccc8CC0x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y33efgEv,_ZThn4_N3ccc8CC0x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y33abcEv,_ZTv0_n12_N3ccc8CC0x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y33abcEv,_ZThn4_N3ccc8CC0x11y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y3E = {  "_ZN3ccc8CC0x11y3E", // class name
  bases__ZN3ccc8CC0x11y3E, 2,
  &(vtc__ZN3ccc8CC0x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y3E),2, //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  DD0x11y3  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD0x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x11y33abcEv
  ~DD0x11y3(); // tgen
  DD0x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y33efgEv");}
void  ccc::DD0x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y33pqrEv");}
void  ccc::DD0x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y33abcEv");}
ccc::DD0x11y3 ::~DD0x11y3(){ note_dtor("_ZN3ccc8DD0x11y3E", this);} // tgen
ccc::DD0x11y3 ::DD0x11y3(){ note_ctor("_ZN3ccc8DD0x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y3E, buf);
    ::ccc::DD0x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y3E);
    dp->::ccc::DD0x11y3::~DD0x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y3E(Test__ZN3ccc8DD0x11y3E, "_ZN3ccc8DD0x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y3C1Ev();
extern void _ZN3ccc8DD0x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y3E[] = {
  NSPAIR(_ZN3ccc8DD0x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y3E[];
extern void _ZN3ccc8DD0x11y33abcEv();
extern void _ZN3ccc8DD0x11y33efgEv();
extern void _ZN3ccc8DD0x11y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y33pqrEv,_ZTv0_n12_N3ccc8DD0x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y33pqrEv,_ZThn4_N3ccc8DD0x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y33efgEv,_ZTv0_n16_N3ccc8DD0x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y33efgEv,_ZThn4_N3ccc8DD0x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y33pqrEv,_ZTv0_n12_N3ccc8DD0x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y33efgEv,_ZTv0_n16_N3ccc8DD0x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y3E[] = {
  {&(_ZTVN3ccc8DD0x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y3E[];
static VTBL_ENTRY alt_thunk_names333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y33efgEv,_ZTv0_n16_N3ccc8DD0x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y33efgEv,_ZThn4_N3ccc8DD0x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y33pqrEv,_ZTv0_n12_N3ccc8DD0x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y33pqrEv,_ZThn4_N3ccc8DD0x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y3E = {  "_ZN3ccc8DD0x11y3E", // class name
  bases__ZN3ccc8DD0x11y3E, 2,
  &(vtc__ZN3ccc8DD0x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y3E),3, //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  CC0x11y4  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC0x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y43efgEv
  ~CC0x11y4(); // tgen
  CC0x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y4E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y43pqrEv");}
void  ccc::CC0x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y43abcEv");}
void  ccc::CC0x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y43efgEv");}
ccc::CC0x11y4 ::~CC0x11y4(){ note_dtor("_ZN3ccc8CC0x11y4E", this);} // tgen
ccc::CC0x11y4 ::CC0x11y4(){ note_ctor("_ZN3ccc8CC0x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y4E, buf);
    ::ccc::CC0x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y4E);
    dp->::ccc::CC0x11y4::~CC0x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y4E(Test__ZN3ccc8CC0x11y4E, "_ZN3ccc8CC0x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y4C1Ev();
extern void _ZN3ccc8CC0x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y4E[] = {
  NSPAIR(_ZN3ccc8CC0x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y4E[];
extern void _ZN3ccc8CC0x11y43pqrEv();
extern void _ZN3ccc8CC0x11y43efgEv();
extern void _ZN3ccc8CC0x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y43abcEv,_ZTv0_n12_N3ccc8CC0x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y43abcEv,_ZThn4_N3ccc8CC0x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y43efgEv,_ZTv0_n16_N3ccc8CC0x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y43efgEv,_ZThn4_N3ccc8CC0x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y43pqrEv,_ZTv0_n20_N3ccc8CC0x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y43pqrEv,_ZThn4_N3ccc8CC0x11y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y43abcEv,_ZTv0_n12_N3ccc8CC0x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y43efgEv,_ZTv0_n16_N3ccc8CC0x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y43pqrEv,_ZTv0_n20_N3ccc8CC0x11y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y4E[] = {
  {&(_ZTVN3ccc8CC0x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y4E[];
static VTBL_ENTRY alt_thunk_names334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y43pqrEv,_ZTv0_n20_N3ccc8CC0x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y43pqrEv,_ZThn4_N3ccc8CC0x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y43efgEv,_ZTv0_n16_N3ccc8CC0x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y43efgEv,_ZThn4_N3ccc8CC0x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y43abcEv,_ZTv0_n12_N3ccc8CC0x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y43abcEv,_ZThn4_N3ccc8CC0x11y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y4E = {  "_ZN3ccc8CC0x11y4E", // class name
  bases__ZN3ccc8CC0x11y4E, 2,
  &(vtc__ZN3ccc8CC0x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y4E),2, //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  DD0x11y4  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD0x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x11y43efgEv
  ~DD0x11y4(); // tgen
  DD0x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y43pqrEv");}
void  ccc::DD0x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y43abcEv");}
void  ccc::DD0x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y43efgEv");}
ccc::DD0x11y4 ::~DD0x11y4(){ note_dtor("_ZN3ccc8DD0x11y4E", this);} // tgen
ccc::DD0x11y4 ::DD0x11y4(){ note_ctor("_ZN3ccc8DD0x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y4E, buf);
    ::ccc::DD0x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y4E);
    dp->::ccc::DD0x11y4::~DD0x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y4E(Test__ZN3ccc8DD0x11y4E, "_ZN3ccc8DD0x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y4C1Ev();
extern void _ZN3ccc8DD0x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y4E[] = {
  NSPAIR(_ZN3ccc8DD0x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y4E[];
extern void _ZN3ccc8DD0x11y43abcEv();
extern void _ZN3ccc8DD0x11y43efgEv();
extern void _ZN3ccc8DD0x11y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y43pqrEv,_ZTv0_n12_N3ccc8DD0x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y43pqrEv,_ZThn4_N3ccc8DD0x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y43efgEv,_ZTv0_n16_N3ccc8DD0x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y43efgEv,_ZThn4_N3ccc8DD0x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y43pqrEv,_ZTv0_n12_N3ccc8DD0x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y43efgEv,_ZTv0_n16_N3ccc8DD0x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y4E[] = {
  {&(_ZTVN3ccc8DD0x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y4E[];
static VTBL_ENTRY alt_thunk_names335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y43efgEv,_ZTv0_n16_N3ccc8DD0x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y43efgEv,_ZThn4_N3ccc8DD0x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y43pqrEv,_ZTv0_n12_N3ccc8DD0x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y43pqrEv,_ZThn4_N3ccc8DD0x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y4E = {  "_ZN3ccc8DD0x11y4E", // class name
  bases__ZN3ccc8DD0x11y4E, 2,
  &(vtc__ZN3ccc8DD0x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y4E),3, //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  CC0x11y5  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC0x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y53abcEv
  ~CC0x11y5(); // tgen
  CC0x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y5E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y53pqrEv");}
void  ccc::CC0x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y53efgEv");}
void  ccc::CC0x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y53abcEv");}
ccc::CC0x11y5 ::~CC0x11y5(){ note_dtor("_ZN3ccc8CC0x11y5E", this);} // tgen
ccc::CC0x11y5 ::CC0x11y5(){ note_ctor("_ZN3ccc8CC0x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y5E, buf);
    ::ccc::CC0x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y5E);
    dp->::ccc::CC0x11y5::~CC0x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y5E(Test__ZN3ccc8CC0x11y5E, "_ZN3ccc8CC0x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y5C1Ev();
extern void _ZN3ccc8CC0x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y5E[] = {
  NSPAIR(_ZN3ccc8CC0x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y5E[];
extern void _ZN3ccc8CC0x11y53pqrEv();
extern void _ZN3ccc8CC0x11y53efgEv();
extern void _ZN3ccc8CC0x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y53abcEv,_ZTv0_n12_N3ccc8CC0x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y53abcEv,_ZThn4_N3ccc8CC0x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y53efgEv,_ZTv0_n16_N3ccc8CC0x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y53efgEv,_ZThn4_N3ccc8CC0x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y53pqrEv,_ZTv0_n20_N3ccc8CC0x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y53pqrEv,_ZThn4_N3ccc8CC0x11y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y53abcEv,_ZTv0_n12_N3ccc8CC0x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y53efgEv,_ZTv0_n16_N3ccc8CC0x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y53pqrEv,_ZTv0_n20_N3ccc8CC0x11y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y5E[] = {
  {&(_ZTVN3ccc8CC0x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y5E[];
static VTBL_ENTRY alt_thunk_names336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y53pqrEv,_ZTv0_n20_N3ccc8CC0x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y53pqrEv,_ZThn4_N3ccc8CC0x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y53efgEv,_ZTv0_n16_N3ccc8CC0x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y53efgEv,_ZThn4_N3ccc8CC0x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y53abcEv,_ZTv0_n12_N3ccc8CC0x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y53abcEv,_ZThn4_N3ccc8CC0x11y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y5E = {  "_ZN3ccc8CC0x11y5E", // class name
  bases__ZN3ccc8CC0x11y5E, 2,
  &(vtc__ZN3ccc8CC0x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y5E),2, //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  DD0x11y5  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD0x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x11y53abcEv
  ~DD0x11y5(); // tgen
  DD0x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y53pqrEv");}
void  ccc::DD0x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y53efgEv");}
void  ccc::DD0x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y53abcEv");}
ccc::DD0x11y5 ::~DD0x11y5(){ note_dtor("_ZN3ccc8DD0x11y5E", this);} // tgen
ccc::DD0x11y5 ::DD0x11y5(){ note_ctor("_ZN3ccc8DD0x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y5E, buf);
    ::ccc::DD0x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y5E);
    dp->::ccc::DD0x11y5::~DD0x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y5E(Test__ZN3ccc8DD0x11y5E, "_ZN3ccc8DD0x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y5C1Ev();
extern void _ZN3ccc8DD0x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y5E[] = {
  NSPAIR(_ZN3ccc8DD0x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y5E[];
extern void _ZN3ccc8DD0x11y53abcEv();
extern void _ZN3ccc8DD0x11y53efgEv();
extern void _ZN3ccc8DD0x11y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y53pqrEv,_ZTv0_n12_N3ccc8DD0x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y53pqrEv,_ZThn4_N3ccc8DD0x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y53efgEv,_ZTv0_n16_N3ccc8DD0x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y53efgEv,_ZThn4_N3ccc8DD0x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y53pqrEv,_ZTv0_n12_N3ccc8DD0x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y53efgEv,_ZTv0_n16_N3ccc8DD0x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y5E[] = {
  {&(_ZTVN3ccc8DD0x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y5E[];
static VTBL_ENTRY alt_thunk_names337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y53efgEv,_ZTv0_n16_N3ccc8DD0x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y53efgEv,_ZThn4_N3ccc8DD0x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y53pqrEv,_ZTv0_n12_N3ccc8DD0x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y53pqrEv,_ZThn4_N3ccc8DD0x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y5E = {  "_ZN3ccc8DD0x11y5E", // class name
  bases__ZN3ccc8DD0x11y5E, 2,
  &(vtc__ZN3ccc8DD0x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y5E),3, //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  CC0x11y6  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y63efgEv
  ~CC0x11y6(); // tgen
  CC0x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y6E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y63abcEv");}
void  ccc::CC0x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y63efgEv");}
ccc::CC0x11y6 ::~CC0x11y6(){ note_dtor("_ZN3ccc8CC0x11y6E", this);} // tgen
ccc::CC0x11y6 ::CC0x11y6(){ note_ctor("_ZN3ccc8CC0x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y6E, buf);
    ::ccc::CC0x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y6E);
    dp->::ccc::CC0x11y6::~CC0x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y6E(Test__ZN3ccc8CC0x11y6E, "_ZN3ccc8CC0x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y6C1Ev();
extern void _ZN3ccc8CC0x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y6E[] = {
  NSPAIR(_ZN3ccc8CC0x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC0x11y63efgEv();
extern void _ZN3ccc8CC0x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y63abcEv,_ZTv0_n12_N3ccc8CC0x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y63abcEv,_ZThn4_N3ccc8CC0x11y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y63efgEv,_ZTv0_n16_N3ccc8CC0x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y63efgEv,_ZThn4_N3ccc8CC0x11y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y63abcEv,_ZTv0_n12_N3ccc8CC0x11y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y63efgEv,_ZTv0_n16_N3ccc8CC0x11y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y6E[] = {
  {&(_ZTVN3ccc8CC0x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y6E[];
static VTBL_ENTRY alt_thunk_names338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y63efgEv,_ZTv0_n16_N3ccc8CC0x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y63efgEv,_ZThn4_N3ccc8CC0x11y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y63abcEv,_ZTv0_n12_N3ccc8CC0x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y63abcEv,_ZThn4_N3ccc8CC0x11y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y6E = {  "_ZN3ccc8CC0x11y6E", // class name
  bases__ZN3ccc8CC0x11y6E, 2,
  &(vtc__ZN3ccc8CC0x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y6E),2, //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  DD0x11y6  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD0x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x11y63efgEv
  ~DD0x11y6(); // tgen
  DD0x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y63abcEv");}
void  ccc::DD0x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y63efgEv");}
ccc::DD0x11y6 ::~DD0x11y6(){ note_dtor("_ZN3ccc8DD0x11y6E", this);} // tgen
ccc::DD0x11y6 ::DD0x11y6(){ note_ctor("_ZN3ccc8DD0x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y6E, buf);
    ::ccc::DD0x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y6E);
    dp->::ccc::DD0x11y6::~DD0x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y6E(Test__ZN3ccc8DD0x11y6E, "_ZN3ccc8DD0x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y6C1Ev();
extern void _ZN3ccc8DD0x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y6E[] = {
  NSPAIR(_ZN3ccc8DD0x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y6E[];
extern void _ZN3ccc8DD0x11y63abcEv();
extern void _ZN3ccc8DD0x11y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y63efgEv,_ZTv0_n16_N3ccc8DD0x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y63efgEv,_ZThn4_N3ccc8DD0x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y63efgEv,_ZTv0_n16_N3ccc8DD0x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y6E[] = {
  {&(_ZTVN3ccc8DD0x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y6E[];
static VTBL_ENTRY alt_thunk_names339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y63efgEv,_ZTv0_n16_N3ccc8DD0x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y63efgEv,_ZThn4_N3ccc8DD0x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y6E = {  "_ZN3ccc8DD0x11y6E", // class name
  bases__ZN3ccc8DD0x11y6E, 2,
  &(vtc__ZN3ccc8DD0x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y6E),3, //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  CC0x11y7  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y73pqrEv
  ~CC0x11y7(); // tgen
  CC0x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y7E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y73abcEv");}
void  ccc::CC0x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y73pqrEv");}
ccc::CC0x11y7 ::~CC0x11y7(){ note_dtor("_ZN3ccc8CC0x11y7E", this);} // tgen
ccc::CC0x11y7 ::CC0x11y7(){ note_ctor("_ZN3ccc8CC0x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y7E, buf);
    ::ccc::CC0x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y7E);
    dp->::ccc::CC0x11y7::~CC0x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y7E(Test__ZN3ccc8CC0x11y7E, "_ZN3ccc8CC0x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y7C1Ev();
extern void _ZN3ccc8CC0x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y7E[] = {
  NSPAIR(_ZN3ccc8CC0x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y7E[];
extern void _ZN3ccc8CC0x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC0x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y73abcEv,_ZTv0_n12_N3ccc8CC0x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y73abcEv,_ZThn4_N3ccc8CC0x11y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y73pqrEv,_ZTv0_n20_N3ccc8CC0x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y73pqrEv,_ZThn4_N3ccc8CC0x11y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y73abcEv,_ZTv0_n12_N3ccc8CC0x11y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y73pqrEv,_ZTv0_n20_N3ccc8CC0x11y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y7E[] = {
  {&(_ZTVN3ccc8CC0x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y7E[];
static VTBL_ENTRY alt_thunk_names340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y73pqrEv,_ZTv0_n20_N3ccc8CC0x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y73pqrEv,_ZThn4_N3ccc8CC0x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y73abcEv,_ZTv0_n12_N3ccc8CC0x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y73abcEv,_ZThn4_N3ccc8CC0x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y7E = {  "_ZN3ccc8CC0x11y7E", // class name
  bases__ZN3ccc8CC0x11y7E, 2,
  &(vtc__ZN3ccc8CC0x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y7E),2, //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  DD0x11y7  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD0x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y73pqrEv
  ~DD0x11y7(); // tgen
  DD0x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y73abcEv");}
void  ccc::DD0x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y73pqrEv");}
ccc::DD0x11y7 ::~DD0x11y7(){ note_dtor("_ZN3ccc8DD0x11y7E", this);} // tgen
ccc::DD0x11y7 ::DD0x11y7(){ note_ctor("_ZN3ccc8DD0x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y7E, buf);
    ::ccc::DD0x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y7E);
    dp->::ccc::DD0x11y7::~DD0x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y7E(Test__ZN3ccc8DD0x11y7E, "_ZN3ccc8DD0x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y7C1Ev();
extern void _ZN3ccc8DD0x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y7E[] = {
  NSPAIR(_ZN3ccc8DD0x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y7E[];
extern void _ZN3ccc8DD0x11y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x11y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y73pqrEv,_ZTv0_n12_N3ccc8DD0x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y73pqrEv,_ZThn4_N3ccc8DD0x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y73pqrEv,_ZTv0_n12_N3ccc8DD0x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y7E[] = {
  {&(_ZTVN3ccc8DD0x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y7E[];
static VTBL_ENTRY alt_thunk_names341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y73pqrEv,_ZTv0_n12_N3ccc8DD0x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y73pqrEv,_ZThn4_N3ccc8DD0x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y7E = {  "_ZN3ccc8DD0x11y7E", // class name
  bases__ZN3ccc8DD0x11y7E, 2,
  &(vtc__ZN3ccc8DD0x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y7E),3, //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  CC0x11y8  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y83abcEv
  ~CC0x11y8(); // tgen
  CC0x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y8E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y83efgEv");}
void  ccc::CC0x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y83abcEv");}
ccc::CC0x11y8 ::~CC0x11y8(){ note_dtor("_ZN3ccc8CC0x11y8E", this);} // tgen
ccc::CC0x11y8 ::CC0x11y8(){ note_ctor("_ZN3ccc8CC0x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y8E, buf);
    ::ccc::CC0x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y8E);
    dp->::ccc::CC0x11y8::~CC0x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y8E(Test__ZN3ccc8CC0x11y8E, "_ZN3ccc8CC0x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y8C1Ev();
extern void _ZN3ccc8CC0x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y8E[] = {
  NSPAIR(_ZN3ccc8CC0x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC0x11y83efgEv();
extern void _ZN3ccc8CC0x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x11y83abcEv,_ZTv0_n12_N3ccc8CC0x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y83abcEv,_ZThn4_N3ccc8CC0x11y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y83efgEv,_ZTv0_n16_N3ccc8CC0x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y83efgEv,_ZThn4_N3ccc8CC0x11y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x11y83abcEv,_ZTv0_n12_N3ccc8CC0x11y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y83efgEv,_ZTv0_n16_N3ccc8CC0x11y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y8E[] = {
  {&(_ZTVN3ccc8CC0x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y8E[];
static VTBL_ENTRY alt_thunk_names342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y83efgEv,_ZTv0_n16_N3ccc8CC0x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y83efgEv,_ZThn4_N3ccc8CC0x11y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x11y83abcEv,_ZTv0_n12_N3ccc8CC0x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y83abcEv,_ZThn4_N3ccc8CC0x11y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y8E = {  "_ZN3ccc8CC0x11y8E", // class name
  bases__ZN3ccc8CC0x11y8E, 2,
  &(vtc__ZN3ccc8CC0x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y8E),2, //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  DD0x11y8  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD0x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x11y83abcEv
  ~DD0x11y8(); // tgen
  DD0x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y83efgEv");}
void  ccc::DD0x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x11y83abcEv");}
ccc::DD0x11y8 ::~DD0x11y8(){ note_dtor("_ZN3ccc8DD0x11y8E", this);} // tgen
ccc::DD0x11y8 ::DD0x11y8(){ note_ctor("_ZN3ccc8DD0x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y8E, buf);
    ::ccc::DD0x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y8E);
    dp->::ccc::DD0x11y8::~DD0x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y8E(Test__ZN3ccc8DD0x11y8E, "_ZN3ccc8DD0x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y8C1Ev();
extern void _ZN3ccc8DD0x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y8E[] = {
  NSPAIR(_ZN3ccc8DD0x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y8E[];
extern void _ZN3ccc8DD0x11y83abcEv();
extern void _ZN3ccc8DD0x11y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y83efgEv,_ZTv0_n16_N3ccc8DD0x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y83efgEv,_ZThn4_N3ccc8DD0x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y83efgEv,_ZTv0_n16_N3ccc8DD0x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y8E[] = {
  {&(_ZTVN3ccc8DD0x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y8E[];
static VTBL_ENTRY alt_thunk_names343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y83efgEv,_ZTv0_n16_N3ccc8DD0x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y83efgEv,_ZThn4_N3ccc8DD0x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y8E = {  "_ZN3ccc8DD0x11y8E", // class name
  bases__ZN3ccc8DD0x11y8E, 2,
  &(vtc__ZN3ccc8DD0x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y8E),3, //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  CC0x11y9  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y93pqrEv
  ~CC0x11y9(); // tgen
  CC0x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y9E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y93efgEv");}
void  ccc::CC0x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y93pqrEv");}
ccc::CC0x11y9 ::~CC0x11y9(){ note_dtor("_ZN3ccc8CC0x11y9E", this);} // tgen
ccc::CC0x11y9 ::CC0x11y9(){ note_ctor("_ZN3ccc8CC0x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y9E, buf);
    ::ccc::CC0x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC0x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y9E);
    dp->::ccc::CC0x11y9::~CC0x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y9E(Test__ZN3ccc8CC0x11y9E, "_ZN3ccc8CC0x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y9C1Ev();
extern void _ZN3ccc8CC0x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y9E[] = {
  NSPAIR(_ZN3ccc8CC0x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y9E[];
extern void _ZN3ccc8CC0x11y93pqrEv();
extern void _ZN3ccc8CC0x11y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x11y93efgEv,_ZTv0_n16_N3ccc8CC0x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y93efgEv,_ZThn4_N3ccc8CC0x11y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x11y93pqrEv,_ZTv0_n20_N3ccc8CC0x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y93pqrEv,_ZThn4_N3ccc8CC0x11y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x11y93efgEv,_ZTv0_n16_N3ccc8CC0x11y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x11y93pqrEv,_ZTv0_n20_N3ccc8CC0x11y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x11y9E[] = {
  {&(_ZTVN3ccc8CC0x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x11y9E[];
static VTBL_ENTRY alt_thunk_names344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x11y93pqrEv,_ZTv0_n20_N3ccc8CC0x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y93pqrEv,_ZThn4_N3ccc8CC0x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x11y93efgEv,_ZTv0_n16_N3ccc8CC0x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x11y93efgEv,_ZThn4_N3ccc8CC0x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x11y9E = {  "_ZN3ccc8CC0x11y9E", // class name
  bases__ZN3ccc8CC0x11y9E, 2,
  &(vtc__ZN3ccc8CC0x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x11y9E),2, //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  DD0x11y9  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD0x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x11y93pqrEv
  ~DD0x11y9(); // tgen
  DD0x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x11y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x11y93efgEv");}
void  ccc::DD0x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x11y93pqrEv");}
ccc::DD0x11y9 ::~DD0x11y9(){ note_dtor("_ZN3ccc8DD0x11y9E", this);} // tgen
ccc::DD0x11y9 ::DD0x11y9(){ note_ctor("_ZN3ccc8DD0x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x11y9E, buf);
    ::ccc::DD0x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x11y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD0x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x11y9E);
    dp->::ccc::DD0x11y9::~DD0x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x11y9E(Test__ZN3ccc8DD0x11y9E, "_ZN3ccc8DD0x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x11y9C1Ev();
extern void _ZN3ccc8DD0x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x11y9E[] = {
  NSPAIR(_ZN3ccc8DD0x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD0x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x11y93efgEv();
extern void _ZN3ccc8DD0x11y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x11y93pqrEv,_ZTv0_n12_N3ccc8DD0x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y93pqrEv,_ZThn4_N3ccc8DD0x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD0x11y93efgEv,_ZTv0_n16_N3ccc8DD0x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x11y93efgEv,_ZThn4_N3ccc8DD0x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x11y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x11y93pqrEv,_ZTv0_n12_N3ccc8DD0x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD0x11y93efgEv,_ZTv0_n16_N3ccc8DD0x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x11y9E[] = {
  {&(_ZTVN3ccc8DD0x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD0x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x11y9E[];
static VTBL_ENTRY alt_thunk_names345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD0x11y93efgEv,_ZTv0_n16_N3ccc8DD0x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y93efgEv,_ZThn4_N3ccc8DD0x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x11y93pqrEv,_ZTv0_n12_N3ccc8DD0x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x11y93pqrEv,_ZThn4_N3ccc8DD0x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x11y9E = {  "_ZN3ccc8DD0x11y9E", // class name
  bases__ZN3ccc8DD0x11y9E, 2,
  &(vtc__ZN3ccc8DD0x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x11y9E),3, //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  CC0x11y10  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x11y103abcEv
  ~CC0x11y10(); // tgen
  CC0x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y10E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y103pqrEv");}
void  ccc::CC0x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x11y103abcEv");}
ccc::CC0x11y10 ::~CC0x11y10(){ note_dtor("_ZN3ccc9CC0x11y10E", this);} // tgen
ccc::CC0x11y10 ::CC0x11y10(){ note_ctor("_ZN3ccc9CC0x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y10E, buf);
    ::ccc::CC0x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y10E);
    dp->::ccc::CC0x11y10::~CC0x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y10E(Test__ZN3ccc9CC0x11y10E, "_ZN3ccc9CC0x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y10C1Ev();
extern void _ZN3ccc9CC0x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y10E[] = {
  NSPAIR(_ZN3ccc9CC0x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y10E[];
extern void _ZN3ccc9CC0x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC0x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x11y103abcEv,_ZTv0_n12_N3ccc9CC0x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y103abcEv,_ZThn4_N3ccc9CC0x11y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x11y103pqrEv,_ZTv0_n20_N3ccc9CC0x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y103pqrEv,_ZThn4_N3ccc9CC0x11y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x11y103abcEv,_ZTv0_n12_N3ccc9CC0x11y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x11y103pqrEv,_ZTv0_n20_N3ccc9CC0x11y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y10E[] = {
  {&(_ZTVN3ccc9CC0x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y10E[];
static VTBL_ENTRY alt_thunk_names346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x11y103pqrEv,_ZTv0_n20_N3ccc9CC0x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y103pqrEv,_ZThn4_N3ccc9CC0x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x11y103abcEv,_ZTv0_n12_N3ccc9CC0x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y103abcEv,_ZThn4_N3ccc9CC0x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x11y10E = {  "_ZN3ccc9CC0x11y10E", // class name
  bases__ZN3ccc9CC0x11y10E, 2,
  &(vtc__ZN3ccc9CC0x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y10E),2, //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  DD0x11y10  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD0x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x11y103abcEv
  ~DD0x11y10(); // tgen
  DD0x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x11y103pqrEv");}
void  ccc::DD0x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x11y103abcEv");}
ccc::DD0x11y10 ::~DD0x11y10(){ note_dtor("_ZN3ccc9DD0x11y10E", this);} // tgen
ccc::DD0x11y10 ::DD0x11y10(){ note_ctor("_ZN3ccc9DD0x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y10E, buf);
    ::ccc::DD0x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y10E);
    dp->::ccc::DD0x11y10::~DD0x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y10E(Test__ZN3ccc9DD0x11y10E, "_ZN3ccc9DD0x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y10C1Ev();
extern void _ZN3ccc9DD0x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y10E[] = {
  NSPAIR(_ZN3ccc9DD0x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y10E[];
extern void _ZN3ccc9DD0x11y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x11y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x11y103pqrEv,_ZTv0_n12_N3ccc9DD0x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x11y103pqrEv,_ZThn4_N3ccc9DD0x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x11y103pqrEv,_ZTv0_n12_N3ccc9DD0x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y10E[] = {
  {&(_ZTVN3ccc9DD0x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y10E[];
static VTBL_ENTRY alt_thunk_names347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x11y103pqrEv,_ZTv0_n12_N3ccc9DD0x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x11y103pqrEv,_ZThn4_N3ccc9DD0x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x11y10E = {  "_ZN3ccc9DD0x11y10E", // class name
  bases__ZN3ccc9DD0x11y10E, 2,
  &(vtc__ZN3ccc9DD0x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y10E),3, //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  CC0x11y11  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x11y113efgEv
  ~CC0x11y11(); // tgen
  CC0x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y11E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y113pqrEv");}
void  ccc::CC0x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x11y113efgEv");}
ccc::CC0x11y11 ::~CC0x11y11(){ note_dtor("_ZN3ccc9CC0x11y11E", this);} // tgen
ccc::CC0x11y11 ::CC0x11y11(){ note_ctor("_ZN3ccc9CC0x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y11E, buf);
    ::ccc::CC0x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y11E);
    dp->::ccc::CC0x11y11::~CC0x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y11E(Test__ZN3ccc9CC0x11y11E, "_ZN3ccc9CC0x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y11C1Ev();
extern void _ZN3ccc9CC0x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y11E[] = {
  NSPAIR(_ZN3ccc9CC0x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y11E[];
extern void _ZN3ccc9CC0x11y113pqrEv();
extern void _ZN3ccc9CC0x11y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x11y113efgEv,_ZTv0_n16_N3ccc9CC0x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y113efgEv,_ZThn4_N3ccc9CC0x11y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x11y113pqrEv,_ZTv0_n20_N3ccc9CC0x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y113pqrEv,_ZThn4_N3ccc9CC0x11y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x11y113efgEv,_ZTv0_n16_N3ccc9CC0x11y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x11y113pqrEv,_ZTv0_n20_N3ccc9CC0x11y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y11E[] = {
  {&(_ZTVN3ccc9CC0x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y11E[];
static VTBL_ENTRY alt_thunk_names348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x11y113pqrEv,_ZTv0_n20_N3ccc9CC0x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y113pqrEv,_ZThn4_N3ccc9CC0x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x11y113efgEv,_ZTv0_n16_N3ccc9CC0x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y113efgEv,_ZThn4_N3ccc9CC0x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x11y11E = {  "_ZN3ccc9CC0x11y11E", // class name
  bases__ZN3ccc9CC0x11y11E, 2,
  &(vtc__ZN3ccc9CC0x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y11E),2, //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  DD0x11y11  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD0x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x11y113efgEv
  ~DD0x11y11(); // tgen
  DD0x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x11y113pqrEv");}
void  ccc::DD0x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x11y113efgEv");}
ccc::DD0x11y11 ::~DD0x11y11(){ note_dtor("_ZN3ccc9DD0x11y11E", this);} // tgen
ccc::DD0x11y11 ::DD0x11y11(){ note_ctor("_ZN3ccc9DD0x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y11E, buf);
    ::ccc::DD0x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y11E);
    dp->::ccc::DD0x11y11::~DD0x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y11E(Test__ZN3ccc9DD0x11y11E, "_ZN3ccc9DD0x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y11C1Ev();
extern void _ZN3ccc9DD0x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y11E[] = {
  NSPAIR(_ZN3ccc9DD0x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x11y113efgEv();
extern void _ZN3ccc9DD0x11y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x11y113pqrEv,_ZTv0_n12_N3ccc9DD0x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x11y113pqrEv,_ZThn4_N3ccc9DD0x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD0x11y113efgEv,_ZTv0_n16_N3ccc9DD0x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x11y113efgEv,_ZThn4_N3ccc9DD0x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x11y113pqrEv,_ZTv0_n12_N3ccc9DD0x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD0x11y113efgEv,_ZTv0_n16_N3ccc9DD0x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y11E[] = {
  {&(_ZTVN3ccc9DD0x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y11E[];
static VTBL_ENTRY alt_thunk_names349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD0x11y113efgEv,_ZTv0_n16_N3ccc9DD0x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x11y113efgEv,_ZThn4_N3ccc9DD0x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x11y113pqrEv,_ZTv0_n12_N3ccc9DD0x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x11y113pqrEv,_ZThn4_N3ccc9DD0x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x11y11E = {  "_ZN3ccc9DD0x11y11E", // class name
  bases__ZN3ccc9DD0x11y11E, 2,
  &(vtc__ZN3ccc9DD0x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y11E),3, //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  CC0x11y12  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC0x11y123abcEv
  ~CC0x11y12(); // tgen
  CC0x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x11y123abcEv");}
ccc::CC0x11y12 ::~CC0x11y12(){ note_dtor("_ZN3ccc9CC0x11y12E", this);} // tgen
ccc::CC0x11y12 ::CC0x11y12(){ note_ctor("_ZN3ccc9CC0x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y12E, buf);
    ::ccc::CC0x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y12E);
    dp->::ccc::CC0x11y12::~CC0x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y12E(Test__ZN3ccc9CC0x11y12E, "_ZN3ccc9CC0x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y12C1Ev();
extern void _ZN3ccc9CC0x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y12E[] = {
  NSPAIR(_ZN3ccc9CC0x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC0x11y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x11y123abcEv,_ZTv0_n12_N3ccc9CC0x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y123abcEv,_ZThn4_N3ccc9CC0x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x11y123abcEv,_ZTv0_n12_N3ccc9CC0x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y12E[] = {
  {&(_ZTVN3ccc9CC0x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y12E[];
static VTBL_ENTRY alt_thunk_names350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x11y123abcEv,_ZTv0_n12_N3ccc9CC0x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y123abcEv,_ZThn4_N3ccc9CC0x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x11y12E = {  "_ZN3ccc9CC0x11y12E", // class name
  bases__ZN3ccc9CC0x11y12E, 2,
  &(vtc__ZN3ccc9CC0x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y12E),2, //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  DD0x11y12  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD0x11y123abcEv
  ~DD0x11y12(); // tgen
  DD0x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD0x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x11y123abcEv");}
ccc::DD0x11y12 ::~DD0x11y12(){ note_dtor("_ZN3ccc9DD0x11y12E", this);} // tgen
ccc::DD0x11y12 ::DD0x11y12(){ note_ctor("_ZN3ccc9DD0x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y12E, buf);
    ::ccc::DD0x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y12E);
    dp->::ccc::DD0x11y12::~DD0x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y12E(Test__ZN3ccc9DD0x11y12E, "_ZN3ccc9DD0x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y12C1Ev();
extern void _ZN3ccc9DD0x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y12E[] = {
  NSPAIR(_ZN3ccc9DD0x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y12E[];
extern void _ZN3ccc9DD0x11y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y12E[] = {
  {&(_ZTVN3ccc9DD0x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y12E[];
Class_Descriptor cd__ZN3ccc9DD0x11y12E = {  "_ZN3ccc9DD0x11y12E", // class name
  bases__ZN3ccc9DD0x11y12E, 2,
  &(vtc__ZN3ccc9DD0x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y13  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC0x11y133efgEv
  ~CC0x11y13(); // tgen
  CC0x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x11y133efgEv");}
ccc::CC0x11y13 ::~CC0x11y13(){ note_dtor("_ZN3ccc9CC0x11y13E", this);} // tgen
ccc::CC0x11y13 ::CC0x11y13(){ note_ctor("_ZN3ccc9CC0x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y13E, buf);
    ::ccc::CC0x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y13E);
    dp->::ccc::CC0x11y13::~CC0x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y13E(Test__ZN3ccc9CC0x11y13E, "_ZN3ccc9CC0x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y13C1Ev();
extern void _ZN3ccc9CC0x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y13E[] = {
  NSPAIR(_ZN3ccc9CC0x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC0x11y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x11y133efgEv,_ZTv0_n16_N3ccc9CC0x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y133efgEv,_ZThn4_N3ccc9CC0x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x11y133efgEv,_ZTv0_n16_N3ccc9CC0x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y13E[] = {
  {&(_ZTVN3ccc9CC0x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y13E[];
static VTBL_ENTRY alt_thunk_names351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x11y133efgEv,_ZTv0_n16_N3ccc9CC0x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y133efgEv,_ZThn4_N3ccc9CC0x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x11y13E = {  "_ZN3ccc9CC0x11y13E", // class name
  bases__ZN3ccc9CC0x11y13E, 2,
  &(vtc__ZN3ccc9CC0x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y13E),2, //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  DD0x11y13  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD0x11y133efgEv
  ~DD0x11y13(); // tgen
  DD0x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD0x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x11y133efgEv");}
ccc::DD0x11y13 ::~DD0x11y13(){ note_dtor("_ZN3ccc9DD0x11y13E", this);} // tgen
ccc::DD0x11y13 ::DD0x11y13(){ note_ctor("_ZN3ccc9DD0x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y13E, buf);
    ::ccc::DD0x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y13E);
    dp->::ccc::DD0x11y13::~DD0x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y13E(Test__ZN3ccc9DD0x11y13E, "_ZN3ccc9DD0x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y13C1Ev();
extern void _ZN3ccc9DD0x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y13E[] = {
  NSPAIR(_ZN3ccc9DD0x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x11y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD0x11y133efgEv,_ZTv0_n16_N3ccc9DD0x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x11y133efgEv,_ZThn4_N3ccc9DD0x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD0x11y133efgEv,_ZTv0_n16_N3ccc9DD0x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y13E[] = {
  {&(_ZTVN3ccc9DD0x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y13E[];
static VTBL_ENTRY alt_thunk_names352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD0x11y133efgEv,_ZTv0_n16_N3ccc9DD0x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x11y133efgEv,_ZThn4_N3ccc9DD0x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x11y13E = {  "_ZN3ccc9DD0x11y13E", // class name
  bases__ZN3ccc9DD0x11y13E, 2,
  &(vtc__ZN3ccc9DD0x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y13E),3, //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  CC0x11y14  : virtual ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y143pqrEv
  ~CC0x11y14(); // tgen
  CC0x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y143pqrEv");}
ccc::CC0x11y14 ::~CC0x11y14(){ note_dtor("_ZN3ccc9CC0x11y14E", this);} // tgen
ccc::CC0x11y14 ::CC0x11y14(){ note_ctor("_ZN3ccc9CC0x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y14E, buf);
    ::ccc::CC0x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y14E);
    dp->::ccc::CC0x11y14::~CC0x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y14E(Test__ZN3ccc9CC0x11y14E, "_ZN3ccc9CC0x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y14C1Ev();
extern void _ZN3ccc9CC0x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y14E[] = {
  NSPAIR(_ZN3ccc9CC0x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y14E[];
extern void _ZN3ccc9CC0x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x11y143pqrEv,_ZTv0_n20_N3ccc9CC0x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y143pqrEv,_ZThn4_N3ccc9CC0x11y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x11y143pqrEv,_ZTv0_n20_N3ccc9CC0x11y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y14E[] = {
  {&(_ZTVN3ccc9CC0x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y14E[];
static VTBL_ENTRY alt_thunk_names353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x11y143pqrEv,_ZTv0_n20_N3ccc9CC0x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x11y143pqrEv,_ZThn4_N3ccc9CC0x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x11y14E = {  "_ZN3ccc9CC0x11y14E", // class name
  bases__ZN3ccc9CC0x11y14E, 2,
  &(vtc__ZN3ccc9CC0x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y14E),2, //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  DD0x11y14  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD0x11y143pqrEv
  ~DD0x11y14(); // tgen
  DD0x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD0x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x11y143pqrEv");}
ccc::DD0x11y14 ::~DD0x11y14(){ note_dtor("_ZN3ccc9DD0x11y14E", this);} // tgen
ccc::DD0x11y14 ::DD0x11y14(){ note_ctor("_ZN3ccc9DD0x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y14E, buf);
    ::ccc::DD0x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y14E);
    dp->::ccc::DD0x11y14::~DD0x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y14E(Test__ZN3ccc9DD0x11y14E, "_ZN3ccc9DD0x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y14C1Ev();
extern void _ZN3ccc9DD0x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y14E[] = {
  NSPAIR(_ZN3ccc9DD0x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x11y143pqrEv,_ZTv0_n12_N3ccc9DD0x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x11y143pqrEv,_ZThn4_N3ccc9DD0x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x11y143pqrEv,_ZTv0_n12_N3ccc9DD0x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y14E[] = {
  {&(_ZTVN3ccc9DD0x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y14E[];
static VTBL_ENTRY alt_thunk_names354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x11y143pqrEv,_ZTv0_n12_N3ccc9DD0x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x11y143pqrEv,_ZThn4_N3ccc9DD0x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x11y14E = {  "_ZN3ccc9DD0x11y14E", // class name
  bases__ZN3ccc9DD0x11y14E, 2,
  &(vtc__ZN3ccc9DD0x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y14E),3, //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  CC0x11y15  : virtual ::ccc::AA0 , ::ccc::BB11 {
  ~CC0x11y15(); // tgen
  CC0x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x11y15 ::~CC0x11y15(){ note_dtor("_ZN3ccc9CC0x11y15E", this);} // tgen
ccc::CC0x11y15 ::CC0x11y15(){ note_ctor("_ZN3ccc9CC0x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y15E, buf);
    ::ccc::CC0x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC0x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y15E);
    dp->::ccc::CC0x11y15::~CC0x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y15E(Test__ZN3ccc9CC0x11y15E, "_ZN3ccc9CC0x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y15C1Ev();
extern void _ZN3ccc9CC0x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y15E[] = {
  NSPAIR(_ZN3ccc9CC0x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x11y15E[] = {
  {&(_ZTVN3ccc9CC0x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x11y15E[];
Class_Descriptor cd__ZN3ccc9CC0x11y15E = {  "_ZN3ccc9CC0x11y15E", // class name
  bases__ZN3ccc9CC0x11y15E, 2,
  &(vtc__ZN3ccc9CC0x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x11y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x11y15  : virtual ::ccc::AA0 , virtual ::ccc::BB11 {
  ~DD0x11y15(); // tgen
  DD0x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD0x11y15 ::~DD0x11y15(){ note_dtor("_ZN3ccc9DD0x11y15E", this);} // tgen
ccc::DD0x11y15 ::DD0x11y15(){ note_ctor("_ZN3ccc9DD0x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x11y15E, buf);
    ::ccc::DD0x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x11y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD0x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x11y15E);
    dp->::ccc::DD0x11y15::~DD0x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x11y15E(Test__ZN3ccc9DD0x11y15E, "_ZN3ccc9DD0x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x11y15C1Ev();
extern void _ZN3ccc9DD0x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x11y15E[] = {
  NSPAIR(_ZN3ccc9DD0x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD0x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x11y15E[] = {
  {&(_ZTVN3ccc9DD0x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD0x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x11y15E[];
Class_Descriptor cd__ZN3ccc9DD0x11y15E = {  "_ZN3ccc9DD0x11y15E", // class name
  bases__ZN3ccc9DD0x11y15E, 2,
  &(vtc__ZN3ccc9DD0x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x11y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y0  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y03pqrEv
  ~CC0x12y0(); // tgen
  CC0x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y0E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y03abcEv");}
void  ccc::CC0x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y03efgEv");}
void  ccc::CC0x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y03pqrEv");}
ccc::CC0x12y0 ::~CC0x12y0(){ note_dtor("_ZN3ccc8CC0x12y0E", this);} // tgen
ccc::CC0x12y0 ::CC0x12y0(){ note_ctor("_ZN3ccc8CC0x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y0E, buf);
    ::ccc::CC0x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y0E);
    dp->::ccc::CC0x12y0::~CC0x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y0E(Test__ZN3ccc8CC0x12y0E, "_ZN3ccc8CC0x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y0C1Ev();
extern void _ZN3ccc8CC0x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y0E[] = {
  NSPAIR(_ZN3ccc8CC0x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y0E[];
extern void _ZN3ccc8CC0x12y03abcEv();
extern void _ZN3ccc8CC0x12y03efgEv();
extern void _ZN3ccc8CC0x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y03abcEv,_ZTv0_n12_N3ccc8CC0x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y03abcEv,_ZThn4_N3ccc8CC0x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y03efgEv,_ZTv0_n16_N3ccc8CC0x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y03efgEv,_ZThn4_N3ccc8CC0x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y03pqrEv,_ZTv0_n20_N3ccc8CC0x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y03pqrEv,_ZThn4_N3ccc8CC0x12y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y03abcEv,_ZTv0_n12_N3ccc8CC0x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y03efgEv,_ZTv0_n16_N3ccc8CC0x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y03pqrEv,_ZTv0_n20_N3ccc8CC0x12y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y0E[] = {
  {&(_ZTVN3ccc8CC0x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y0E[];
static VTBL_ENTRY alt_thunk_names355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y03pqrEv,_ZTv0_n20_N3ccc8CC0x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y03pqrEv,_ZThn4_N3ccc8CC0x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y03efgEv,_ZTv0_n16_N3ccc8CC0x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y03efgEv,_ZThn4_N3ccc8CC0x12y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y03abcEv,_ZTv0_n12_N3ccc8CC0x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y03abcEv,_ZThn4_N3ccc8CC0x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y0E = {  "_ZN3ccc8CC0x12y0E", // class name
  bases__ZN3ccc8CC0x12y0E, 2,
  &(vtc__ZN3ccc8CC0x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y0E),2, //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  DD0x12y0  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD0x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y03pqrEv
  ~DD0x12y0(); // tgen
  DD0x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y03abcEv");}
void  ccc::DD0x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y03efgEv");}
void  ccc::DD0x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y03pqrEv");}
ccc::DD0x12y0 ::~DD0x12y0(){ note_dtor("_ZN3ccc8DD0x12y0E", this);} // tgen
ccc::DD0x12y0 ::DD0x12y0(){ note_ctor("_ZN3ccc8DD0x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y0E, buf);
    ::ccc::DD0x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y0E);
    dp->::ccc::DD0x12y0::~DD0x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y0E(Test__ZN3ccc8DD0x12y0E, "_ZN3ccc8DD0x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y0C1Ev();
extern void _ZN3ccc8DD0x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y0E[] = {
  NSPAIR(_ZN3ccc8DD0x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y0E[];
extern void _ZN3ccc8DD0x12y03abcEv();
extern void _ZN3ccc8DD0x12y03efgEv();
extern void _ZN3ccc8DD0x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y03abcEv,_ZTv0_n12_N3ccc8DD0x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y03abcEv,_ZThn4_N3ccc8DD0x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y03abcEv,_ZTv0_n12_N3ccc8DD0x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y0E[] = {
  {&(_ZTVN3ccc8DD0x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y0E[];
static VTBL_ENTRY alt_thunk_names356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y03abcEv,_ZTv0_n12_N3ccc8DD0x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y03abcEv,_ZThn4_N3ccc8DD0x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y0E = {  "_ZN3ccc8DD0x12y0E", // class name
  bases__ZN3ccc8DD0x12y0E, 2,
  &(vtc__ZN3ccc8DD0x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y0E),3, //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  CC0x12y1  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x12y13efgEv
  ~CC0x12y1(); // tgen
  CC0x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y1E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y13abcEv");}
void  ccc::CC0x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y13pqrEv");}
void  ccc::CC0x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y13efgEv");}
ccc::CC0x12y1 ::~CC0x12y1(){ note_dtor("_ZN3ccc8CC0x12y1E", this);} // tgen
ccc::CC0x12y1 ::CC0x12y1(){ note_ctor("_ZN3ccc8CC0x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y1E, buf);
    ::ccc::CC0x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y1E);
    dp->::ccc::CC0x12y1::~CC0x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y1E(Test__ZN3ccc8CC0x12y1E, "_ZN3ccc8CC0x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y1C1Ev();
extern void _ZN3ccc8CC0x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y1E[] = {
  NSPAIR(_ZN3ccc8CC0x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y1E[];
extern void _ZN3ccc8CC0x12y13abcEv();
extern void _ZN3ccc8CC0x12y13pqrEv();
extern void _ZN3ccc8CC0x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y13abcEv,_ZTv0_n12_N3ccc8CC0x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y13abcEv,_ZThn4_N3ccc8CC0x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y13efgEv,_ZTv0_n16_N3ccc8CC0x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y13efgEv,_ZThn4_N3ccc8CC0x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y13pqrEv,_ZTv0_n20_N3ccc8CC0x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y13pqrEv,_ZThn4_N3ccc8CC0x12y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y13abcEv,_ZTv0_n12_N3ccc8CC0x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y13efgEv,_ZTv0_n16_N3ccc8CC0x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y13pqrEv,_ZTv0_n20_N3ccc8CC0x12y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y1E[] = {
  {&(_ZTVN3ccc8CC0x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y1E[];
static VTBL_ENTRY alt_thunk_names357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y13pqrEv,_ZTv0_n20_N3ccc8CC0x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y13pqrEv,_ZThn4_N3ccc8CC0x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y13efgEv,_ZTv0_n16_N3ccc8CC0x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y13efgEv,_ZThn4_N3ccc8CC0x12y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y13abcEv,_ZTv0_n12_N3ccc8CC0x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y13abcEv,_ZThn4_N3ccc8CC0x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y1E = {  "_ZN3ccc8CC0x12y1E", // class name
  bases__ZN3ccc8CC0x12y1E, 2,
  &(vtc__ZN3ccc8CC0x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y1E),2, //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  DD0x12y1  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD0x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x12y13efgEv
  ~DD0x12y1(); // tgen
  DD0x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y13abcEv");}
void  ccc::DD0x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y13pqrEv");}
void  ccc::DD0x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y13efgEv");}
ccc::DD0x12y1 ::~DD0x12y1(){ note_dtor("_ZN3ccc8DD0x12y1E", this);} // tgen
ccc::DD0x12y1 ::DD0x12y1(){ note_ctor("_ZN3ccc8DD0x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y1E, buf);
    ::ccc::DD0x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y1E);
    dp->::ccc::DD0x12y1::~DD0x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y1E(Test__ZN3ccc8DD0x12y1E, "_ZN3ccc8DD0x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y1C1Ev();
extern void _ZN3ccc8DD0x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y1E[] = {
  NSPAIR(_ZN3ccc8DD0x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y1E[];
extern void _ZN3ccc8DD0x12y13abcEv();
extern void _ZN3ccc8DD0x12y13efgEv();
extern void _ZN3ccc8DD0x12y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y13abcEv,_ZTv0_n12_N3ccc8DD0x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y13abcEv,_ZThn4_N3ccc8DD0x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y13abcEv,_ZTv0_n12_N3ccc8DD0x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y1E[] = {
  {&(_ZTVN3ccc8DD0x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y1E[];
static VTBL_ENTRY alt_thunk_names358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y13abcEv,_ZTv0_n12_N3ccc8DD0x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y13abcEv,_ZThn4_N3ccc8DD0x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y1E = {  "_ZN3ccc8DD0x12y1E", // class name
  bases__ZN3ccc8DD0x12y1E, 2,
  &(vtc__ZN3ccc8DD0x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y1E),3, //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  CC0x12y2  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y23pqrEv
  ~CC0x12y2(); // tgen
  CC0x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y2E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y23efgEv");}
void  ccc::CC0x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y23abcEv");}
void  ccc::CC0x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y23pqrEv");}
ccc::CC0x12y2 ::~CC0x12y2(){ note_dtor("_ZN3ccc8CC0x12y2E", this);} // tgen
ccc::CC0x12y2 ::CC0x12y2(){ note_ctor("_ZN3ccc8CC0x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y2E, buf);
    ::ccc::CC0x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y2E);
    dp->::ccc::CC0x12y2::~CC0x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y2E(Test__ZN3ccc8CC0x12y2E, "_ZN3ccc8CC0x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y2C1Ev();
extern void _ZN3ccc8CC0x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y2E[] = {
  NSPAIR(_ZN3ccc8CC0x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y2E[];
extern void _ZN3ccc8CC0x12y23abcEv();
extern void _ZN3ccc8CC0x12y23efgEv();
extern void _ZN3ccc8CC0x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y23abcEv,_ZTv0_n12_N3ccc8CC0x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y23abcEv,_ZThn4_N3ccc8CC0x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y23efgEv,_ZTv0_n16_N3ccc8CC0x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y23efgEv,_ZThn4_N3ccc8CC0x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y23pqrEv,_ZTv0_n20_N3ccc8CC0x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y23pqrEv,_ZThn4_N3ccc8CC0x12y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y23abcEv,_ZTv0_n12_N3ccc8CC0x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y23efgEv,_ZTv0_n16_N3ccc8CC0x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y23pqrEv,_ZTv0_n20_N3ccc8CC0x12y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y2E[] = {
  {&(_ZTVN3ccc8CC0x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y2E[];
static VTBL_ENTRY alt_thunk_names359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y23pqrEv,_ZTv0_n20_N3ccc8CC0x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y23pqrEv,_ZThn4_N3ccc8CC0x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y23efgEv,_ZTv0_n16_N3ccc8CC0x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y23efgEv,_ZThn4_N3ccc8CC0x12y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y23abcEv,_ZTv0_n12_N3ccc8CC0x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y23abcEv,_ZThn4_N3ccc8CC0x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y2E = {  "_ZN3ccc8CC0x12y2E", // class name
  bases__ZN3ccc8CC0x12y2E, 2,
  &(vtc__ZN3ccc8CC0x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y2E),2, //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  DD0x12y2  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD0x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y23pqrEv
  ~DD0x12y2(); // tgen
  DD0x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y23efgEv");}
void  ccc::DD0x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y23abcEv");}
void  ccc::DD0x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y23pqrEv");}
ccc::DD0x12y2 ::~DD0x12y2(){ note_dtor("_ZN3ccc8DD0x12y2E", this);} // tgen
ccc::DD0x12y2 ::DD0x12y2(){ note_ctor("_ZN3ccc8DD0x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y2E, buf);
    ::ccc::DD0x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y2E);
    dp->::ccc::DD0x12y2::~DD0x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y2E(Test__ZN3ccc8DD0x12y2E, "_ZN3ccc8DD0x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y2C1Ev();
extern void _ZN3ccc8DD0x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y2E[] = {
  NSPAIR(_ZN3ccc8DD0x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y2E[];
extern void _ZN3ccc8DD0x12y23abcEv();
extern void _ZN3ccc8DD0x12y23efgEv();
extern void _ZN3ccc8DD0x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y23abcEv,_ZTv0_n12_N3ccc8DD0x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y23abcEv,_ZThn4_N3ccc8DD0x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y23abcEv,_ZTv0_n12_N3ccc8DD0x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y2E[] = {
  {&(_ZTVN3ccc8DD0x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y2E[];
static VTBL_ENTRY alt_thunk_names360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y23abcEv,_ZTv0_n12_N3ccc8DD0x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y23abcEv,_ZThn4_N3ccc8DD0x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y2E = {  "_ZN3ccc8DD0x12y2E", // class name
  bases__ZN3ccc8DD0x12y2E, 2,
  &(vtc__ZN3ccc8DD0x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y2E),3, //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  CC0x12y3  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x12y33abcEv
  ~CC0x12y3(); // tgen
  CC0x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y3E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y33efgEv");}
void  ccc::CC0x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y33pqrEv");}
void  ccc::CC0x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y33abcEv");}
ccc::CC0x12y3 ::~CC0x12y3(){ note_dtor("_ZN3ccc8CC0x12y3E", this);} // tgen
ccc::CC0x12y3 ::CC0x12y3(){ note_ctor("_ZN3ccc8CC0x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y3E, buf);
    ::ccc::CC0x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y3E);
    dp->::ccc::CC0x12y3::~CC0x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y3E(Test__ZN3ccc8CC0x12y3E, "_ZN3ccc8CC0x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y3C1Ev();
extern void _ZN3ccc8CC0x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y3E[] = {
  NSPAIR(_ZN3ccc8CC0x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y3E[];
extern void _ZN3ccc8CC0x12y33abcEv();
extern void _ZN3ccc8CC0x12y33efgEv();
extern void _ZN3ccc8CC0x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y33abcEv,_ZTv0_n12_N3ccc8CC0x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y33abcEv,_ZThn4_N3ccc8CC0x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y33efgEv,_ZTv0_n16_N3ccc8CC0x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y33efgEv,_ZThn4_N3ccc8CC0x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y33pqrEv,_ZTv0_n20_N3ccc8CC0x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y33pqrEv,_ZThn4_N3ccc8CC0x12y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y33abcEv,_ZTv0_n12_N3ccc8CC0x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y33efgEv,_ZTv0_n16_N3ccc8CC0x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y33pqrEv,_ZTv0_n20_N3ccc8CC0x12y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y3E[] = {
  {&(_ZTVN3ccc8CC0x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y3E[];
static VTBL_ENTRY alt_thunk_names361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y33pqrEv,_ZTv0_n20_N3ccc8CC0x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y33pqrEv,_ZThn4_N3ccc8CC0x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y33efgEv,_ZTv0_n16_N3ccc8CC0x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y33efgEv,_ZThn4_N3ccc8CC0x12y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y33abcEv,_ZTv0_n12_N3ccc8CC0x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y33abcEv,_ZThn4_N3ccc8CC0x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y3E = {  "_ZN3ccc8CC0x12y3E", // class name
  bases__ZN3ccc8CC0x12y3E, 2,
  &(vtc__ZN3ccc8CC0x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y3E),2, //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  DD0x12y3  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD0x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x12y33abcEv
  ~DD0x12y3(); // tgen
  DD0x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y33efgEv");}
void  ccc::DD0x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y33pqrEv");}
void  ccc::DD0x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y33abcEv");}
ccc::DD0x12y3 ::~DD0x12y3(){ note_dtor("_ZN3ccc8DD0x12y3E", this);} // tgen
ccc::DD0x12y3 ::DD0x12y3(){ note_ctor("_ZN3ccc8DD0x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y3E, buf);
    ::ccc::DD0x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y3E);
    dp->::ccc::DD0x12y3::~DD0x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y3E(Test__ZN3ccc8DD0x12y3E, "_ZN3ccc8DD0x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y3C1Ev();
extern void _ZN3ccc8DD0x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y3E[] = {
  NSPAIR(_ZN3ccc8DD0x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y3E[];
extern void _ZN3ccc8DD0x12y33abcEv();
extern void _ZN3ccc8DD0x12y33efgEv();
extern void _ZN3ccc8DD0x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y33abcEv,_ZTv0_n12_N3ccc8DD0x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y33abcEv,_ZThn4_N3ccc8DD0x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y33abcEv,_ZTv0_n12_N3ccc8DD0x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y3E[] = {
  {&(_ZTVN3ccc8DD0x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y3E[];
static VTBL_ENTRY alt_thunk_names362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y33abcEv,_ZTv0_n12_N3ccc8DD0x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y33abcEv,_ZThn4_N3ccc8DD0x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y3E = {  "_ZN3ccc8DD0x12y3E", // class name
  bases__ZN3ccc8DD0x12y3E, 2,
  &(vtc__ZN3ccc8DD0x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y3E),3, //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  CC0x12y4  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC0x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y43efgEv
  ~CC0x12y4(); // tgen
  CC0x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y4E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y43pqrEv");}
void  ccc::CC0x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y43abcEv");}
void  ccc::CC0x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y43efgEv");}
ccc::CC0x12y4 ::~CC0x12y4(){ note_dtor("_ZN3ccc8CC0x12y4E", this);} // tgen
ccc::CC0x12y4 ::CC0x12y4(){ note_ctor("_ZN3ccc8CC0x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y4E, buf);
    ::ccc::CC0x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y4E);
    dp->::ccc::CC0x12y4::~CC0x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y4E(Test__ZN3ccc8CC0x12y4E, "_ZN3ccc8CC0x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y4C1Ev();
extern void _ZN3ccc8CC0x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y4E[] = {
  NSPAIR(_ZN3ccc8CC0x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y4E[];
extern void _ZN3ccc8CC0x12y43abcEv();
extern void _ZN3ccc8CC0x12y43pqrEv();
extern void _ZN3ccc8CC0x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y43abcEv,_ZTv0_n12_N3ccc8CC0x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y43abcEv,_ZThn4_N3ccc8CC0x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y43efgEv,_ZTv0_n16_N3ccc8CC0x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y43efgEv,_ZThn4_N3ccc8CC0x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y43pqrEv,_ZTv0_n20_N3ccc8CC0x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y43pqrEv,_ZThn4_N3ccc8CC0x12y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y43abcEv,_ZTv0_n12_N3ccc8CC0x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y43efgEv,_ZTv0_n16_N3ccc8CC0x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y43pqrEv,_ZTv0_n20_N3ccc8CC0x12y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y4E[] = {
  {&(_ZTVN3ccc8CC0x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y4E[];
static VTBL_ENTRY alt_thunk_names363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y43pqrEv,_ZTv0_n20_N3ccc8CC0x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y43pqrEv,_ZThn4_N3ccc8CC0x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y43efgEv,_ZTv0_n16_N3ccc8CC0x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y43efgEv,_ZThn4_N3ccc8CC0x12y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y43abcEv,_ZTv0_n12_N3ccc8CC0x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y43abcEv,_ZThn4_N3ccc8CC0x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y4E = {  "_ZN3ccc8CC0x12y4E", // class name
  bases__ZN3ccc8CC0x12y4E, 2,
  &(vtc__ZN3ccc8CC0x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y4E),2, //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  DD0x12y4  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD0x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x12y43efgEv
  ~DD0x12y4(); // tgen
  DD0x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y43pqrEv");}
void  ccc::DD0x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y43abcEv");}
void  ccc::DD0x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y43efgEv");}
ccc::DD0x12y4 ::~DD0x12y4(){ note_dtor("_ZN3ccc8DD0x12y4E", this);} // tgen
ccc::DD0x12y4 ::DD0x12y4(){ note_ctor("_ZN3ccc8DD0x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y4E, buf);
    ::ccc::DD0x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y4E);
    dp->::ccc::DD0x12y4::~DD0x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y4E(Test__ZN3ccc8DD0x12y4E, "_ZN3ccc8DD0x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y4C1Ev();
extern void _ZN3ccc8DD0x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y4E[] = {
  NSPAIR(_ZN3ccc8DD0x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y4E[];
extern void _ZN3ccc8DD0x12y43abcEv();
extern void _ZN3ccc8DD0x12y43efgEv();
extern void _ZN3ccc8DD0x12y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y43abcEv,_ZTv0_n12_N3ccc8DD0x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y43abcEv,_ZThn4_N3ccc8DD0x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y43abcEv,_ZTv0_n12_N3ccc8DD0x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y4E[] = {
  {&(_ZTVN3ccc8DD0x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y4E[];
static VTBL_ENTRY alt_thunk_names364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y43abcEv,_ZTv0_n12_N3ccc8DD0x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y43abcEv,_ZThn4_N3ccc8DD0x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y4E = {  "_ZN3ccc8DD0x12y4E", // class name
  bases__ZN3ccc8DD0x12y4E, 2,
  &(vtc__ZN3ccc8DD0x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y4E),3, //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  CC0x12y5  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC0x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y53abcEv
  ~CC0x12y5(); // tgen
  CC0x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y5E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y53pqrEv");}
void  ccc::CC0x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y53efgEv");}
void  ccc::CC0x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y53abcEv");}
ccc::CC0x12y5 ::~CC0x12y5(){ note_dtor("_ZN3ccc8CC0x12y5E", this);} // tgen
ccc::CC0x12y5 ::CC0x12y5(){ note_ctor("_ZN3ccc8CC0x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y5E, buf);
    ::ccc::CC0x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y5E);
    dp->::ccc::CC0x12y5::~CC0x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y5E(Test__ZN3ccc8CC0x12y5E, "_ZN3ccc8CC0x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y5C1Ev();
extern void _ZN3ccc8CC0x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y5E[] = {
  NSPAIR(_ZN3ccc8CC0x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y5E[];
extern void _ZN3ccc8CC0x12y53abcEv();
extern void _ZN3ccc8CC0x12y53pqrEv();
extern void _ZN3ccc8CC0x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y53abcEv,_ZTv0_n12_N3ccc8CC0x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y53abcEv,_ZThn4_N3ccc8CC0x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y53efgEv,_ZTv0_n16_N3ccc8CC0x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y53efgEv,_ZThn4_N3ccc8CC0x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y53pqrEv,_ZTv0_n20_N3ccc8CC0x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y53pqrEv,_ZThn4_N3ccc8CC0x12y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y53abcEv,_ZTv0_n12_N3ccc8CC0x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y53efgEv,_ZTv0_n16_N3ccc8CC0x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y53pqrEv,_ZTv0_n20_N3ccc8CC0x12y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y5E[] = {
  {&(_ZTVN3ccc8CC0x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y5E[];
static VTBL_ENTRY alt_thunk_names365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y53pqrEv,_ZTv0_n20_N3ccc8CC0x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y53pqrEv,_ZThn4_N3ccc8CC0x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y53efgEv,_ZTv0_n16_N3ccc8CC0x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y53efgEv,_ZThn4_N3ccc8CC0x12y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y53abcEv,_ZTv0_n12_N3ccc8CC0x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y53abcEv,_ZThn4_N3ccc8CC0x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y5E = {  "_ZN3ccc8CC0x12y5E", // class name
  bases__ZN3ccc8CC0x12y5E, 2,
  &(vtc__ZN3ccc8CC0x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y5E),2, //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  DD0x12y5  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD0x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x12y53abcEv
  ~DD0x12y5(); // tgen
  DD0x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y53pqrEv");}
void  ccc::DD0x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y53efgEv");}
void  ccc::DD0x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y53abcEv");}
ccc::DD0x12y5 ::~DD0x12y5(){ note_dtor("_ZN3ccc8DD0x12y5E", this);} // tgen
ccc::DD0x12y5 ::DD0x12y5(){ note_ctor("_ZN3ccc8DD0x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y5E, buf);
    ::ccc::DD0x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y5E);
    dp->::ccc::DD0x12y5::~DD0x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y5E(Test__ZN3ccc8DD0x12y5E, "_ZN3ccc8DD0x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y5C1Ev();
extern void _ZN3ccc8DD0x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y5E[] = {
  NSPAIR(_ZN3ccc8DD0x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y5E[];
extern void _ZN3ccc8DD0x12y53abcEv();
extern void _ZN3ccc8DD0x12y53efgEv();
extern void _ZN3ccc8DD0x12y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y53abcEv,_ZTv0_n12_N3ccc8DD0x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y53abcEv,_ZThn4_N3ccc8DD0x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y53abcEv,_ZTv0_n12_N3ccc8DD0x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y5E[] = {
  {&(_ZTVN3ccc8DD0x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y5E[];
static VTBL_ENTRY alt_thunk_names366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y53abcEv,_ZTv0_n12_N3ccc8DD0x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y53abcEv,_ZThn4_N3ccc8DD0x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y5E = {  "_ZN3ccc8DD0x12y5E", // class name
  bases__ZN3ccc8DD0x12y5E, 2,
  &(vtc__ZN3ccc8DD0x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y5E),3, //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  CC0x12y6  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y63efgEv
  ~CC0x12y6(); // tgen
  CC0x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y6E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y63abcEv");}
void  ccc::CC0x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y63efgEv");}
ccc::CC0x12y6 ::~CC0x12y6(){ note_dtor("_ZN3ccc8CC0x12y6E", this);} // tgen
ccc::CC0x12y6 ::CC0x12y6(){ note_ctor("_ZN3ccc8CC0x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y6E, buf);
    ::ccc::CC0x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y6E);
    dp->::ccc::CC0x12y6::~CC0x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y6E(Test__ZN3ccc8CC0x12y6E, "_ZN3ccc8CC0x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y6C1Ev();
extern void _ZN3ccc8CC0x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y6E[] = {
  NSPAIR(_ZN3ccc8CC0x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y6E[];
extern void _ZN3ccc8CC0x12y63abcEv();
extern void _ZN3ccc8CC0x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y63abcEv,_ZTv0_n12_N3ccc8CC0x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y63abcEv,_ZThn4_N3ccc8CC0x12y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y63efgEv,_ZTv0_n16_N3ccc8CC0x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y63efgEv,_ZThn4_N3ccc8CC0x12y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y63abcEv,_ZTv0_n12_N3ccc8CC0x12y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y63efgEv,_ZTv0_n16_N3ccc8CC0x12y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y6E[] = {
  {&(_ZTVN3ccc8CC0x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y6E[];
static VTBL_ENTRY alt_thunk_names367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y63efgEv,_ZTv0_n16_N3ccc8CC0x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y63efgEv,_ZThn4_N3ccc8CC0x12y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y63abcEv,_ZTv0_n12_N3ccc8CC0x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y63abcEv,_ZThn4_N3ccc8CC0x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y6E = {  "_ZN3ccc8CC0x12y6E", // class name
  bases__ZN3ccc8CC0x12y6E, 2,
  &(vtc__ZN3ccc8CC0x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y6E),2, //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  DD0x12y6  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD0x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x12y63efgEv
  ~DD0x12y6(); // tgen
  DD0x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y63abcEv");}
void  ccc::DD0x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y63efgEv");}
ccc::DD0x12y6 ::~DD0x12y6(){ note_dtor("_ZN3ccc8DD0x12y6E", this);} // tgen
ccc::DD0x12y6 ::DD0x12y6(){ note_ctor("_ZN3ccc8DD0x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y6E, buf);
    ::ccc::DD0x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y6E);
    dp->::ccc::DD0x12y6::~DD0x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y6E(Test__ZN3ccc8DD0x12y6E, "_ZN3ccc8DD0x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y6C1Ev();
extern void _ZN3ccc8DD0x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y6E[] = {
  NSPAIR(_ZN3ccc8DD0x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y6E[];
extern void _ZN3ccc8DD0x12y63abcEv();
extern void _ZN3ccc8DD0x12y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y63abcEv,_ZTv0_n12_N3ccc8DD0x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y63abcEv,_ZThn4_N3ccc8DD0x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y63abcEv,_ZTv0_n12_N3ccc8DD0x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y6E[] = {
  {&(_ZTVN3ccc8DD0x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y6E[];
static VTBL_ENTRY alt_thunk_names368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y63abcEv,_ZTv0_n12_N3ccc8DD0x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y63abcEv,_ZThn4_N3ccc8DD0x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y6E = {  "_ZN3ccc8DD0x12y6E", // class name
  bases__ZN3ccc8DD0x12y6E, 2,
  &(vtc__ZN3ccc8DD0x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y6E),3, //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  CC0x12y7  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y73pqrEv
  ~CC0x12y7(); // tgen
  CC0x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y7E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y73abcEv");}
void  ccc::CC0x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y73pqrEv");}
ccc::CC0x12y7 ::~CC0x12y7(){ note_dtor("_ZN3ccc8CC0x12y7E", this);} // tgen
ccc::CC0x12y7 ::CC0x12y7(){ note_ctor("_ZN3ccc8CC0x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y7E, buf);
    ::ccc::CC0x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y7E);
    dp->::ccc::CC0x12y7::~CC0x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y7E(Test__ZN3ccc8CC0x12y7E, "_ZN3ccc8CC0x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y7C1Ev();
extern void _ZN3ccc8CC0x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y7E[] = {
  NSPAIR(_ZN3ccc8CC0x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y7E[];
extern void _ZN3ccc8CC0x12y73abcEv();
extern void _ZN3ccc8CC0x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y73abcEv,_ZTv0_n12_N3ccc8CC0x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y73abcEv,_ZThn4_N3ccc8CC0x12y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y73pqrEv,_ZTv0_n20_N3ccc8CC0x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y73pqrEv,_ZThn4_N3ccc8CC0x12y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y73abcEv,_ZTv0_n12_N3ccc8CC0x12y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y73pqrEv,_ZTv0_n20_N3ccc8CC0x12y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y7E[] = {
  {&(_ZTVN3ccc8CC0x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y7E[];
static VTBL_ENTRY alt_thunk_names369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y73pqrEv,_ZTv0_n20_N3ccc8CC0x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y73pqrEv,_ZThn4_N3ccc8CC0x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y73abcEv,_ZTv0_n12_N3ccc8CC0x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y73abcEv,_ZThn4_N3ccc8CC0x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y7E = {  "_ZN3ccc8CC0x12y7E", // class name
  bases__ZN3ccc8CC0x12y7E, 2,
  &(vtc__ZN3ccc8CC0x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y7E),2, //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  DD0x12y7  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD0x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y73pqrEv
  ~DD0x12y7(); // tgen
  DD0x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y73abcEv");}
void  ccc::DD0x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y73pqrEv");}
ccc::DD0x12y7 ::~DD0x12y7(){ note_dtor("_ZN3ccc8DD0x12y7E", this);} // tgen
ccc::DD0x12y7 ::DD0x12y7(){ note_ctor("_ZN3ccc8DD0x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y7E, buf);
    ::ccc::DD0x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y7E);
    dp->::ccc::DD0x12y7::~DD0x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y7E(Test__ZN3ccc8DD0x12y7E, "_ZN3ccc8DD0x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y7C1Ev();
extern void _ZN3ccc8DD0x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y7E[] = {
  NSPAIR(_ZN3ccc8DD0x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y7E[];
extern void _ZN3ccc8DD0x12y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y73abcEv,_ZTv0_n12_N3ccc8DD0x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y73abcEv,_ZThn4_N3ccc8DD0x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y73abcEv,_ZTv0_n12_N3ccc8DD0x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y7E[] = {
  {&(_ZTVN3ccc8DD0x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y7E[];
static VTBL_ENTRY alt_thunk_names370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y73abcEv,_ZTv0_n12_N3ccc8DD0x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y73abcEv,_ZThn4_N3ccc8DD0x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y7E = {  "_ZN3ccc8DD0x12y7E", // class name
  bases__ZN3ccc8DD0x12y7E, 2,
  &(vtc__ZN3ccc8DD0x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y7E),3, //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  CC0x12y8  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y83abcEv
  ~CC0x12y8(); // tgen
  CC0x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y8E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y83efgEv");}
void  ccc::CC0x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y83abcEv");}
ccc::CC0x12y8 ::~CC0x12y8(){ note_dtor("_ZN3ccc8CC0x12y8E", this);} // tgen
ccc::CC0x12y8 ::CC0x12y8(){ note_ctor("_ZN3ccc8CC0x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y8E, buf);
    ::ccc::CC0x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y8E);
    dp->::ccc::CC0x12y8::~CC0x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y8E(Test__ZN3ccc8CC0x12y8E, "_ZN3ccc8CC0x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y8C1Ev();
extern void _ZN3ccc8CC0x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y8E[] = {
  NSPAIR(_ZN3ccc8CC0x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y8E[];
extern void _ZN3ccc8CC0x12y83abcEv();
extern void _ZN3ccc8CC0x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x12y83abcEv,_ZTv0_n12_N3ccc8CC0x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y83abcEv,_ZThn4_N3ccc8CC0x12y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y83efgEv,_ZTv0_n16_N3ccc8CC0x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y83efgEv,_ZThn4_N3ccc8CC0x12y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x12y83abcEv,_ZTv0_n12_N3ccc8CC0x12y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y83efgEv,_ZTv0_n16_N3ccc8CC0x12y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y8E[] = {
  {&(_ZTVN3ccc8CC0x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y8E[];
static VTBL_ENTRY alt_thunk_names371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y83efgEv,_ZTv0_n16_N3ccc8CC0x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y83efgEv,_ZThn4_N3ccc8CC0x12y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x12y83abcEv,_ZTv0_n12_N3ccc8CC0x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y83abcEv,_ZThn4_N3ccc8CC0x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y8E = {  "_ZN3ccc8CC0x12y8E", // class name
  bases__ZN3ccc8CC0x12y8E, 2,
  &(vtc__ZN3ccc8CC0x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y8E),2, //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  DD0x12y8  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD0x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x12y83abcEv
  ~DD0x12y8(); // tgen
  DD0x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y83efgEv");}
void  ccc::DD0x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x12y83abcEv");}
ccc::DD0x12y8 ::~DD0x12y8(){ note_dtor("_ZN3ccc8DD0x12y8E", this);} // tgen
ccc::DD0x12y8 ::DD0x12y8(){ note_ctor("_ZN3ccc8DD0x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y8E, buf);
    ::ccc::DD0x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y8E);
    dp->::ccc::DD0x12y8::~DD0x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y8E(Test__ZN3ccc8DD0x12y8E, "_ZN3ccc8DD0x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y8C1Ev();
extern void _ZN3ccc8DD0x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y8E[] = {
  NSPAIR(_ZN3ccc8DD0x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y8E[];
extern void _ZN3ccc8DD0x12y83abcEv();
extern void _ZN3ccc8DD0x12y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x12y83abcEv,_ZTv0_n12_N3ccc8DD0x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x12y83abcEv,_ZThn4_N3ccc8DD0x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x12y83abcEv,_ZTv0_n12_N3ccc8DD0x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y8E[] = {
  {&(_ZTVN3ccc8DD0x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y8E[];
static VTBL_ENTRY alt_thunk_names372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x12y83abcEv,_ZTv0_n12_N3ccc8DD0x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x12y83abcEv,_ZThn4_N3ccc8DD0x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x12y8E = {  "_ZN3ccc8DD0x12y8E", // class name
  bases__ZN3ccc8DD0x12y8E, 2,
  &(vtc__ZN3ccc8DD0x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y8E),3, //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  CC0x12y9  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y93pqrEv
  ~CC0x12y9(); // tgen
  CC0x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y9E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y93efgEv");}
void  ccc::CC0x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y93pqrEv");}
ccc::CC0x12y9 ::~CC0x12y9(){ note_dtor("_ZN3ccc8CC0x12y9E", this);} // tgen
ccc::CC0x12y9 ::CC0x12y9(){ note_ctor("_ZN3ccc8CC0x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y9E, buf);
    ::ccc::CC0x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC0x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y9E);
    dp->::ccc::CC0x12y9::~CC0x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y9E(Test__ZN3ccc8CC0x12y9E, "_ZN3ccc8CC0x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y9C1Ev();
extern void _ZN3ccc8CC0x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y9E[] = {
  NSPAIR(_ZN3ccc8CC0x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC0x12y93efgEv();
extern void _ZN3ccc8CC0x12y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x12y93efgEv,_ZTv0_n16_N3ccc8CC0x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y93efgEv,_ZThn4_N3ccc8CC0x12y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x12y93pqrEv,_ZTv0_n20_N3ccc8CC0x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y93pqrEv,_ZThn4_N3ccc8CC0x12y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x12y93efgEv,_ZTv0_n16_N3ccc8CC0x12y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x12y93pqrEv,_ZTv0_n20_N3ccc8CC0x12y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x12y9E[] = {
  {&(_ZTVN3ccc8CC0x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x12y9E[];
static VTBL_ENTRY alt_thunk_names373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x12y93pqrEv,_ZTv0_n20_N3ccc8CC0x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y93pqrEv,_ZThn4_N3ccc8CC0x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x12y93efgEv,_ZTv0_n16_N3ccc8CC0x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x12y93efgEv,_ZThn4_N3ccc8CC0x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x12y9E = {  "_ZN3ccc8CC0x12y9E", // class name
  bases__ZN3ccc8CC0x12y9E, 2,
  &(vtc__ZN3ccc8CC0x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x12y9E),2, //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  DD0x12y9  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD0x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x12y93pqrEv
  ~DD0x12y9(); // tgen
  DD0x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x12y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x12y93efgEv");}
void  ccc::DD0x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x12y93pqrEv");}
ccc::DD0x12y9 ::~DD0x12y9(){ note_dtor("_ZN3ccc8DD0x12y9E", this);} // tgen
ccc::DD0x12y9 ::DD0x12y9(){ note_ctor("_ZN3ccc8DD0x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x12y9E, buf);
    ::ccc::DD0x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x12y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD0x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x12y9E);
    dp->::ccc::DD0x12y9::~DD0x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x12y9E(Test__ZN3ccc8DD0x12y9E, "_ZN3ccc8DD0x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x12y9C1Ev();
extern void _ZN3ccc8DD0x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x12y9E[] = {
  NSPAIR(_ZN3ccc8DD0x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD0x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x12y93efgEv();
extern void _ZN3ccc8DD0x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x12y9E[] = {
  {&(_ZTVN3ccc8DD0x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x12y9E[];
Class_Descriptor cd__ZN3ccc8DD0x12y9E = {  "_ZN3ccc8DD0x12y9E", // class name
  bases__ZN3ccc8DD0x12y9E, 2,
  &(vtc__ZN3ccc8DD0x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x12y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y10  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x12y103abcEv
  ~CC0x12y10(); // tgen
  CC0x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y10E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y103pqrEv");}
void  ccc::CC0x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x12y103abcEv");}
ccc::CC0x12y10 ::~CC0x12y10(){ note_dtor("_ZN3ccc9CC0x12y10E", this);} // tgen
ccc::CC0x12y10 ::CC0x12y10(){ note_ctor("_ZN3ccc9CC0x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y10E, buf);
    ::ccc::CC0x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y10E);
    dp->::ccc::CC0x12y10::~CC0x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y10E(Test__ZN3ccc9CC0x12y10E, "_ZN3ccc9CC0x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y10C1Ev();
extern void _ZN3ccc9CC0x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y10E[] = {
  NSPAIR(_ZN3ccc9CC0x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y10E[];
extern void _ZN3ccc9CC0x12y103abcEv();
extern void _ZN3ccc9CC0x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x12y103abcEv,_ZTv0_n12_N3ccc9CC0x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y103abcEv,_ZThn4_N3ccc9CC0x12y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x12y103pqrEv,_ZTv0_n20_N3ccc9CC0x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y103pqrEv,_ZThn4_N3ccc9CC0x12y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x12y103abcEv,_ZTv0_n12_N3ccc9CC0x12y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x12y103pqrEv,_ZTv0_n20_N3ccc9CC0x12y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y10E[] = {
  {&(_ZTVN3ccc9CC0x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y10E[];
static VTBL_ENTRY alt_thunk_names374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x12y103pqrEv,_ZTv0_n20_N3ccc9CC0x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y103pqrEv,_ZThn4_N3ccc9CC0x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x12y103abcEv,_ZTv0_n12_N3ccc9CC0x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y103abcEv,_ZThn4_N3ccc9CC0x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x12y10E = {  "_ZN3ccc9CC0x12y10E", // class name
  bases__ZN3ccc9CC0x12y10E, 2,
  &(vtc__ZN3ccc9CC0x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y10E),2, //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  DD0x12y10  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD0x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x12y103abcEv
  ~DD0x12y10(); // tgen
  DD0x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x12y103pqrEv");}
void  ccc::DD0x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x12y103abcEv");}
ccc::DD0x12y10 ::~DD0x12y10(){ note_dtor("_ZN3ccc9DD0x12y10E", this);} // tgen
ccc::DD0x12y10 ::DD0x12y10(){ note_ctor("_ZN3ccc9DD0x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y10E, buf);
    ::ccc::DD0x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y10E);
    dp->::ccc::DD0x12y10::~DD0x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y10E(Test__ZN3ccc9DD0x12y10E, "_ZN3ccc9DD0x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y10C1Ev();
extern void _ZN3ccc9DD0x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y10E[] = {
  NSPAIR(_ZN3ccc9DD0x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y10E[];
extern void _ZN3ccc9DD0x12y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x12y103abcEv,_ZTv0_n12_N3ccc9DD0x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x12y103abcEv,_ZThn4_N3ccc9DD0x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x12y103abcEv,_ZTv0_n12_N3ccc9DD0x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y10E[] = {
  {&(_ZTVN3ccc9DD0x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y10E[];
static VTBL_ENTRY alt_thunk_names375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x12y103abcEv,_ZTv0_n12_N3ccc9DD0x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x12y103abcEv,_ZThn4_N3ccc9DD0x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x12y10E = {  "_ZN3ccc9DD0x12y10E", // class name
  bases__ZN3ccc9DD0x12y10E, 2,
  &(vtc__ZN3ccc9DD0x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y10E),3, //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  CC0x12y11  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x12y113efgEv
  ~CC0x12y11(); // tgen
  CC0x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y11E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y113pqrEv");}
void  ccc::CC0x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x12y113efgEv");}
ccc::CC0x12y11 ::~CC0x12y11(){ note_dtor("_ZN3ccc9CC0x12y11E", this);} // tgen
ccc::CC0x12y11 ::CC0x12y11(){ note_ctor("_ZN3ccc9CC0x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y11E, buf);
    ::ccc::CC0x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y11E);
    dp->::ccc::CC0x12y11::~CC0x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y11E(Test__ZN3ccc9CC0x12y11E, "_ZN3ccc9CC0x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y11C1Ev();
extern void _ZN3ccc9CC0x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y11E[] = {
  NSPAIR(_ZN3ccc9CC0x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC0x12y113pqrEv();
extern void _ZN3ccc9CC0x12y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x12y113efgEv,_ZTv0_n16_N3ccc9CC0x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y113efgEv,_ZThn4_N3ccc9CC0x12y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x12y113pqrEv,_ZTv0_n20_N3ccc9CC0x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y113pqrEv,_ZThn4_N3ccc9CC0x12y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x12y113efgEv,_ZTv0_n16_N3ccc9CC0x12y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x12y113pqrEv,_ZTv0_n20_N3ccc9CC0x12y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y11E[] = {
  {&(_ZTVN3ccc9CC0x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y11E[];
static VTBL_ENTRY alt_thunk_names376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x12y113pqrEv,_ZTv0_n20_N3ccc9CC0x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y113pqrEv,_ZThn4_N3ccc9CC0x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x12y113efgEv,_ZTv0_n16_N3ccc9CC0x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y113efgEv,_ZThn4_N3ccc9CC0x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x12y11E = {  "_ZN3ccc9CC0x12y11E", // class name
  bases__ZN3ccc9CC0x12y11E, 2,
  &(vtc__ZN3ccc9CC0x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y11E),2, //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  DD0x12y11  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD0x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x12y113efgEv
  ~DD0x12y11(); // tgen
  DD0x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x12y113pqrEv");}
void  ccc::DD0x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x12y113efgEv");}
ccc::DD0x12y11 ::~DD0x12y11(){ note_dtor("_ZN3ccc9DD0x12y11E", this);} // tgen
ccc::DD0x12y11 ::DD0x12y11(){ note_ctor("_ZN3ccc9DD0x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y11E, buf);
    ::ccc::DD0x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y11E);
    dp->::ccc::DD0x12y11::~DD0x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y11E(Test__ZN3ccc9DD0x12y11E, "_ZN3ccc9DD0x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y11C1Ev();
extern void _ZN3ccc9DD0x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y11E[] = {
  NSPAIR(_ZN3ccc9DD0x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x12y113efgEv();
extern void _ZN3ccc9DD0x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y113pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y11E[] = {
  {&(_ZTVN3ccc9DD0x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y11E[];
Class_Descriptor cd__ZN3ccc9DD0x12y11E = {  "_ZN3ccc9DD0x12y11E", // class name
  bases__ZN3ccc9DD0x12y11E, 2,
  &(vtc__ZN3ccc9DD0x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y12  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC0x12y123abcEv
  ~CC0x12y12(); // tgen
  CC0x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x12y123abcEv");}
ccc::CC0x12y12 ::~CC0x12y12(){ note_dtor("_ZN3ccc9CC0x12y12E", this);} // tgen
ccc::CC0x12y12 ::CC0x12y12(){ note_ctor("_ZN3ccc9CC0x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y12E, buf);
    ::ccc::CC0x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y12E);
    dp->::ccc::CC0x12y12::~CC0x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y12E(Test__ZN3ccc9CC0x12y12E, "_ZN3ccc9CC0x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y12C1Ev();
extern void _ZN3ccc9CC0x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y12E[] = {
  NSPAIR(_ZN3ccc9CC0x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y12E[];
extern void _ZN3ccc9CC0x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x12y123abcEv,_ZTv0_n12_N3ccc9CC0x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y123abcEv,_ZThn4_N3ccc9CC0x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x12y123abcEv,_ZTv0_n12_N3ccc9CC0x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y12E[] = {
  {&(_ZTVN3ccc9CC0x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y12E[];
static VTBL_ENTRY alt_thunk_names377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x12y123abcEv,_ZTv0_n12_N3ccc9CC0x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y123abcEv,_ZThn4_N3ccc9CC0x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x12y12E = {  "_ZN3ccc9CC0x12y12E", // class name
  bases__ZN3ccc9CC0x12y12E, 2,
  &(vtc__ZN3ccc9CC0x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y12E),2, //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  DD0x12y12  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD0x12y123abcEv
  ~DD0x12y12(); // tgen
  DD0x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD0x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x12y123abcEv");}
ccc::DD0x12y12 ::~DD0x12y12(){ note_dtor("_ZN3ccc9DD0x12y12E", this);} // tgen
ccc::DD0x12y12 ::DD0x12y12(){ note_ctor("_ZN3ccc9DD0x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y12E, buf);
    ::ccc::DD0x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y12E);
    dp->::ccc::DD0x12y12::~DD0x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y12E(Test__ZN3ccc9DD0x12y12E, "_ZN3ccc9DD0x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y12C1Ev();
extern void _ZN3ccc9DD0x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y12E[] = {
  NSPAIR(_ZN3ccc9DD0x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y12E[];
extern void _ZN3ccc9DD0x12y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x12y123abcEv,_ZTv0_n12_N3ccc9DD0x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x12y123abcEv,_ZThn4_N3ccc9DD0x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x12y123abcEv,_ZTv0_n12_N3ccc9DD0x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y12E[] = {
  {&(_ZTVN3ccc9DD0x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y12E[];
static VTBL_ENTRY alt_thunk_names378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x12y123abcEv,_ZTv0_n12_N3ccc9DD0x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x12y123abcEv,_ZThn4_N3ccc9DD0x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x12y12E = {  "_ZN3ccc9DD0x12y12E", // class name
  bases__ZN3ccc9DD0x12y12E, 2,
  &(vtc__ZN3ccc9DD0x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y12E),3, //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  CC0x12y13  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC0x12y133efgEv
  ~CC0x12y13(); // tgen
  CC0x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x12y133efgEv");}
ccc::CC0x12y13 ::~CC0x12y13(){ note_dtor("_ZN3ccc9CC0x12y13E", this);} // tgen
ccc::CC0x12y13 ::CC0x12y13(){ note_ctor("_ZN3ccc9CC0x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y13E, buf);
    ::ccc::CC0x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y13E);
    dp->::ccc::CC0x12y13::~CC0x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y13E(Test__ZN3ccc9CC0x12y13E, "_ZN3ccc9CC0x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y13C1Ev();
extern void _ZN3ccc9CC0x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y13E[] = {
  NSPAIR(_ZN3ccc9CC0x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC0x12y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x12y133efgEv,_ZTv0_n16_N3ccc9CC0x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y133efgEv,_ZThn4_N3ccc9CC0x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x12y133efgEv,_ZTv0_n16_N3ccc9CC0x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y13E[] = {
  {&(_ZTVN3ccc9CC0x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y13E[];
static VTBL_ENTRY alt_thunk_names379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x12y133efgEv,_ZTv0_n16_N3ccc9CC0x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y133efgEv,_ZThn4_N3ccc9CC0x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x12y13E = {  "_ZN3ccc9CC0x12y13E", // class name
  bases__ZN3ccc9CC0x12y13E, 2,
  &(vtc__ZN3ccc9CC0x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y13E),2, //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  DD0x12y13  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD0x12y133efgEv
  ~DD0x12y13(); // tgen
  DD0x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x12y133efgEv");}
ccc::DD0x12y13 ::~DD0x12y13(){ note_dtor("_ZN3ccc9DD0x12y13E", this);} // tgen
ccc::DD0x12y13 ::DD0x12y13(){ note_ctor("_ZN3ccc9DD0x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y13E, buf);
    ::ccc::DD0x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y13E);
    dp->::ccc::DD0x12y13::~DD0x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y13E(Test__ZN3ccc9DD0x12y13E, "_ZN3ccc9DD0x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y13C1Ev();
extern void _ZN3ccc9DD0x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y13E[] = {
  NSPAIR(_ZN3ccc9DD0x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x12y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y13E[] = {
  {&(_ZTVN3ccc9DD0x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y13E[];
Class_Descriptor cd__ZN3ccc9DD0x12y13E = {  "_ZN3ccc9DD0x12y13E", // class name
  bases__ZN3ccc9DD0x12y13E, 2,
  &(vtc__ZN3ccc9DD0x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y14  : virtual ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y143pqrEv
  ~CC0x12y14(); // tgen
  CC0x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y143pqrEv");}
ccc::CC0x12y14 ::~CC0x12y14(){ note_dtor("_ZN3ccc9CC0x12y14E", this);} // tgen
ccc::CC0x12y14 ::CC0x12y14(){ note_ctor("_ZN3ccc9CC0x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y14E, buf);
    ::ccc::CC0x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y14E);
    dp->::ccc::CC0x12y14::~CC0x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y14E(Test__ZN3ccc9CC0x12y14E, "_ZN3ccc9CC0x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y14C1Ev();
extern void _ZN3ccc9CC0x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y14E[] = {
  NSPAIR(_ZN3ccc9CC0x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC0x12y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x12y143pqrEv,_ZTv0_n20_N3ccc9CC0x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y143pqrEv,_ZThn4_N3ccc9CC0x12y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x12y143pqrEv,_ZTv0_n20_N3ccc9CC0x12y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y14E[] = {
  {&(_ZTVN3ccc9CC0x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y14E[];
static VTBL_ENTRY alt_thunk_names380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x12y143pqrEv,_ZTv0_n20_N3ccc9CC0x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x12y143pqrEv,_ZThn4_N3ccc9CC0x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x12y14E = {  "_ZN3ccc9CC0x12y14E", // class name
  bases__ZN3ccc9CC0x12y14E, 2,
  &(vtc__ZN3ccc9CC0x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y14E),2, //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  DD0x12y14  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD0x12y143pqrEv
  ~DD0x12y14(); // tgen
  DD0x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x12y143pqrEv");}
ccc::DD0x12y14 ::~DD0x12y14(){ note_dtor("_ZN3ccc9DD0x12y14E", this);} // tgen
ccc::DD0x12y14 ::DD0x12y14(){ note_ctor("_ZN3ccc9DD0x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y14E, buf);
    ::ccc::DD0x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y14E);
    dp->::ccc::DD0x12y14::~DD0x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y14E(Test__ZN3ccc9DD0x12y14E, "_ZN3ccc9DD0x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y14C1Ev();
extern void _ZN3ccc9DD0x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y14E[] = {
  NSPAIR(_ZN3ccc9DD0x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y14E[] = {
  {&(_ZTVN3ccc9DD0x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y14E[];
Class_Descriptor cd__ZN3ccc9DD0x12y14E = {  "_ZN3ccc9DD0x12y14E", // class name
  bases__ZN3ccc9DD0x12y14E, 2,
  &(vtc__ZN3ccc9DD0x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y15  : virtual ::ccc::AA0 , ::ccc::BB12 {
  ~CC0x12y15(); // tgen
  CC0x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x12y15 ::~CC0x12y15(){ note_dtor("_ZN3ccc9CC0x12y15E", this);} // tgen
ccc::CC0x12y15 ::CC0x12y15(){ note_ctor("_ZN3ccc9CC0x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y15E, buf);
    ::ccc::CC0x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC0x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y15E);
    dp->::ccc::CC0x12y15::~CC0x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y15E(Test__ZN3ccc9CC0x12y15E, "_ZN3ccc9CC0x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y15C1Ev();
extern void _ZN3ccc9CC0x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y15E[] = {
  NSPAIR(_ZN3ccc9CC0x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x12y15E[] = {
  {&(_ZTVN3ccc9CC0x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x12y15E[];
Class_Descriptor cd__ZN3ccc9CC0x12y15E = {  "_ZN3ccc9CC0x12y15E", // class name
  bases__ZN3ccc9CC0x12y15E, 2,
  &(vtc__ZN3ccc9CC0x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x12y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x12y15  : virtual ::ccc::AA0 , virtual ::ccc::BB12 {
  ~DD0x12y15(); // tgen
  DD0x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD0x12y15 ::~DD0x12y15(){ note_dtor("_ZN3ccc9DD0x12y15E", this);} // tgen
ccc::DD0x12y15 ::DD0x12y15(){ note_ctor("_ZN3ccc9DD0x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x12y15E, buf);
    ::ccc::DD0x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x12y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD0x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x12y15E);
    dp->::ccc::DD0x12y15::~DD0x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x12y15E(Test__ZN3ccc9DD0x12y15E, "_ZN3ccc9DD0x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x12y15C1Ev();
extern void _ZN3ccc9DD0x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x12y15E[] = {
  NSPAIR(_ZN3ccc9DD0x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD0x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x12y15E[] = {
  {&(_ZTVN3ccc9DD0x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x12y15E[];
Class_Descriptor cd__ZN3ccc9DD0x12y15E = {  "_ZN3ccc9DD0x12y15E", // class name
  bases__ZN3ccc9DD0x12y15E, 2,
  &(vtc__ZN3ccc9DD0x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x12y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y0  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y03pqrEv
  ~CC0x13y0(); // tgen
  CC0x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y0E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y03abcEv");}
void  ccc::CC0x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y03efgEv");}
void  ccc::CC0x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y03pqrEv");}
ccc::CC0x13y0 ::~CC0x13y0(){ note_dtor("_ZN3ccc8CC0x13y0E", this);} // tgen
ccc::CC0x13y0 ::CC0x13y0(){ note_ctor("_ZN3ccc8CC0x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y0E, buf);
    ::ccc::CC0x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y0E);
    dp->::ccc::CC0x13y0::~CC0x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y0E(Test__ZN3ccc8CC0x13y0E, "_ZN3ccc8CC0x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y0C1Ev();
extern void _ZN3ccc8CC0x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y0E[] = {
  NSPAIR(_ZN3ccc8CC0x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y0E[];
extern void _ZN3ccc8CC0x13y03efgEv();
extern void _ZN3ccc8CC0x13y03abcEv();
extern void _ZN3ccc8CC0x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y03abcEv,_ZTv0_n12_N3ccc8CC0x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y03abcEv,_ZThn4_N3ccc8CC0x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y03efgEv,_ZTv0_n16_N3ccc8CC0x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y03efgEv,_ZThn4_N3ccc8CC0x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y03pqrEv,_ZTv0_n20_N3ccc8CC0x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y03pqrEv,_ZThn4_N3ccc8CC0x13y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y03abcEv,_ZTv0_n12_N3ccc8CC0x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y03efgEv,_ZTv0_n16_N3ccc8CC0x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y03pqrEv,_ZTv0_n20_N3ccc8CC0x13y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y0E[] = {
  {&(_ZTVN3ccc8CC0x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y0E[];
static VTBL_ENTRY alt_thunk_names381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y03pqrEv,_ZTv0_n20_N3ccc8CC0x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y03pqrEv,_ZThn4_N3ccc8CC0x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y03efgEv,_ZTv0_n16_N3ccc8CC0x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y03efgEv,_ZThn4_N3ccc8CC0x13y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y03abcEv,_ZTv0_n12_N3ccc8CC0x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y03abcEv,_ZThn4_N3ccc8CC0x13y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y0E = {  "_ZN3ccc8CC0x13y0E", // class name
  bases__ZN3ccc8CC0x13y0E, 2,
  &(vtc__ZN3ccc8CC0x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y0E),2, //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  DD0x13y0  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD0x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y03pqrEv
  ~DD0x13y0(); // tgen
  DD0x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y03abcEv");}
void  ccc::DD0x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y03efgEv");}
void  ccc::DD0x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y03pqrEv");}
ccc::DD0x13y0 ::~DD0x13y0(){ note_dtor("_ZN3ccc8DD0x13y0E", this);} // tgen
ccc::DD0x13y0 ::DD0x13y0(){ note_ctor("_ZN3ccc8DD0x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y0E, buf);
    ::ccc::DD0x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y0E);
    dp->::ccc::DD0x13y0::~DD0x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y0E(Test__ZN3ccc8DD0x13y0E, "_ZN3ccc8DD0x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y0C1Ev();
extern void _ZN3ccc8DD0x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y0E[] = {
  NSPAIR(_ZN3ccc8DD0x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y0E[];
extern void _ZN3ccc8DD0x13y03abcEv();
extern void _ZN3ccc8DD0x13y03efgEv();
extern void _ZN3ccc8DD0x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y03efgEv,_ZTv0_n12_N3ccc8DD0x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y03efgEv,_ZThn4_N3ccc8DD0x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y03efgEv,_ZTv0_n12_N3ccc8DD0x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y0E[] = {
  {&(_ZTVN3ccc8DD0x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y0E[];
static VTBL_ENTRY alt_thunk_names382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y03efgEv,_ZTv0_n12_N3ccc8DD0x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y03efgEv,_ZThn4_N3ccc8DD0x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y0E = {  "_ZN3ccc8DD0x13y0E", // class name
  bases__ZN3ccc8DD0x13y0E, 2,
  &(vtc__ZN3ccc8DD0x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y0E),3, //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  CC0x13y1  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x13y13efgEv
  ~CC0x13y1(); // tgen
  CC0x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y1E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y13abcEv");}
void  ccc::CC0x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y13pqrEv");}
void  ccc::CC0x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y13efgEv");}
ccc::CC0x13y1 ::~CC0x13y1(){ note_dtor("_ZN3ccc8CC0x13y1E", this);} // tgen
ccc::CC0x13y1 ::CC0x13y1(){ note_ctor("_ZN3ccc8CC0x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y1E, buf);
    ::ccc::CC0x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y1E);
    dp->::ccc::CC0x13y1::~CC0x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y1E(Test__ZN3ccc8CC0x13y1E, "_ZN3ccc8CC0x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y1C1Ev();
extern void _ZN3ccc8CC0x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y1E[] = {
  NSPAIR(_ZN3ccc8CC0x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y1E[];
extern void _ZN3ccc8CC0x13y13efgEv();
extern void _ZN3ccc8CC0x13y13abcEv();
extern void _ZN3ccc8CC0x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y13abcEv,_ZTv0_n12_N3ccc8CC0x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y13abcEv,_ZThn4_N3ccc8CC0x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y13efgEv,_ZTv0_n16_N3ccc8CC0x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y13efgEv,_ZThn4_N3ccc8CC0x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y13pqrEv,_ZTv0_n20_N3ccc8CC0x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y13pqrEv,_ZThn4_N3ccc8CC0x13y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y13abcEv,_ZTv0_n12_N3ccc8CC0x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y13efgEv,_ZTv0_n16_N3ccc8CC0x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y13pqrEv,_ZTv0_n20_N3ccc8CC0x13y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y1E[] = {
  {&(_ZTVN3ccc8CC0x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y1E[];
static VTBL_ENTRY alt_thunk_names383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y13pqrEv,_ZTv0_n20_N3ccc8CC0x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y13pqrEv,_ZThn4_N3ccc8CC0x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y13efgEv,_ZTv0_n16_N3ccc8CC0x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y13efgEv,_ZThn4_N3ccc8CC0x13y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y13abcEv,_ZTv0_n12_N3ccc8CC0x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y13abcEv,_ZThn4_N3ccc8CC0x13y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y1E = {  "_ZN3ccc8CC0x13y1E", // class name
  bases__ZN3ccc8CC0x13y1E, 2,
  &(vtc__ZN3ccc8CC0x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y1E),2, //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  DD0x13y1  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD0x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x13y13efgEv
  ~DD0x13y1(); // tgen
  DD0x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y13abcEv");}
void  ccc::DD0x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y13pqrEv");}
void  ccc::DD0x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y13efgEv");}
ccc::DD0x13y1 ::~DD0x13y1(){ note_dtor("_ZN3ccc8DD0x13y1E", this);} // tgen
ccc::DD0x13y1 ::DD0x13y1(){ note_ctor("_ZN3ccc8DD0x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y1E, buf);
    ::ccc::DD0x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y1E);
    dp->::ccc::DD0x13y1::~DD0x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y1E(Test__ZN3ccc8DD0x13y1E, "_ZN3ccc8DD0x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y1C1Ev();
extern void _ZN3ccc8DD0x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y1E[] = {
  NSPAIR(_ZN3ccc8DD0x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y1E[];
extern void _ZN3ccc8DD0x13y13abcEv();
extern void _ZN3ccc8DD0x13y13efgEv();
extern void _ZN3ccc8DD0x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y13efgEv,_ZTv0_n12_N3ccc8DD0x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y13efgEv,_ZThn4_N3ccc8DD0x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y13efgEv,_ZTv0_n12_N3ccc8DD0x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y1E[] = {
  {&(_ZTVN3ccc8DD0x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y1E[];
static VTBL_ENTRY alt_thunk_names384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y13efgEv,_ZTv0_n12_N3ccc8DD0x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y13efgEv,_ZThn4_N3ccc8DD0x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y1E = {  "_ZN3ccc8DD0x13y1E", // class name
  bases__ZN3ccc8DD0x13y1E, 2,
  &(vtc__ZN3ccc8DD0x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y1E),3, //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  CC0x13y2  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y23pqrEv
  ~CC0x13y2(); // tgen
  CC0x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y2E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y23efgEv");}
void  ccc::CC0x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y23abcEv");}
void  ccc::CC0x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y23pqrEv");}
ccc::CC0x13y2 ::~CC0x13y2(){ note_dtor("_ZN3ccc8CC0x13y2E", this);} // tgen
ccc::CC0x13y2 ::CC0x13y2(){ note_ctor("_ZN3ccc8CC0x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y2E, buf);
    ::ccc::CC0x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y2E);
    dp->::ccc::CC0x13y2::~CC0x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y2E(Test__ZN3ccc8CC0x13y2E, "_ZN3ccc8CC0x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y2C1Ev();
extern void _ZN3ccc8CC0x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y2E[] = {
  NSPAIR(_ZN3ccc8CC0x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y2E[];
extern void _ZN3ccc8CC0x13y23efgEv();
extern void _ZN3ccc8CC0x13y23abcEv();
extern void _ZN3ccc8CC0x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y23abcEv,_ZTv0_n12_N3ccc8CC0x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y23abcEv,_ZThn4_N3ccc8CC0x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y23efgEv,_ZTv0_n16_N3ccc8CC0x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y23efgEv,_ZThn4_N3ccc8CC0x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y23pqrEv,_ZTv0_n20_N3ccc8CC0x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y23pqrEv,_ZThn4_N3ccc8CC0x13y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y23abcEv,_ZTv0_n12_N3ccc8CC0x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y23efgEv,_ZTv0_n16_N3ccc8CC0x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y23pqrEv,_ZTv0_n20_N3ccc8CC0x13y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y2E[] = {
  {&(_ZTVN3ccc8CC0x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y2E[];
static VTBL_ENTRY alt_thunk_names385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y23pqrEv,_ZTv0_n20_N3ccc8CC0x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y23pqrEv,_ZThn4_N3ccc8CC0x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y23efgEv,_ZTv0_n16_N3ccc8CC0x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y23efgEv,_ZThn4_N3ccc8CC0x13y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y23abcEv,_ZTv0_n12_N3ccc8CC0x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y23abcEv,_ZThn4_N3ccc8CC0x13y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y2E = {  "_ZN3ccc8CC0x13y2E", // class name
  bases__ZN3ccc8CC0x13y2E, 2,
  &(vtc__ZN3ccc8CC0x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y2E),2, //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  DD0x13y2  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD0x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y23pqrEv
  ~DD0x13y2(); // tgen
  DD0x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y23efgEv");}
void  ccc::DD0x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y23abcEv");}
void  ccc::DD0x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y23pqrEv");}
ccc::DD0x13y2 ::~DD0x13y2(){ note_dtor("_ZN3ccc8DD0x13y2E", this);} // tgen
ccc::DD0x13y2 ::DD0x13y2(){ note_ctor("_ZN3ccc8DD0x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y2E, buf);
    ::ccc::DD0x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y2E);
    dp->::ccc::DD0x13y2::~DD0x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y2E(Test__ZN3ccc8DD0x13y2E, "_ZN3ccc8DD0x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y2C1Ev();
extern void _ZN3ccc8DD0x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y2E[] = {
  NSPAIR(_ZN3ccc8DD0x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y2E[];
extern void _ZN3ccc8DD0x13y23abcEv();
extern void _ZN3ccc8DD0x13y23efgEv();
extern void _ZN3ccc8DD0x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y23efgEv,_ZTv0_n12_N3ccc8DD0x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y23efgEv,_ZThn4_N3ccc8DD0x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y23efgEv,_ZTv0_n12_N3ccc8DD0x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y2E[] = {
  {&(_ZTVN3ccc8DD0x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y2E[];
static VTBL_ENTRY alt_thunk_names386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y23efgEv,_ZTv0_n12_N3ccc8DD0x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y23efgEv,_ZThn4_N3ccc8DD0x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y2E = {  "_ZN3ccc8DD0x13y2E", // class name
  bases__ZN3ccc8DD0x13y2E, 2,
  &(vtc__ZN3ccc8DD0x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y2E),3, //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  CC0x13y3  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x13y33abcEv
  ~CC0x13y3(); // tgen
  CC0x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y3E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y33efgEv");}
void  ccc::CC0x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y33pqrEv");}
void  ccc::CC0x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y33abcEv");}
ccc::CC0x13y3 ::~CC0x13y3(){ note_dtor("_ZN3ccc8CC0x13y3E", this);} // tgen
ccc::CC0x13y3 ::CC0x13y3(){ note_ctor("_ZN3ccc8CC0x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y3E, buf);
    ::ccc::CC0x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y3E);
    dp->::ccc::CC0x13y3::~CC0x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y3E(Test__ZN3ccc8CC0x13y3E, "_ZN3ccc8CC0x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y3C1Ev();
extern void _ZN3ccc8CC0x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y3E[] = {
  NSPAIR(_ZN3ccc8CC0x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y3E[];
extern void _ZN3ccc8CC0x13y33efgEv();
extern void _ZN3ccc8CC0x13y33pqrEv();
extern void _ZN3ccc8CC0x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y33abcEv,_ZTv0_n12_N3ccc8CC0x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y33abcEv,_ZThn4_N3ccc8CC0x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y33efgEv,_ZTv0_n16_N3ccc8CC0x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y33efgEv,_ZThn4_N3ccc8CC0x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y33pqrEv,_ZTv0_n20_N3ccc8CC0x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y33pqrEv,_ZThn4_N3ccc8CC0x13y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y33abcEv,_ZTv0_n12_N3ccc8CC0x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y33efgEv,_ZTv0_n16_N3ccc8CC0x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y33pqrEv,_ZTv0_n20_N3ccc8CC0x13y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y3E[] = {
  {&(_ZTVN3ccc8CC0x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y3E[];
static VTBL_ENTRY alt_thunk_names387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y33pqrEv,_ZTv0_n20_N3ccc8CC0x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y33pqrEv,_ZThn4_N3ccc8CC0x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y33efgEv,_ZTv0_n16_N3ccc8CC0x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y33efgEv,_ZThn4_N3ccc8CC0x13y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y33abcEv,_ZTv0_n12_N3ccc8CC0x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y33abcEv,_ZThn4_N3ccc8CC0x13y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y3E = {  "_ZN3ccc8CC0x13y3E", // class name
  bases__ZN3ccc8CC0x13y3E, 2,
  &(vtc__ZN3ccc8CC0x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y3E),2, //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  DD0x13y3  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD0x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x13y33abcEv
  ~DD0x13y3(); // tgen
  DD0x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y33efgEv");}
void  ccc::DD0x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y33pqrEv");}
void  ccc::DD0x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y33abcEv");}
ccc::DD0x13y3 ::~DD0x13y3(){ note_dtor("_ZN3ccc8DD0x13y3E", this);} // tgen
ccc::DD0x13y3 ::DD0x13y3(){ note_ctor("_ZN3ccc8DD0x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y3E, buf);
    ::ccc::DD0x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y3E);
    dp->::ccc::DD0x13y3::~DD0x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y3E(Test__ZN3ccc8DD0x13y3E, "_ZN3ccc8DD0x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y3C1Ev();
extern void _ZN3ccc8DD0x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y3E[] = {
  NSPAIR(_ZN3ccc8DD0x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y3E[];
extern void _ZN3ccc8DD0x13y33abcEv();
extern void _ZN3ccc8DD0x13y33efgEv();
extern void _ZN3ccc8DD0x13y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y33efgEv,_ZTv0_n12_N3ccc8DD0x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y33efgEv,_ZThn4_N3ccc8DD0x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y33efgEv,_ZTv0_n12_N3ccc8DD0x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y3E[] = {
  {&(_ZTVN3ccc8DD0x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y3E[];
static VTBL_ENTRY alt_thunk_names388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y33efgEv,_ZTv0_n12_N3ccc8DD0x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y33efgEv,_ZThn4_N3ccc8DD0x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y3E = {  "_ZN3ccc8DD0x13y3E", // class name
  bases__ZN3ccc8DD0x13y3E, 2,
  &(vtc__ZN3ccc8DD0x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y3E),3, //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  CC0x13y4  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC0x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y43efgEv
  ~CC0x13y4(); // tgen
  CC0x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y4E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y43pqrEv");}
void  ccc::CC0x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y43abcEv");}
void  ccc::CC0x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y43efgEv");}
ccc::CC0x13y4 ::~CC0x13y4(){ note_dtor("_ZN3ccc8CC0x13y4E", this);} // tgen
ccc::CC0x13y4 ::CC0x13y4(){ note_ctor("_ZN3ccc8CC0x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y4E, buf);
    ::ccc::CC0x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y4E);
    dp->::ccc::CC0x13y4::~CC0x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y4E(Test__ZN3ccc8CC0x13y4E, "_ZN3ccc8CC0x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y4C1Ev();
extern void _ZN3ccc8CC0x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y4E[] = {
  NSPAIR(_ZN3ccc8CC0x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y4E[];
extern void _ZN3ccc8CC0x13y43efgEv();
extern void _ZN3ccc8CC0x13y43pqrEv();
extern void _ZN3ccc8CC0x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y43abcEv,_ZTv0_n12_N3ccc8CC0x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y43abcEv,_ZThn4_N3ccc8CC0x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y43efgEv,_ZTv0_n16_N3ccc8CC0x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y43efgEv,_ZThn4_N3ccc8CC0x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y43pqrEv,_ZTv0_n20_N3ccc8CC0x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y43pqrEv,_ZThn4_N3ccc8CC0x13y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y43abcEv,_ZTv0_n12_N3ccc8CC0x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y43efgEv,_ZTv0_n16_N3ccc8CC0x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y43pqrEv,_ZTv0_n20_N3ccc8CC0x13y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y4E[] = {
  {&(_ZTVN3ccc8CC0x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y4E[];
static VTBL_ENTRY alt_thunk_names389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y43pqrEv,_ZTv0_n20_N3ccc8CC0x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y43pqrEv,_ZThn4_N3ccc8CC0x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y43efgEv,_ZTv0_n16_N3ccc8CC0x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y43efgEv,_ZThn4_N3ccc8CC0x13y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y43abcEv,_ZTv0_n12_N3ccc8CC0x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y43abcEv,_ZThn4_N3ccc8CC0x13y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y4E = {  "_ZN3ccc8CC0x13y4E", // class name
  bases__ZN3ccc8CC0x13y4E, 2,
  &(vtc__ZN3ccc8CC0x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y4E),2, //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  DD0x13y4  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD0x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x13y43efgEv
  ~DD0x13y4(); // tgen
  DD0x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y43pqrEv");}
void  ccc::DD0x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y43abcEv");}
void  ccc::DD0x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y43efgEv");}
ccc::DD0x13y4 ::~DD0x13y4(){ note_dtor("_ZN3ccc8DD0x13y4E", this);} // tgen
ccc::DD0x13y4 ::DD0x13y4(){ note_ctor("_ZN3ccc8DD0x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y4E, buf);
    ::ccc::DD0x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y4E);
    dp->::ccc::DD0x13y4::~DD0x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y4E(Test__ZN3ccc8DD0x13y4E, "_ZN3ccc8DD0x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y4C1Ev();
extern void _ZN3ccc8DD0x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y4E[] = {
  NSPAIR(_ZN3ccc8DD0x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y4E[];
extern void _ZN3ccc8DD0x13y43abcEv();
extern void _ZN3ccc8DD0x13y43efgEv();
extern void _ZN3ccc8DD0x13y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y43efgEv,_ZTv0_n12_N3ccc8DD0x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y43efgEv,_ZThn4_N3ccc8DD0x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y43efgEv,_ZTv0_n12_N3ccc8DD0x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y4E[] = {
  {&(_ZTVN3ccc8DD0x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y4E[];
static VTBL_ENTRY alt_thunk_names390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y43efgEv,_ZTv0_n12_N3ccc8DD0x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y43efgEv,_ZThn4_N3ccc8DD0x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y4E = {  "_ZN3ccc8DD0x13y4E", // class name
  bases__ZN3ccc8DD0x13y4E, 2,
  &(vtc__ZN3ccc8DD0x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y4E),3, //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  CC0x13y5  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC0x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y53abcEv
  ~CC0x13y5(); // tgen
  CC0x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y5E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y53pqrEv");}
void  ccc::CC0x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y53efgEv");}
void  ccc::CC0x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y53abcEv");}
ccc::CC0x13y5 ::~CC0x13y5(){ note_dtor("_ZN3ccc8CC0x13y5E", this);} // tgen
ccc::CC0x13y5 ::CC0x13y5(){ note_ctor("_ZN3ccc8CC0x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y5E, buf);
    ::ccc::CC0x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y5E);
    dp->::ccc::CC0x13y5::~CC0x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y5E(Test__ZN3ccc8CC0x13y5E, "_ZN3ccc8CC0x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y5C1Ev();
extern void _ZN3ccc8CC0x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y5E[] = {
  NSPAIR(_ZN3ccc8CC0x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y5E[];
extern void _ZN3ccc8CC0x13y53efgEv();
extern void _ZN3ccc8CC0x13y53pqrEv();
extern void _ZN3ccc8CC0x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y53abcEv,_ZTv0_n12_N3ccc8CC0x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y53abcEv,_ZThn4_N3ccc8CC0x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y53efgEv,_ZTv0_n16_N3ccc8CC0x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y53efgEv,_ZThn4_N3ccc8CC0x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y53pqrEv,_ZTv0_n20_N3ccc8CC0x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y53pqrEv,_ZThn4_N3ccc8CC0x13y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y53abcEv,_ZTv0_n12_N3ccc8CC0x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y53efgEv,_ZTv0_n16_N3ccc8CC0x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y53pqrEv,_ZTv0_n20_N3ccc8CC0x13y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y5E[] = {
  {&(_ZTVN3ccc8CC0x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y5E[];
static VTBL_ENTRY alt_thunk_names391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y53pqrEv,_ZTv0_n20_N3ccc8CC0x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y53pqrEv,_ZThn4_N3ccc8CC0x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y53efgEv,_ZTv0_n16_N3ccc8CC0x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y53efgEv,_ZThn4_N3ccc8CC0x13y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y53abcEv,_ZTv0_n12_N3ccc8CC0x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y53abcEv,_ZThn4_N3ccc8CC0x13y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y5E = {  "_ZN3ccc8CC0x13y5E", // class name
  bases__ZN3ccc8CC0x13y5E, 2,
  &(vtc__ZN3ccc8CC0x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y5E),2, //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  DD0x13y5  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD0x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x13y53abcEv
  ~DD0x13y5(); // tgen
  DD0x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y53pqrEv");}
void  ccc::DD0x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y53efgEv");}
void  ccc::DD0x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y53abcEv");}
ccc::DD0x13y5 ::~DD0x13y5(){ note_dtor("_ZN3ccc8DD0x13y5E", this);} // tgen
ccc::DD0x13y5 ::DD0x13y5(){ note_ctor("_ZN3ccc8DD0x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y5E, buf);
    ::ccc::DD0x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y5E);
    dp->::ccc::DD0x13y5::~DD0x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y5E(Test__ZN3ccc8DD0x13y5E, "_ZN3ccc8DD0x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y5C1Ev();
extern void _ZN3ccc8DD0x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y5E[] = {
  NSPAIR(_ZN3ccc8DD0x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y5E[];
extern void _ZN3ccc8DD0x13y53abcEv();
extern void _ZN3ccc8DD0x13y53efgEv();
extern void _ZN3ccc8DD0x13y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y53efgEv,_ZTv0_n12_N3ccc8DD0x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y53efgEv,_ZThn4_N3ccc8DD0x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y53efgEv,_ZTv0_n12_N3ccc8DD0x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y5E[] = {
  {&(_ZTVN3ccc8DD0x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y5E[];
static VTBL_ENTRY alt_thunk_names392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y53efgEv,_ZTv0_n12_N3ccc8DD0x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y53efgEv,_ZThn4_N3ccc8DD0x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y5E = {  "_ZN3ccc8DD0x13y5E", // class name
  bases__ZN3ccc8DD0x13y5E, 2,
  &(vtc__ZN3ccc8DD0x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y5E),3, //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  CC0x13y6  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y63efgEv
  ~CC0x13y6(); // tgen
  CC0x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y6E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y63abcEv");}
void  ccc::CC0x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y63efgEv");}
ccc::CC0x13y6 ::~CC0x13y6(){ note_dtor("_ZN3ccc8CC0x13y6E", this);} // tgen
ccc::CC0x13y6 ::CC0x13y6(){ note_ctor("_ZN3ccc8CC0x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y6E, buf);
    ::ccc::CC0x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y6E);
    dp->::ccc::CC0x13y6::~CC0x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y6E(Test__ZN3ccc8CC0x13y6E, "_ZN3ccc8CC0x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y6C1Ev();
extern void _ZN3ccc8CC0x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y6E[] = {
  NSPAIR(_ZN3ccc8CC0x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y6E[];
extern void _ZN3ccc8CC0x13y63efgEv();
extern void _ZN3ccc8CC0x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y63abcEv,_ZTv0_n12_N3ccc8CC0x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y63abcEv,_ZThn4_N3ccc8CC0x13y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y63efgEv,_ZTv0_n16_N3ccc8CC0x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y63efgEv,_ZThn4_N3ccc8CC0x13y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y63abcEv,_ZTv0_n12_N3ccc8CC0x13y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y63efgEv,_ZTv0_n16_N3ccc8CC0x13y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y6E[] = {
  {&(_ZTVN3ccc8CC0x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y6E[];
static VTBL_ENTRY alt_thunk_names393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y63efgEv,_ZTv0_n16_N3ccc8CC0x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y63efgEv,_ZThn4_N3ccc8CC0x13y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y63abcEv,_ZTv0_n12_N3ccc8CC0x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y63abcEv,_ZThn4_N3ccc8CC0x13y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y6E = {  "_ZN3ccc8CC0x13y6E", // class name
  bases__ZN3ccc8CC0x13y6E, 2,
  &(vtc__ZN3ccc8CC0x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y6E),2, //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  DD0x13y6  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD0x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x13y63efgEv
  ~DD0x13y6(); // tgen
  DD0x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y63abcEv");}
void  ccc::DD0x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y63efgEv");}
ccc::DD0x13y6 ::~DD0x13y6(){ note_dtor("_ZN3ccc8DD0x13y6E", this);} // tgen
ccc::DD0x13y6 ::DD0x13y6(){ note_ctor("_ZN3ccc8DD0x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y6E, buf);
    ::ccc::DD0x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y6E);
    dp->::ccc::DD0x13y6::~DD0x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y6E(Test__ZN3ccc8DD0x13y6E, "_ZN3ccc8DD0x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y6C1Ev();
extern void _ZN3ccc8DD0x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y6E[] = {
  NSPAIR(_ZN3ccc8DD0x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y6E[];
extern void _ZN3ccc8DD0x13y63abcEv();
extern void _ZN3ccc8DD0x13y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y63efgEv,_ZTv0_n12_N3ccc8DD0x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y63efgEv,_ZThn4_N3ccc8DD0x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y63efgEv,_ZTv0_n12_N3ccc8DD0x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y6E[] = {
  {&(_ZTVN3ccc8DD0x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y6E[];
static VTBL_ENTRY alt_thunk_names394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y63efgEv,_ZTv0_n12_N3ccc8DD0x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y63efgEv,_ZThn4_N3ccc8DD0x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y6E = {  "_ZN3ccc8DD0x13y6E", // class name
  bases__ZN3ccc8DD0x13y6E, 2,
  &(vtc__ZN3ccc8DD0x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y6E),3, //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  CC0x13y7  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y73pqrEv
  ~CC0x13y7(); // tgen
  CC0x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y7E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y73abcEv");}
void  ccc::CC0x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y73pqrEv");}
ccc::CC0x13y7 ::~CC0x13y7(){ note_dtor("_ZN3ccc8CC0x13y7E", this);} // tgen
ccc::CC0x13y7 ::CC0x13y7(){ note_ctor("_ZN3ccc8CC0x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y7E, buf);
    ::ccc::CC0x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y7E);
    dp->::ccc::CC0x13y7::~CC0x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y7E(Test__ZN3ccc8CC0x13y7E, "_ZN3ccc8CC0x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y7C1Ev();
extern void _ZN3ccc8CC0x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y7E[] = {
  NSPAIR(_ZN3ccc8CC0x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC0x13y73abcEv();
extern void _ZN3ccc8CC0x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y73abcEv,_ZTv0_n12_N3ccc8CC0x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y73abcEv,_ZThn4_N3ccc8CC0x13y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y73pqrEv,_ZTv0_n20_N3ccc8CC0x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y73pqrEv,_ZThn4_N3ccc8CC0x13y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y73abcEv,_ZTv0_n12_N3ccc8CC0x13y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y73pqrEv,_ZTv0_n20_N3ccc8CC0x13y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y7E[] = {
  {&(_ZTVN3ccc8CC0x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y7E[];
static VTBL_ENTRY alt_thunk_names395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y73pqrEv,_ZTv0_n20_N3ccc8CC0x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y73pqrEv,_ZThn4_N3ccc8CC0x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y73abcEv,_ZTv0_n12_N3ccc8CC0x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y73abcEv,_ZThn4_N3ccc8CC0x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y7E = {  "_ZN3ccc8CC0x13y7E", // class name
  bases__ZN3ccc8CC0x13y7E, 2,
  &(vtc__ZN3ccc8CC0x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y7E),2, //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  DD0x13y7  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD0x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y73pqrEv
  ~DD0x13y7(); // tgen
  DD0x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y73abcEv");}
void  ccc::DD0x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y73pqrEv");}
ccc::DD0x13y7 ::~DD0x13y7(){ note_dtor("_ZN3ccc8DD0x13y7E", this);} // tgen
ccc::DD0x13y7 ::DD0x13y7(){ note_ctor("_ZN3ccc8DD0x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y7E, buf);
    ::ccc::DD0x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y7E);
    dp->::ccc::DD0x13y7::~DD0x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y7E(Test__ZN3ccc8DD0x13y7E, "_ZN3ccc8DD0x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y7C1Ev();
extern void _ZN3ccc8DD0x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y7E[] = {
  NSPAIR(_ZN3ccc8DD0x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y7E[];
extern void _ZN3ccc8DD0x13y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y7E[] = {
  {&(_ZTVN3ccc8DD0x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y7E[];
Class_Descriptor cd__ZN3ccc8DD0x13y7E = {  "_ZN3ccc8DD0x13y7E", // class name
  bases__ZN3ccc8DD0x13y7E, 2,
  &(vtc__ZN3ccc8DD0x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y8  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y83abcEv
  ~CC0x13y8(); // tgen
  CC0x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y8E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y83efgEv");}
void  ccc::CC0x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y83abcEv");}
ccc::CC0x13y8 ::~CC0x13y8(){ note_dtor("_ZN3ccc8CC0x13y8E", this);} // tgen
ccc::CC0x13y8 ::CC0x13y8(){ note_ctor("_ZN3ccc8CC0x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y8E, buf);
    ::ccc::CC0x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y8E);
    dp->::ccc::CC0x13y8::~CC0x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y8E(Test__ZN3ccc8CC0x13y8E, "_ZN3ccc8CC0x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y8C1Ev();
extern void _ZN3ccc8CC0x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y8E[] = {
  NSPAIR(_ZN3ccc8CC0x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y8E[];
extern void _ZN3ccc8CC0x13y83efgEv();
extern void _ZN3ccc8CC0x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x13y83abcEv,_ZTv0_n12_N3ccc8CC0x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y83abcEv,_ZThn4_N3ccc8CC0x13y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y83efgEv,_ZTv0_n16_N3ccc8CC0x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y83efgEv,_ZThn4_N3ccc8CC0x13y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x13y83abcEv,_ZTv0_n12_N3ccc8CC0x13y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y83efgEv,_ZTv0_n16_N3ccc8CC0x13y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y8E[] = {
  {&(_ZTVN3ccc8CC0x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y8E[];
static VTBL_ENTRY alt_thunk_names396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y83efgEv,_ZTv0_n16_N3ccc8CC0x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y83efgEv,_ZThn4_N3ccc8CC0x13y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x13y83abcEv,_ZTv0_n12_N3ccc8CC0x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y83abcEv,_ZThn4_N3ccc8CC0x13y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y8E = {  "_ZN3ccc8CC0x13y8E", // class name
  bases__ZN3ccc8CC0x13y8E, 2,
  &(vtc__ZN3ccc8CC0x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y8E),2, //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  DD0x13y8  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD0x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x13y83abcEv
  ~DD0x13y8(); // tgen
  DD0x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y83efgEv");}
void  ccc::DD0x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x13y83abcEv");}
ccc::DD0x13y8 ::~DD0x13y8(){ note_dtor("_ZN3ccc8DD0x13y8E", this);} // tgen
ccc::DD0x13y8 ::DD0x13y8(){ note_ctor("_ZN3ccc8DD0x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y8E, buf);
    ::ccc::DD0x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y8E);
    dp->::ccc::DD0x13y8::~DD0x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y8E(Test__ZN3ccc8DD0x13y8E, "_ZN3ccc8DD0x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y8C1Ev();
extern void _ZN3ccc8DD0x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y8E[] = {
  NSPAIR(_ZN3ccc8DD0x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y8E[];
extern void _ZN3ccc8DD0x13y83abcEv();
extern void _ZN3ccc8DD0x13y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y83efgEv,_ZTv0_n12_N3ccc8DD0x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y83efgEv,_ZThn4_N3ccc8DD0x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y83efgEv,_ZTv0_n12_N3ccc8DD0x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y8E[] = {
  {&(_ZTVN3ccc8DD0x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y8E[];
static VTBL_ENTRY alt_thunk_names397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y83efgEv,_ZTv0_n12_N3ccc8DD0x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y83efgEv,_ZThn4_N3ccc8DD0x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y8E = {  "_ZN3ccc8DD0x13y8E", // class name
  bases__ZN3ccc8DD0x13y8E, 2,
  &(vtc__ZN3ccc8DD0x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y8E),3, //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  CC0x13y9  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y93pqrEv
  ~CC0x13y9(); // tgen
  CC0x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y9E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y93efgEv");}
void  ccc::CC0x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y93pqrEv");}
ccc::CC0x13y9 ::~CC0x13y9(){ note_dtor("_ZN3ccc8CC0x13y9E", this);} // tgen
ccc::CC0x13y9 ::CC0x13y9(){ note_ctor("_ZN3ccc8CC0x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y9E, buf);
    ::ccc::CC0x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC0x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y9E);
    dp->::ccc::CC0x13y9::~CC0x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y9E(Test__ZN3ccc8CC0x13y9E, "_ZN3ccc8CC0x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y9C1Ev();
extern void _ZN3ccc8CC0x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y9E[] = {
  NSPAIR(_ZN3ccc8CC0x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y9E[];
extern void _ZN3ccc8CC0x13y93efgEv();
extern void _ZN3ccc8CC0x13y93pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x13y93efgEv,_ZTv0_n16_N3ccc8CC0x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y93efgEv,_ZThn4_N3ccc8CC0x13y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x13y93pqrEv,_ZTv0_n20_N3ccc8CC0x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y93pqrEv,_ZThn4_N3ccc8CC0x13y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x13y93efgEv,_ZTv0_n16_N3ccc8CC0x13y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x13y93pqrEv,_ZTv0_n20_N3ccc8CC0x13y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x13y9E[] = {
  {&(_ZTVN3ccc8CC0x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x13y9E[];
static VTBL_ENTRY alt_thunk_names398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x13y93pqrEv,_ZTv0_n20_N3ccc8CC0x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y93pqrEv,_ZThn4_N3ccc8CC0x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x13y93efgEv,_ZTv0_n16_N3ccc8CC0x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x13y93efgEv,_ZThn4_N3ccc8CC0x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x13y9E = {  "_ZN3ccc8CC0x13y9E", // class name
  bases__ZN3ccc8CC0x13y9E, 2,
  &(vtc__ZN3ccc8CC0x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x13y9E),2, //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  DD0x13y9  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD0x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x13y93pqrEv
  ~DD0x13y9(); // tgen
  DD0x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x13y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x13y93efgEv");}
void  ccc::DD0x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x13y93pqrEv");}
ccc::DD0x13y9 ::~DD0x13y9(){ note_dtor("_ZN3ccc8DD0x13y9E", this);} // tgen
ccc::DD0x13y9 ::DD0x13y9(){ note_ctor("_ZN3ccc8DD0x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x13y9E, buf);
    ::ccc::DD0x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x13y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD0x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x13y9E);
    dp->::ccc::DD0x13y9::~DD0x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x13y9E(Test__ZN3ccc8DD0x13y9E, "_ZN3ccc8DD0x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x13y9C1Ev();
extern void _ZN3ccc8DD0x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x13y9E[] = {
  NSPAIR(_ZN3ccc8DD0x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD0x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x13y93efgEv();
extern void _ZN3ccc8DD0x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x13y93efgEv,_ZTv0_n12_N3ccc8DD0x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x13y93efgEv,_ZThn4_N3ccc8DD0x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x13y93efgEv,_ZTv0_n12_N3ccc8DD0x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x13y9E[] = {
  {&(_ZTVN3ccc8DD0x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x13y9E[];
static VTBL_ENTRY alt_thunk_names399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x13y93efgEv,_ZTv0_n12_N3ccc8DD0x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x13y93efgEv,_ZThn4_N3ccc8DD0x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x13y9E = {  "_ZN3ccc8DD0x13y9E", // class name
  bases__ZN3ccc8DD0x13y9E, 2,
  &(vtc__ZN3ccc8DD0x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x13y9E),3, //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  CC0x13y10  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x13y103abcEv
  ~CC0x13y10(); // tgen
  CC0x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y10E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y103pqrEv");}
void  ccc::CC0x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x13y103abcEv");}
ccc::CC0x13y10 ::~CC0x13y10(){ note_dtor("_ZN3ccc9CC0x13y10E", this);} // tgen
ccc::CC0x13y10 ::CC0x13y10(){ note_ctor("_ZN3ccc9CC0x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y10E, buf);
    ::ccc::CC0x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y10E);
    dp->::ccc::CC0x13y10::~CC0x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y10E(Test__ZN3ccc9CC0x13y10E, "_ZN3ccc9CC0x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y10C1Ev();
extern void _ZN3ccc9CC0x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y10E[] = {
  NSPAIR(_ZN3ccc9CC0x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC0x13y103pqrEv();
extern void _ZN3ccc9CC0x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x13y103abcEv,_ZTv0_n12_N3ccc9CC0x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y103abcEv,_ZThn4_N3ccc9CC0x13y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x13y103pqrEv,_ZTv0_n20_N3ccc9CC0x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y103pqrEv,_ZThn4_N3ccc9CC0x13y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x13y103abcEv,_ZTv0_n12_N3ccc9CC0x13y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x13y103pqrEv,_ZTv0_n20_N3ccc9CC0x13y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y10E[] = {
  {&(_ZTVN3ccc9CC0x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC0x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y10E[];
static VTBL_ENTRY alt_thunk_names400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x13y103pqrEv,_ZTv0_n20_N3ccc9CC0x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y103pqrEv,_ZThn4_N3ccc9CC0x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x13y103abcEv,_ZTv0_n12_N3ccc9CC0x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y103abcEv,_ZThn4_N3ccc9CC0x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x13y10E = {  "_ZN3ccc9CC0x13y10E", // class name
  bases__ZN3ccc9CC0x13y10E, 2,
  &(vtc__ZN3ccc9CC0x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y10E),2, //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  DD0x13y10  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD0x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x13y103abcEv
  ~DD0x13y10(); // tgen
  DD0x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x13y103pqrEv");}
void  ccc::DD0x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x13y103abcEv");}
ccc::DD0x13y10 ::~DD0x13y10(){ note_dtor("_ZN3ccc9DD0x13y10E", this);} // tgen
ccc::DD0x13y10 ::DD0x13y10(){ note_ctor("_ZN3ccc9DD0x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y10E, buf);
    ::ccc::DD0x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y10E);
    dp->::ccc::DD0x13y10::~DD0x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y10E(Test__ZN3ccc9DD0x13y10E, "_ZN3ccc9DD0x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y10C1Ev();
extern void _ZN3ccc9DD0x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y10E[] = {
  NSPAIR(_ZN3ccc9DD0x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y10E[];
extern void _ZN3ccc9DD0x13y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y103pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y10E[] = {
  {&(_ZTVN3ccc9DD0x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y10E[];
Class_Descriptor cd__ZN3ccc9DD0x13y10E = {  "_ZN3ccc9DD0x13y10E", // class name
  bases__ZN3ccc9DD0x13y10E, 2,
  &(vtc__ZN3ccc9DD0x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y11  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x13y113efgEv
  ~CC0x13y11(); // tgen
  CC0x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y11E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y113pqrEv");}
void  ccc::CC0x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x13y113efgEv");}
ccc::CC0x13y11 ::~CC0x13y11(){ note_dtor("_ZN3ccc9CC0x13y11E", this);} // tgen
ccc::CC0x13y11 ::CC0x13y11(){ note_ctor("_ZN3ccc9CC0x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y11E, buf);
    ::ccc::CC0x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y11E);
    dp->::ccc::CC0x13y11::~CC0x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y11E(Test__ZN3ccc9CC0x13y11E, "_ZN3ccc9CC0x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y11C1Ev();
extern void _ZN3ccc9CC0x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y11E[] = {
  NSPAIR(_ZN3ccc9CC0x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y11E[];
extern void _ZN3ccc9CC0x13y113efgEv();
extern void _ZN3ccc9CC0x13y113pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x13y113efgEv,_ZTv0_n16_N3ccc9CC0x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y113efgEv,_ZThn4_N3ccc9CC0x13y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x13y113pqrEv,_ZTv0_n20_N3ccc9CC0x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y113pqrEv,_ZThn4_N3ccc9CC0x13y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x13y113efgEv,_ZTv0_n16_N3ccc9CC0x13y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x13y113pqrEv,_ZTv0_n20_N3ccc9CC0x13y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y11E[] = {
  {&(_ZTVN3ccc9CC0x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y11E[];
static VTBL_ENTRY alt_thunk_names401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x13y113pqrEv,_ZTv0_n20_N3ccc9CC0x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y113pqrEv,_ZThn4_N3ccc9CC0x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x13y113efgEv,_ZTv0_n16_N3ccc9CC0x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y113efgEv,_ZThn4_N3ccc9CC0x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x13y11E = {  "_ZN3ccc9CC0x13y11E", // class name
  bases__ZN3ccc9CC0x13y11E, 2,
  &(vtc__ZN3ccc9CC0x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y11E),2, //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  DD0x13y11  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD0x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x13y113efgEv
  ~DD0x13y11(); // tgen
  DD0x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x13y113pqrEv");}
void  ccc::DD0x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x13y113efgEv");}
ccc::DD0x13y11 ::~DD0x13y11(){ note_dtor("_ZN3ccc9DD0x13y11E", this);} // tgen
ccc::DD0x13y11 ::DD0x13y11(){ note_ctor("_ZN3ccc9DD0x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y11E, buf);
    ::ccc::DD0x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y11E);
    dp->::ccc::DD0x13y11::~DD0x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y11E(Test__ZN3ccc9DD0x13y11E, "_ZN3ccc9DD0x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y11C1Ev();
extern void _ZN3ccc9DD0x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y11E[] = {
  NSPAIR(_ZN3ccc9DD0x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x13y113efgEv();
extern void _ZN3ccc9DD0x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x13y113efgEv,_ZTv0_n12_N3ccc9DD0x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x13y113efgEv,_ZThn4_N3ccc9DD0x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x13y113efgEv,_ZTv0_n12_N3ccc9DD0x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y11E[] = {
  {&(_ZTVN3ccc9DD0x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y11E[];
static VTBL_ENTRY alt_thunk_names402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x13y113efgEv,_ZTv0_n12_N3ccc9DD0x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x13y113efgEv,_ZThn4_N3ccc9DD0x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x13y11E = {  "_ZN3ccc9DD0x13y11E", // class name
  bases__ZN3ccc9DD0x13y11E, 2,
  &(vtc__ZN3ccc9DD0x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y11E),3, //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  CC0x13y12  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC0x13y123abcEv
  ~CC0x13y12(); // tgen
  CC0x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x13y123abcEv");}
ccc::CC0x13y12 ::~CC0x13y12(){ note_dtor("_ZN3ccc9CC0x13y12E", this);} // tgen
ccc::CC0x13y12 ::CC0x13y12(){ note_ctor("_ZN3ccc9CC0x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y12E, buf);
    ::ccc::CC0x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y12E);
    dp->::ccc::CC0x13y12::~CC0x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y12E(Test__ZN3ccc9CC0x13y12E, "_ZN3ccc9CC0x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y12C1Ev();
extern void _ZN3ccc9CC0x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y12E[] = {
  NSPAIR(_ZN3ccc9CC0x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC0x13y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x13y123abcEv,_ZTv0_n12_N3ccc9CC0x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y123abcEv,_ZThn4_N3ccc9CC0x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x13y123abcEv,_ZTv0_n12_N3ccc9CC0x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y12E[] = {
  {&(_ZTVN3ccc9CC0x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y12E[];
static VTBL_ENTRY alt_thunk_names403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x13y123abcEv,_ZTv0_n12_N3ccc9CC0x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y123abcEv,_ZThn4_N3ccc9CC0x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x13y12E = {  "_ZN3ccc9CC0x13y12E", // class name
  bases__ZN3ccc9CC0x13y12E, 2,
  &(vtc__ZN3ccc9CC0x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y12E),2, //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  DD0x13y12  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD0x13y123abcEv
  ~DD0x13y12(); // tgen
  DD0x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x13y123abcEv");}
ccc::DD0x13y12 ::~DD0x13y12(){ note_dtor("_ZN3ccc9DD0x13y12E", this);} // tgen
ccc::DD0x13y12 ::DD0x13y12(){ note_ctor("_ZN3ccc9DD0x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y12E, buf);
    ::ccc::DD0x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y12E);
    dp->::ccc::DD0x13y12::~DD0x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y12E(Test__ZN3ccc9DD0x13y12E, "_ZN3ccc9DD0x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y12C1Ev();
extern void _ZN3ccc9DD0x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y12E[] = {
  NSPAIR(_ZN3ccc9DD0x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y12E[];
extern void _ZN3ccc9DD0x13y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y12E[] = {
  {&(_ZTVN3ccc9DD0x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y12E[];
Class_Descriptor cd__ZN3ccc9DD0x13y12E = {  "_ZN3ccc9DD0x13y12E", // class name
  bases__ZN3ccc9DD0x13y12E, 2,
  &(vtc__ZN3ccc9DD0x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y13  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC0x13y133efgEv
  ~CC0x13y13(); // tgen
  CC0x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x13y133efgEv");}
ccc::CC0x13y13 ::~CC0x13y13(){ note_dtor("_ZN3ccc9CC0x13y13E", this);} // tgen
ccc::CC0x13y13 ::CC0x13y13(){ note_ctor("_ZN3ccc9CC0x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y13E, buf);
    ::ccc::CC0x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y13E);
    dp->::ccc::CC0x13y13::~CC0x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y13E(Test__ZN3ccc9CC0x13y13E, "_ZN3ccc9CC0x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y13C1Ev();
extern void _ZN3ccc9CC0x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y13E[] = {
  NSPAIR(_ZN3ccc9CC0x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y13E[];
extern void _ZN3ccc9CC0x13y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x13y133efgEv,_ZTv0_n16_N3ccc9CC0x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y133efgEv,_ZThn4_N3ccc9CC0x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x13y133efgEv,_ZTv0_n16_N3ccc9CC0x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y13E[] = {
  {&(_ZTVN3ccc9CC0x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y13E[];
static VTBL_ENTRY alt_thunk_names404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x13y133efgEv,_ZTv0_n16_N3ccc9CC0x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y133efgEv,_ZThn4_N3ccc9CC0x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x13y13E = {  "_ZN3ccc9CC0x13y13E", // class name
  bases__ZN3ccc9CC0x13y13E, 2,
  &(vtc__ZN3ccc9CC0x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y13E),2, //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  DD0x13y13  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD0x13y133efgEv
  ~DD0x13y13(); // tgen
  DD0x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD0x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x13y133efgEv");}
ccc::DD0x13y13 ::~DD0x13y13(){ note_dtor("_ZN3ccc9DD0x13y13E", this);} // tgen
ccc::DD0x13y13 ::DD0x13y13(){ note_ctor("_ZN3ccc9DD0x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y13E, buf);
    ::ccc::DD0x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y13E);
    dp->::ccc::DD0x13y13::~DD0x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y13E(Test__ZN3ccc9DD0x13y13E, "_ZN3ccc9DD0x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y13C1Ev();
extern void _ZN3ccc9DD0x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y13E[] = {
  NSPAIR(_ZN3ccc9DD0x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x13y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x13y133efgEv,_ZTv0_n12_N3ccc9DD0x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x13y133efgEv,_ZThn4_N3ccc9DD0x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x13y133efgEv,_ZTv0_n12_N3ccc9DD0x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y13E[] = {
  {&(_ZTVN3ccc9DD0x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y13E[];
static VTBL_ENTRY alt_thunk_names405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x13y133efgEv,_ZTv0_n12_N3ccc9DD0x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x13y133efgEv,_ZThn4_N3ccc9DD0x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x13y13E = {  "_ZN3ccc9DD0x13y13E", // class name
  bases__ZN3ccc9DD0x13y13E, 2,
  &(vtc__ZN3ccc9DD0x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y13E),3, //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  CC0x13y14  : virtual ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y143pqrEv
  ~CC0x13y14(); // tgen
  CC0x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y143pqrEv");}
ccc::CC0x13y14 ::~CC0x13y14(){ note_dtor("_ZN3ccc9CC0x13y14E", this);} // tgen
ccc::CC0x13y14 ::CC0x13y14(){ note_ctor("_ZN3ccc9CC0x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y14E, buf);
    ::ccc::CC0x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y14E);
    dp->::ccc::CC0x13y14::~CC0x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y14E(Test__ZN3ccc9CC0x13y14E, "_ZN3ccc9CC0x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y14C1Ev();
extern void _ZN3ccc9CC0x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y14E[] = {
  NSPAIR(_ZN3ccc9CC0x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC0x13y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x13y143pqrEv,_ZTv0_n20_N3ccc9CC0x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y143pqrEv,_ZThn4_N3ccc9CC0x13y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x13y143pqrEv,_ZTv0_n20_N3ccc9CC0x13y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y14E[] = {
  {&(_ZTVN3ccc9CC0x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y14E[];
static VTBL_ENTRY alt_thunk_names406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x13y143pqrEv,_ZTv0_n20_N3ccc9CC0x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x13y143pqrEv,_ZThn4_N3ccc9CC0x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x13y14E = {  "_ZN3ccc9CC0x13y14E", // class name
  bases__ZN3ccc9CC0x13y14E, 2,
  &(vtc__ZN3ccc9CC0x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y14E),2, //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  DD0x13y14  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD0x13y143pqrEv
  ~DD0x13y14(); // tgen
  DD0x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x13y143pqrEv");}
ccc::DD0x13y14 ::~DD0x13y14(){ note_dtor("_ZN3ccc9DD0x13y14E", this);} // tgen
ccc::DD0x13y14 ::DD0x13y14(){ note_ctor("_ZN3ccc9DD0x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y14E, buf);
    ::ccc::DD0x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y14E);
    dp->::ccc::DD0x13y14::~DD0x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y14E(Test__ZN3ccc9DD0x13y14E, "_ZN3ccc9DD0x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y14C1Ev();
extern void _ZN3ccc9DD0x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y14E[] = {
  NSPAIR(_ZN3ccc9DD0x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y14E[] = {
  {&(_ZTVN3ccc9DD0x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y14E[];
Class_Descriptor cd__ZN3ccc9DD0x13y14E = {  "_ZN3ccc9DD0x13y14E", // class name
  bases__ZN3ccc9DD0x13y14E, 2,
  &(vtc__ZN3ccc9DD0x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y15  : virtual ::ccc::AA0 , ::ccc::BB13 {
  ~CC0x13y15(); // tgen
  CC0x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x13y15 ::~CC0x13y15(){ note_dtor("_ZN3ccc9CC0x13y15E", this);} // tgen
ccc::CC0x13y15 ::CC0x13y15(){ note_ctor("_ZN3ccc9CC0x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y15E, buf);
    ::ccc::CC0x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC0x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y15E);
    dp->::ccc::CC0x13y15::~CC0x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y15E(Test__ZN3ccc9CC0x13y15E, "_ZN3ccc9CC0x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y15C1Ev();
extern void _ZN3ccc9CC0x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y15E[] = {
  NSPAIR(_ZN3ccc9CC0x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x13y15E[] = {
  {&(_ZTVN3ccc9CC0x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x13y15E[];
Class_Descriptor cd__ZN3ccc9CC0x13y15E = {  "_ZN3ccc9CC0x13y15E", // class name
  bases__ZN3ccc9CC0x13y15E, 2,
  &(vtc__ZN3ccc9CC0x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x13y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x13y15  : virtual ::ccc::AA0 , virtual ::ccc::BB13 {
  ~DD0x13y15(); // tgen
  DD0x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD0x13y15 ::~DD0x13y15(){ note_dtor("_ZN3ccc9DD0x13y15E", this);} // tgen
ccc::DD0x13y15 ::DD0x13y15(){ note_ctor("_ZN3ccc9DD0x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x13y15E, buf);
    ::ccc::DD0x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x13y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD0x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x13y15E);
    dp->::ccc::DD0x13y15::~DD0x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x13y15E(Test__ZN3ccc9DD0x13y15E, "_ZN3ccc9DD0x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x13y15C1Ev();
extern void _ZN3ccc9DD0x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x13y15E[] = {
  NSPAIR(_ZN3ccc9DD0x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD0x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x13y15E[] = {
  {&(_ZTVN3ccc9DD0x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x13y15E[];
Class_Descriptor cd__ZN3ccc9DD0x13y15E = {  "_ZN3ccc9DD0x13y15E", // class name
  bases__ZN3ccc9DD0x13y15E, 2,
  &(vtc__ZN3ccc9DD0x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x13y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y0  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y03pqrEv
  ~CC0x14y0(); // tgen
  CC0x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y0E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y03abcEv");}
void  ccc::CC0x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y03efgEv");}
void  ccc::CC0x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y03pqrEv");}
ccc::CC0x14y0 ::~CC0x14y0(){ note_dtor("_ZN3ccc8CC0x14y0E", this);} // tgen
ccc::CC0x14y0 ::CC0x14y0(){ note_ctor("_ZN3ccc8CC0x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y0E, buf);
    ::ccc::CC0x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y0E);
    dp->::ccc::CC0x14y0::~CC0x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y0E(Test__ZN3ccc8CC0x14y0E, "_ZN3ccc8CC0x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y0C1Ev();
extern void _ZN3ccc8CC0x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y0E[] = {
  NSPAIR(_ZN3ccc8CC0x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y0E[];
extern void _ZN3ccc8CC0x14y03pqrEv();
extern void _ZN3ccc8CC0x14y03abcEv();
extern void _ZN3ccc8CC0x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y03abcEv,_ZTv0_n12_N3ccc8CC0x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y03abcEv,_ZThn4_N3ccc8CC0x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y03efgEv,_ZTv0_n16_N3ccc8CC0x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y03efgEv,_ZThn4_N3ccc8CC0x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y03pqrEv,_ZTv0_n20_N3ccc8CC0x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y03pqrEv,_ZThn4_N3ccc8CC0x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y03abcEv,_ZTv0_n12_N3ccc8CC0x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y03efgEv,_ZTv0_n16_N3ccc8CC0x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y03pqrEv,_ZTv0_n20_N3ccc8CC0x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y0E[] = {
  {&(_ZTVN3ccc8CC0x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y0E[];
static VTBL_ENTRY alt_thunk_names407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y03pqrEv,_ZTv0_n20_N3ccc8CC0x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y03pqrEv,_ZThn4_N3ccc8CC0x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y03efgEv,_ZTv0_n16_N3ccc8CC0x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y03efgEv,_ZThn4_N3ccc8CC0x14y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y03abcEv,_ZTv0_n12_N3ccc8CC0x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y03abcEv,_ZThn4_N3ccc8CC0x14y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y0E = {  "_ZN3ccc8CC0x14y0E", // class name
  bases__ZN3ccc8CC0x14y0E, 2,
  &(vtc__ZN3ccc8CC0x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y0E),2, //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  DD0x14y0  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD0x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y03pqrEv
  ~DD0x14y0(); // tgen
  DD0x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y0E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y03abcEv");}
void  ccc::DD0x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y03efgEv");}
void  ccc::DD0x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y03pqrEv");}
ccc::DD0x14y0 ::~DD0x14y0(){ note_dtor("_ZN3ccc8DD0x14y0E", this);} // tgen
ccc::DD0x14y0 ::DD0x14y0(){ note_ctor("_ZN3ccc8DD0x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y0E, buf);
    ::ccc::DD0x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y0E);
    dp->::ccc::DD0x14y0::~DD0x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y0E(Test__ZN3ccc8DD0x14y0E, "_ZN3ccc8DD0x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y0C1Ev();
extern void _ZN3ccc8DD0x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y0E[] = {
  NSPAIR(_ZN3ccc8DD0x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y0E[];
extern void _ZN3ccc8DD0x14y03abcEv();
extern void _ZN3ccc8DD0x14y03efgEv();
extern void _ZN3ccc8DD0x14y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y03pqrEv,_ZTv0_n12_N3ccc8DD0x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y03pqrEv,_ZThn4_N3ccc8DD0x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y03pqrEv,_ZTv0_n12_N3ccc8DD0x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y0E[] = {
  {&(_ZTVN3ccc8DD0x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y0E[];
static VTBL_ENTRY alt_thunk_names408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y03pqrEv,_ZTv0_n12_N3ccc8DD0x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y03pqrEv,_ZThn4_N3ccc8DD0x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y0E = {  "_ZN3ccc8DD0x14y0E", // class name
  bases__ZN3ccc8DD0x14y0E, 2,
  &(vtc__ZN3ccc8DD0x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y0E),3, //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  CC0x14y1  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x14y13efgEv
  ~CC0x14y1(); // tgen
  CC0x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y1E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y13abcEv");}
void  ccc::CC0x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y13pqrEv");}
void  ccc::CC0x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y13efgEv");}
ccc::CC0x14y1 ::~CC0x14y1(){ note_dtor("_ZN3ccc8CC0x14y1E", this);} // tgen
ccc::CC0x14y1 ::CC0x14y1(){ note_ctor("_ZN3ccc8CC0x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y1E, buf);
    ::ccc::CC0x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y1E);
    dp->::ccc::CC0x14y1::~CC0x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y1E(Test__ZN3ccc8CC0x14y1E, "_ZN3ccc8CC0x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y1C1Ev();
extern void _ZN3ccc8CC0x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y1E[] = {
  NSPAIR(_ZN3ccc8CC0x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y1E[];
extern void _ZN3ccc8CC0x14y13pqrEv();
extern void _ZN3ccc8CC0x14y13abcEv();
extern void _ZN3ccc8CC0x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y13abcEv,_ZTv0_n12_N3ccc8CC0x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y13abcEv,_ZThn4_N3ccc8CC0x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y13efgEv,_ZTv0_n16_N3ccc8CC0x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y13efgEv,_ZThn4_N3ccc8CC0x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y13pqrEv,_ZTv0_n20_N3ccc8CC0x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y13pqrEv,_ZThn4_N3ccc8CC0x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y13abcEv,_ZTv0_n12_N3ccc8CC0x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y13efgEv,_ZTv0_n16_N3ccc8CC0x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y13pqrEv,_ZTv0_n20_N3ccc8CC0x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y1E[] = {
  {&(_ZTVN3ccc8CC0x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y1E[];
static VTBL_ENTRY alt_thunk_names409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y13pqrEv,_ZTv0_n20_N3ccc8CC0x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y13pqrEv,_ZThn4_N3ccc8CC0x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y13efgEv,_ZTv0_n16_N3ccc8CC0x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y13efgEv,_ZThn4_N3ccc8CC0x14y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y13abcEv,_ZTv0_n12_N3ccc8CC0x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y13abcEv,_ZThn4_N3ccc8CC0x14y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y1E = {  "_ZN3ccc8CC0x14y1E", // class name
  bases__ZN3ccc8CC0x14y1E, 2,
  &(vtc__ZN3ccc8CC0x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y1E),2, //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  DD0x14y1  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD0x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x14y13efgEv
  ~DD0x14y1(); // tgen
  DD0x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y1E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y13abcEv");}
void  ccc::DD0x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y13pqrEv");}
void  ccc::DD0x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y13efgEv");}
ccc::DD0x14y1 ::~DD0x14y1(){ note_dtor("_ZN3ccc8DD0x14y1E", this);} // tgen
ccc::DD0x14y1 ::DD0x14y1(){ note_ctor("_ZN3ccc8DD0x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y1E, buf);
    ::ccc::DD0x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y1E);
    dp->::ccc::DD0x14y1::~DD0x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y1E(Test__ZN3ccc8DD0x14y1E, "_ZN3ccc8DD0x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y1C1Ev();
extern void _ZN3ccc8DD0x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y1E[] = {
  NSPAIR(_ZN3ccc8DD0x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y1E[];
extern void _ZN3ccc8DD0x14y13abcEv();
extern void _ZN3ccc8DD0x14y13efgEv();
extern void _ZN3ccc8DD0x14y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y13pqrEv,_ZTv0_n12_N3ccc8DD0x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y13pqrEv,_ZThn4_N3ccc8DD0x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y13pqrEv,_ZTv0_n12_N3ccc8DD0x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y1E[] = {
  {&(_ZTVN3ccc8DD0x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y1E[];
static VTBL_ENTRY alt_thunk_names410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y13pqrEv,_ZTv0_n12_N3ccc8DD0x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y13pqrEv,_ZThn4_N3ccc8DD0x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y1E = {  "_ZN3ccc8DD0x14y1E", // class name
  bases__ZN3ccc8DD0x14y1E, 2,
  &(vtc__ZN3ccc8DD0x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y1E),3, //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  CC0x14y2  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y23pqrEv
  ~CC0x14y2(); // tgen
  CC0x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y2E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y23efgEv");}
void  ccc::CC0x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y23abcEv");}
void  ccc::CC0x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y23pqrEv");}
ccc::CC0x14y2 ::~CC0x14y2(){ note_dtor("_ZN3ccc8CC0x14y2E", this);} // tgen
ccc::CC0x14y2 ::CC0x14y2(){ note_ctor("_ZN3ccc8CC0x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y2E, buf);
    ::ccc::CC0x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y2E);
    dp->::ccc::CC0x14y2::~CC0x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y2E(Test__ZN3ccc8CC0x14y2E, "_ZN3ccc8CC0x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y2C1Ev();
extern void _ZN3ccc8CC0x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y2E[] = {
  NSPAIR(_ZN3ccc8CC0x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y2E[];
extern void _ZN3ccc8CC0x14y23pqrEv();
extern void _ZN3ccc8CC0x14y23efgEv();
extern void _ZN3ccc8CC0x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y23abcEv,_ZTv0_n12_N3ccc8CC0x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y23abcEv,_ZThn4_N3ccc8CC0x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y23efgEv,_ZTv0_n16_N3ccc8CC0x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y23efgEv,_ZThn4_N3ccc8CC0x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y23pqrEv,_ZTv0_n20_N3ccc8CC0x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y23pqrEv,_ZThn4_N3ccc8CC0x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y23abcEv,_ZTv0_n12_N3ccc8CC0x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y23efgEv,_ZTv0_n16_N3ccc8CC0x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y23pqrEv,_ZTv0_n20_N3ccc8CC0x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y2E[] = {
  {&(_ZTVN3ccc8CC0x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y2E[];
static VTBL_ENTRY alt_thunk_names411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y23pqrEv,_ZTv0_n20_N3ccc8CC0x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y23pqrEv,_ZThn4_N3ccc8CC0x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y23efgEv,_ZTv0_n16_N3ccc8CC0x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y23efgEv,_ZThn4_N3ccc8CC0x14y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y23abcEv,_ZTv0_n12_N3ccc8CC0x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y23abcEv,_ZThn4_N3ccc8CC0x14y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y2E = {  "_ZN3ccc8CC0x14y2E", // class name
  bases__ZN3ccc8CC0x14y2E, 2,
  &(vtc__ZN3ccc8CC0x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y2E),2, //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  DD0x14y2  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD0x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y23pqrEv
  ~DD0x14y2(); // tgen
  DD0x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y2E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y23efgEv");}
void  ccc::DD0x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y23abcEv");}
void  ccc::DD0x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y23pqrEv");}
ccc::DD0x14y2 ::~DD0x14y2(){ note_dtor("_ZN3ccc8DD0x14y2E", this);} // tgen
ccc::DD0x14y2 ::DD0x14y2(){ note_ctor("_ZN3ccc8DD0x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y2E, buf);
    ::ccc::DD0x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y2E);
    dp->::ccc::DD0x14y2::~DD0x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y2E(Test__ZN3ccc8DD0x14y2E, "_ZN3ccc8DD0x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y2C1Ev();
extern void _ZN3ccc8DD0x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y2E[] = {
  NSPAIR(_ZN3ccc8DD0x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y2E[];
extern void _ZN3ccc8DD0x14y23abcEv();
extern void _ZN3ccc8DD0x14y23efgEv();
extern void _ZN3ccc8DD0x14y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y23pqrEv,_ZTv0_n12_N3ccc8DD0x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y23pqrEv,_ZThn4_N3ccc8DD0x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y23pqrEv,_ZTv0_n12_N3ccc8DD0x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y2E[] = {
  {&(_ZTVN3ccc8DD0x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y2E[];
static VTBL_ENTRY alt_thunk_names412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y23pqrEv,_ZTv0_n12_N3ccc8DD0x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y23pqrEv,_ZThn4_N3ccc8DD0x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y2E = {  "_ZN3ccc8DD0x14y2E", // class name
  bases__ZN3ccc8DD0x14y2E, 2,
  &(vtc__ZN3ccc8DD0x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y2E),3, //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  CC0x14y3  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x14y33abcEv
  ~CC0x14y3(); // tgen
  CC0x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y3E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y33efgEv");}
void  ccc::CC0x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y33pqrEv");}
void  ccc::CC0x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y33abcEv");}
ccc::CC0x14y3 ::~CC0x14y3(){ note_dtor("_ZN3ccc8CC0x14y3E", this);} // tgen
ccc::CC0x14y3 ::CC0x14y3(){ note_ctor("_ZN3ccc8CC0x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y3E, buf);
    ::ccc::CC0x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y3E);
    dp->::ccc::CC0x14y3::~CC0x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y3E(Test__ZN3ccc8CC0x14y3E, "_ZN3ccc8CC0x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y3C1Ev();
extern void _ZN3ccc8CC0x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y3E[] = {
  NSPAIR(_ZN3ccc8CC0x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y3E[];
extern void _ZN3ccc8CC0x14y33pqrEv();
extern void _ZN3ccc8CC0x14y33efgEv();
extern void _ZN3ccc8CC0x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y33abcEv,_ZTv0_n12_N3ccc8CC0x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y33abcEv,_ZThn4_N3ccc8CC0x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y33efgEv,_ZTv0_n16_N3ccc8CC0x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y33efgEv,_ZThn4_N3ccc8CC0x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y33pqrEv,_ZTv0_n20_N3ccc8CC0x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y33pqrEv,_ZThn4_N3ccc8CC0x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y33abcEv,_ZTv0_n12_N3ccc8CC0x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y33efgEv,_ZTv0_n16_N3ccc8CC0x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y33pqrEv,_ZTv0_n20_N3ccc8CC0x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y3E[] = {
  {&(_ZTVN3ccc8CC0x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y3E[];
static VTBL_ENTRY alt_thunk_names413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y33pqrEv,_ZTv0_n20_N3ccc8CC0x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y33pqrEv,_ZThn4_N3ccc8CC0x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y33efgEv,_ZTv0_n16_N3ccc8CC0x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y33efgEv,_ZThn4_N3ccc8CC0x14y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y33abcEv,_ZTv0_n12_N3ccc8CC0x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y33abcEv,_ZThn4_N3ccc8CC0x14y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y3E = {  "_ZN3ccc8CC0x14y3E", // class name
  bases__ZN3ccc8CC0x14y3E, 2,
  &(vtc__ZN3ccc8CC0x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y3E),2, //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  DD0x14y3  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD0x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x14y33abcEv
  ~DD0x14y3(); // tgen
  DD0x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y3E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y33efgEv");}
void  ccc::DD0x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y33pqrEv");}
void  ccc::DD0x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y33abcEv");}
ccc::DD0x14y3 ::~DD0x14y3(){ note_dtor("_ZN3ccc8DD0x14y3E", this);} // tgen
ccc::DD0x14y3 ::DD0x14y3(){ note_ctor("_ZN3ccc8DD0x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y3E, buf);
    ::ccc::DD0x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y3E);
    dp->::ccc::DD0x14y3::~DD0x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y3E(Test__ZN3ccc8DD0x14y3E, "_ZN3ccc8DD0x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y3C1Ev();
extern void _ZN3ccc8DD0x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y3E[] = {
  NSPAIR(_ZN3ccc8DD0x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y3E[];
extern void _ZN3ccc8DD0x14y33abcEv();
extern void _ZN3ccc8DD0x14y33efgEv();
extern void _ZN3ccc8DD0x14y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y33pqrEv,_ZTv0_n12_N3ccc8DD0x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y33pqrEv,_ZThn4_N3ccc8DD0x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y33pqrEv,_ZTv0_n12_N3ccc8DD0x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y3E[] = {
  {&(_ZTVN3ccc8DD0x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y3E[];
static VTBL_ENTRY alt_thunk_names414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y33pqrEv,_ZTv0_n12_N3ccc8DD0x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y33pqrEv,_ZThn4_N3ccc8DD0x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y3E = {  "_ZN3ccc8DD0x14y3E", // class name
  bases__ZN3ccc8DD0x14y3E, 2,
  &(vtc__ZN3ccc8DD0x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y3E),3, //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  CC0x14y4  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC0x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y43efgEv
  ~CC0x14y4(); // tgen
  CC0x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y4E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y43pqrEv");}
void  ccc::CC0x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y43abcEv");}
void  ccc::CC0x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y43efgEv");}
ccc::CC0x14y4 ::~CC0x14y4(){ note_dtor("_ZN3ccc8CC0x14y4E", this);} // tgen
ccc::CC0x14y4 ::CC0x14y4(){ note_ctor("_ZN3ccc8CC0x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y4E, buf);
    ::ccc::CC0x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y4E);
    dp->::ccc::CC0x14y4::~CC0x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y4E(Test__ZN3ccc8CC0x14y4E, "_ZN3ccc8CC0x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y4C1Ev();
extern void _ZN3ccc8CC0x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y4E[] = {
  NSPAIR(_ZN3ccc8CC0x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y4E[];
extern void _ZN3ccc8CC0x14y43pqrEv();
extern void _ZN3ccc8CC0x14y43abcEv();
extern void _ZN3ccc8CC0x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y43abcEv,_ZTv0_n12_N3ccc8CC0x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y43abcEv,_ZThn4_N3ccc8CC0x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y43efgEv,_ZTv0_n16_N3ccc8CC0x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y43efgEv,_ZThn4_N3ccc8CC0x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y43pqrEv,_ZTv0_n20_N3ccc8CC0x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y43pqrEv,_ZThn4_N3ccc8CC0x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y43abcEv,_ZTv0_n12_N3ccc8CC0x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y43efgEv,_ZTv0_n16_N3ccc8CC0x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y43pqrEv,_ZTv0_n20_N3ccc8CC0x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y4E[] = {
  {&(_ZTVN3ccc8CC0x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y4E[];
static VTBL_ENTRY alt_thunk_names415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y43pqrEv,_ZTv0_n20_N3ccc8CC0x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y43pqrEv,_ZThn4_N3ccc8CC0x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y43efgEv,_ZTv0_n16_N3ccc8CC0x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y43efgEv,_ZThn4_N3ccc8CC0x14y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y43abcEv,_ZTv0_n12_N3ccc8CC0x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y43abcEv,_ZThn4_N3ccc8CC0x14y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y4E = {  "_ZN3ccc8CC0x14y4E", // class name
  bases__ZN3ccc8CC0x14y4E, 2,
  &(vtc__ZN3ccc8CC0x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y4E),2, //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  DD0x14y4  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD0x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x14y43efgEv
  ~DD0x14y4(); // tgen
  DD0x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y4E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y43pqrEv");}
void  ccc::DD0x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y43abcEv");}
void  ccc::DD0x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y43efgEv");}
ccc::DD0x14y4 ::~DD0x14y4(){ note_dtor("_ZN3ccc8DD0x14y4E", this);} // tgen
ccc::DD0x14y4 ::DD0x14y4(){ note_ctor("_ZN3ccc8DD0x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y4E, buf);
    ::ccc::DD0x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y4E);
    dp->::ccc::DD0x14y4::~DD0x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y4E(Test__ZN3ccc8DD0x14y4E, "_ZN3ccc8DD0x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y4C1Ev();
extern void _ZN3ccc8DD0x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y4E[] = {
  NSPAIR(_ZN3ccc8DD0x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y4E[];
extern void _ZN3ccc8DD0x14y43abcEv();
extern void _ZN3ccc8DD0x14y43efgEv();
extern void _ZN3ccc8DD0x14y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y43pqrEv,_ZTv0_n12_N3ccc8DD0x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y43pqrEv,_ZThn4_N3ccc8DD0x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y43pqrEv,_ZTv0_n12_N3ccc8DD0x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y4E[] = {
  {&(_ZTVN3ccc8DD0x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y4E[];
static VTBL_ENTRY alt_thunk_names416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y43pqrEv,_ZTv0_n12_N3ccc8DD0x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y43pqrEv,_ZThn4_N3ccc8DD0x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y4E = {  "_ZN3ccc8DD0x14y4E", // class name
  bases__ZN3ccc8DD0x14y4E, 2,
  &(vtc__ZN3ccc8DD0x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y4E),3, //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  CC0x14y5  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC0x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y53abcEv
  ~CC0x14y5(); // tgen
  CC0x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y5E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y53pqrEv");}
void  ccc::CC0x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y53efgEv");}
void  ccc::CC0x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y53abcEv");}
ccc::CC0x14y5 ::~CC0x14y5(){ note_dtor("_ZN3ccc8CC0x14y5E", this);} // tgen
ccc::CC0x14y5 ::CC0x14y5(){ note_ctor("_ZN3ccc8CC0x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y5E, buf);
    ::ccc::CC0x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y5E);
    dp->::ccc::CC0x14y5::~CC0x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y5E(Test__ZN3ccc8CC0x14y5E, "_ZN3ccc8CC0x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y5C1Ev();
extern void _ZN3ccc8CC0x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y5E[] = {
  NSPAIR(_ZN3ccc8CC0x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y5E[];
extern void _ZN3ccc8CC0x14y53pqrEv();
extern void _ZN3ccc8CC0x14y53efgEv();
extern void _ZN3ccc8CC0x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y53abcEv,_ZTv0_n12_N3ccc8CC0x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y53abcEv,_ZThn4_N3ccc8CC0x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y53efgEv,_ZTv0_n16_N3ccc8CC0x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y53efgEv,_ZThn4_N3ccc8CC0x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y53pqrEv,_ZTv0_n20_N3ccc8CC0x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y53pqrEv,_ZThn4_N3ccc8CC0x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y53abcEv,_ZTv0_n12_N3ccc8CC0x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y53efgEv,_ZTv0_n16_N3ccc8CC0x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y53pqrEv,_ZTv0_n20_N3ccc8CC0x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y5E[] = {
  {&(_ZTVN3ccc8CC0x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y5E[];
static VTBL_ENTRY alt_thunk_names417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y53pqrEv,_ZTv0_n20_N3ccc8CC0x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y53pqrEv,_ZThn4_N3ccc8CC0x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y53efgEv,_ZTv0_n16_N3ccc8CC0x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y53efgEv,_ZThn4_N3ccc8CC0x14y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y53abcEv,_ZTv0_n12_N3ccc8CC0x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y53abcEv,_ZThn4_N3ccc8CC0x14y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y5E = {  "_ZN3ccc8CC0x14y5E", // class name
  bases__ZN3ccc8CC0x14y5E, 2,
  &(vtc__ZN3ccc8CC0x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y5E),2, //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  DD0x14y5  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD0x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x14y53abcEv
  ~DD0x14y5(); // tgen
  DD0x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y5E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y53pqrEv");}
void  ccc::DD0x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y53efgEv");}
void  ccc::DD0x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y53abcEv");}
ccc::DD0x14y5 ::~DD0x14y5(){ note_dtor("_ZN3ccc8DD0x14y5E", this);} // tgen
ccc::DD0x14y5 ::DD0x14y5(){ note_ctor("_ZN3ccc8DD0x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y5E, buf);
    ::ccc::DD0x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y5E);
    dp->::ccc::DD0x14y5::~DD0x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y5E(Test__ZN3ccc8DD0x14y5E, "_ZN3ccc8DD0x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y5C1Ev();
extern void _ZN3ccc8DD0x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y5E[] = {
  NSPAIR(_ZN3ccc8DD0x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y5E[];
extern void _ZN3ccc8DD0x14y53abcEv();
extern void _ZN3ccc8DD0x14y53efgEv();
extern void _ZN3ccc8DD0x14y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y53pqrEv,_ZTv0_n12_N3ccc8DD0x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y53pqrEv,_ZThn4_N3ccc8DD0x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y53pqrEv,_ZTv0_n12_N3ccc8DD0x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y5E[] = {
  {&(_ZTVN3ccc8DD0x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y5E[];
static VTBL_ENTRY alt_thunk_names418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y53pqrEv,_ZTv0_n12_N3ccc8DD0x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y53pqrEv,_ZThn4_N3ccc8DD0x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y5E = {  "_ZN3ccc8DD0x14y5E", // class name
  bases__ZN3ccc8DD0x14y5E, 2,
  &(vtc__ZN3ccc8DD0x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y5E),3, //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  CC0x14y6  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y63efgEv
  ~CC0x14y6(); // tgen
  CC0x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y6E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y63abcEv");}
void  ccc::CC0x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y63efgEv");}
ccc::CC0x14y6 ::~CC0x14y6(){ note_dtor("_ZN3ccc8CC0x14y6E", this);} // tgen
ccc::CC0x14y6 ::CC0x14y6(){ note_ctor("_ZN3ccc8CC0x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y6E, buf);
    ::ccc::CC0x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y6E);
    dp->::ccc::CC0x14y6::~CC0x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y6E(Test__ZN3ccc8CC0x14y6E, "_ZN3ccc8CC0x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y6C1Ev();
extern void _ZN3ccc8CC0x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y6E[] = {
  NSPAIR(_ZN3ccc8CC0x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC0x14y63abcEv();
extern void _ZN3ccc8CC0x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y63abcEv,_ZTv0_n12_N3ccc8CC0x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y63abcEv,_ZThn4_N3ccc8CC0x14y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y63efgEv,_ZTv0_n16_N3ccc8CC0x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y63efgEv,_ZThn4_N3ccc8CC0x14y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y63abcEv,_ZTv0_n12_N3ccc8CC0x14y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y63efgEv,_ZTv0_n16_N3ccc8CC0x14y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y6E[] = {
  {&(_ZTVN3ccc8CC0x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y6E[];
static VTBL_ENTRY alt_thunk_names419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y63efgEv,_ZTv0_n16_N3ccc8CC0x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y63efgEv,_ZThn4_N3ccc8CC0x14y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y63abcEv,_ZTv0_n12_N3ccc8CC0x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y63abcEv,_ZThn4_N3ccc8CC0x14y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y6E = {  "_ZN3ccc8CC0x14y6E", // class name
  bases__ZN3ccc8CC0x14y6E, 2,
  &(vtc__ZN3ccc8CC0x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y6E),2, //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  DD0x14y6  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD0x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x14y63efgEv
  ~DD0x14y6(); // tgen
  DD0x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y6E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y63abcEv");}
void  ccc::DD0x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y63efgEv");}
ccc::DD0x14y6 ::~DD0x14y6(){ note_dtor("_ZN3ccc8DD0x14y6E", this);} // tgen
ccc::DD0x14y6 ::DD0x14y6(){ note_ctor("_ZN3ccc8DD0x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y6E, buf);
    ::ccc::DD0x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y6E);
    dp->::ccc::DD0x14y6::~DD0x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y6E(Test__ZN3ccc8DD0x14y6E, "_ZN3ccc8DD0x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y6C1Ev();
extern void _ZN3ccc8DD0x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y6E[] = {
  NSPAIR(_ZN3ccc8DD0x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y6E[];
extern void _ZN3ccc8DD0x14y63abcEv();
extern void _ZN3ccc8DD0x14y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y6E[] = {
  {&(_ZTVN3ccc8DD0x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y6E[];
Class_Descriptor cd__ZN3ccc8DD0x14y6E = {  "_ZN3ccc8DD0x14y6E", // class name
  bases__ZN3ccc8DD0x14y6E, 2,
  &(vtc__ZN3ccc8DD0x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y7  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y73pqrEv
  ~CC0x14y7(); // tgen
  CC0x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y7E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y73abcEv");}
void  ccc::CC0x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y73pqrEv");}
ccc::CC0x14y7 ::~CC0x14y7(){ note_dtor("_ZN3ccc8CC0x14y7E", this);} // tgen
ccc::CC0x14y7 ::CC0x14y7(){ note_ctor("_ZN3ccc8CC0x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y7E, buf);
    ::ccc::CC0x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y7E);
    dp->::ccc::CC0x14y7::~CC0x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y7E(Test__ZN3ccc8CC0x14y7E, "_ZN3ccc8CC0x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y7C1Ev();
extern void _ZN3ccc8CC0x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y7E[] = {
  NSPAIR(_ZN3ccc8CC0x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y7E[];
extern void _ZN3ccc8CC0x14y73pqrEv();
extern void _ZN3ccc8CC0x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y73abcEv,_ZTv0_n12_N3ccc8CC0x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y73abcEv,_ZThn4_N3ccc8CC0x14y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y73pqrEv,_ZTv0_n20_N3ccc8CC0x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y73pqrEv,_ZThn4_N3ccc8CC0x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y73abcEv,_ZTv0_n12_N3ccc8CC0x14y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y73pqrEv,_ZTv0_n20_N3ccc8CC0x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y7E[] = {
  {&(_ZTVN3ccc8CC0x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y7E[];
static VTBL_ENTRY alt_thunk_names420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y73pqrEv,_ZTv0_n20_N3ccc8CC0x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y73pqrEv,_ZThn4_N3ccc8CC0x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y73abcEv,_ZTv0_n12_N3ccc8CC0x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y73abcEv,_ZThn4_N3ccc8CC0x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y7E = {  "_ZN3ccc8CC0x14y7E", // class name
  bases__ZN3ccc8CC0x14y7E, 2,
  &(vtc__ZN3ccc8CC0x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y7E),2, //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  DD0x14y7  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD0x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y73pqrEv
  ~DD0x14y7(); // tgen
  DD0x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y7E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y73abcEv");}
void  ccc::DD0x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y73pqrEv");}
ccc::DD0x14y7 ::~DD0x14y7(){ note_dtor("_ZN3ccc8DD0x14y7E", this);} // tgen
ccc::DD0x14y7 ::DD0x14y7(){ note_ctor("_ZN3ccc8DD0x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y7E, buf);
    ::ccc::DD0x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y7E);
    dp->::ccc::DD0x14y7::~DD0x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y7E(Test__ZN3ccc8DD0x14y7E, "_ZN3ccc8DD0x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y7C1Ev();
extern void _ZN3ccc8DD0x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y7E[] = {
  NSPAIR(_ZN3ccc8DD0x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y7E[];
extern void _ZN3ccc8DD0x14y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x14y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y73pqrEv,_ZTv0_n12_N3ccc8DD0x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y73pqrEv,_ZThn4_N3ccc8DD0x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y73pqrEv,_ZTv0_n12_N3ccc8DD0x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y7E[] = {
  {&(_ZTVN3ccc8DD0x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y7E[];
static VTBL_ENTRY alt_thunk_names421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y73pqrEv,_ZTv0_n12_N3ccc8DD0x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y73pqrEv,_ZThn4_N3ccc8DD0x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y7E = {  "_ZN3ccc8DD0x14y7E", // class name
  bases__ZN3ccc8DD0x14y7E, 2,
  &(vtc__ZN3ccc8DD0x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y7E),3, //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  CC0x14y8  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y83abcEv
  ~CC0x14y8(); // tgen
  CC0x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y8E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y83efgEv");}
void  ccc::CC0x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y83abcEv");}
ccc::CC0x14y8 ::~CC0x14y8(){ note_dtor("_ZN3ccc8CC0x14y8E", this);} // tgen
ccc::CC0x14y8 ::CC0x14y8(){ note_ctor("_ZN3ccc8CC0x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y8E, buf);
    ::ccc::CC0x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y8E);
    dp->::ccc::CC0x14y8::~CC0x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y8E(Test__ZN3ccc8CC0x14y8E, "_ZN3ccc8CC0x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y8C1Ev();
extern void _ZN3ccc8CC0x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y8E[] = {
  NSPAIR(_ZN3ccc8CC0x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC0x14y83efgEv();
extern void _ZN3ccc8CC0x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC0x14y83abcEv,_ZTv0_n12_N3ccc8CC0x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y83abcEv,_ZThn4_N3ccc8CC0x14y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y83efgEv,_ZTv0_n16_N3ccc8CC0x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y83efgEv,_ZThn4_N3ccc8CC0x14y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC0x14y83abcEv,_ZTv0_n12_N3ccc8CC0x14y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y83efgEv,_ZTv0_n16_N3ccc8CC0x14y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y8E[] = {
  {&(_ZTVN3ccc8CC0x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC0x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y8E[];
static VTBL_ENTRY alt_thunk_names422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y83efgEv,_ZTv0_n16_N3ccc8CC0x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y83efgEv,_ZThn4_N3ccc8CC0x14y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC0x14y83abcEv,_ZTv0_n12_N3ccc8CC0x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y83abcEv,_ZThn4_N3ccc8CC0x14y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y8E = {  "_ZN3ccc8CC0x14y8E", // class name
  bases__ZN3ccc8CC0x14y8E, 2,
  &(vtc__ZN3ccc8CC0x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y8E),2, //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  DD0x14y8  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD0x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x14y83abcEv
  ~DD0x14y8(); // tgen
  DD0x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y8E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y83efgEv");}
void  ccc::DD0x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x14y83abcEv");}
ccc::DD0x14y8 ::~DD0x14y8(){ note_dtor("_ZN3ccc8DD0x14y8E", this);} // tgen
ccc::DD0x14y8 ::DD0x14y8(){ note_ctor("_ZN3ccc8DD0x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y8E, buf);
    ::ccc::DD0x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y8E);
    dp->::ccc::DD0x14y8::~DD0x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y8E(Test__ZN3ccc8DD0x14y8E, "_ZN3ccc8DD0x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y8C1Ev();
extern void _ZN3ccc8DD0x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y8E[] = {
  NSPAIR(_ZN3ccc8DD0x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y8E[];
extern void _ZN3ccc8DD0x14y83abcEv();
extern void _ZN3ccc8DD0x14y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y8E[] = {
  {&(_ZTVN3ccc8DD0x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y8E[];
Class_Descriptor cd__ZN3ccc8DD0x14y8E = {  "_ZN3ccc8DD0x14y8E", // class name
  bases__ZN3ccc8DD0x14y8E, 2,
  &(vtc__ZN3ccc8DD0x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y9  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y93pqrEv
  ~CC0x14y9(); // tgen
  CC0x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y9E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y93efgEv");}
void  ccc::CC0x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y93pqrEv");}
ccc::CC0x14y9 ::~CC0x14y9(){ note_dtor("_ZN3ccc8CC0x14y9E", this);} // tgen
ccc::CC0x14y9 ::CC0x14y9(){ note_ctor("_ZN3ccc8CC0x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y9E, buf);
    ::ccc::CC0x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc8CC0x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC0x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y9E);
    dp->::ccc::CC0x14y9::~CC0x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y9E(Test__ZN3ccc8CC0x14y9E, "_ZN3ccc8CC0x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y9C1Ev();
extern void _ZN3ccc8CC0x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y9E[] = {
  NSPAIR(_ZN3ccc8CC0x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y9E[];
extern void _ZN3ccc8CC0x14y93pqrEv();
extern void _ZN3ccc8CC0x14y93efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC0x14y93efgEv,_ZTv0_n16_N3ccc8CC0x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y93efgEv,_ZThn4_N3ccc8CC0x14y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC0x14y93pqrEv,_ZTv0_n20_N3ccc8CC0x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y93pqrEv,_ZThn4_N3ccc8CC0x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC0x14y93efgEv,_ZTv0_n16_N3ccc8CC0x14y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC0x14y93pqrEv,_ZTv0_n20_N3ccc8CC0x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x14y9E[] = {
  {&(_ZTVN3ccc8CC0x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC0x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x14y9E[];
static VTBL_ENTRY alt_thunk_names423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC0x14y93pqrEv,_ZTv0_n20_N3ccc8CC0x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y93pqrEv,_ZThn4_N3ccc8CC0x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC0x14y93efgEv,_ZTv0_n16_N3ccc8CC0x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC0x14y93efgEv,_ZThn4_N3ccc8CC0x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC0x14y9E = {  "_ZN3ccc8CC0x14y9E", // class name
  bases__ZN3ccc8CC0x14y9E, 2,
  &(vtc__ZN3ccc8CC0x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x14y9E),2, //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  DD0x14y9  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD0x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x14y93pqrEv
  ~DD0x14y9(); // tgen
  DD0x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x14y9E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x14y93efgEv");}
void  ccc::DD0x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x14y93pqrEv");}
ccc::DD0x14y9 ::~DD0x14y9(){ note_dtor("_ZN3ccc8DD0x14y9E", this);} // tgen
ccc::DD0x14y9 ::DD0x14y9(){ note_ctor("_ZN3ccc8DD0x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD0x14y9E, buf);
    ::ccc::DD0x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD0x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x14y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD0x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x14y9E);
    dp->::ccc::DD0x14y9::~DD0x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x14y9E(Test__ZN3ccc8DD0x14y9E, "_ZN3ccc8DD0x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD0x14y9C1Ev();
extern void _ZN3ccc8DD0x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x14y9E[] = {
  NSPAIR(_ZN3ccc8DD0x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD0x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x14y93efgEv();
extern void _ZN3ccc8DD0x14y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD0x14y93pqrEv,_ZTv0_n12_N3ccc8DD0x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD0x14y93pqrEv,_ZThn4_N3ccc8DD0x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD0x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x14y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD0x14y93pqrEv,_ZTv0_n12_N3ccc8DD0x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x14y9E[] = {
  {&(_ZTVN3ccc8DD0x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD0x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x14y9E[];
static VTBL_ENTRY alt_thunk_names424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD0x14y93pqrEv,_ZTv0_n12_N3ccc8DD0x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD0x14y93pqrEv,_ZThn4_N3ccc8DD0x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD0x14y9E = {  "_ZN3ccc8DD0x14y9E", // class name
  bases__ZN3ccc8DD0x14y9E, 2,
  &(vtc__ZN3ccc8DD0x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD0x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x14y9E),3, //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  CC0x14y10  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x14y103abcEv
  ~CC0x14y10(); // tgen
  CC0x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y10E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y103pqrEv");}
void  ccc::CC0x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x14y103abcEv");}
ccc::CC0x14y10 ::~CC0x14y10(){ note_dtor("_ZN3ccc9CC0x14y10E", this);} // tgen
ccc::CC0x14y10 ::CC0x14y10(){ note_ctor("_ZN3ccc9CC0x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y10E, buf);
    ::ccc::CC0x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y10E);
    dp->::ccc::CC0x14y10::~CC0x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y10E(Test__ZN3ccc9CC0x14y10E, "_ZN3ccc9CC0x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y10C1Ev();
extern void _ZN3ccc9CC0x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y10E[] = {
  NSPAIR(_ZN3ccc9CC0x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y10E[];
extern void _ZN3ccc9CC0x14y103pqrEv();
extern void _ZN3ccc9CC0x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x14y103abcEv,_ZTv0_n12_N3ccc9CC0x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y103abcEv,_ZThn4_N3ccc9CC0x14y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x14y103pqrEv,_ZTv0_n20_N3ccc9CC0x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y103pqrEv,_ZThn4_N3ccc9CC0x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x14y103abcEv,_ZTv0_n12_N3ccc9CC0x14y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x14y103pqrEv,_ZTv0_n20_N3ccc9CC0x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y10E[] = {
  {&(_ZTVN3ccc9CC0x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y10E[];
static VTBL_ENTRY alt_thunk_names425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x14y103pqrEv,_ZTv0_n20_N3ccc9CC0x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y103pqrEv,_ZThn4_N3ccc9CC0x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x14y103abcEv,_ZTv0_n12_N3ccc9CC0x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y103abcEv,_ZThn4_N3ccc9CC0x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x14y10E = {  "_ZN3ccc9CC0x14y10E", // class name
  bases__ZN3ccc9CC0x14y10E, 2,
  &(vtc__ZN3ccc9CC0x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y10E),2, //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  DD0x14y10  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD0x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x14y103abcEv
  ~DD0x14y10(); // tgen
  DD0x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y10E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x14y103pqrEv");}
void  ccc::DD0x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x14y103abcEv");}
ccc::DD0x14y10 ::~DD0x14y10(){ note_dtor("_ZN3ccc9DD0x14y10E", this);} // tgen
ccc::DD0x14y10 ::DD0x14y10(){ note_ctor("_ZN3ccc9DD0x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y10E, buf);
    ::ccc::DD0x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y10E);
    dp->::ccc::DD0x14y10::~DD0x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y10E(Test__ZN3ccc9DD0x14y10E, "_ZN3ccc9DD0x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y10C1Ev();
extern void _ZN3ccc9DD0x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y10E[] = {
  NSPAIR(_ZN3ccc9DD0x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y10E[];
extern void _ZN3ccc9DD0x14y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x14y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x14y103pqrEv,_ZTv0_n12_N3ccc9DD0x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x14y103pqrEv,_ZThn4_N3ccc9DD0x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x14y103pqrEv,_ZTv0_n12_N3ccc9DD0x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y10E[] = {
  {&(_ZTVN3ccc9DD0x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y10E[];
static VTBL_ENTRY alt_thunk_names426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x14y103pqrEv,_ZTv0_n12_N3ccc9DD0x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x14y103pqrEv,_ZThn4_N3ccc9DD0x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x14y10E = {  "_ZN3ccc9DD0x14y10E", // class name
  bases__ZN3ccc9DD0x14y10E, 2,
  &(vtc__ZN3ccc9DD0x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y10E),3, //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  CC0x14y11  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x14y113efgEv
  ~CC0x14y11(); // tgen
  CC0x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y11E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y113pqrEv");}
void  ccc::CC0x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x14y113efgEv");}
ccc::CC0x14y11 ::~CC0x14y11(){ note_dtor("_ZN3ccc9CC0x14y11E", this);} // tgen
ccc::CC0x14y11 ::CC0x14y11(){ note_ctor("_ZN3ccc9CC0x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y11E, buf);
    ::ccc::CC0x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y11E);
    dp->::ccc::CC0x14y11::~CC0x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y11E(Test__ZN3ccc9CC0x14y11E, "_ZN3ccc9CC0x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y11C1Ev();
extern void _ZN3ccc9CC0x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y11E[] = {
  NSPAIR(_ZN3ccc9CC0x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y11E[];
extern void _ZN3ccc9CC0x14y113pqrEv();
extern void _ZN3ccc9CC0x14y113efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x14y113efgEv,_ZTv0_n16_N3ccc9CC0x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y113efgEv,_ZThn4_N3ccc9CC0x14y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x14y113pqrEv,_ZTv0_n20_N3ccc9CC0x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y113pqrEv,_ZThn4_N3ccc9CC0x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x14y113efgEv,_ZTv0_n16_N3ccc9CC0x14y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x14y113pqrEv,_ZTv0_n20_N3ccc9CC0x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y11E[] = {
  {&(_ZTVN3ccc9CC0x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y11E[];
static VTBL_ENTRY alt_thunk_names427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x14y113pqrEv,_ZTv0_n20_N3ccc9CC0x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y113pqrEv,_ZThn4_N3ccc9CC0x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x14y113efgEv,_ZTv0_n16_N3ccc9CC0x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y113efgEv,_ZThn4_N3ccc9CC0x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x14y11E = {  "_ZN3ccc9CC0x14y11E", // class name
  bases__ZN3ccc9CC0x14y11E, 2,
  &(vtc__ZN3ccc9CC0x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y11E),2, //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  DD0x14y11  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD0x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x14y113efgEv
  ~DD0x14y11(); // tgen
  DD0x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y11E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD0x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x14y113pqrEv");}
void  ccc::DD0x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x14y113efgEv");}
ccc::DD0x14y11 ::~DD0x14y11(){ note_dtor("_ZN3ccc9DD0x14y11E", this);} // tgen
ccc::DD0x14y11 ::DD0x14y11(){ note_ctor("_ZN3ccc9DD0x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y11E, buf);
    ::ccc::DD0x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y11E);
    dp->::ccc::DD0x14y11::~DD0x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y11E(Test__ZN3ccc9DD0x14y11E, "_ZN3ccc9DD0x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y11C1Ev();
extern void _ZN3ccc9DD0x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y11E[] = {
  NSPAIR(_ZN3ccc9DD0x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x14y113efgEv();
extern void _ZN3ccc9DD0x14y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x14y113pqrEv,_ZTv0_n12_N3ccc9DD0x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x14y113pqrEv,_ZThn4_N3ccc9DD0x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x14y113pqrEv,_ZTv0_n12_N3ccc9DD0x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y11E[] = {
  {&(_ZTVN3ccc9DD0x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y11E[];
static VTBL_ENTRY alt_thunk_names428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x14y113pqrEv,_ZTv0_n12_N3ccc9DD0x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x14y113pqrEv,_ZThn4_N3ccc9DD0x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x14y11E = {  "_ZN3ccc9DD0x14y11E", // class name
  bases__ZN3ccc9DD0x14y11E, 2,
  &(vtc__ZN3ccc9DD0x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y11E),3, //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  CC0x14y12  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC0x14y123abcEv
  ~CC0x14y12(); // tgen
  CC0x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x14y123abcEv");}
ccc::CC0x14y12 ::~CC0x14y12(){ note_dtor("_ZN3ccc9CC0x14y12E", this);} // tgen
ccc::CC0x14y12 ::CC0x14y12(){ note_ctor("_ZN3ccc9CC0x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y12E, buf);
    ::ccc::CC0x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y12E);
    dp->::ccc::CC0x14y12::~CC0x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y12E(Test__ZN3ccc9CC0x14y12E, "_ZN3ccc9CC0x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y12C1Ev();
extern void _ZN3ccc9CC0x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y12E[] = {
  NSPAIR(_ZN3ccc9CC0x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC0x14y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC0x14y123abcEv,_ZTv0_n12_N3ccc9CC0x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y123abcEv,_ZThn4_N3ccc9CC0x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC0x14y123abcEv,_ZTv0_n12_N3ccc9CC0x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y12E[] = {
  {&(_ZTVN3ccc9CC0x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y12E[];
static VTBL_ENTRY alt_thunk_names429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC0x14y123abcEv,_ZTv0_n12_N3ccc9CC0x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y123abcEv,_ZThn4_N3ccc9CC0x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x14y12E = {  "_ZN3ccc9CC0x14y12E", // class name
  bases__ZN3ccc9CC0x14y12E, 2,
  &(vtc__ZN3ccc9CC0x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y12E),2, //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  DD0x14y12  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD0x14y123abcEv
  ~DD0x14y12(); // tgen
  DD0x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x14y123abcEv");}
ccc::DD0x14y12 ::~DD0x14y12(){ note_dtor("_ZN3ccc9DD0x14y12E", this);} // tgen
ccc::DD0x14y12 ::DD0x14y12(){ note_ctor("_ZN3ccc9DD0x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y12E, buf);
    ::ccc::DD0x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y12E);
    dp->::ccc::DD0x14y12::~DD0x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y12E(Test__ZN3ccc9DD0x14y12E, "_ZN3ccc9DD0x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y12C1Ev();
extern void _ZN3ccc9DD0x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y12E[] = {
  NSPAIR(_ZN3ccc9DD0x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y12E[];
extern void _ZN3ccc9DD0x14y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y12E[] = {
  {&(_ZTVN3ccc9DD0x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y12E[];
Class_Descriptor cd__ZN3ccc9DD0x14y12E = {  "_ZN3ccc9DD0x14y12E", // class name
  bases__ZN3ccc9DD0x14y12E, 2,
  &(vtc__ZN3ccc9DD0x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y13  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC0x14y133efgEv
  ~CC0x14y13(); // tgen
  CC0x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x14y133efgEv");}
ccc::CC0x14y13 ::~CC0x14y13(){ note_dtor("_ZN3ccc9CC0x14y13E", this);} // tgen
ccc::CC0x14y13 ::CC0x14y13(){ note_ctor("_ZN3ccc9CC0x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y13E, buf);
    ::ccc::CC0x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y13E);
    dp->::ccc::CC0x14y13::~CC0x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y13E(Test__ZN3ccc9CC0x14y13E, "_ZN3ccc9CC0x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y13C1Ev();
extern void _ZN3ccc9CC0x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y13E[] = {
  NSPAIR(_ZN3ccc9CC0x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC0x14y133efgEv();
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC0x14y133efgEv,_ZTv0_n16_N3ccc9CC0x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y133efgEv,_ZThn4_N3ccc9CC0x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC0x14y133efgEv,_ZTv0_n16_N3ccc9CC0x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y13E[] = {
  {&(_ZTVN3ccc9CC0x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC0x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y13E[];
static VTBL_ENTRY alt_thunk_names430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC0x14y133efgEv,_ZTv0_n16_N3ccc9CC0x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y133efgEv,_ZThn4_N3ccc9CC0x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x14y13E = {  "_ZN3ccc9CC0x14y13E", // class name
  bases__ZN3ccc9CC0x14y13E, 2,
  &(vtc__ZN3ccc9CC0x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y13E),2, //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  DD0x14y13  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD0x14y133efgEv
  ~DD0x14y13(); // tgen
  DD0x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD0x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x14y133efgEv");}
ccc::DD0x14y13 ::~DD0x14y13(){ note_dtor("_ZN3ccc9DD0x14y13E", this);} // tgen
ccc::DD0x14y13 ::DD0x14y13(){ note_ctor("_ZN3ccc9DD0x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y13E, buf);
    ::ccc::DD0x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y13E);
    dp->::ccc::DD0x14y13::~DD0x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y13E(Test__ZN3ccc9DD0x14y13E, "_ZN3ccc9DD0x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y13C1Ev();
extern void _ZN3ccc9DD0x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y13E[] = {
  NSPAIR(_ZN3ccc9DD0x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x14y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y13E[] = {
  {&(_ZTVN3ccc9DD0x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y13E[];
Class_Descriptor cd__ZN3ccc9DD0x14y13E = {  "_ZN3ccc9DD0x14y13E", // class name
  bases__ZN3ccc9DD0x14y13E, 2,
  &(vtc__ZN3ccc9DD0x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y14  : virtual ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y143pqrEv
  ~CC0x14y14(); // tgen
  CC0x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y143pqrEv");}
ccc::CC0x14y14 ::~CC0x14y14(){ note_dtor("_ZN3ccc9CC0x14y14E", this);} // tgen
ccc::CC0x14y14 ::CC0x14y14(){ note_ctor("_ZN3ccc9CC0x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y14E, buf);
    ::ccc::CC0x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y14E);
    dp->::ccc::CC0x14y14::~CC0x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y14E(Test__ZN3ccc9CC0x14y14E, "_ZN3ccc9CC0x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y14C1Ev();
extern void _ZN3ccc9CC0x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y14E[] = {
  NSPAIR(_ZN3ccc9CC0x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y14E[];
extern void _ZN3ccc9CC0x14y143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC0x14y143pqrEv,_ZTv0_n20_N3ccc9CC0x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y143pqrEv,_ZThn4_N3ccc9CC0x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC0x14y143pqrEv,_ZTv0_n20_N3ccc9CC0x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y14E[] = {
  {&(_ZTVN3ccc9CC0x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y14E[];
static VTBL_ENTRY alt_thunk_names431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC0x14y143pqrEv,_ZTv0_n20_N3ccc9CC0x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC0x14y143pqrEv,_ZThn4_N3ccc9CC0x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC0x14y14E = {  "_ZN3ccc9CC0x14y14E", // class name
  bases__ZN3ccc9CC0x14y14E, 2,
  &(vtc__ZN3ccc9CC0x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y14E),2, //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  DD0x14y14  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD0x14y143pqrEv
  ~DD0x14y14(); // tgen
  DD0x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD0x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x14y143pqrEv");}
ccc::DD0x14y14 ::~DD0x14y14(){ note_dtor("_ZN3ccc9DD0x14y14E", this);} // tgen
ccc::DD0x14y14 ::DD0x14y14(){ note_ctor("_ZN3ccc9DD0x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y14E, buf);
    ::ccc::DD0x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y14E);
    dp->::ccc::DD0x14y14::~DD0x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y14E(Test__ZN3ccc9DD0x14y14E, "_ZN3ccc9DD0x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y14C1Ev();
extern void _ZN3ccc9DD0x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y14E[] = {
  NSPAIR(_ZN3ccc9DD0x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD0x14y143pqrEv,_ZTv0_n12_N3ccc9DD0x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD0x14y143pqrEv,_ZThn4_N3ccc9DD0x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD0x14y143pqrEv,_ZTv0_n12_N3ccc9DD0x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y14E[] = {
  {&(_ZTVN3ccc9DD0x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y14E[];
static VTBL_ENTRY alt_thunk_names432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD0x14y143pqrEv,_ZTv0_n12_N3ccc9DD0x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD0x14y143pqrEv,_ZThn4_N3ccc9DD0x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD0x14y14E = {  "_ZN3ccc9DD0x14y14E", // class name
  bases__ZN3ccc9DD0x14y14E, 2,
  &(vtc__ZN3ccc9DD0x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y14E),3, //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  CC0x14y15  : virtual ::ccc::AA0 , ::ccc::BB14 {
  ~CC0x14y15(); // tgen
  CC0x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x14y15 ::~CC0x14y15(){ note_dtor("_ZN3ccc9CC0x14y15E", this);} // tgen
ccc::CC0x14y15 ::CC0x14y15(){ note_ctor("_ZN3ccc9CC0x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y15E, buf);
    ::ccc::CC0x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), ABISELECT(8,4), "_ZN3ccc9CC0x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC0x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y15E);
    dp->::ccc::CC0x14y15::~CC0x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y15E(Test__ZN3ccc9CC0x14y15E, "_ZN3ccc9CC0x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y15C1Ev();
extern void _ZN3ccc9CC0x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y15E[] = {
  NSPAIR(_ZN3ccc9CC0x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x14y15E[] = {
  {&(_ZTVN3ccc9CC0x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC0x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x14y15E[];
Class_Descriptor cd__ZN3ccc9CC0x14y15E = {  "_ZN3ccc9CC0x14y15E", // class name
  bases__ZN3ccc9CC0x14y15E, 2,
  &(vtc__ZN3ccc9CC0x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x14y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD0x14y15  : virtual ::ccc::AA0 , virtual ::ccc::BB14 {
  ~DD0x14y15(); // tgen
  DD0x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD0x14y15 ::~DD0x14y15(){ note_dtor("_ZN3ccc9DD0x14y15E", this);} // tgen
ccc::DD0x14y15 ::DD0x14y15(){ note_ctor("_ZN3ccc9DD0x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD0x14y15E, buf);
    ::ccc::DD0x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD0x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x14y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD0x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x14y15E);
    dp->::ccc::DD0x14y15::~DD0x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x14y15E(Test__ZN3ccc9DD0x14y15E, "_ZN3ccc9DD0x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD0x14y15C1Ev();
extern void _ZN3ccc9DD0x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x14y15E[] = {
  NSPAIR(_ZN3ccc9DD0x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD0x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x14y15E[] = {
  {&(_ZTVN3ccc9DD0x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD0x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x14y15E[];
Class_Descriptor cd__ZN3ccc9DD0x14y15E = {  "_ZN3ccc9DD0x14y15E", // class name
  bases__ZN3ccc9DD0x14y15E, 2,
  &(vtc__ZN3ccc9DD0x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD0x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x14y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y0  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y03pqrEv
  ~CC0x15y0(); // tgen
  CC0x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y0E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y03abcEv");}
void  ccc::CC0x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y03efgEv");}
void  ccc::CC0x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y03pqrEv");}
ccc::CC0x15y0 ::~CC0x15y0(){ note_dtor("_ZN3ccc8CC0x15y0E", this);} // tgen
ccc::CC0x15y0 ::CC0x15y0(){ note_ctor("_ZN3ccc8CC0x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y0E, buf);
    ::ccc::CC0x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y0E);
    dp->::ccc::CC0x15y0::~CC0x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y0E(Test__ZN3ccc8CC0x15y0E, "_ZN3ccc8CC0x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y0C1Ev();
extern void _ZN3ccc8CC0x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y0E[] = {
  NSPAIR(_ZN3ccc8CC0x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y0E[];
extern void _ZN3ccc8CC0x15y03abcEv();
extern void _ZN3ccc8CC0x15y03efgEv();
extern void _ZN3ccc8CC0x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y0E[] = {
  {&(_ZTVN3ccc8CC0x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y0E[];
Class_Descriptor cd__ZN3ccc8CC0x15y0E = {  "_ZN3ccc8CC0x15y0E", // class name
  bases__ZN3ccc8CC0x15y0E, 2,
  &(vtc__ZN3ccc8CC0x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y0E),2, //virtual 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  DD0x15y0  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD0x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD0x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y03pqrEv
  ~DD0x15y0(); // tgen
  DD0x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y0E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y03abcEv");}
void  ccc::DD0x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y03efgEv");}
void  ccc::DD0x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y03pqrEv");}
ccc::DD0x15y0 ::~DD0x15y0(){ note_dtor("_ZN3ccc8DD0x15y0E", this);} // tgen
ccc::DD0x15y0 ::DD0x15y0(){ note_ctor("_ZN3ccc8DD0x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y0E, buf);
    ::ccc::DD0x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y0E);
    dp->::ccc::DD0x15y0::~DD0x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y0E(Test__ZN3ccc8DD0x15y0E, "_ZN3ccc8DD0x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y0C1Ev();
extern void _ZN3ccc8DD0x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y0E[] = {
  NSPAIR(_ZN3ccc8DD0x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y0E[];
extern void _ZN3ccc8DD0x15y03abcEv();
extern void _ZN3ccc8DD0x15y03efgEv();
extern void _ZN3ccc8DD0x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y0E[] = {
  {&(_ZTVN3ccc8DD0x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y0E[];
Class_Descriptor cd__ZN3ccc8DD0x15y0E = {  "_ZN3ccc8DD0x15y0E", // class name
  bases__ZN3ccc8DD0x15y0E, 2,
  &(vtc__ZN3ccc8DD0x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y0E),2, //virtual 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  CC0x15y1  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x15y13efgEv
  ~CC0x15y1(); // tgen
  CC0x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y1E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y13abcEv");}
void  ccc::CC0x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y13pqrEv");}
void  ccc::CC0x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y13efgEv");}
ccc::CC0x15y1 ::~CC0x15y1(){ note_dtor("_ZN3ccc8CC0x15y1E", this);} // tgen
ccc::CC0x15y1 ::CC0x15y1(){ note_ctor("_ZN3ccc8CC0x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y1E, buf);
    ::ccc::CC0x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y1E);
    dp->::ccc::CC0x15y1::~CC0x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y1E(Test__ZN3ccc8CC0x15y1E, "_ZN3ccc8CC0x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y1C1Ev();
extern void _ZN3ccc8CC0x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y1E[] = {
  NSPAIR(_ZN3ccc8CC0x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y1E[];
extern void _ZN3ccc8CC0x15y13abcEv();
extern void _ZN3ccc8CC0x15y13efgEv();
extern void _ZN3ccc8CC0x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y1E[] = {
  {&(_ZTVN3ccc8CC0x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y1E[];
Class_Descriptor cd__ZN3ccc8CC0x15y1E = {  "_ZN3ccc8CC0x15y1E", // class name
  bases__ZN3ccc8CC0x15y1E, 2,
  &(vtc__ZN3ccc8CC0x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y1E),2, //virtual 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  DD0x15y1  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD0x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x15y13efgEv
  ~DD0x15y1(); // tgen
  DD0x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y1E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y13abcEv");}
void  ccc::DD0x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y13pqrEv");}
void  ccc::DD0x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y13efgEv");}
ccc::DD0x15y1 ::~DD0x15y1(){ note_dtor("_ZN3ccc8DD0x15y1E", this);} // tgen
ccc::DD0x15y1 ::DD0x15y1(){ note_ctor("_ZN3ccc8DD0x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y1E, buf);
    ::ccc::DD0x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y1E);
    dp->::ccc::DD0x15y1::~DD0x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y1E(Test__ZN3ccc8DD0x15y1E, "_ZN3ccc8DD0x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y1C1Ev();
extern void _ZN3ccc8DD0x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y1E[] = {
  NSPAIR(_ZN3ccc8DD0x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y1E[];
extern void _ZN3ccc8DD0x15y13abcEv();
extern void _ZN3ccc8DD0x15y13efgEv();
extern void _ZN3ccc8DD0x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y1E[] = {
  {&(_ZTVN3ccc8DD0x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y1E[];
Class_Descriptor cd__ZN3ccc8DD0x15y1E = {  "_ZN3ccc8DD0x15y1E", // class name
  bases__ZN3ccc8DD0x15y1E, 2,
  &(vtc__ZN3ccc8DD0x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y1E),2, //virtual 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  CC0x15y2  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y23pqrEv
  ~CC0x15y2(); // tgen
  CC0x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y2E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y23efgEv");}
void  ccc::CC0x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y23abcEv");}
void  ccc::CC0x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y23pqrEv");}
ccc::CC0x15y2 ::~CC0x15y2(){ note_dtor("_ZN3ccc8CC0x15y2E", this);} // tgen
ccc::CC0x15y2 ::CC0x15y2(){ note_ctor("_ZN3ccc8CC0x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y2E, buf);
    ::ccc::CC0x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y2E);
    dp->::ccc::CC0x15y2::~CC0x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y2E(Test__ZN3ccc8CC0x15y2E, "_ZN3ccc8CC0x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y2C1Ev();
extern void _ZN3ccc8CC0x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y2E[] = {
  NSPAIR(_ZN3ccc8CC0x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y2E[];
extern void _ZN3ccc8CC0x15y23abcEv();
extern void _ZN3ccc8CC0x15y23efgEv();
extern void _ZN3ccc8CC0x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y2E[] = {
  {&(_ZTVN3ccc8CC0x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y2E[];
Class_Descriptor cd__ZN3ccc8CC0x15y2E = {  "_ZN3ccc8CC0x15y2E", // class name
  bases__ZN3ccc8CC0x15y2E, 2,
  &(vtc__ZN3ccc8CC0x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y2E),2, //virtual 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  DD0x15y2  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD0x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD0x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y23pqrEv
  ~DD0x15y2(); // tgen
  DD0x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y2E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y23efgEv");}
void  ccc::DD0x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y23abcEv");}
void  ccc::DD0x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y23pqrEv");}
ccc::DD0x15y2 ::~DD0x15y2(){ note_dtor("_ZN3ccc8DD0x15y2E", this);} // tgen
ccc::DD0x15y2 ::DD0x15y2(){ note_ctor("_ZN3ccc8DD0x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y2E, buf);
    ::ccc::DD0x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y2E);
    dp->::ccc::DD0x15y2::~DD0x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y2E(Test__ZN3ccc8DD0x15y2E, "_ZN3ccc8DD0x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y2C1Ev();
extern void _ZN3ccc8DD0x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y2E[] = {
  NSPAIR(_ZN3ccc8DD0x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y2E[];
extern void _ZN3ccc8DD0x15y23abcEv();
extern void _ZN3ccc8DD0x15y23efgEv();
extern void _ZN3ccc8DD0x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y2E[] = {
  {&(_ZTVN3ccc8DD0x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y2E[];
Class_Descriptor cd__ZN3ccc8DD0x15y2E = {  "_ZN3ccc8DD0x15y2E", // class name
  bases__ZN3ccc8DD0x15y2E, 2,
  &(vtc__ZN3ccc8DD0x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y2E),2, //virtual 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  CC0x15y3  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x15y33abcEv
  ~CC0x15y3(); // tgen
  CC0x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y3E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y33efgEv");}
void  ccc::CC0x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y33pqrEv");}
void  ccc::CC0x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y33abcEv");}
ccc::CC0x15y3 ::~CC0x15y3(){ note_dtor("_ZN3ccc8CC0x15y3E", this);} // tgen
ccc::CC0x15y3 ::CC0x15y3(){ note_ctor("_ZN3ccc8CC0x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y3E, buf);
    ::ccc::CC0x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y3E);
    dp->::ccc::CC0x15y3::~CC0x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y3E(Test__ZN3ccc8CC0x15y3E, "_ZN3ccc8CC0x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y3C1Ev();
extern void _ZN3ccc8CC0x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y3E[] = {
  NSPAIR(_ZN3ccc8CC0x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y3E[];
extern void _ZN3ccc8CC0x15y33abcEv();
extern void _ZN3ccc8CC0x15y33efgEv();
extern void _ZN3ccc8CC0x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y3E[] = {
  {&(_ZTVN3ccc8CC0x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y3E[];
Class_Descriptor cd__ZN3ccc8CC0x15y3E = {  "_ZN3ccc8CC0x15y3E", // class name
  bases__ZN3ccc8CC0x15y3E, 2,
  &(vtc__ZN3ccc8CC0x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y3E),2, //virtual 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  DD0x15y3  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD0x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x15y33abcEv
  ~DD0x15y3(); // tgen
  DD0x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y3E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y33efgEv");}
void  ccc::DD0x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y33pqrEv");}
void  ccc::DD0x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y33abcEv");}
ccc::DD0x15y3 ::~DD0x15y3(){ note_dtor("_ZN3ccc8DD0x15y3E", this);} // tgen
ccc::DD0x15y3 ::DD0x15y3(){ note_ctor("_ZN3ccc8DD0x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y3E, buf);
    ::ccc::DD0x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y3E);
    dp->::ccc::DD0x15y3::~DD0x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y3E(Test__ZN3ccc8DD0x15y3E, "_ZN3ccc8DD0x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y3C1Ev();
extern void _ZN3ccc8DD0x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y3E[] = {
  NSPAIR(_ZN3ccc8DD0x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y3E[];
extern void _ZN3ccc8DD0x15y33abcEv();
extern void _ZN3ccc8DD0x15y33efgEv();
extern void _ZN3ccc8DD0x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y3E[] = {
  {&(_ZTVN3ccc8DD0x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y3E[];
Class_Descriptor cd__ZN3ccc8DD0x15y3E = {  "_ZN3ccc8DD0x15y3E", // class name
  bases__ZN3ccc8DD0x15y3E, 2,
  &(vtc__ZN3ccc8DD0x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y3E),2, //virtual 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  CC0x15y4  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC0x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y43efgEv
  ~CC0x15y4(); // tgen
  CC0x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y4E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y43pqrEv");}
void  ccc::CC0x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y43abcEv");}
void  ccc::CC0x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y43efgEv");}
ccc::CC0x15y4 ::~CC0x15y4(){ note_dtor("_ZN3ccc8CC0x15y4E", this);} // tgen
ccc::CC0x15y4 ::CC0x15y4(){ note_ctor("_ZN3ccc8CC0x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y4E, buf);
    ::ccc::CC0x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y4E);
    dp->::ccc::CC0x15y4::~CC0x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y4E(Test__ZN3ccc8CC0x15y4E, "_ZN3ccc8CC0x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y4C1Ev();
extern void _ZN3ccc8CC0x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y4E[] = {
  NSPAIR(_ZN3ccc8CC0x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y4E[];
extern void _ZN3ccc8CC0x15y43abcEv();
extern void _ZN3ccc8CC0x15y43efgEv();
extern void _ZN3ccc8CC0x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y4E[] = {
  {&(_ZTVN3ccc8CC0x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y4E[];
Class_Descriptor cd__ZN3ccc8CC0x15y4E = {  "_ZN3ccc8CC0x15y4E", // class name
  bases__ZN3ccc8CC0x15y4E, 2,
  &(vtc__ZN3ccc8CC0x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y4E),2, //virtual 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  DD0x15y4  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD0x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD0x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD0x15y43efgEv
  ~DD0x15y4(); // tgen
  DD0x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y4E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y43pqrEv");}
void  ccc::DD0x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y43abcEv");}
void  ccc::DD0x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y43efgEv");}
ccc::DD0x15y4 ::~DD0x15y4(){ note_dtor("_ZN3ccc8DD0x15y4E", this);} // tgen
ccc::DD0x15y4 ::DD0x15y4(){ note_ctor("_ZN3ccc8DD0x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y4E, buf);
    ::ccc::DD0x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y4E);
    dp->::ccc::DD0x15y4::~DD0x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y4E(Test__ZN3ccc8DD0x15y4E, "_ZN3ccc8DD0x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y4C1Ev();
extern void _ZN3ccc8DD0x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y4E[] = {
  NSPAIR(_ZN3ccc8DD0x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y4E[];
extern void _ZN3ccc8DD0x15y43abcEv();
extern void _ZN3ccc8DD0x15y43efgEv();
extern void _ZN3ccc8DD0x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y4E[] = {
  {&(_ZTVN3ccc8DD0x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y4E[];
Class_Descriptor cd__ZN3ccc8DD0x15y4E = {  "_ZN3ccc8DD0x15y4E", // class name
  bases__ZN3ccc8DD0x15y4E, 2,
  &(vtc__ZN3ccc8DD0x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y4E),2, //virtual 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  CC0x15y5  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC0x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y53abcEv
  ~CC0x15y5(); // tgen
  CC0x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y5E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y53pqrEv");}
void  ccc::CC0x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y53efgEv");}
void  ccc::CC0x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y53abcEv");}
ccc::CC0x15y5 ::~CC0x15y5(){ note_dtor("_ZN3ccc8CC0x15y5E", this);} // tgen
ccc::CC0x15y5 ::CC0x15y5(){ note_ctor("_ZN3ccc8CC0x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y5E, buf);
    ::ccc::CC0x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y5E);
    dp->::ccc::CC0x15y5::~CC0x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y5E(Test__ZN3ccc8CC0x15y5E, "_ZN3ccc8CC0x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y5C1Ev();
extern void _ZN3ccc8CC0x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y5E[] = {
  NSPAIR(_ZN3ccc8CC0x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y5E[];
extern void _ZN3ccc8CC0x15y53abcEv();
extern void _ZN3ccc8CC0x15y53efgEv();
extern void _ZN3ccc8CC0x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y5E[] = {
  {&(_ZTVN3ccc8CC0x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y5E[];
Class_Descriptor cd__ZN3ccc8CC0x15y5E = {  "_ZN3ccc8CC0x15y5E", // class name
  bases__ZN3ccc8CC0x15y5E, 2,
  &(vtc__ZN3ccc8CC0x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y5E),2, //virtual 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  DD0x15y5  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD0x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD0x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD0x15y53abcEv
  ~DD0x15y5(); // tgen
  DD0x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y5E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD0x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y53pqrEv");}
void  ccc::DD0x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y53efgEv");}
void  ccc::DD0x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y53abcEv");}
ccc::DD0x15y5 ::~DD0x15y5(){ note_dtor("_ZN3ccc8DD0x15y5E", this);} // tgen
ccc::DD0x15y5 ::DD0x15y5(){ note_ctor("_ZN3ccc8DD0x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y5E, buf);
    ::ccc::DD0x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y5E);
    dp->::ccc::DD0x15y5::~DD0x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y5E(Test__ZN3ccc8DD0x15y5E, "_ZN3ccc8DD0x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y5C1Ev();
extern void _ZN3ccc8DD0x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y5E[] = {
  NSPAIR(_ZN3ccc8DD0x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y5E[];
extern void _ZN3ccc8DD0x15y53abcEv();
extern void _ZN3ccc8DD0x15y53efgEv();
extern void _ZN3ccc8DD0x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y5E[] = {
  {&(_ZTVN3ccc8DD0x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y5E[];
Class_Descriptor cd__ZN3ccc8DD0x15y5E = {  "_ZN3ccc8DD0x15y5E", // class name
  bases__ZN3ccc8DD0x15y5E, 2,
  &(vtc__ZN3ccc8DD0x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y5E),2, //virtual 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  CC0x15y6  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y63efgEv
  ~CC0x15y6(); // tgen
  CC0x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y6E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y63abcEv");}
void  ccc::CC0x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y63efgEv");}
ccc::CC0x15y6 ::~CC0x15y6(){ note_dtor("_ZN3ccc8CC0x15y6E", this);} // tgen
ccc::CC0x15y6 ::CC0x15y6(){ note_ctor("_ZN3ccc8CC0x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y6E, buf);
    ::ccc::CC0x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y6E);
    dp->::ccc::CC0x15y6::~CC0x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y6E(Test__ZN3ccc8CC0x15y6E, "_ZN3ccc8CC0x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y6C1Ev();
extern void _ZN3ccc8CC0x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y6E[] = {
  NSPAIR(_ZN3ccc8CC0x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y6E[];
extern void _ZN3ccc8CC0x15y63abcEv();
extern void _ZN3ccc8CC0x15y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y6E[] = {
  {&(_ZTVN3ccc8CC0x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y6E[];
Class_Descriptor cd__ZN3ccc8CC0x15y6E = {  "_ZN3ccc8CC0x15y6E", // class name
  bases__ZN3ccc8CC0x15y6E, 2,
  &(vtc__ZN3ccc8CC0x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y6E),2, //virtual 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  DD0x15y6  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD0x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD0x15y63efgEv
  ~DD0x15y6(); // tgen
  DD0x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y6E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y63abcEv");}
void  ccc::DD0x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y63efgEv");}
ccc::DD0x15y6 ::~DD0x15y6(){ note_dtor("_ZN3ccc8DD0x15y6E", this);} // tgen
ccc::DD0x15y6 ::DD0x15y6(){ note_ctor("_ZN3ccc8DD0x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y6E, buf);
    ::ccc::DD0x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y6E);
    dp->::ccc::DD0x15y6::~DD0x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y6E(Test__ZN3ccc8DD0x15y6E, "_ZN3ccc8DD0x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y6C1Ev();
extern void _ZN3ccc8DD0x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y6E[] = {
  NSPAIR(_ZN3ccc8DD0x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y6E[];
extern void _ZN3ccc8DD0x15y63abcEv();
extern void _ZN3ccc8DD0x15y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y6E[] = {
  {&(_ZTVN3ccc8DD0x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y6E[];
Class_Descriptor cd__ZN3ccc8DD0x15y6E = {  "_ZN3ccc8DD0x15y6E", // class name
  bases__ZN3ccc8DD0x15y6E, 2,
  &(vtc__ZN3ccc8DD0x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y6E),2, //virtual 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  CC0x15y7  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y73pqrEv
  ~CC0x15y7(); // tgen
  CC0x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y7E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y73abcEv");}
void  ccc::CC0x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y73pqrEv");}
ccc::CC0x15y7 ::~CC0x15y7(){ note_dtor("_ZN3ccc8CC0x15y7E", this);} // tgen
ccc::CC0x15y7 ::CC0x15y7(){ note_ctor("_ZN3ccc8CC0x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y7E, buf);
    ::ccc::CC0x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y7E);
    dp->::ccc::CC0x15y7::~CC0x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y7E(Test__ZN3ccc8CC0x15y7E, "_ZN3ccc8CC0x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y7C1Ev();
extern void _ZN3ccc8CC0x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y7E[] = {
  NSPAIR(_ZN3ccc8CC0x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y7E[];
extern void _ZN3ccc8CC0x15y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y7E[] = {
  {&(_ZTVN3ccc8CC0x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y7E[];
Class_Descriptor cd__ZN3ccc8CC0x15y7E = {  "_ZN3ccc8CC0x15y7E", // class name
  bases__ZN3ccc8CC0x15y7E, 2,
  &(vtc__ZN3ccc8CC0x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y7E),2, //virtual 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  DD0x15y7  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD0x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y73pqrEv
  ~DD0x15y7(); // tgen
  DD0x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y7E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y73abcEv");}
void  ccc::DD0x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y73pqrEv");}
ccc::DD0x15y7 ::~DD0x15y7(){ note_dtor("_ZN3ccc8DD0x15y7E", this);} // tgen
ccc::DD0x15y7 ::DD0x15y7(){ note_ctor("_ZN3ccc8DD0x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y7E, buf);
    ::ccc::DD0x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y7E);
    dp->::ccc::DD0x15y7::~DD0x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y7E(Test__ZN3ccc8DD0x15y7E, "_ZN3ccc8DD0x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y7C1Ev();
extern void _ZN3ccc8DD0x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y7E[] = {
  NSPAIR(_ZN3ccc8DD0x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y7E[];
extern void _ZN3ccc8DD0x15y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8DD0x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y7E[] = {
  {&(_ZTVN3ccc8DD0x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y7E[];
Class_Descriptor cd__ZN3ccc8DD0x15y7E = {  "_ZN3ccc8DD0x15y7E", // class name
  bases__ZN3ccc8DD0x15y7E, 2,
  &(vtc__ZN3ccc8DD0x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y7E),2, //virtual 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  CC0x15y8  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y83abcEv
  ~CC0x15y8(); // tgen
  CC0x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y8E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y83efgEv");}
void  ccc::CC0x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y83abcEv");}
ccc::CC0x15y8 ::~CC0x15y8(){ note_dtor("_ZN3ccc8CC0x15y8E", this);} // tgen
ccc::CC0x15y8 ::CC0x15y8(){ note_ctor("_ZN3ccc8CC0x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y8E, buf);
    ::ccc::CC0x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y8E);
    dp->::ccc::CC0x15y8::~CC0x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y8E(Test__ZN3ccc8CC0x15y8E, "_ZN3ccc8CC0x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y8C1Ev();
extern void _ZN3ccc8CC0x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y8E[] = {
  NSPAIR(_ZN3ccc8CC0x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y8E[];
extern void _ZN3ccc8CC0x15y83abcEv();
extern void _ZN3ccc8CC0x15y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y8E[] = {
  {&(_ZTVN3ccc8CC0x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y8E[];
Class_Descriptor cd__ZN3ccc8CC0x15y8E = {  "_ZN3ccc8CC0x15y8E", // class name
  bases__ZN3ccc8CC0x15y8E, 2,
  &(vtc__ZN3ccc8CC0x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y8E),2, //virtual 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  DD0x15y8  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD0x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD0x15y83abcEv
  ~DD0x15y8(); // tgen
  DD0x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y8E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y83efgEv");}
void  ccc::DD0x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD0x15y83abcEv");}
ccc::DD0x15y8 ::~DD0x15y8(){ note_dtor("_ZN3ccc8DD0x15y8E", this);} // tgen
ccc::DD0x15y8 ::DD0x15y8(){ note_ctor("_ZN3ccc8DD0x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y8E, buf);
    ::ccc::DD0x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y8E);
    dp->::ccc::DD0x15y8::~DD0x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y8E(Test__ZN3ccc8DD0x15y8E, "_ZN3ccc8DD0x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y8C1Ev();
extern void _ZN3ccc8DD0x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y8E[] = {
  NSPAIR(_ZN3ccc8DD0x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y8E[];
extern void _ZN3ccc8DD0x15y83abcEv();
extern void _ZN3ccc8DD0x15y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y8E[] = {
  {&(_ZTVN3ccc8DD0x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y8E[];
Class_Descriptor cd__ZN3ccc8DD0x15y8E = {  "_ZN3ccc8DD0x15y8E", // class name
  bases__ZN3ccc8DD0x15y8E, 2,
  &(vtc__ZN3ccc8DD0x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y8E),2, //virtual 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  CC0x15y9  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y93pqrEv
  ~CC0x15y9(); // tgen
  CC0x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y9E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y93efgEv");}
void  ccc::CC0x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y93pqrEv");}
ccc::CC0x15y9 ::~CC0x15y9(){ note_dtor("_ZN3ccc8CC0x15y9E", this);} // tgen
ccc::CC0x15y9 ::CC0x15y9(){ note_ctor("_ZN3ccc8CC0x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y9E, buf);
    ::ccc::CC0x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y9E);
    dp->::ccc::CC0x15y9::~CC0x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y9E(Test__ZN3ccc8CC0x15y9E, "_ZN3ccc8CC0x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y9C1Ev();
extern void _ZN3ccc8CC0x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y9E[] = {
  NSPAIR(_ZN3ccc8CC0x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x15y93efgEv();
extern void _ZN3ccc8CC0x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC0x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC0x15y9E[] = {
  {&(_ZTVN3ccc8CC0x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC0x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC0x15y9E[];
Class_Descriptor cd__ZN3ccc8CC0x15y9E = {  "_ZN3ccc8CC0x15y9E", // class name
  bases__ZN3ccc8CC0x15y9E, 2,
  &(vtc__ZN3ccc8CC0x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC0x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC0x15y9E),2, //virtual 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  DD0x15y9  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD0x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD0x15y93pqrEv
  ~DD0x15y9(); // tgen
  DD0x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD0x15y9E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD0x15y93efgEv");}
void  ccc::DD0x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD0x15y93pqrEv");}
ccc::DD0x15y9 ::~DD0x15y9(){ note_dtor("_ZN3ccc8DD0x15y9E", this);} // tgen
ccc::DD0x15y9 ::DD0x15y9(){ note_ctor("_ZN3ccc8DD0x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD0x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD0x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD0x15y9E, buf);
    ::ccc::DD0x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD0x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD0x15y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8DD0x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD0x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD0x15y9E);
    dp->::ccc::DD0x15y9::~DD0x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD0x15y9E(Test__ZN3ccc8DD0x15y9E, "_ZN3ccc8DD0x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD0x15y9C1Ev();
extern void _ZN3ccc8DD0x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD0x15y9E[] = {
  NSPAIR(_ZN3ccc8DD0x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD0x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD0x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8DD0x15y93efgEv();
extern void _ZN3ccc8DD0x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD0x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD0x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD0x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD0x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD0x15y9E[] = {
  {&(_ZTVN3ccc8DD0x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD0x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD0x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD0x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD0x15y9E[];
Class_Descriptor cd__ZN3ccc8DD0x15y9E = {  "_ZN3ccc8DD0x15y9E", // class name
  bases__ZN3ccc8DD0x15y9E, 2,
  &(vtc__ZN3ccc8DD0x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD0x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD0x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD0x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD0x15y9E),2, //virtual 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  CC0x15y10  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x15y103abcEv
  ~CC0x15y10(); // tgen
  CC0x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y10E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y103pqrEv");}
void  ccc::CC0x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x15y103abcEv");}
ccc::CC0x15y10 ::~CC0x15y10(){ note_dtor("_ZN3ccc9CC0x15y10E", this);} // tgen
ccc::CC0x15y10 ::CC0x15y10(){ note_ctor("_ZN3ccc9CC0x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y10E, buf);
    ::ccc::CC0x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y10E);
    dp->::ccc::CC0x15y10::~CC0x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y10E(Test__ZN3ccc9CC0x15y10E, "_ZN3ccc9CC0x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y10C1Ev();
extern void _ZN3ccc9CC0x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y10E[] = {
  NSPAIR(_ZN3ccc9CC0x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y10E[];
extern void _ZN3ccc9CC0x15y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y10E[] = {
  {&(_ZTVN3ccc9CC0x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y10E[];
Class_Descriptor cd__ZN3ccc9CC0x15y10E = {  "_ZN3ccc9CC0x15y10E", // class name
  bases__ZN3ccc9CC0x15y10E, 2,
  &(vtc__ZN3ccc9CC0x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y10E),2, //virtual 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  DD0x15y10  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD0x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD0x15y103abcEv
  ~DD0x15y10(); // tgen
  DD0x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y10E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x15y103pqrEv");}
void  ccc::DD0x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x15y103abcEv");}
ccc::DD0x15y10 ::~DD0x15y10(){ note_dtor("_ZN3ccc9DD0x15y10E", this);} // tgen
ccc::DD0x15y10 ::DD0x15y10(){ note_ctor("_ZN3ccc9DD0x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y10E, buf);
    ::ccc::DD0x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y10E);
    dp->::ccc::DD0x15y10::~DD0x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y10E(Test__ZN3ccc9DD0x15y10E, "_ZN3ccc9DD0x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y10C1Ev();
extern void _ZN3ccc9DD0x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y10E[] = {
  NSPAIR(_ZN3ccc9DD0x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y10E[];
extern void _ZN3ccc9DD0x15y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y10E[] = {
  {&(_ZTVN3ccc9DD0x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y10E[];
Class_Descriptor cd__ZN3ccc9DD0x15y10E = {  "_ZN3ccc9DD0x15y10E", // class name
  bases__ZN3ccc9DD0x15y10E, 2,
  &(vtc__ZN3ccc9DD0x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y10E),2, //virtual 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  CC0x15y11  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x15y113efgEv
  ~CC0x15y11(); // tgen
  CC0x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y11E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y113pqrEv");}
void  ccc::CC0x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x15y113efgEv");}
ccc::CC0x15y11 ::~CC0x15y11(){ note_dtor("_ZN3ccc9CC0x15y11E", this);} // tgen
ccc::CC0x15y11 ::CC0x15y11(){ note_ctor("_ZN3ccc9CC0x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y11E, buf);
    ::ccc::CC0x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y11E);
    dp->::ccc::CC0x15y11::~CC0x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y11E(Test__ZN3ccc9CC0x15y11E, "_ZN3ccc9CC0x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y11C1Ev();
extern void _ZN3ccc9CC0x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y11E[] = {
  NSPAIR(_ZN3ccc9CC0x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x15y113efgEv();
extern void _ZN3ccc9CC0x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y11E[] = {
  {&(_ZTVN3ccc9CC0x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y11E[];
Class_Descriptor cd__ZN3ccc9CC0x15y11E = {  "_ZN3ccc9CC0x15y11E", // class name
  bases__ZN3ccc9CC0x15y11E, 2,
  &(vtc__ZN3ccc9CC0x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y11E),2, //virtual 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  DD0x15y11  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD0x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD0x15y113efgEv
  ~DD0x15y11(); // tgen
  DD0x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y11E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD0x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x15y113pqrEv");}
void  ccc::DD0x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x15y113efgEv");}
ccc::DD0x15y11 ::~DD0x15y11(){ note_dtor("_ZN3ccc9DD0x15y11E", this);} // tgen
ccc::DD0x15y11 ::DD0x15y11(){ note_ctor("_ZN3ccc9DD0x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y11E, buf);
    ::ccc::DD0x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y11E);
    dp->::ccc::DD0x15y11::~DD0x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y11E(Test__ZN3ccc9DD0x15y11E, "_ZN3ccc9DD0x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y11C1Ev();
extern void _ZN3ccc9DD0x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y11E[] = {
  NSPAIR(_ZN3ccc9DD0x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x15y113efgEv();
extern void _ZN3ccc9DD0x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y11E[] = {
  {&(_ZTVN3ccc9DD0x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y11E[];
Class_Descriptor cd__ZN3ccc9DD0x15y11E = {  "_ZN3ccc9DD0x15y11E", // class name
  bases__ZN3ccc9DD0x15y11E, 2,
  &(vtc__ZN3ccc9DD0x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y11E),2, //virtual 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  CC0x15y12  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC0x15y123abcEv
  ~CC0x15y12(); // tgen
  CC0x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y12E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x15y123abcEv");}
ccc::CC0x15y12 ::~CC0x15y12(){ note_dtor("_ZN3ccc9CC0x15y12E", this);} // tgen
ccc::CC0x15y12 ::CC0x15y12(){ note_ctor("_ZN3ccc9CC0x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y12E, buf);
    ::ccc::CC0x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y12E);
    dp->::ccc::CC0x15y12::~CC0x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y12E(Test__ZN3ccc9CC0x15y12E, "_ZN3ccc9CC0x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y12C1Ev();
extern void _ZN3ccc9CC0x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y12E[] = {
  NSPAIR(_ZN3ccc9CC0x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y12E[];
extern void _ZN3ccc9CC0x15y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y12E[] = {
  {&(_ZTVN3ccc9CC0x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y12E[];
Class_Descriptor cd__ZN3ccc9CC0x15y12E = {  "_ZN3ccc9CC0x15y12E", // class name
  bases__ZN3ccc9CC0x15y12E, 2,
  &(vtc__ZN3ccc9CC0x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y12E),2, //virtual 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  DD0x15y12  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD0x15y123abcEv
  ~DD0x15y12(); // tgen
  DD0x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y12E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD0x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD0x15y123abcEv");}
ccc::DD0x15y12 ::~DD0x15y12(){ note_dtor("_ZN3ccc9DD0x15y12E", this);} // tgen
ccc::DD0x15y12 ::DD0x15y12(){ note_ctor("_ZN3ccc9DD0x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y12E, buf);
    ::ccc::DD0x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y12E);
    dp->::ccc::DD0x15y12::~DD0x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y12E(Test__ZN3ccc9DD0x15y12E, "_ZN3ccc9DD0x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y12C1Ev();
extern void _ZN3ccc9DD0x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y12E[] = {
  NSPAIR(_ZN3ccc9DD0x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y12E[];
extern void _ZN3ccc9DD0x15y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y12E[] = {
  {&(_ZTVN3ccc9DD0x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y12E[];
Class_Descriptor cd__ZN3ccc9DD0x15y12E = {  "_ZN3ccc9DD0x15y12E", // class name
  bases__ZN3ccc9DD0x15y12E, 2,
  &(vtc__ZN3ccc9DD0x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y12E),2, //virtual 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  CC0x15y13  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC0x15y133efgEv
  ~CC0x15y13(); // tgen
  CC0x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y13E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x15y133efgEv");}
ccc::CC0x15y13 ::~CC0x15y13(){ note_dtor("_ZN3ccc9CC0x15y13E", this);} // tgen
ccc::CC0x15y13 ::CC0x15y13(){ note_ctor("_ZN3ccc9CC0x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y13E, buf);
    ::ccc::CC0x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y13E);
    dp->::ccc::CC0x15y13::~CC0x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y13E(Test__ZN3ccc9CC0x15y13E, "_ZN3ccc9CC0x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y13C1Ev();
extern void _ZN3ccc9CC0x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y13E[] = {
  NSPAIR(_ZN3ccc9CC0x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x15y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y13E[] = {
  {&(_ZTVN3ccc9CC0x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y13E[];
Class_Descriptor cd__ZN3ccc9CC0x15y13E = {  "_ZN3ccc9CC0x15y13E", // class name
  bases__ZN3ccc9CC0x15y13E, 2,
  &(vtc__ZN3ccc9CC0x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y13E),2, //virtual 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  DD0x15y13  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD0x15y133efgEv
  ~DD0x15y13(); // tgen
  DD0x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y13E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD0x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD0x15y133efgEv");}
ccc::DD0x15y13 ::~DD0x15y13(){ note_dtor("_ZN3ccc9DD0x15y13E", this);} // tgen
ccc::DD0x15y13 ::DD0x15y13(){ note_ctor("_ZN3ccc9DD0x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y13E, buf);
    ::ccc::DD0x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y13E);
    dp->::ccc::DD0x15y13::~DD0x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y13E(Test__ZN3ccc9DD0x15y13E, "_ZN3ccc9DD0x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y13C1Ev();
extern void _ZN3ccc9DD0x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y13E[] = {
  NSPAIR(_ZN3ccc9DD0x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9DD0x15y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y13E[] = {
  {&(_ZTVN3ccc9DD0x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y13E[];
Class_Descriptor cd__ZN3ccc9DD0x15y13E = {  "_ZN3ccc9DD0x15y13E", // class name
  bases__ZN3ccc9DD0x15y13E, 2,
  &(vtc__ZN3ccc9DD0x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y13E),2, //virtual 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  CC0x15y14  : virtual ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y143pqrEv
  ~CC0x15y14(); // tgen
  CC0x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y14E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y143pqrEv");}
ccc::CC0x15y14 ::~CC0x15y14(){ note_dtor("_ZN3ccc9CC0x15y14E", this);} // tgen
ccc::CC0x15y14 ::CC0x15y14(){ note_ctor("_ZN3ccc9CC0x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y14E, buf);
    ::ccc::CC0x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y14E);
    dp->::ccc::CC0x15y14::~CC0x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y14E(Test__ZN3ccc9CC0x15y14E, "_ZN3ccc9CC0x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y14C1Ev();
extern void _ZN3ccc9CC0x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y14E[] = {
  NSPAIR(_ZN3ccc9CC0x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y14E[] = {
  {&(_ZTVN3ccc9CC0x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y14E[];
Class_Descriptor cd__ZN3ccc9CC0x15y14E = {  "_ZN3ccc9CC0x15y14E", // class name
  bases__ZN3ccc9CC0x15y14E, 2,
  &(vtc__ZN3ccc9CC0x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y14E),2, //virtual 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  DD0x15y14  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD0x15y143pqrEv
  ~DD0x15y14(); // tgen
  DD0x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y14E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD0x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD0x15y143pqrEv");}
ccc::DD0x15y14 ::~DD0x15y14(){ note_dtor("_ZN3ccc9DD0x15y14E", this);} // tgen
ccc::DD0x15y14 ::DD0x15y14(){ note_ctor("_ZN3ccc9DD0x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y14E, buf);
    ::ccc::DD0x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y14E);
    dp->::ccc::DD0x15y14::~DD0x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y14E(Test__ZN3ccc9DD0x15y14E, "_ZN3ccc9DD0x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y14C1Ev();
extern void _ZN3ccc9DD0x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y14E[] = {
  NSPAIR(_ZN3ccc9DD0x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9DD0x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD0x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y14E[] = {
  {&(_ZTVN3ccc9DD0x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y14E[];
Class_Descriptor cd__ZN3ccc9DD0x15y14E = {  "_ZN3ccc9DD0x15y14E", // class name
  bases__ZN3ccc9DD0x15y14E, 2,
  &(vtc__ZN3ccc9DD0x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y14E),2, //virtual 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  CC0x15y15  : virtual ::ccc::AA0 , ::ccc::BB15 {
  ~CC0x15y15(); // tgen
  CC0x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC0x15y15 ::~CC0x15y15(){ note_dtor("_ZN3ccc9CC0x15y15E", this);} // tgen
ccc::CC0x15y15 ::CC0x15y15(){ note_ctor("_ZN3ccc9CC0x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y15E, buf);
    ::ccc::CC0x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y15E);
    dp->::ccc::CC0x15y15::~CC0x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y15E(Test__ZN3ccc9CC0x15y15E, "_ZN3ccc9CC0x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y15C1Ev();
extern void _ZN3ccc9CC0x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y15E[] = {
  NSPAIR(_ZN3ccc9CC0x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC0x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC0x15y15E[] = {
  {&(_ZTVN3ccc9CC0x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC0x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC0x15y15E[];
Class_Descriptor cd__ZN3ccc9CC0x15y15E = {  "_ZN3ccc9CC0x15y15E", // class name
  bases__ZN3ccc9CC0x15y15E, 2,
  &(vtc__ZN3ccc9CC0x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC0x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC0x15y15E),2, //virtual 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  DD0x15y15  : virtual ::ccc::AA0 , virtual ::ccc::BB15 {
  ~DD0x15y15(); // tgen
  DD0x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD0x15y15E) C1{ VBC2{ v1 v2 v3} VBC3{}}
}
namespace ccc { 
ccc::DD0x15y15 ::~DD0x15y15(){ note_dtor("_ZN3ccc9DD0x15y15E", this);} // tgen
ccc::DD0x15y15 ::DD0x15y15(){ note_ctor("_ZN3ccc9DD0x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD0x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD0x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD0x15y15E, buf);
    ::ccc::DD0x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD0x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD0x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD0x15y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9DD0x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD0x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD0x15y15E);
    dp->::ccc::DD0x15y15::~DD0x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD0x15y15E(Test__ZN3ccc9DD0x15y15E, "_ZN3ccc9DD0x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD0x15y15C1Ev();
extern void _ZN3ccc9DD0x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD0x15y15E[] = {
  NSPAIR(_ZN3ccc9DD0x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD0x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD0x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD0x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD0x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD0x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD0x15y15E[] = {
  {&(_ZTVN3ccc9DD0x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD0x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD0x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD0x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD0x15y15E[];
Class_Descriptor cd__ZN3ccc9DD0x15y15E = {  "_ZN3ccc9DD0x15y15E", // class name
  bases__ZN3ccc9DD0x15y15E, 2,
  &(vtc__ZN3ccc9DD0x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD0x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD0x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD0x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD0x15y15E),2, //virtual 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  CC1x0y0  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y03pqrEv
  ~CC1x0y0(); // tgen
  CC1x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y0E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y03abcEv");}
void  ccc::CC1x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y03efgEv");}
void  ccc::CC1x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y03pqrEv");}
ccc::CC1x0y0 ::~CC1x0y0(){ note_dtor("_ZN3ccc7CC1x0y0E", this);} // tgen
ccc::CC1x0y0 ::CC1x0y0(){ note_ctor("_ZN3ccc7CC1x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y0E, buf);
    ::ccc::CC1x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y0E);
    dp->::ccc::CC1x0y0::~CC1x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y0E(Test__ZN3ccc7CC1x0y0E, "_ZN3ccc7CC1x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y0C1Ev();
extern void _ZN3ccc7CC1x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y0E[] = {
  NSPAIR(_ZN3ccc7CC1x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y0E[];
extern void _ZN3ccc7CC1x0y03abcEv();
extern void _ZN3ccc7CC1x0y03efgEv();
extern void _ZN3ccc7CC1x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y03abcEv,_ZTv0_n12_N3ccc7CC1x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03abcEv,_ZThn4_N3ccc7CC1x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y03pqrEv,_ZTv0_n16_N3ccc7CC1x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03pqrEv,_ZThn4_N3ccc7CC1x0y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y03efgEv,_ZTv0_n20_N3ccc7CC1x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03efgEv,_ZThn4_N3ccc7CC1x0y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y03abcEv,_ZTv0_n12_N3ccc7CC1x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y03pqrEv,_ZTv0_n16_N3ccc7CC1x0y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y03efgEv,_ZTv0_n20_N3ccc7CC1x0y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y0E[] = {
  {&(_ZTVN3ccc7CC1x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y0E[];
static VTBL_ENTRY alt_thunk_names433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y03efgEv,_ZTv0_n20_N3ccc7CC1x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y03efgEv,_ZThn4_N3ccc7CC1x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y03pqrEv,_ZTv0_n16_N3ccc7CC1x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y03pqrEv,_ZThn4_N3ccc7CC1x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y03abcEv,_ZTv0_n12_N3ccc7CC1x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y03abcEv,_ZThn4_N3ccc7CC1x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y0E = {  "_ZN3ccc7CC1x0y0E", // class name
  bases__ZN3ccc7CC1x0y0E, 2,
  &(vtc__ZN3ccc7CC1x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y0E),2, //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  DD1x0y0  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD1x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y03pqrEv
  ~DD1x0y0(); // tgen
  DD1x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y03abcEv");}
void  ccc::DD1x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y03efgEv");}
void  ccc::DD1x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y03pqrEv");}
ccc::DD1x0y0 ::~DD1x0y0(){ note_dtor("_ZN3ccc7DD1x0y0E", this);} // tgen
ccc::DD1x0y0 ::DD1x0y0(){ note_ctor("_ZN3ccc7DD1x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y0E, buf);
    ::ccc::DD1x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y0E);
    dp->::ccc::DD1x0y0::~DD1x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y0E(Test__ZN3ccc7DD1x0y0E, "_ZN3ccc7DD1x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y0C1Ev();
extern void _ZN3ccc7DD1x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y0E[] = {
  NSPAIR(_ZN3ccc7DD1x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y0E[];
extern void _ZN3ccc7DD1x0y03abcEv();
extern void _ZN3ccc7DD1x0y03pqrEv();
extern void _ZN3ccc7DD1x0y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y03abcEv,_ZTv0_n12_N3ccc7DD1x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y03abcEv,_ZThn4_N3ccc7DD1x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y03efgEv,_ZTv0_n16_N3ccc7DD1x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y03efgEv,_ZThn4_N3ccc7DD1x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y03pqrEv,_ZTv0_n20_N3ccc7DD1x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y03pqrEv,_ZThn4_N3ccc7DD1x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y03abcEv,_ZTv0_n12_N3ccc7DD1x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y03efgEv,_ZTv0_n16_N3ccc7DD1x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y03pqrEv,_ZTv0_n20_N3ccc7DD1x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y0E[] = {
  {&(_ZTVN3ccc7DD1x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y0E[];
static VTBL_ENTRY alt_thunk_names434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y03pqrEv,_ZTv0_n20_N3ccc7DD1x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y03pqrEv,_ZThn4_N3ccc7DD1x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y03efgEv,_ZTv0_n16_N3ccc7DD1x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y03efgEv,_ZThn4_N3ccc7DD1x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y03abcEv,_ZTv0_n12_N3ccc7DD1x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y03abcEv,_ZThn4_N3ccc7DD1x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y0E = {  "_ZN3ccc7DD1x0y0E", // class name
  bases__ZN3ccc7DD1x0y0E, 2,
  &(vtc__ZN3ccc7DD1x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y0E),3, //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  CC1x0y1  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x0y13efgEv
  ~CC1x0y1(); // tgen
  CC1x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y1E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y13abcEv");}
void  ccc::CC1x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y13pqrEv");}
void  ccc::CC1x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y13efgEv");}
ccc::CC1x0y1 ::~CC1x0y1(){ note_dtor("_ZN3ccc7CC1x0y1E", this);} // tgen
ccc::CC1x0y1 ::CC1x0y1(){ note_ctor("_ZN3ccc7CC1x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y1E, buf);
    ::ccc::CC1x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y1E);
    dp->::ccc::CC1x0y1::~CC1x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y1E(Test__ZN3ccc7CC1x0y1E, "_ZN3ccc7CC1x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y1C1Ev();
extern void _ZN3ccc7CC1x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y1E[] = {
  NSPAIR(_ZN3ccc7CC1x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y1E[];
extern void _ZN3ccc7CC1x0y13abcEv();
extern void _ZN3ccc7CC1x0y13efgEv();
extern void _ZN3ccc7CC1x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y13abcEv,_ZTv0_n12_N3ccc7CC1x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13abcEv,_ZThn4_N3ccc7CC1x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y13pqrEv,_ZTv0_n16_N3ccc7CC1x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13pqrEv,_ZThn4_N3ccc7CC1x0y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y13efgEv,_ZTv0_n20_N3ccc7CC1x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13efgEv,_ZThn4_N3ccc7CC1x0y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y13abcEv,_ZTv0_n12_N3ccc7CC1x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y13pqrEv,_ZTv0_n16_N3ccc7CC1x0y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y13efgEv,_ZTv0_n20_N3ccc7CC1x0y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y1E[] = {
  {&(_ZTVN3ccc7CC1x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y1E[];
static VTBL_ENTRY alt_thunk_names435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y13efgEv,_ZTv0_n20_N3ccc7CC1x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y13efgEv,_ZThn4_N3ccc7CC1x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y13pqrEv,_ZTv0_n16_N3ccc7CC1x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y13pqrEv,_ZThn4_N3ccc7CC1x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y13abcEv,_ZTv0_n12_N3ccc7CC1x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y13abcEv,_ZThn4_N3ccc7CC1x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y1E = {  "_ZN3ccc7CC1x0y1E", // class name
  bases__ZN3ccc7CC1x0y1E, 2,
  &(vtc__ZN3ccc7CC1x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y1E),2, //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  DD1x0y1  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD1x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x0y13efgEv
  ~DD1x0y1(); // tgen
  DD1x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y13abcEv");}
void  ccc::DD1x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y13pqrEv");}
void  ccc::DD1x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y13efgEv");}
ccc::DD1x0y1 ::~DD1x0y1(){ note_dtor("_ZN3ccc7DD1x0y1E", this);} // tgen
ccc::DD1x0y1 ::DD1x0y1(){ note_ctor("_ZN3ccc7DD1x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y1E, buf);
    ::ccc::DD1x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y1E);
    dp->::ccc::DD1x0y1::~DD1x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y1E(Test__ZN3ccc7DD1x0y1E, "_ZN3ccc7DD1x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y1C1Ev();
extern void _ZN3ccc7DD1x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y1E[] = {
  NSPAIR(_ZN3ccc7DD1x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y1E[];
extern void _ZN3ccc7DD1x0y13abcEv();
extern void _ZN3ccc7DD1x0y13pqrEv();
extern void _ZN3ccc7DD1x0y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y13abcEv,_ZTv0_n12_N3ccc7DD1x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y13abcEv,_ZThn4_N3ccc7DD1x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y13efgEv,_ZTv0_n16_N3ccc7DD1x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y13efgEv,_ZThn4_N3ccc7DD1x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y13pqrEv,_ZTv0_n20_N3ccc7DD1x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y13pqrEv,_ZThn4_N3ccc7DD1x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y13abcEv,_ZTv0_n12_N3ccc7DD1x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y13efgEv,_ZTv0_n16_N3ccc7DD1x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y13pqrEv,_ZTv0_n20_N3ccc7DD1x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y1E[] = {
  {&(_ZTVN3ccc7DD1x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y1E[];
static VTBL_ENTRY alt_thunk_names436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y13pqrEv,_ZTv0_n20_N3ccc7DD1x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y13pqrEv,_ZThn4_N3ccc7DD1x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y13efgEv,_ZTv0_n16_N3ccc7DD1x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y13efgEv,_ZThn4_N3ccc7DD1x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y13abcEv,_ZTv0_n12_N3ccc7DD1x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y13abcEv,_ZThn4_N3ccc7DD1x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y1E = {  "_ZN3ccc7DD1x0y1E", // class name
  bases__ZN3ccc7DD1x0y1E, 2,
  &(vtc__ZN3ccc7DD1x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y1E),3, //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  CC1x0y2  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y23pqrEv
  ~CC1x0y2(); // tgen
  CC1x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y2E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y23efgEv");}
void  ccc::CC1x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y23abcEv");}
void  ccc::CC1x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y23pqrEv");}
ccc::CC1x0y2 ::~CC1x0y2(){ note_dtor("_ZN3ccc7CC1x0y2E", this);} // tgen
ccc::CC1x0y2 ::CC1x0y2(){ note_ctor("_ZN3ccc7CC1x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y2E, buf);
    ::ccc::CC1x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y2E);
    dp->::ccc::CC1x0y2::~CC1x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y2E(Test__ZN3ccc7CC1x0y2E, "_ZN3ccc7CC1x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y2C1Ev();
extern void _ZN3ccc7CC1x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y2E[] = {
  NSPAIR(_ZN3ccc7CC1x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y2E[];
extern void _ZN3ccc7CC1x0y23abcEv();
extern void _ZN3ccc7CC1x0y23efgEv();
extern void _ZN3ccc7CC1x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y23abcEv,_ZTv0_n12_N3ccc7CC1x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23abcEv,_ZThn4_N3ccc7CC1x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y23pqrEv,_ZTv0_n16_N3ccc7CC1x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23pqrEv,_ZThn4_N3ccc7CC1x0y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y23efgEv,_ZTv0_n20_N3ccc7CC1x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23efgEv,_ZThn4_N3ccc7CC1x0y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y23abcEv,_ZTv0_n12_N3ccc7CC1x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y23pqrEv,_ZTv0_n16_N3ccc7CC1x0y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y23efgEv,_ZTv0_n20_N3ccc7CC1x0y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y2E[] = {
  {&(_ZTVN3ccc7CC1x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y2E[];
static VTBL_ENTRY alt_thunk_names437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y23efgEv,_ZTv0_n20_N3ccc7CC1x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y23efgEv,_ZThn4_N3ccc7CC1x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y23pqrEv,_ZTv0_n16_N3ccc7CC1x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y23pqrEv,_ZThn4_N3ccc7CC1x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y23abcEv,_ZTv0_n12_N3ccc7CC1x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y23abcEv,_ZThn4_N3ccc7CC1x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y2E = {  "_ZN3ccc7CC1x0y2E", // class name
  bases__ZN3ccc7CC1x0y2E, 2,
  &(vtc__ZN3ccc7CC1x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y2E),2, //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  DD1x0y2  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD1x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y23pqrEv
  ~DD1x0y2(); // tgen
  DD1x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y23efgEv");}
void  ccc::DD1x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y23abcEv");}
void  ccc::DD1x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y23pqrEv");}
ccc::DD1x0y2 ::~DD1x0y2(){ note_dtor("_ZN3ccc7DD1x0y2E", this);} // tgen
ccc::DD1x0y2 ::DD1x0y2(){ note_ctor("_ZN3ccc7DD1x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y2E, buf);
    ::ccc::DD1x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y2E);
    dp->::ccc::DD1x0y2::~DD1x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y2E(Test__ZN3ccc7DD1x0y2E, "_ZN3ccc7DD1x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y2C1Ev();
extern void _ZN3ccc7DD1x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y2E[] = {
  NSPAIR(_ZN3ccc7DD1x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y2E[];
extern void _ZN3ccc7DD1x0y23abcEv();
extern void _ZN3ccc7DD1x0y23pqrEv();
extern void _ZN3ccc7DD1x0y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y23abcEv,_ZTv0_n12_N3ccc7DD1x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y23abcEv,_ZThn4_N3ccc7DD1x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y23efgEv,_ZTv0_n16_N3ccc7DD1x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y23efgEv,_ZThn4_N3ccc7DD1x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y23pqrEv,_ZTv0_n20_N3ccc7DD1x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y23pqrEv,_ZThn4_N3ccc7DD1x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y23abcEv,_ZTv0_n12_N3ccc7DD1x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y23efgEv,_ZTv0_n16_N3ccc7DD1x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y23pqrEv,_ZTv0_n20_N3ccc7DD1x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y2E[] = {
  {&(_ZTVN3ccc7DD1x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y2E[];
static VTBL_ENTRY alt_thunk_names438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y23pqrEv,_ZTv0_n20_N3ccc7DD1x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y23pqrEv,_ZThn4_N3ccc7DD1x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y23efgEv,_ZTv0_n16_N3ccc7DD1x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y23efgEv,_ZThn4_N3ccc7DD1x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y23abcEv,_ZTv0_n12_N3ccc7DD1x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y23abcEv,_ZThn4_N3ccc7DD1x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y2E = {  "_ZN3ccc7DD1x0y2E", // class name
  bases__ZN3ccc7DD1x0y2E, 2,
  &(vtc__ZN3ccc7DD1x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y2E),3, //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  CC1x0y3  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x0y33abcEv
  ~CC1x0y3(); // tgen
  CC1x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y3E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y33efgEv");}
void  ccc::CC1x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y33pqrEv");}
void  ccc::CC1x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y33abcEv");}
ccc::CC1x0y3 ::~CC1x0y3(){ note_dtor("_ZN3ccc7CC1x0y3E", this);} // tgen
ccc::CC1x0y3 ::CC1x0y3(){ note_ctor("_ZN3ccc7CC1x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y3E, buf);
    ::ccc::CC1x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y3E);
    dp->::ccc::CC1x0y3::~CC1x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y3E(Test__ZN3ccc7CC1x0y3E, "_ZN3ccc7CC1x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y3C1Ev();
extern void _ZN3ccc7CC1x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y3E[] = {
  NSPAIR(_ZN3ccc7CC1x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y3E[];
extern void _ZN3ccc7CC1x0y33abcEv();
extern void _ZN3ccc7CC1x0y33efgEv();
extern void _ZN3ccc7CC1x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y33abcEv,_ZTv0_n12_N3ccc7CC1x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33abcEv,_ZThn4_N3ccc7CC1x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y33pqrEv,_ZTv0_n16_N3ccc7CC1x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33pqrEv,_ZThn4_N3ccc7CC1x0y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y33efgEv,_ZTv0_n20_N3ccc7CC1x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33efgEv,_ZThn4_N3ccc7CC1x0y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y33abcEv,_ZTv0_n12_N3ccc7CC1x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y33pqrEv,_ZTv0_n16_N3ccc7CC1x0y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y33efgEv,_ZTv0_n20_N3ccc7CC1x0y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y3E[] = {
  {&(_ZTVN3ccc7CC1x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y3E[];
static VTBL_ENTRY alt_thunk_names439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y33efgEv,_ZTv0_n20_N3ccc7CC1x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y33efgEv,_ZThn4_N3ccc7CC1x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y33pqrEv,_ZTv0_n16_N3ccc7CC1x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y33pqrEv,_ZThn4_N3ccc7CC1x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y33abcEv,_ZTv0_n12_N3ccc7CC1x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y33abcEv,_ZThn4_N3ccc7CC1x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y3E = {  "_ZN3ccc7CC1x0y3E", // class name
  bases__ZN3ccc7CC1x0y3E, 2,
  &(vtc__ZN3ccc7CC1x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y3E),2, //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  DD1x0y3  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD1x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x0y33abcEv
  ~DD1x0y3(); // tgen
  DD1x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y33efgEv");}
void  ccc::DD1x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y33pqrEv");}
void  ccc::DD1x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y33abcEv");}
ccc::DD1x0y3 ::~DD1x0y3(){ note_dtor("_ZN3ccc7DD1x0y3E", this);} // tgen
ccc::DD1x0y3 ::DD1x0y3(){ note_ctor("_ZN3ccc7DD1x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y3E, buf);
    ::ccc::DD1x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y3E);
    dp->::ccc::DD1x0y3::~DD1x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y3E(Test__ZN3ccc7DD1x0y3E, "_ZN3ccc7DD1x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y3C1Ev();
extern void _ZN3ccc7DD1x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y3E[] = {
  NSPAIR(_ZN3ccc7DD1x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y3E[];
extern void _ZN3ccc7DD1x0y33abcEv();
extern void _ZN3ccc7DD1x0y33pqrEv();
extern void _ZN3ccc7DD1x0y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y33abcEv,_ZTv0_n12_N3ccc7DD1x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y33abcEv,_ZThn4_N3ccc7DD1x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y33efgEv,_ZTv0_n16_N3ccc7DD1x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y33efgEv,_ZThn4_N3ccc7DD1x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y33pqrEv,_ZTv0_n20_N3ccc7DD1x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y33pqrEv,_ZThn4_N3ccc7DD1x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y33abcEv,_ZTv0_n12_N3ccc7DD1x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y33efgEv,_ZTv0_n16_N3ccc7DD1x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y33pqrEv,_ZTv0_n20_N3ccc7DD1x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y3E[] = {
  {&(_ZTVN3ccc7DD1x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y3E[];
static VTBL_ENTRY alt_thunk_names440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y33pqrEv,_ZTv0_n20_N3ccc7DD1x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y33pqrEv,_ZThn4_N3ccc7DD1x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y33efgEv,_ZTv0_n16_N3ccc7DD1x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y33efgEv,_ZThn4_N3ccc7DD1x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y33abcEv,_ZTv0_n12_N3ccc7DD1x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y33abcEv,_ZThn4_N3ccc7DD1x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y3E = {  "_ZN3ccc7DD1x0y3E", // class name
  bases__ZN3ccc7DD1x0y3E, 2,
  &(vtc__ZN3ccc7DD1x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y3E),3, //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  CC1x0y4  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC1x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y43efgEv
  ~CC1x0y4(); // tgen
  CC1x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y4E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y43pqrEv");}
void  ccc::CC1x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y43abcEv");}
void  ccc::CC1x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y43efgEv");}
ccc::CC1x0y4 ::~CC1x0y4(){ note_dtor("_ZN3ccc7CC1x0y4E", this);} // tgen
ccc::CC1x0y4 ::CC1x0y4(){ note_ctor("_ZN3ccc7CC1x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y4E, buf);
    ::ccc::CC1x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y4E);
    dp->::ccc::CC1x0y4::~CC1x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y4E(Test__ZN3ccc7CC1x0y4E, "_ZN3ccc7CC1x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y4C1Ev();
extern void _ZN3ccc7CC1x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y4E[] = {
  NSPAIR(_ZN3ccc7CC1x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y4E[];
extern void _ZN3ccc7CC1x0y43abcEv();
extern void _ZN3ccc7CC1x0y43efgEv();
extern void _ZN3ccc7CC1x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y43abcEv,_ZTv0_n12_N3ccc7CC1x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43abcEv,_ZThn4_N3ccc7CC1x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y43pqrEv,_ZTv0_n16_N3ccc7CC1x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43pqrEv,_ZThn4_N3ccc7CC1x0y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y43efgEv,_ZTv0_n20_N3ccc7CC1x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43efgEv,_ZThn4_N3ccc7CC1x0y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y43abcEv,_ZTv0_n12_N3ccc7CC1x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y43pqrEv,_ZTv0_n16_N3ccc7CC1x0y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y43efgEv,_ZTv0_n20_N3ccc7CC1x0y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y4E[] = {
  {&(_ZTVN3ccc7CC1x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y4E[];
static VTBL_ENTRY alt_thunk_names441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y43efgEv,_ZTv0_n20_N3ccc7CC1x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y43efgEv,_ZThn4_N3ccc7CC1x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y43pqrEv,_ZTv0_n16_N3ccc7CC1x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y43pqrEv,_ZThn4_N3ccc7CC1x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y43abcEv,_ZTv0_n12_N3ccc7CC1x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y43abcEv,_ZThn4_N3ccc7CC1x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y4E = {  "_ZN3ccc7CC1x0y4E", // class name
  bases__ZN3ccc7CC1x0y4E, 2,
  &(vtc__ZN3ccc7CC1x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y4E),2, //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  DD1x0y4  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD1x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x0y43efgEv
  ~DD1x0y4(); // tgen
  DD1x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y43pqrEv");}
void  ccc::DD1x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y43abcEv");}
void  ccc::DD1x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y43efgEv");}
ccc::DD1x0y4 ::~DD1x0y4(){ note_dtor("_ZN3ccc7DD1x0y4E", this);} // tgen
ccc::DD1x0y4 ::DD1x0y4(){ note_ctor("_ZN3ccc7DD1x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y4E, buf);
    ::ccc::DD1x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y4E);
    dp->::ccc::DD1x0y4::~DD1x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y4E(Test__ZN3ccc7DD1x0y4E, "_ZN3ccc7DD1x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y4C1Ev();
extern void _ZN3ccc7DD1x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y4E[] = {
  NSPAIR(_ZN3ccc7DD1x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y4E[];
extern void _ZN3ccc7DD1x0y43abcEv();
extern void _ZN3ccc7DD1x0y43pqrEv();
extern void _ZN3ccc7DD1x0y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y43abcEv,_ZTv0_n12_N3ccc7DD1x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y43abcEv,_ZThn4_N3ccc7DD1x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y43efgEv,_ZTv0_n16_N3ccc7DD1x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y43efgEv,_ZThn4_N3ccc7DD1x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y43pqrEv,_ZTv0_n20_N3ccc7DD1x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y43pqrEv,_ZThn4_N3ccc7DD1x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y43abcEv,_ZTv0_n12_N3ccc7DD1x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y43efgEv,_ZTv0_n16_N3ccc7DD1x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y43pqrEv,_ZTv0_n20_N3ccc7DD1x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y4E[] = {
  {&(_ZTVN3ccc7DD1x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y4E[];
static VTBL_ENTRY alt_thunk_names442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y43pqrEv,_ZTv0_n20_N3ccc7DD1x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y43pqrEv,_ZThn4_N3ccc7DD1x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y43efgEv,_ZTv0_n16_N3ccc7DD1x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y43efgEv,_ZThn4_N3ccc7DD1x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y43abcEv,_ZTv0_n12_N3ccc7DD1x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y43abcEv,_ZThn4_N3ccc7DD1x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y4E = {  "_ZN3ccc7DD1x0y4E", // class name
  bases__ZN3ccc7DD1x0y4E, 2,
  &(vtc__ZN3ccc7DD1x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y4E),3, //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  CC1x0y5  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC1x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y53abcEv
  ~CC1x0y5(); // tgen
  CC1x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y5E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y53pqrEv");}
void  ccc::CC1x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y53efgEv");}
void  ccc::CC1x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y53abcEv");}
ccc::CC1x0y5 ::~CC1x0y5(){ note_dtor("_ZN3ccc7CC1x0y5E", this);} // tgen
ccc::CC1x0y5 ::CC1x0y5(){ note_ctor("_ZN3ccc7CC1x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y5E, buf);
    ::ccc::CC1x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y5E);
    dp->::ccc::CC1x0y5::~CC1x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y5E(Test__ZN3ccc7CC1x0y5E, "_ZN3ccc7CC1x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y5C1Ev();
extern void _ZN3ccc7CC1x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y5E[] = {
  NSPAIR(_ZN3ccc7CC1x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y5E[];
extern void _ZN3ccc7CC1x0y53abcEv();
extern void _ZN3ccc7CC1x0y53efgEv();
extern void _ZN3ccc7CC1x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y53abcEv,_ZTv0_n12_N3ccc7CC1x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53abcEv,_ZThn4_N3ccc7CC1x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y53pqrEv,_ZTv0_n16_N3ccc7CC1x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53pqrEv,_ZThn4_N3ccc7CC1x0y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y53efgEv,_ZTv0_n20_N3ccc7CC1x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53efgEv,_ZThn4_N3ccc7CC1x0y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y53abcEv,_ZTv0_n12_N3ccc7CC1x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y53pqrEv,_ZTv0_n16_N3ccc7CC1x0y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y53efgEv,_ZTv0_n20_N3ccc7CC1x0y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y5E[] = {
  {&(_ZTVN3ccc7CC1x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y5E[];
static VTBL_ENTRY alt_thunk_names443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y53efgEv,_ZTv0_n20_N3ccc7CC1x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y53efgEv,_ZThn4_N3ccc7CC1x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y53pqrEv,_ZTv0_n16_N3ccc7CC1x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y53pqrEv,_ZThn4_N3ccc7CC1x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y53abcEv,_ZTv0_n12_N3ccc7CC1x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y53abcEv,_ZThn4_N3ccc7CC1x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y5E = {  "_ZN3ccc7CC1x0y5E", // class name
  bases__ZN3ccc7CC1x0y5E, 2,
  &(vtc__ZN3ccc7CC1x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y5E),2, //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  DD1x0y5  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD1x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x0y53abcEv
  ~DD1x0y5(); // tgen
  DD1x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y53pqrEv");}
void  ccc::DD1x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y53efgEv");}
void  ccc::DD1x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y53abcEv");}
ccc::DD1x0y5 ::~DD1x0y5(){ note_dtor("_ZN3ccc7DD1x0y5E", this);} // tgen
ccc::DD1x0y5 ::DD1x0y5(){ note_ctor("_ZN3ccc7DD1x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y5E, buf);
    ::ccc::DD1x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y5E);
    dp->::ccc::DD1x0y5::~DD1x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y5E(Test__ZN3ccc7DD1x0y5E, "_ZN3ccc7DD1x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y5C1Ev();
extern void _ZN3ccc7DD1x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y5E[] = {
  NSPAIR(_ZN3ccc7DD1x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y5E[];
extern void _ZN3ccc7DD1x0y53abcEv();
extern void _ZN3ccc7DD1x0y53pqrEv();
extern void _ZN3ccc7DD1x0y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y53abcEv,_ZTv0_n12_N3ccc7DD1x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y53abcEv,_ZThn4_N3ccc7DD1x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y53efgEv,_ZTv0_n16_N3ccc7DD1x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y53efgEv,_ZThn4_N3ccc7DD1x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y53pqrEv,_ZTv0_n20_N3ccc7DD1x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y53pqrEv,_ZThn4_N3ccc7DD1x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y53abcEv,_ZTv0_n12_N3ccc7DD1x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y53efgEv,_ZTv0_n16_N3ccc7DD1x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y53pqrEv,_ZTv0_n20_N3ccc7DD1x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y5E[] = {
  {&(_ZTVN3ccc7DD1x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y5E[];
static VTBL_ENTRY alt_thunk_names444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y53pqrEv,_ZTv0_n20_N3ccc7DD1x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y53pqrEv,_ZThn4_N3ccc7DD1x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y53efgEv,_ZTv0_n16_N3ccc7DD1x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y53efgEv,_ZThn4_N3ccc7DD1x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y53abcEv,_ZTv0_n12_N3ccc7DD1x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y53abcEv,_ZThn4_N3ccc7DD1x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y5E = {  "_ZN3ccc7DD1x0y5E", // class name
  bases__ZN3ccc7DD1x0y5E, 2,
  &(vtc__ZN3ccc7DD1x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y5E),3, //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  CC1x0y6  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y63efgEv
  ~CC1x0y6(); // tgen
  CC1x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y6E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y63abcEv");}
void  ccc::CC1x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y63efgEv");}
ccc::CC1x0y6 ::~CC1x0y6(){ note_dtor("_ZN3ccc7CC1x0y6E", this);} // tgen
ccc::CC1x0y6 ::CC1x0y6(){ note_ctor("_ZN3ccc7CC1x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y6E, buf);
    ::ccc::CC1x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y6E);
    dp->::ccc::CC1x0y6::~CC1x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y6E(Test__ZN3ccc7CC1x0y6E, "_ZN3ccc7CC1x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y6C1Ev();
extern void _ZN3ccc7CC1x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y6E[] = {
  NSPAIR(_ZN3ccc7CC1x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y6E[];
extern void _ZN3ccc7CC1x0y63abcEv();
extern void _ZN3ccc7CC1x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y63abcEv,_ZTv0_n12_N3ccc7CC1x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y63abcEv,_ZThn4_N3ccc7CC1x0y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y63efgEv,_ZTv0_n20_N3ccc7CC1x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y63efgEv,_ZThn4_N3ccc7CC1x0y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y63abcEv,_ZTv0_n12_N3ccc7CC1x0y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y63efgEv,_ZTv0_n20_N3ccc7CC1x0y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y6E[] = {
  {&(_ZTVN3ccc7CC1x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y6E[];
static VTBL_ENTRY alt_thunk_names445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y63efgEv,_ZTv0_n20_N3ccc7CC1x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y63efgEv,_ZThn4_N3ccc7CC1x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y63abcEv,_ZTv0_n12_N3ccc7CC1x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y63abcEv,_ZThn4_N3ccc7CC1x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y6E = {  "_ZN3ccc7CC1x0y6E", // class name
  bases__ZN3ccc7CC1x0y6E, 2,
  &(vtc__ZN3ccc7CC1x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y6E),2, //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  DD1x0y6  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD1x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x0y63efgEv
  ~DD1x0y6(); // tgen
  DD1x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y63abcEv");}
void  ccc::DD1x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y63efgEv");}
ccc::DD1x0y6 ::~DD1x0y6(){ note_dtor("_ZN3ccc7DD1x0y6E", this);} // tgen
ccc::DD1x0y6 ::DD1x0y6(){ note_ctor("_ZN3ccc7DD1x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y6E, buf);
    ::ccc::DD1x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y6E);
    dp->::ccc::DD1x0y6::~DD1x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y6E(Test__ZN3ccc7DD1x0y6E, "_ZN3ccc7DD1x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y6C1Ev();
extern void _ZN3ccc7DD1x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y6E[] = {
  NSPAIR(_ZN3ccc7DD1x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y6E[];
extern void _ZN3ccc7DD1x0y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x0y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y63abcEv,_ZTv0_n12_N3ccc7DD1x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y63abcEv,_ZThn4_N3ccc7DD1x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y63efgEv,_ZTv0_n16_N3ccc7DD1x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y63efgEv,_ZThn4_N3ccc7DD1x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y63abcEv,_ZTv0_n12_N3ccc7DD1x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y63efgEv,_ZTv0_n16_N3ccc7DD1x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y6E[] = {
  {&(_ZTVN3ccc7DD1x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y6E[];
static VTBL_ENTRY alt_thunk_names446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y63efgEv,_ZTv0_n16_N3ccc7DD1x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y63efgEv,_ZThn4_N3ccc7DD1x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y63abcEv,_ZTv0_n12_N3ccc7DD1x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y63abcEv,_ZThn4_N3ccc7DD1x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y6E = {  "_ZN3ccc7DD1x0y6E", // class name
  bases__ZN3ccc7DD1x0y6E, 2,
  &(vtc__ZN3ccc7DD1x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y6E),3, //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  CC1x0y7  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y73pqrEv
  ~CC1x0y7(); // tgen
  CC1x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y7E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y73abcEv");}
void  ccc::CC1x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y73pqrEv");}
ccc::CC1x0y7 ::~CC1x0y7(){ note_dtor("_ZN3ccc7CC1x0y7E", this);} // tgen
ccc::CC1x0y7 ::CC1x0y7(){ note_ctor("_ZN3ccc7CC1x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y7E, buf);
    ::ccc::CC1x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y7E);
    dp->::ccc::CC1x0y7::~CC1x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y7E(Test__ZN3ccc7CC1x0y7E, "_ZN3ccc7CC1x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y7C1Ev();
extern void _ZN3ccc7CC1x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y7E[] = {
  NSPAIR(_ZN3ccc7CC1x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y7E[];
extern void _ZN3ccc7CC1x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC1x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y73abcEv,_ZTv0_n12_N3ccc7CC1x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y73abcEv,_ZThn4_N3ccc7CC1x0y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y73pqrEv,_ZTv0_n16_N3ccc7CC1x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y73pqrEv,_ZThn4_N3ccc7CC1x0y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y73abcEv,_ZTv0_n12_N3ccc7CC1x0y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y73pqrEv,_ZTv0_n16_N3ccc7CC1x0y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y7E[] = {
  {&(_ZTVN3ccc7CC1x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y7E[];
static VTBL_ENTRY alt_thunk_names447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y73pqrEv,_ZTv0_n16_N3ccc7CC1x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y73pqrEv,_ZThn4_N3ccc7CC1x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y73abcEv,_ZTv0_n12_N3ccc7CC1x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y73abcEv,_ZThn4_N3ccc7CC1x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y7E = {  "_ZN3ccc7CC1x0y7E", // class name
  bases__ZN3ccc7CC1x0y7E, 2,
  &(vtc__ZN3ccc7CC1x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y7E),2, //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  DD1x0y7  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD1x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y73pqrEv
  ~DD1x0y7(); // tgen
  DD1x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y73abcEv");}
void  ccc::DD1x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y73pqrEv");}
ccc::DD1x0y7 ::~DD1x0y7(){ note_dtor("_ZN3ccc7DD1x0y7E", this);} // tgen
ccc::DD1x0y7 ::DD1x0y7(){ note_ctor("_ZN3ccc7DD1x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y7E, buf);
    ::ccc::DD1x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y7E);
    dp->::ccc::DD1x0y7::~DD1x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y7E(Test__ZN3ccc7DD1x0y7E, "_ZN3ccc7DD1x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y7C1Ev();
extern void _ZN3ccc7DD1x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y7E[] = {
  NSPAIR(_ZN3ccc7DD1x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y7E[];
extern void _ZN3ccc7DD1x0y73abcEv();
extern void _ZN3ccc7DD1x0y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y73abcEv,_ZTv0_n12_N3ccc7DD1x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y73abcEv,_ZThn4_N3ccc7DD1x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y73pqrEv,_ZTv0_n20_N3ccc7DD1x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y73pqrEv,_ZThn4_N3ccc7DD1x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y73abcEv,_ZTv0_n12_N3ccc7DD1x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y73pqrEv,_ZTv0_n20_N3ccc7DD1x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y7E[] = {
  {&(_ZTVN3ccc7DD1x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y7E[];
static VTBL_ENTRY alt_thunk_names448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y73pqrEv,_ZTv0_n20_N3ccc7DD1x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y73pqrEv,_ZThn4_N3ccc7DD1x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y73abcEv,_ZTv0_n12_N3ccc7DD1x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y73abcEv,_ZThn4_N3ccc7DD1x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y7E = {  "_ZN3ccc7DD1x0y7E", // class name
  bases__ZN3ccc7DD1x0y7E, 2,
  &(vtc__ZN3ccc7DD1x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y7E),3, //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  CC1x0y8  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y83abcEv
  ~CC1x0y8(); // tgen
  CC1x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y8E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y83efgEv");}
void  ccc::CC1x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y83abcEv");}
ccc::CC1x0y8 ::~CC1x0y8(){ note_dtor("_ZN3ccc7CC1x0y8E", this);} // tgen
ccc::CC1x0y8 ::CC1x0y8(){ note_ctor("_ZN3ccc7CC1x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y8E, buf);
    ::ccc::CC1x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y8E);
    dp->::ccc::CC1x0y8::~CC1x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y8E(Test__ZN3ccc7CC1x0y8E, "_ZN3ccc7CC1x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y8C1Ev();
extern void _ZN3ccc7CC1x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y8E[] = {
  NSPAIR(_ZN3ccc7CC1x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y8E[];
extern void _ZN3ccc7CC1x0y83abcEv();
extern void _ZN3ccc7CC1x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x0y83abcEv,_ZTv0_n12_N3ccc7CC1x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y83abcEv,_ZThn4_N3ccc7CC1x0y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y83efgEv,_ZTv0_n20_N3ccc7CC1x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y83efgEv,_ZThn4_N3ccc7CC1x0y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x0y83abcEv,_ZTv0_n12_N3ccc7CC1x0y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y83efgEv,_ZTv0_n20_N3ccc7CC1x0y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y8E[] = {
  {&(_ZTVN3ccc7CC1x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y8E[];
static VTBL_ENTRY alt_thunk_names449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y83efgEv,_ZTv0_n20_N3ccc7CC1x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y83efgEv,_ZThn4_N3ccc7CC1x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x0y83abcEv,_ZTv0_n12_N3ccc7CC1x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y83abcEv,_ZThn4_N3ccc7CC1x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y8E = {  "_ZN3ccc7CC1x0y8E", // class name
  bases__ZN3ccc7CC1x0y8E, 2,
  &(vtc__ZN3ccc7CC1x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y8E),2, //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  DD1x0y8  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD1x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x0y83abcEv
  ~DD1x0y8(); // tgen
  DD1x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y83efgEv");}
void  ccc::DD1x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x0y83abcEv");}
ccc::DD1x0y8 ::~DD1x0y8(){ note_dtor("_ZN3ccc7DD1x0y8E", this);} // tgen
ccc::DD1x0y8 ::DD1x0y8(){ note_ctor("_ZN3ccc7DD1x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y8E, buf);
    ::ccc::DD1x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y8E);
    dp->::ccc::DD1x0y8::~DD1x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y8E(Test__ZN3ccc7DD1x0y8E, "_ZN3ccc7DD1x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y8C1Ev();
extern void _ZN3ccc7DD1x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y8E[] = {
  NSPAIR(_ZN3ccc7DD1x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y8E[];
extern void _ZN3ccc7DD1x0y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x0y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x0y83abcEv,_ZTv0_n12_N3ccc7DD1x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y83abcEv,_ZThn4_N3ccc7DD1x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y83efgEv,_ZTv0_n16_N3ccc7DD1x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y83efgEv,_ZThn4_N3ccc7DD1x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x0y83abcEv,_ZTv0_n12_N3ccc7DD1x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y83efgEv,_ZTv0_n16_N3ccc7DD1x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y8E[] = {
  {&(_ZTVN3ccc7DD1x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y8E[];
static VTBL_ENTRY alt_thunk_names450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y83efgEv,_ZTv0_n16_N3ccc7DD1x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y83efgEv,_ZThn4_N3ccc7DD1x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x0y83abcEv,_ZTv0_n12_N3ccc7DD1x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y83abcEv,_ZThn4_N3ccc7DD1x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y8E = {  "_ZN3ccc7DD1x0y8E", // class name
  bases__ZN3ccc7DD1x0y8E, 2,
  &(vtc__ZN3ccc7DD1x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y8E),3, //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  CC1x0y9  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y93pqrEv
  ~CC1x0y9(); // tgen
  CC1x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y9E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y93efgEv");}
void  ccc::CC1x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y93pqrEv");}
ccc::CC1x0y9 ::~CC1x0y9(){ note_dtor("_ZN3ccc7CC1x0y9E", this);} // tgen
ccc::CC1x0y9 ::CC1x0y9(){ note_ctor("_ZN3ccc7CC1x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y9E, buf);
    ::ccc::CC1x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC1x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y9E);
    dp->::ccc::CC1x0y9::~CC1x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y9E(Test__ZN3ccc7CC1x0y9E, "_ZN3ccc7CC1x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y9C1Ev();
extern void _ZN3ccc7CC1x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y9E[] = {
  NSPAIR(_ZN3ccc7CC1x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC1x0y93efgEv();
extern void _ZN3ccc7CC1x0y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x0y93pqrEv,_ZTv0_n16_N3ccc7CC1x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y93pqrEv,_ZThn4_N3ccc7CC1x0y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x0y93efgEv,_ZTv0_n20_N3ccc7CC1x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y93efgEv,_ZThn4_N3ccc7CC1x0y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x0y93pqrEv,_ZTv0_n16_N3ccc7CC1x0y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x0y93efgEv,_ZTv0_n20_N3ccc7CC1x0y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x0y9E[] = {
  {&(_ZTVN3ccc7CC1x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x0y9E[];
static VTBL_ENTRY alt_thunk_names451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x0y93efgEv,_ZTv0_n20_N3ccc7CC1x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y93efgEv,_ZThn4_N3ccc7CC1x0y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x0y93pqrEv,_ZTv0_n16_N3ccc7CC1x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x0y93pqrEv,_ZThn4_N3ccc7CC1x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x0y9E = {  "_ZN3ccc7CC1x0y9E", // class name
  bases__ZN3ccc7CC1x0y9E, 2,
  &(vtc__ZN3ccc7CC1x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x0y9E),2, //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  DD1x0y9  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD1x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x0y93pqrEv
  ~DD1x0y9(); // tgen
  DD1x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x0y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x0y93efgEv");}
void  ccc::DD1x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x0y93pqrEv");}
ccc::DD1x0y9 ::~DD1x0y9(){ note_dtor("_ZN3ccc7DD1x0y9E", this);} // tgen
ccc::DD1x0y9 ::DD1x0y9(){ note_ctor("_ZN3ccc7DD1x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x0y9E, buf);
    ::ccc::DD1x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x0y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD1x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x0y9E);
    dp->::ccc::DD1x0y9::~DD1x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x0y9E(Test__ZN3ccc7DD1x0y9E, "_ZN3ccc7DD1x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x0y9C1Ev();
extern void _ZN3ccc7DD1x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x0y9E[] = {
  NSPAIR(_ZN3ccc7DD1x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD1x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x0y93pqrEv();
extern void _ZN3ccc7DD1x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x0y93efgEv,_ZTv0_n16_N3ccc7DD1x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y93efgEv,_ZThn4_N3ccc7DD1x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x0y93pqrEv,_ZTv0_n20_N3ccc7DD1x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x0y93pqrEv,_ZThn4_N3ccc7DD1x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x0y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x0y93efgEv,_ZTv0_n16_N3ccc7DD1x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x0y93pqrEv,_ZTv0_n20_N3ccc7DD1x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x0y9E[] = {
  {&(_ZTVN3ccc7DD1x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x0y9E[];
static VTBL_ENTRY alt_thunk_names452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x0y93pqrEv,_ZTv0_n20_N3ccc7DD1x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y93pqrEv,_ZThn4_N3ccc7DD1x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x0y93efgEv,_ZTv0_n16_N3ccc7DD1x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x0y93efgEv,_ZThn4_N3ccc7DD1x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x0y9E = {  "_ZN3ccc7DD1x0y9E", // class name
  bases__ZN3ccc7DD1x0y9E, 2,
  &(vtc__ZN3ccc7DD1x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x0y9E),3, //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  CC1x0y10  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x0y103abcEv
  ~CC1x0y10(); // tgen
  CC1x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y10E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y103pqrEv");}
void  ccc::CC1x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x0y103abcEv");}
ccc::CC1x0y10 ::~CC1x0y10(){ note_dtor("_ZN3ccc8CC1x0y10E", this);} // tgen
ccc::CC1x0y10 ::CC1x0y10(){ note_ctor("_ZN3ccc8CC1x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y10E, buf);
    ::ccc::CC1x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y10E);
    dp->::ccc::CC1x0y10::~CC1x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y10E(Test__ZN3ccc8CC1x0y10E, "_ZN3ccc8CC1x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y10C1Ev();
extern void _ZN3ccc8CC1x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y10E[] = {
  NSPAIR(_ZN3ccc8CC1x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y10E[];
extern void _ZN3ccc8CC1x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC1x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x0y103abcEv,_ZTv0_n12_N3ccc8CC1x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y103abcEv,_ZThn4_N3ccc8CC1x0y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x0y103pqrEv,_ZTv0_n16_N3ccc8CC1x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y103pqrEv,_ZThn4_N3ccc8CC1x0y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x0y103abcEv,_ZTv0_n12_N3ccc8CC1x0y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x0y103pqrEv,_ZTv0_n16_N3ccc8CC1x0y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y10E[] = {
  {&(_ZTVN3ccc8CC1x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y10E[];
static VTBL_ENTRY alt_thunk_names453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x0y103pqrEv,_ZTv0_n16_N3ccc8CC1x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y103pqrEv,_ZThn4_N3ccc8CC1x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x0y103abcEv,_ZTv0_n12_N3ccc8CC1x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y103abcEv,_ZThn4_N3ccc8CC1x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x0y10E = {  "_ZN3ccc8CC1x0y10E", // class name
  bases__ZN3ccc8CC1x0y10E, 2,
  &(vtc__ZN3ccc8CC1x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y10E),2, //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  DD1x0y10  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD1x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x0y103abcEv
  ~DD1x0y10(); // tgen
  DD1x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x0y103pqrEv");}
void  ccc::DD1x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x0y103abcEv");}
ccc::DD1x0y10 ::~DD1x0y10(){ note_dtor("_ZN3ccc8DD1x0y10E", this);} // tgen
ccc::DD1x0y10 ::DD1x0y10(){ note_ctor("_ZN3ccc8DD1x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y10E, buf);
    ::ccc::DD1x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y10E);
    dp->::ccc::DD1x0y10::~DD1x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y10E(Test__ZN3ccc8DD1x0y10E, "_ZN3ccc8DD1x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y10C1Ev();
extern void _ZN3ccc8DD1x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y10E[] = {
  NSPAIR(_ZN3ccc8DD1x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y10E[];
extern void _ZN3ccc8DD1x0y103abcEv();
extern void _ZN3ccc8DD1x0y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x0y103abcEv,_ZTv0_n12_N3ccc8DD1x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y103abcEv,_ZThn4_N3ccc8DD1x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x0y103pqrEv,_ZTv0_n20_N3ccc8DD1x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y103pqrEv,_ZThn4_N3ccc8DD1x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x0y103abcEv,_ZTv0_n12_N3ccc8DD1x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x0y103pqrEv,_ZTv0_n20_N3ccc8DD1x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y10E[] = {
  {&(_ZTVN3ccc8DD1x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y10E[];
static VTBL_ENTRY alt_thunk_names454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x0y103pqrEv,_ZTv0_n20_N3ccc8DD1x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y103pqrEv,_ZThn4_N3ccc8DD1x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x0y103abcEv,_ZTv0_n12_N3ccc8DD1x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y103abcEv,_ZThn4_N3ccc8DD1x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x0y10E = {  "_ZN3ccc8DD1x0y10E", // class name
  bases__ZN3ccc8DD1x0y10E, 2,
  &(vtc__ZN3ccc8DD1x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y10E),3, //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  CC1x0y11  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x0y113efgEv
  ~CC1x0y11(); // tgen
  CC1x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y11E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y113pqrEv");}
void  ccc::CC1x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x0y113efgEv");}
ccc::CC1x0y11 ::~CC1x0y11(){ note_dtor("_ZN3ccc8CC1x0y11E", this);} // tgen
ccc::CC1x0y11 ::CC1x0y11(){ note_ctor("_ZN3ccc8CC1x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y11E, buf);
    ::ccc::CC1x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y11E);
    dp->::ccc::CC1x0y11::~CC1x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y11E(Test__ZN3ccc8CC1x0y11E, "_ZN3ccc8CC1x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y11C1Ev();
extern void _ZN3ccc8CC1x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y11E[] = {
  NSPAIR(_ZN3ccc8CC1x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC1x0y113efgEv();
extern void _ZN3ccc8CC1x0y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x0y113pqrEv,_ZTv0_n16_N3ccc8CC1x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y113pqrEv,_ZThn4_N3ccc8CC1x0y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x0y113efgEv,_ZTv0_n20_N3ccc8CC1x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y113efgEv,_ZThn4_N3ccc8CC1x0y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x0y113pqrEv,_ZTv0_n16_N3ccc8CC1x0y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x0y113efgEv,_ZTv0_n20_N3ccc8CC1x0y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y11E[] = {
  {&(_ZTVN3ccc8CC1x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y11E[];
static VTBL_ENTRY alt_thunk_names455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x0y113efgEv,_ZTv0_n20_N3ccc8CC1x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y113efgEv,_ZThn4_N3ccc8CC1x0y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x0y113pqrEv,_ZTv0_n16_N3ccc8CC1x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y113pqrEv,_ZThn4_N3ccc8CC1x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x0y11E = {  "_ZN3ccc8CC1x0y11E", // class name
  bases__ZN3ccc8CC1x0y11E, 2,
  &(vtc__ZN3ccc8CC1x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y11E),2, //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  DD1x0y11  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD1x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x0y113efgEv
  ~DD1x0y11(); // tgen
  DD1x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x0y113pqrEv");}
void  ccc::DD1x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x0y113efgEv");}
ccc::DD1x0y11 ::~DD1x0y11(){ note_dtor("_ZN3ccc8DD1x0y11E", this);} // tgen
ccc::DD1x0y11 ::DD1x0y11(){ note_ctor("_ZN3ccc8DD1x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y11E, buf);
    ::ccc::DD1x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y11E);
    dp->::ccc::DD1x0y11::~DD1x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y11E(Test__ZN3ccc8DD1x0y11E, "_ZN3ccc8DD1x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y11C1Ev();
extern void _ZN3ccc8DD1x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y11E[] = {
  NSPAIR(_ZN3ccc8DD1x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x0y113pqrEv();
extern void _ZN3ccc8DD1x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x0y113efgEv,_ZTv0_n16_N3ccc8DD1x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y113efgEv,_ZThn4_N3ccc8DD1x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x0y113pqrEv,_ZTv0_n20_N3ccc8DD1x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y113pqrEv,_ZThn4_N3ccc8DD1x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x0y113efgEv,_ZTv0_n16_N3ccc8DD1x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x0y113pqrEv,_ZTv0_n20_N3ccc8DD1x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y11E[] = {
  {&(_ZTVN3ccc8DD1x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y11E[];
static VTBL_ENTRY alt_thunk_names456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x0y113pqrEv,_ZTv0_n20_N3ccc8DD1x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y113pqrEv,_ZThn4_N3ccc8DD1x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x0y113efgEv,_ZTv0_n16_N3ccc8DD1x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y113efgEv,_ZThn4_N3ccc8DD1x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x0y11E = {  "_ZN3ccc8DD1x0y11E", // class name
  bases__ZN3ccc8DD1x0y11E, 2,
  &(vtc__ZN3ccc8DD1x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y11E),3, //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  CC1x0y12  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC1x0y123abcEv
  ~CC1x0y12(); // tgen
  CC1x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x0y123abcEv");}
ccc::CC1x0y12 ::~CC1x0y12(){ note_dtor("_ZN3ccc8CC1x0y12E", this);} // tgen
ccc::CC1x0y12 ::CC1x0y12(){ note_ctor("_ZN3ccc8CC1x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y12E, buf);
    ::ccc::CC1x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y12E);
    dp->::ccc::CC1x0y12::~CC1x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y12E(Test__ZN3ccc8CC1x0y12E, "_ZN3ccc8CC1x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y12C1Ev();
extern void _ZN3ccc8CC1x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y12E[] = {
  NSPAIR(_ZN3ccc8CC1x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y12E[];
extern void _ZN3ccc8CC1x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x0y123abcEv,_ZTv0_n12_N3ccc8CC1x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y123abcEv,_ZThn4_N3ccc8CC1x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x0y123abcEv,_ZTv0_n12_N3ccc8CC1x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y12E[] = {
  {&(_ZTVN3ccc8CC1x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y12E[];
static VTBL_ENTRY alt_thunk_names457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x0y123abcEv,_ZTv0_n12_N3ccc8CC1x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y123abcEv,_ZThn4_N3ccc8CC1x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x0y12E = {  "_ZN3ccc8CC1x0y12E", // class name
  bases__ZN3ccc8CC1x0y12E, 2,
  &(vtc__ZN3ccc8CC1x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y12E),2, //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  DD1x0y12  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD1x0y123abcEv
  ~DD1x0y12(); // tgen
  DD1x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x0y123abcEv");}
ccc::DD1x0y12 ::~DD1x0y12(){ note_dtor("_ZN3ccc8DD1x0y12E", this);} // tgen
ccc::DD1x0y12 ::DD1x0y12(){ note_ctor("_ZN3ccc8DD1x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y12E, buf);
    ::ccc::DD1x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y12E);
    dp->::ccc::DD1x0y12::~DD1x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y12E(Test__ZN3ccc8DD1x0y12E, "_ZN3ccc8DD1x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y12C1Ev();
extern void _ZN3ccc8DD1x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y12E[] = {
  NSPAIR(_ZN3ccc8DD1x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y12E[];
extern void _ZN3ccc8DD1x0y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x0y123abcEv,_ZTv0_n12_N3ccc8DD1x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y123abcEv,_ZThn4_N3ccc8DD1x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x0y123abcEv,_ZTv0_n12_N3ccc8DD1x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y12E[] = {
  {&(_ZTVN3ccc8DD1x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y12E[];
static VTBL_ENTRY alt_thunk_names458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x0y123abcEv,_ZTv0_n12_N3ccc8DD1x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y123abcEv,_ZThn4_N3ccc8DD1x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x0y12E = {  "_ZN3ccc8DD1x0y12E", // class name
  bases__ZN3ccc8DD1x0y12E, 2,
  &(vtc__ZN3ccc8DD1x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y12E),3, //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  CC1x0y13  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC1x0y133efgEv
  ~CC1x0y13(); // tgen
  CC1x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x0y133efgEv");}
ccc::CC1x0y13 ::~CC1x0y13(){ note_dtor("_ZN3ccc8CC1x0y13E", this);} // tgen
ccc::CC1x0y13 ::CC1x0y13(){ note_ctor("_ZN3ccc8CC1x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y13E, buf);
    ::ccc::CC1x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y13E);
    dp->::ccc::CC1x0y13::~CC1x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y13E(Test__ZN3ccc8CC1x0y13E, "_ZN3ccc8CC1x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y13C1Ev();
extern void _ZN3ccc8CC1x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y13E[] = {
  NSPAIR(_ZN3ccc8CC1x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC1x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x0y133efgEv,_ZTv0_n20_N3ccc8CC1x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y133efgEv,_ZThn4_N3ccc8CC1x0y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x0y133efgEv,_ZTv0_n20_N3ccc8CC1x0y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y13E[] = {
  {&(_ZTVN3ccc8CC1x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y13E[];
static VTBL_ENTRY alt_thunk_names459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x0y133efgEv,_ZTv0_n20_N3ccc8CC1x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y133efgEv,_ZThn4_N3ccc8CC1x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x0y13E = {  "_ZN3ccc8CC1x0y13E", // class name
  bases__ZN3ccc8CC1x0y13E, 2,
  &(vtc__ZN3ccc8CC1x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y13E),2, //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  DD1x0y13  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD1x0y133efgEv
  ~DD1x0y13(); // tgen
  DD1x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x0y133efgEv");}
ccc::DD1x0y13 ::~DD1x0y13(){ note_dtor("_ZN3ccc8DD1x0y13E", this);} // tgen
ccc::DD1x0y13 ::DD1x0y13(){ note_ctor("_ZN3ccc8DD1x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y13E, buf);
    ::ccc::DD1x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y13E);
    dp->::ccc::DD1x0y13::~DD1x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y13E(Test__ZN3ccc8DD1x0y13E, "_ZN3ccc8DD1x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y13C1Ev();
extern void _ZN3ccc8DD1x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y13E[] = {
  NSPAIR(_ZN3ccc8DD1x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x0y133efgEv,_ZTv0_n16_N3ccc8DD1x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y133efgEv,_ZThn4_N3ccc8DD1x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x0y133efgEv,_ZTv0_n16_N3ccc8DD1x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y13E[] = {
  {&(_ZTVN3ccc8DD1x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y13E[];
static VTBL_ENTRY alt_thunk_names460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x0y133efgEv,_ZTv0_n16_N3ccc8DD1x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y133efgEv,_ZThn4_N3ccc8DD1x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x0y13E = {  "_ZN3ccc8DD1x0y13E", // class name
  bases__ZN3ccc8DD1x0y13E, 2,
  &(vtc__ZN3ccc8DD1x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y13E),3, //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  CC1x0y14  : virtual ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y143pqrEv
  ~CC1x0y14(); // tgen
  CC1x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y143pqrEv");}
ccc::CC1x0y14 ::~CC1x0y14(){ note_dtor("_ZN3ccc8CC1x0y14E", this);} // tgen
ccc::CC1x0y14 ::CC1x0y14(){ note_ctor("_ZN3ccc8CC1x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y14E, buf);
    ::ccc::CC1x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y14E);
    dp->::ccc::CC1x0y14::~CC1x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y14E(Test__ZN3ccc8CC1x0y14E, "_ZN3ccc8CC1x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y14C1Ev();
extern void _ZN3ccc8CC1x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y14E[] = {
  NSPAIR(_ZN3ccc8CC1x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC1x0y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x0y143pqrEv,_ZTv0_n16_N3ccc8CC1x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y143pqrEv,_ZThn4_N3ccc8CC1x0y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x0y143pqrEv,_ZTv0_n16_N3ccc8CC1x0y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y14E[] = {
  {&(_ZTVN3ccc8CC1x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y14E[];
static VTBL_ENTRY alt_thunk_names461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x0y143pqrEv,_ZTv0_n16_N3ccc8CC1x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x0y143pqrEv,_ZThn4_N3ccc8CC1x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x0y14E = {  "_ZN3ccc8CC1x0y14E", // class name
  bases__ZN3ccc8CC1x0y14E, 2,
  &(vtc__ZN3ccc8CC1x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y14E),2, //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  DD1x0y14  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD1x0y143pqrEv
  ~DD1x0y14(); // tgen
  DD1x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x0y143pqrEv");}
ccc::DD1x0y14 ::~DD1x0y14(){ note_dtor("_ZN3ccc8DD1x0y14E", this);} // tgen
ccc::DD1x0y14 ::DD1x0y14(){ note_ctor("_ZN3ccc8DD1x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y14E, buf);
    ::ccc::DD1x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y14E);
    dp->::ccc::DD1x0y14::~DD1x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y14E(Test__ZN3ccc8DD1x0y14E, "_ZN3ccc8DD1x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y14C1Ev();
extern void _ZN3ccc8DD1x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y14E[] = {
  NSPAIR(_ZN3ccc8DD1x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x0y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x0y143pqrEv,_ZTv0_n20_N3ccc8DD1x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x0y143pqrEv,_ZThn4_N3ccc8DD1x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x0y143pqrEv,_ZTv0_n20_N3ccc8DD1x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y14E[] = {
  {&(_ZTVN3ccc8DD1x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y14E[];
static VTBL_ENTRY alt_thunk_names462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x0y143pqrEv,_ZTv0_n20_N3ccc8DD1x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x0y143pqrEv,_ZThn4_N3ccc8DD1x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x0y14E = {  "_ZN3ccc8DD1x0y14E", // class name
  bases__ZN3ccc8DD1x0y14E, 2,
  &(vtc__ZN3ccc8DD1x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y14E),3, //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  CC1x0y15  : virtual ::ccc::AA1 , ::ccc::BB0 {
  ~CC1x0y15(); // tgen
  CC1x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x0y15 ::~CC1x0y15(){ note_dtor("_ZN3ccc8CC1x0y15E", this);} // tgen
ccc::CC1x0y15 ::CC1x0y15(){ note_ctor("_ZN3ccc8CC1x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y15E, buf);
    ::ccc::CC1x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC1x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y15E);
    dp->::ccc::CC1x0y15::~CC1x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y15E(Test__ZN3ccc8CC1x0y15E, "_ZN3ccc8CC1x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y15C1Ev();
extern void _ZN3ccc8CC1x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y15E[] = {
  NSPAIR(_ZN3ccc8CC1x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x0y15E[] = {
  {&(_ZTVN3ccc8CC1x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x0y15E[];
Class_Descriptor cd__ZN3ccc8CC1x0y15E = {  "_ZN3ccc8CC1x0y15E", // class name
  bases__ZN3ccc8CC1x0y15E, 2,
  &(vtc__ZN3ccc8CC1x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x0y15  : virtual ::ccc::AA1 , virtual ::ccc::BB0 {
  ~DD1x0y15(); // tgen
  DD1x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x0y15 ::~DD1x0y15(){ note_dtor("_ZN3ccc8DD1x0y15E", this);} // tgen
ccc::DD1x0y15 ::DD1x0y15(){ note_ctor("_ZN3ccc8DD1x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x0y15E, buf);
    ::ccc::DD1x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x0y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD1x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x0y15E);
    dp->::ccc::DD1x0y15::~DD1x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x0y15E(Test__ZN3ccc8DD1x0y15E, "_ZN3ccc8DD1x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x0y15C1Ev();
extern void _ZN3ccc8DD1x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x0y15E[] = {
  NSPAIR(_ZN3ccc8DD1x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD1x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x0y15E[] = {
  {&(_ZTVN3ccc8DD1x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x0y15E[];
Class_Descriptor cd__ZN3ccc8DD1x0y15E = {  "_ZN3ccc8DD1x0y15E", // class name
  bases__ZN3ccc8DD1x0y15E, 2,
  &(vtc__ZN3ccc8DD1x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y0  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y03pqrEv
  ~CC1x1y0(); // tgen
  CC1x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y0E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y03abcEv");}
void  ccc::CC1x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y03efgEv");}
void  ccc::CC1x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y03pqrEv");}
ccc::CC1x1y0 ::~CC1x1y0(){ note_dtor("_ZN3ccc7CC1x1y0E", this);} // tgen
ccc::CC1x1y0 ::CC1x1y0(){ note_ctor("_ZN3ccc7CC1x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y0E, buf);
    ::ccc::CC1x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y0E);
    dp->::ccc::CC1x1y0::~CC1x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y0E(Test__ZN3ccc7CC1x1y0E, "_ZN3ccc7CC1x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y0C1Ev();
extern void _ZN3ccc7CC1x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y0E[] = {
  NSPAIR(_ZN3ccc7CC1x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y0E[];
extern void _ZN3ccc7CC1x1y03abcEv();
extern void _ZN3ccc7CC1x1y03pqrEv();
extern void _ZN3ccc7CC1x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y03abcEv,_ZTv0_n12_N3ccc7CC1x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03abcEv,_ZThn4_N3ccc7CC1x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y03pqrEv,_ZTv0_n16_N3ccc7CC1x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03pqrEv,_ZThn4_N3ccc7CC1x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y03efgEv,_ZTv0_n20_N3ccc7CC1x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03efgEv,_ZThn4_N3ccc7CC1x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y03abcEv,_ZTv0_n12_N3ccc7CC1x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y03pqrEv,_ZTv0_n16_N3ccc7CC1x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y03efgEv,_ZTv0_n20_N3ccc7CC1x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y0E[] = {
  {&(_ZTVN3ccc7CC1x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y0E[];
static VTBL_ENTRY alt_thunk_names463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y03efgEv,_ZTv0_n20_N3ccc7CC1x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y03efgEv,_ZThn4_N3ccc7CC1x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y03pqrEv,_ZTv0_n16_N3ccc7CC1x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y03pqrEv,_ZThn4_N3ccc7CC1x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y03abcEv,_ZTv0_n12_N3ccc7CC1x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y03abcEv,_ZThn4_N3ccc7CC1x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y0E = {  "_ZN3ccc7CC1x1y0E", // class name
  bases__ZN3ccc7CC1x1y0E, 2,
  &(vtc__ZN3ccc7CC1x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y0E),2, //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  DD1x1y0  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD1x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y03pqrEv
  ~DD1x1y0(); // tgen
  DD1x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y03abcEv");}
void  ccc::DD1x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y03efgEv");}
void  ccc::DD1x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y03pqrEv");}
ccc::DD1x1y0 ::~DD1x1y0(){ note_dtor("_ZN3ccc7DD1x1y0E", this);} // tgen
ccc::DD1x1y0 ::DD1x1y0(){ note_ctor("_ZN3ccc7DD1x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y0E, buf);
    ::ccc::DD1x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y0E);
    dp->::ccc::DD1x1y0::~DD1x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y0E(Test__ZN3ccc7DD1x1y0E, "_ZN3ccc7DD1x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y0C1Ev();
extern void _ZN3ccc7DD1x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y0E[] = {
  NSPAIR(_ZN3ccc7DD1x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y0E[];
extern void _ZN3ccc7DD1x1y03abcEv();
extern void _ZN3ccc7DD1x1y03pqrEv();
extern void _ZN3ccc7DD1x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y03abcEv,_ZTv0_n12_N3ccc7DD1x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y03abcEv,_ZThn4_N3ccc7DD1x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y03pqrEv,_ZTv0_n16_N3ccc7DD1x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y03pqrEv,_ZThn4_N3ccc7DD1x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y03efgEv,_ZTv0_n20_N3ccc7DD1x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y03efgEv,_ZThn4_N3ccc7DD1x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y03abcEv,_ZTv0_n12_N3ccc7DD1x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y03pqrEv,_ZTv0_n16_N3ccc7DD1x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y03efgEv,_ZTv0_n20_N3ccc7DD1x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y0E[] = {
  {&(_ZTVN3ccc7DD1x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y0E[];
static VTBL_ENTRY alt_thunk_names464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y03efgEv,_ZTv0_n20_N3ccc7DD1x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y03efgEv,_ZThn4_N3ccc7DD1x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y03pqrEv,_ZTv0_n16_N3ccc7DD1x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y03pqrEv,_ZThn4_N3ccc7DD1x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y03abcEv,_ZTv0_n12_N3ccc7DD1x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y03abcEv,_ZThn4_N3ccc7DD1x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y0E = {  "_ZN3ccc7DD1x1y0E", // class name
  bases__ZN3ccc7DD1x1y0E, 2,
  &(vtc__ZN3ccc7DD1x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y0E),3, //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  CC1x1y1  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x1y13efgEv
  ~CC1x1y1(); // tgen
  CC1x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y1E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y13abcEv");}
void  ccc::CC1x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y13pqrEv");}
void  ccc::CC1x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y13efgEv");}
ccc::CC1x1y1 ::~CC1x1y1(){ note_dtor("_ZN3ccc7CC1x1y1E", this);} // tgen
ccc::CC1x1y1 ::CC1x1y1(){ note_ctor("_ZN3ccc7CC1x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y1E, buf);
    ::ccc::CC1x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y1E);
    dp->::ccc::CC1x1y1::~CC1x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y1E(Test__ZN3ccc7CC1x1y1E, "_ZN3ccc7CC1x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y1C1Ev();
extern void _ZN3ccc7CC1x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y1E[] = {
  NSPAIR(_ZN3ccc7CC1x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y1E[];
extern void _ZN3ccc7CC1x1y13abcEv();
extern void _ZN3ccc7CC1x1y13pqrEv();
extern void _ZN3ccc7CC1x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y13abcEv,_ZTv0_n12_N3ccc7CC1x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13abcEv,_ZThn4_N3ccc7CC1x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y13pqrEv,_ZTv0_n16_N3ccc7CC1x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13pqrEv,_ZThn4_N3ccc7CC1x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y13efgEv,_ZTv0_n20_N3ccc7CC1x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13efgEv,_ZThn4_N3ccc7CC1x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y13abcEv,_ZTv0_n12_N3ccc7CC1x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y13pqrEv,_ZTv0_n16_N3ccc7CC1x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y13efgEv,_ZTv0_n20_N3ccc7CC1x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y1E[] = {
  {&(_ZTVN3ccc7CC1x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y1E[];
static VTBL_ENTRY alt_thunk_names465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y13efgEv,_ZTv0_n20_N3ccc7CC1x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y13efgEv,_ZThn4_N3ccc7CC1x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y13pqrEv,_ZTv0_n16_N3ccc7CC1x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y13pqrEv,_ZThn4_N3ccc7CC1x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y13abcEv,_ZTv0_n12_N3ccc7CC1x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y13abcEv,_ZThn4_N3ccc7CC1x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y1E = {  "_ZN3ccc7CC1x1y1E", // class name
  bases__ZN3ccc7CC1x1y1E, 2,
  &(vtc__ZN3ccc7CC1x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y1E),2, //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  DD1x1y1  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD1x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x1y13efgEv
  ~DD1x1y1(); // tgen
  DD1x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y13abcEv");}
void  ccc::DD1x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y13pqrEv");}
void  ccc::DD1x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y13efgEv");}
ccc::DD1x1y1 ::~DD1x1y1(){ note_dtor("_ZN3ccc7DD1x1y1E", this);} // tgen
ccc::DD1x1y1 ::DD1x1y1(){ note_ctor("_ZN3ccc7DD1x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y1E, buf);
    ::ccc::DD1x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y1E);
    dp->::ccc::DD1x1y1::~DD1x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y1E(Test__ZN3ccc7DD1x1y1E, "_ZN3ccc7DD1x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y1C1Ev();
extern void _ZN3ccc7DD1x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y1E[] = {
  NSPAIR(_ZN3ccc7DD1x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y1E[];
extern void _ZN3ccc7DD1x1y13abcEv();
extern void _ZN3ccc7DD1x1y13pqrEv();
extern void _ZN3ccc7DD1x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y13abcEv,_ZTv0_n12_N3ccc7DD1x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y13abcEv,_ZThn4_N3ccc7DD1x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y13pqrEv,_ZTv0_n16_N3ccc7DD1x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y13pqrEv,_ZThn4_N3ccc7DD1x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y13efgEv,_ZTv0_n20_N3ccc7DD1x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y13efgEv,_ZThn4_N3ccc7DD1x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y13abcEv,_ZTv0_n12_N3ccc7DD1x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y13pqrEv,_ZTv0_n16_N3ccc7DD1x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y13efgEv,_ZTv0_n20_N3ccc7DD1x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y1E[] = {
  {&(_ZTVN3ccc7DD1x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y1E[];
static VTBL_ENTRY alt_thunk_names466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y13efgEv,_ZTv0_n20_N3ccc7DD1x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y13efgEv,_ZThn4_N3ccc7DD1x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y13pqrEv,_ZTv0_n16_N3ccc7DD1x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y13pqrEv,_ZThn4_N3ccc7DD1x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y13abcEv,_ZTv0_n12_N3ccc7DD1x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y13abcEv,_ZThn4_N3ccc7DD1x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y1E = {  "_ZN3ccc7DD1x1y1E", // class name
  bases__ZN3ccc7DD1x1y1E, 2,
  &(vtc__ZN3ccc7DD1x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y1E),3, //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  CC1x1y2  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y23pqrEv
  ~CC1x1y2(); // tgen
  CC1x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y2E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y23efgEv");}
void  ccc::CC1x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y23abcEv");}
void  ccc::CC1x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y23pqrEv");}
ccc::CC1x1y2 ::~CC1x1y2(){ note_dtor("_ZN3ccc7CC1x1y2E", this);} // tgen
ccc::CC1x1y2 ::CC1x1y2(){ note_ctor("_ZN3ccc7CC1x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y2E, buf);
    ::ccc::CC1x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y2E);
    dp->::ccc::CC1x1y2::~CC1x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y2E(Test__ZN3ccc7CC1x1y2E, "_ZN3ccc7CC1x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y2C1Ev();
extern void _ZN3ccc7CC1x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y2E[] = {
  NSPAIR(_ZN3ccc7CC1x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y2E[];
extern void _ZN3ccc7CC1x1y23abcEv();
extern void _ZN3ccc7CC1x1y23pqrEv();
extern void _ZN3ccc7CC1x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y23abcEv,_ZTv0_n12_N3ccc7CC1x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23abcEv,_ZThn4_N3ccc7CC1x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y23pqrEv,_ZTv0_n16_N3ccc7CC1x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23pqrEv,_ZThn4_N3ccc7CC1x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y23efgEv,_ZTv0_n20_N3ccc7CC1x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23efgEv,_ZThn4_N3ccc7CC1x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y23abcEv,_ZTv0_n12_N3ccc7CC1x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y23pqrEv,_ZTv0_n16_N3ccc7CC1x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y23efgEv,_ZTv0_n20_N3ccc7CC1x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y2E[] = {
  {&(_ZTVN3ccc7CC1x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y2E[];
static VTBL_ENTRY alt_thunk_names467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y23efgEv,_ZTv0_n20_N3ccc7CC1x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y23efgEv,_ZThn4_N3ccc7CC1x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y23pqrEv,_ZTv0_n16_N3ccc7CC1x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y23pqrEv,_ZThn4_N3ccc7CC1x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y23abcEv,_ZTv0_n12_N3ccc7CC1x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y23abcEv,_ZThn4_N3ccc7CC1x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y2E = {  "_ZN3ccc7CC1x1y2E", // class name
  bases__ZN3ccc7CC1x1y2E, 2,
  &(vtc__ZN3ccc7CC1x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y2E),2, //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  DD1x1y2  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD1x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y23pqrEv
  ~DD1x1y2(); // tgen
  DD1x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y23efgEv");}
void  ccc::DD1x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y23abcEv");}
void  ccc::DD1x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y23pqrEv");}
ccc::DD1x1y2 ::~DD1x1y2(){ note_dtor("_ZN3ccc7DD1x1y2E", this);} // tgen
ccc::DD1x1y2 ::DD1x1y2(){ note_ctor("_ZN3ccc7DD1x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y2E, buf);
    ::ccc::DD1x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y2E);
    dp->::ccc::DD1x1y2::~DD1x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y2E(Test__ZN3ccc7DD1x1y2E, "_ZN3ccc7DD1x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y2C1Ev();
extern void _ZN3ccc7DD1x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y2E[] = {
  NSPAIR(_ZN3ccc7DD1x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y2E[];
extern void _ZN3ccc7DD1x1y23abcEv();
extern void _ZN3ccc7DD1x1y23pqrEv();
extern void _ZN3ccc7DD1x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y23abcEv,_ZTv0_n12_N3ccc7DD1x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y23abcEv,_ZThn4_N3ccc7DD1x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y23pqrEv,_ZTv0_n16_N3ccc7DD1x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y23pqrEv,_ZThn4_N3ccc7DD1x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y23efgEv,_ZTv0_n20_N3ccc7DD1x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y23efgEv,_ZThn4_N3ccc7DD1x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y23abcEv,_ZTv0_n12_N3ccc7DD1x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y23pqrEv,_ZTv0_n16_N3ccc7DD1x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y23efgEv,_ZTv0_n20_N3ccc7DD1x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y2E[] = {
  {&(_ZTVN3ccc7DD1x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y2E[];
static VTBL_ENTRY alt_thunk_names468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y23efgEv,_ZTv0_n20_N3ccc7DD1x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y23efgEv,_ZThn4_N3ccc7DD1x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y23pqrEv,_ZTv0_n16_N3ccc7DD1x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y23pqrEv,_ZThn4_N3ccc7DD1x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y23abcEv,_ZTv0_n12_N3ccc7DD1x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y23abcEv,_ZThn4_N3ccc7DD1x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y2E = {  "_ZN3ccc7DD1x1y2E", // class name
  bases__ZN3ccc7DD1x1y2E, 2,
  &(vtc__ZN3ccc7DD1x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y2E),3, //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  CC1x1y3  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x1y33abcEv
  ~CC1x1y3(); // tgen
  CC1x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y3E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y33efgEv");}
void  ccc::CC1x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y33pqrEv");}
void  ccc::CC1x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y33abcEv");}
ccc::CC1x1y3 ::~CC1x1y3(){ note_dtor("_ZN3ccc7CC1x1y3E", this);} // tgen
ccc::CC1x1y3 ::CC1x1y3(){ note_ctor("_ZN3ccc7CC1x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y3E, buf);
    ::ccc::CC1x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y3E);
    dp->::ccc::CC1x1y3::~CC1x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y3E(Test__ZN3ccc7CC1x1y3E, "_ZN3ccc7CC1x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y3C1Ev();
extern void _ZN3ccc7CC1x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y3E[] = {
  NSPAIR(_ZN3ccc7CC1x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y3E[];
extern void _ZN3ccc7CC1x1y33abcEv();
extern void _ZN3ccc7CC1x1y33pqrEv();
extern void _ZN3ccc7CC1x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y33abcEv,_ZTv0_n12_N3ccc7CC1x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33abcEv,_ZThn4_N3ccc7CC1x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y33pqrEv,_ZTv0_n16_N3ccc7CC1x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33pqrEv,_ZThn4_N3ccc7CC1x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y33efgEv,_ZTv0_n20_N3ccc7CC1x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33efgEv,_ZThn4_N3ccc7CC1x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y33abcEv,_ZTv0_n12_N3ccc7CC1x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y33pqrEv,_ZTv0_n16_N3ccc7CC1x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y33efgEv,_ZTv0_n20_N3ccc7CC1x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y3E[] = {
  {&(_ZTVN3ccc7CC1x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y3E[];
static VTBL_ENTRY alt_thunk_names469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y33efgEv,_ZTv0_n20_N3ccc7CC1x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y33efgEv,_ZThn4_N3ccc7CC1x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y33pqrEv,_ZTv0_n16_N3ccc7CC1x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y33pqrEv,_ZThn4_N3ccc7CC1x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y33abcEv,_ZTv0_n12_N3ccc7CC1x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y33abcEv,_ZThn4_N3ccc7CC1x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y3E = {  "_ZN3ccc7CC1x1y3E", // class name
  bases__ZN3ccc7CC1x1y3E, 2,
  &(vtc__ZN3ccc7CC1x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y3E),2, //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  DD1x1y3  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD1x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x1y33abcEv
  ~DD1x1y3(); // tgen
  DD1x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y33efgEv");}
void  ccc::DD1x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y33pqrEv");}
void  ccc::DD1x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y33abcEv");}
ccc::DD1x1y3 ::~DD1x1y3(){ note_dtor("_ZN3ccc7DD1x1y3E", this);} // tgen
ccc::DD1x1y3 ::DD1x1y3(){ note_ctor("_ZN3ccc7DD1x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y3E, buf);
    ::ccc::DD1x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y3E);
    dp->::ccc::DD1x1y3::~DD1x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y3E(Test__ZN3ccc7DD1x1y3E, "_ZN3ccc7DD1x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y3C1Ev();
extern void _ZN3ccc7DD1x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y3E[] = {
  NSPAIR(_ZN3ccc7DD1x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y3E[];
extern void _ZN3ccc7DD1x1y33abcEv();
extern void _ZN3ccc7DD1x1y33pqrEv();
extern void _ZN3ccc7DD1x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y33abcEv,_ZTv0_n12_N3ccc7DD1x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y33abcEv,_ZThn4_N3ccc7DD1x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y33pqrEv,_ZTv0_n16_N3ccc7DD1x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y33pqrEv,_ZThn4_N3ccc7DD1x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y33efgEv,_ZTv0_n20_N3ccc7DD1x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y33efgEv,_ZThn4_N3ccc7DD1x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y33abcEv,_ZTv0_n12_N3ccc7DD1x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y33pqrEv,_ZTv0_n16_N3ccc7DD1x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y33efgEv,_ZTv0_n20_N3ccc7DD1x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y3E[] = {
  {&(_ZTVN3ccc7DD1x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y3E[];
static VTBL_ENTRY alt_thunk_names470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y33efgEv,_ZTv0_n20_N3ccc7DD1x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y33efgEv,_ZThn4_N3ccc7DD1x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y33pqrEv,_ZTv0_n16_N3ccc7DD1x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y33pqrEv,_ZThn4_N3ccc7DD1x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y33abcEv,_ZTv0_n12_N3ccc7DD1x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y33abcEv,_ZThn4_N3ccc7DD1x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y3E = {  "_ZN3ccc7DD1x1y3E", // class name
  bases__ZN3ccc7DD1x1y3E, 2,
  &(vtc__ZN3ccc7DD1x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y3E),3, //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  CC1x1y4  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC1x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y43efgEv
  ~CC1x1y4(); // tgen
  CC1x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y4E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y43pqrEv");}
void  ccc::CC1x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y43abcEv");}
void  ccc::CC1x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y43efgEv");}
ccc::CC1x1y4 ::~CC1x1y4(){ note_dtor("_ZN3ccc7CC1x1y4E", this);} // tgen
ccc::CC1x1y4 ::CC1x1y4(){ note_ctor("_ZN3ccc7CC1x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y4E, buf);
    ::ccc::CC1x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y4E);
    dp->::ccc::CC1x1y4::~CC1x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y4E(Test__ZN3ccc7CC1x1y4E, "_ZN3ccc7CC1x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y4C1Ev();
extern void _ZN3ccc7CC1x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y4E[] = {
  NSPAIR(_ZN3ccc7CC1x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y4E[];
extern void _ZN3ccc7CC1x1y43abcEv();
extern void _ZN3ccc7CC1x1y43pqrEv();
extern void _ZN3ccc7CC1x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y43abcEv,_ZTv0_n12_N3ccc7CC1x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43abcEv,_ZThn4_N3ccc7CC1x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y43pqrEv,_ZTv0_n16_N3ccc7CC1x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43pqrEv,_ZThn4_N3ccc7CC1x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y43efgEv,_ZTv0_n20_N3ccc7CC1x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43efgEv,_ZThn4_N3ccc7CC1x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y43abcEv,_ZTv0_n12_N3ccc7CC1x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y43pqrEv,_ZTv0_n16_N3ccc7CC1x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y43efgEv,_ZTv0_n20_N3ccc7CC1x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y4E[] = {
  {&(_ZTVN3ccc7CC1x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y4E[];
static VTBL_ENTRY alt_thunk_names471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y43efgEv,_ZTv0_n20_N3ccc7CC1x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y43efgEv,_ZThn4_N3ccc7CC1x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y43pqrEv,_ZTv0_n16_N3ccc7CC1x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y43pqrEv,_ZThn4_N3ccc7CC1x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y43abcEv,_ZTv0_n12_N3ccc7CC1x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y43abcEv,_ZThn4_N3ccc7CC1x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y4E = {  "_ZN3ccc7CC1x1y4E", // class name
  bases__ZN3ccc7CC1x1y4E, 2,
  &(vtc__ZN3ccc7CC1x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y4E),2, //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  DD1x1y4  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD1x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x1y43efgEv
  ~DD1x1y4(); // tgen
  DD1x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y43pqrEv");}
void  ccc::DD1x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y43abcEv");}
void  ccc::DD1x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y43efgEv");}
ccc::DD1x1y4 ::~DD1x1y4(){ note_dtor("_ZN3ccc7DD1x1y4E", this);} // tgen
ccc::DD1x1y4 ::DD1x1y4(){ note_ctor("_ZN3ccc7DD1x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y4E, buf);
    ::ccc::DD1x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y4E);
    dp->::ccc::DD1x1y4::~DD1x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y4E(Test__ZN3ccc7DD1x1y4E, "_ZN3ccc7DD1x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y4C1Ev();
extern void _ZN3ccc7DD1x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y4E[] = {
  NSPAIR(_ZN3ccc7DD1x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y4E[];
extern void _ZN3ccc7DD1x1y43abcEv();
extern void _ZN3ccc7DD1x1y43pqrEv();
extern void _ZN3ccc7DD1x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y43abcEv,_ZTv0_n12_N3ccc7DD1x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y43abcEv,_ZThn4_N3ccc7DD1x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y43pqrEv,_ZTv0_n16_N3ccc7DD1x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y43pqrEv,_ZThn4_N3ccc7DD1x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y43efgEv,_ZTv0_n20_N3ccc7DD1x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y43efgEv,_ZThn4_N3ccc7DD1x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y43abcEv,_ZTv0_n12_N3ccc7DD1x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y43pqrEv,_ZTv0_n16_N3ccc7DD1x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y43efgEv,_ZTv0_n20_N3ccc7DD1x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y4E[] = {
  {&(_ZTVN3ccc7DD1x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y4E[];
static VTBL_ENTRY alt_thunk_names472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y43efgEv,_ZTv0_n20_N3ccc7DD1x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y43efgEv,_ZThn4_N3ccc7DD1x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y43pqrEv,_ZTv0_n16_N3ccc7DD1x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y43pqrEv,_ZThn4_N3ccc7DD1x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y43abcEv,_ZTv0_n12_N3ccc7DD1x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y43abcEv,_ZThn4_N3ccc7DD1x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y4E = {  "_ZN3ccc7DD1x1y4E", // class name
  bases__ZN3ccc7DD1x1y4E, 2,
  &(vtc__ZN3ccc7DD1x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y4E),3, //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  CC1x1y5  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC1x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y53abcEv
  ~CC1x1y5(); // tgen
  CC1x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y5E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y53pqrEv");}
void  ccc::CC1x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y53efgEv");}
void  ccc::CC1x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y53abcEv");}
ccc::CC1x1y5 ::~CC1x1y5(){ note_dtor("_ZN3ccc7CC1x1y5E", this);} // tgen
ccc::CC1x1y5 ::CC1x1y5(){ note_ctor("_ZN3ccc7CC1x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y5E, buf);
    ::ccc::CC1x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y5E);
    dp->::ccc::CC1x1y5::~CC1x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y5E(Test__ZN3ccc7CC1x1y5E, "_ZN3ccc7CC1x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y5C1Ev();
extern void _ZN3ccc7CC1x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y5E[] = {
  NSPAIR(_ZN3ccc7CC1x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y5E[];
extern void _ZN3ccc7CC1x1y53abcEv();
extern void _ZN3ccc7CC1x1y53pqrEv();
extern void _ZN3ccc7CC1x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y53abcEv,_ZTv0_n12_N3ccc7CC1x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53abcEv,_ZThn4_N3ccc7CC1x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y53pqrEv,_ZTv0_n16_N3ccc7CC1x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53pqrEv,_ZThn4_N3ccc7CC1x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y53efgEv,_ZTv0_n20_N3ccc7CC1x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53efgEv,_ZThn4_N3ccc7CC1x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y53abcEv,_ZTv0_n12_N3ccc7CC1x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y53pqrEv,_ZTv0_n16_N3ccc7CC1x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y53efgEv,_ZTv0_n20_N3ccc7CC1x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y5E[] = {
  {&(_ZTVN3ccc7CC1x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y5E[];
static VTBL_ENTRY alt_thunk_names473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y53efgEv,_ZTv0_n20_N3ccc7CC1x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y53efgEv,_ZThn4_N3ccc7CC1x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y53pqrEv,_ZTv0_n16_N3ccc7CC1x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y53pqrEv,_ZThn4_N3ccc7CC1x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y53abcEv,_ZTv0_n12_N3ccc7CC1x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y53abcEv,_ZThn4_N3ccc7CC1x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y5E = {  "_ZN3ccc7CC1x1y5E", // class name
  bases__ZN3ccc7CC1x1y5E, 2,
  &(vtc__ZN3ccc7CC1x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y5E),2, //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  DD1x1y5  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD1x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x1y53abcEv
  ~DD1x1y5(); // tgen
  DD1x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y53pqrEv");}
void  ccc::DD1x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y53efgEv");}
void  ccc::DD1x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y53abcEv");}
ccc::DD1x1y5 ::~DD1x1y5(){ note_dtor("_ZN3ccc7DD1x1y5E", this);} // tgen
ccc::DD1x1y5 ::DD1x1y5(){ note_ctor("_ZN3ccc7DD1x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y5E, buf);
    ::ccc::DD1x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y5E);
    dp->::ccc::DD1x1y5::~DD1x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y5E(Test__ZN3ccc7DD1x1y5E, "_ZN3ccc7DD1x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y5C1Ev();
extern void _ZN3ccc7DD1x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y5E[] = {
  NSPAIR(_ZN3ccc7DD1x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y5E[];
extern void _ZN3ccc7DD1x1y53abcEv();
extern void _ZN3ccc7DD1x1y53pqrEv();
extern void _ZN3ccc7DD1x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y53abcEv,_ZTv0_n12_N3ccc7DD1x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y53abcEv,_ZThn4_N3ccc7DD1x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y53pqrEv,_ZTv0_n16_N3ccc7DD1x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y53pqrEv,_ZThn4_N3ccc7DD1x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y53efgEv,_ZTv0_n20_N3ccc7DD1x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y53efgEv,_ZThn4_N3ccc7DD1x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y53abcEv,_ZTv0_n12_N3ccc7DD1x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y53pqrEv,_ZTv0_n16_N3ccc7DD1x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y53efgEv,_ZTv0_n20_N3ccc7DD1x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y5E[] = {
  {&(_ZTVN3ccc7DD1x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y5E[];
static VTBL_ENTRY alt_thunk_names474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y53efgEv,_ZTv0_n20_N3ccc7DD1x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y53efgEv,_ZThn4_N3ccc7DD1x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y53pqrEv,_ZTv0_n16_N3ccc7DD1x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y53pqrEv,_ZThn4_N3ccc7DD1x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y53abcEv,_ZTv0_n12_N3ccc7DD1x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y53abcEv,_ZThn4_N3ccc7DD1x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y5E = {  "_ZN3ccc7DD1x1y5E", // class name
  bases__ZN3ccc7DD1x1y5E, 2,
  &(vtc__ZN3ccc7DD1x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y5E),3, //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  CC1x1y6  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y63efgEv
  ~CC1x1y6(); // tgen
  CC1x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y6E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y63abcEv");}
void  ccc::CC1x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y63efgEv");}
ccc::CC1x1y6 ::~CC1x1y6(){ note_dtor("_ZN3ccc7CC1x1y6E", this);} // tgen
ccc::CC1x1y6 ::CC1x1y6(){ note_ctor("_ZN3ccc7CC1x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y6E, buf);
    ::ccc::CC1x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y6E);
    dp->::ccc::CC1x1y6::~CC1x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y6E(Test__ZN3ccc7CC1x1y6E, "_ZN3ccc7CC1x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y6C1Ev();
extern void _ZN3ccc7CC1x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y6E[] = {
  NSPAIR(_ZN3ccc7CC1x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y6E[];
extern void _ZN3ccc7CC1x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC1x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y63abcEv,_ZTv0_n12_N3ccc7CC1x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y63abcEv,_ZThn4_N3ccc7CC1x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y63efgEv,_ZTv0_n20_N3ccc7CC1x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y63efgEv,_ZThn4_N3ccc7CC1x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y63abcEv,_ZTv0_n12_N3ccc7CC1x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y63efgEv,_ZTv0_n20_N3ccc7CC1x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y6E[] = {
  {&(_ZTVN3ccc7CC1x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y6E[];
static VTBL_ENTRY alt_thunk_names475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y63efgEv,_ZTv0_n20_N3ccc7CC1x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y63efgEv,_ZThn4_N3ccc7CC1x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y63abcEv,_ZTv0_n12_N3ccc7CC1x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y63abcEv,_ZThn4_N3ccc7CC1x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y6E = {  "_ZN3ccc7CC1x1y6E", // class name
  bases__ZN3ccc7CC1x1y6E, 2,
  &(vtc__ZN3ccc7CC1x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y6E),2, //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  DD1x1y6  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD1x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x1y63efgEv
  ~DD1x1y6(); // tgen
  DD1x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y63abcEv");}
void  ccc::DD1x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y63efgEv");}
ccc::DD1x1y6 ::~DD1x1y6(){ note_dtor("_ZN3ccc7DD1x1y6E", this);} // tgen
ccc::DD1x1y6 ::DD1x1y6(){ note_ctor("_ZN3ccc7DD1x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y6E, buf);
    ::ccc::DD1x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y6E);
    dp->::ccc::DD1x1y6::~DD1x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y6E(Test__ZN3ccc7DD1x1y6E, "_ZN3ccc7DD1x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y6C1Ev();
extern void _ZN3ccc7DD1x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y6E[] = {
  NSPAIR(_ZN3ccc7DD1x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y6E[];
extern void _ZN3ccc7DD1x1y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y63abcEv,_ZTv0_n12_N3ccc7DD1x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y63abcEv,_ZThn4_N3ccc7DD1x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y63efgEv,_ZTv0_n20_N3ccc7DD1x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y63efgEv,_ZThn4_N3ccc7DD1x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y63abcEv,_ZTv0_n12_N3ccc7DD1x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y63efgEv,_ZTv0_n20_N3ccc7DD1x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y6E[] = {
  {&(_ZTVN3ccc7DD1x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y6E[];
static VTBL_ENTRY alt_thunk_names476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y63efgEv,_ZTv0_n20_N3ccc7DD1x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y63efgEv,_ZThn4_N3ccc7DD1x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y63abcEv,_ZTv0_n12_N3ccc7DD1x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y63abcEv,_ZThn4_N3ccc7DD1x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y6E = {  "_ZN3ccc7DD1x1y6E", // class name
  bases__ZN3ccc7DD1x1y6E, 2,
  &(vtc__ZN3ccc7DD1x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y6E),3, //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  CC1x1y7  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y73pqrEv
  ~CC1x1y7(); // tgen
  CC1x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y7E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y73abcEv");}
void  ccc::CC1x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y73pqrEv");}
ccc::CC1x1y7 ::~CC1x1y7(){ note_dtor("_ZN3ccc7CC1x1y7E", this);} // tgen
ccc::CC1x1y7 ::CC1x1y7(){ note_ctor("_ZN3ccc7CC1x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y7E, buf);
    ::ccc::CC1x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y7E);
    dp->::ccc::CC1x1y7::~CC1x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y7E(Test__ZN3ccc7CC1x1y7E, "_ZN3ccc7CC1x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y7C1Ev();
extern void _ZN3ccc7CC1x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y7E[] = {
  NSPAIR(_ZN3ccc7CC1x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y7E[];
extern void _ZN3ccc7CC1x1y73abcEv();
extern void _ZN3ccc7CC1x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y73abcEv,_ZTv0_n12_N3ccc7CC1x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y73abcEv,_ZThn4_N3ccc7CC1x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y73pqrEv,_ZTv0_n16_N3ccc7CC1x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y73pqrEv,_ZThn4_N3ccc7CC1x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y73abcEv,_ZTv0_n12_N3ccc7CC1x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y73pqrEv,_ZTv0_n16_N3ccc7CC1x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y7E[] = {
  {&(_ZTVN3ccc7CC1x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y7E[];
static VTBL_ENTRY alt_thunk_names477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y73pqrEv,_ZTv0_n16_N3ccc7CC1x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y73pqrEv,_ZThn4_N3ccc7CC1x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y73abcEv,_ZTv0_n12_N3ccc7CC1x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y73abcEv,_ZThn4_N3ccc7CC1x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y7E = {  "_ZN3ccc7CC1x1y7E", // class name
  bases__ZN3ccc7CC1x1y7E, 2,
  &(vtc__ZN3ccc7CC1x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y7E),2, //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  DD1x1y7  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD1x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y73pqrEv
  ~DD1x1y7(); // tgen
  DD1x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y73abcEv");}
void  ccc::DD1x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y73pqrEv");}
ccc::DD1x1y7 ::~DD1x1y7(){ note_dtor("_ZN3ccc7DD1x1y7E", this);} // tgen
ccc::DD1x1y7 ::DD1x1y7(){ note_ctor("_ZN3ccc7DD1x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y7E, buf);
    ::ccc::DD1x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y7E);
    dp->::ccc::DD1x1y7::~DD1x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y7E(Test__ZN3ccc7DD1x1y7E, "_ZN3ccc7DD1x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y7C1Ev();
extern void _ZN3ccc7DD1x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y7E[] = {
  NSPAIR(_ZN3ccc7DD1x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y7E[];
extern void _ZN3ccc7DD1x1y73abcEv();
extern void _ZN3ccc7DD1x1y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y73abcEv,_ZTv0_n12_N3ccc7DD1x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y73abcEv,_ZThn4_N3ccc7DD1x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y73pqrEv,_ZTv0_n16_N3ccc7DD1x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y73pqrEv,_ZThn4_N3ccc7DD1x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y73abcEv,_ZTv0_n12_N3ccc7DD1x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y73pqrEv,_ZTv0_n16_N3ccc7DD1x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y7E[] = {
  {&(_ZTVN3ccc7DD1x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y7E[];
static VTBL_ENTRY alt_thunk_names478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y73pqrEv,_ZTv0_n16_N3ccc7DD1x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y73pqrEv,_ZThn4_N3ccc7DD1x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y73abcEv,_ZTv0_n12_N3ccc7DD1x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y73abcEv,_ZThn4_N3ccc7DD1x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y7E = {  "_ZN3ccc7DD1x1y7E", // class name
  bases__ZN3ccc7DD1x1y7E, 2,
  &(vtc__ZN3ccc7DD1x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y7E),3, //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  CC1x1y8  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y83abcEv
  ~CC1x1y8(); // tgen
  CC1x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y8E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y83efgEv");}
void  ccc::CC1x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y83abcEv");}
ccc::CC1x1y8 ::~CC1x1y8(){ note_dtor("_ZN3ccc7CC1x1y8E", this);} // tgen
ccc::CC1x1y8 ::CC1x1y8(){ note_ctor("_ZN3ccc7CC1x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y8E, buf);
    ::ccc::CC1x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y8E);
    dp->::ccc::CC1x1y8::~CC1x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y8E(Test__ZN3ccc7CC1x1y8E, "_ZN3ccc7CC1x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y8C1Ev();
extern void _ZN3ccc7CC1x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y8E[] = {
  NSPAIR(_ZN3ccc7CC1x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y8E[];
extern void _ZN3ccc7CC1x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC1x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x1y83abcEv,_ZTv0_n12_N3ccc7CC1x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y83abcEv,_ZThn4_N3ccc7CC1x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y83efgEv,_ZTv0_n20_N3ccc7CC1x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y83efgEv,_ZThn4_N3ccc7CC1x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x1y83abcEv,_ZTv0_n12_N3ccc7CC1x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y83efgEv,_ZTv0_n20_N3ccc7CC1x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y8E[] = {
  {&(_ZTVN3ccc7CC1x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y8E[];
static VTBL_ENTRY alt_thunk_names479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y83efgEv,_ZTv0_n20_N3ccc7CC1x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y83efgEv,_ZThn4_N3ccc7CC1x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x1y83abcEv,_ZTv0_n12_N3ccc7CC1x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y83abcEv,_ZThn4_N3ccc7CC1x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y8E = {  "_ZN3ccc7CC1x1y8E", // class name
  bases__ZN3ccc7CC1x1y8E, 2,
  &(vtc__ZN3ccc7CC1x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y8E),2, //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  DD1x1y8  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD1x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x1y83abcEv
  ~DD1x1y8(); // tgen
  DD1x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y83efgEv");}
void  ccc::DD1x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x1y83abcEv");}
ccc::DD1x1y8 ::~DD1x1y8(){ note_dtor("_ZN3ccc7DD1x1y8E", this);} // tgen
ccc::DD1x1y8 ::DD1x1y8(){ note_ctor("_ZN3ccc7DD1x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y8E, buf);
    ::ccc::DD1x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y8E);
    dp->::ccc::DD1x1y8::~DD1x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y8E(Test__ZN3ccc7DD1x1y8E, "_ZN3ccc7DD1x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y8C1Ev();
extern void _ZN3ccc7DD1x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y8E[] = {
  NSPAIR(_ZN3ccc7DD1x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y8E[];
extern void _ZN3ccc7DD1x1y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x1y83abcEv,_ZTv0_n12_N3ccc7DD1x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y83abcEv,_ZThn4_N3ccc7DD1x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y83efgEv,_ZTv0_n20_N3ccc7DD1x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y83efgEv,_ZThn4_N3ccc7DD1x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x1y83abcEv,_ZTv0_n12_N3ccc7DD1x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y83efgEv,_ZTv0_n20_N3ccc7DD1x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y8E[] = {
  {&(_ZTVN3ccc7DD1x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y8E[];
static VTBL_ENTRY alt_thunk_names480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y83efgEv,_ZTv0_n20_N3ccc7DD1x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y83efgEv,_ZThn4_N3ccc7DD1x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x1y83abcEv,_ZTv0_n12_N3ccc7DD1x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y83abcEv,_ZThn4_N3ccc7DD1x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y8E = {  "_ZN3ccc7DD1x1y8E", // class name
  bases__ZN3ccc7DD1x1y8E, 2,
  &(vtc__ZN3ccc7DD1x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y8E),3, //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  CC1x1y9  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y93pqrEv
  ~CC1x1y9(); // tgen
  CC1x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y9E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y93efgEv");}
void  ccc::CC1x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y93pqrEv");}
ccc::CC1x1y9 ::~CC1x1y9(){ note_dtor("_ZN3ccc7CC1x1y9E", this);} // tgen
ccc::CC1x1y9 ::CC1x1y9(){ note_ctor("_ZN3ccc7CC1x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y9E, buf);
    ::ccc::CC1x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC1x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y9E);
    dp->::ccc::CC1x1y9::~CC1x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y9E(Test__ZN3ccc7CC1x1y9E, "_ZN3ccc7CC1x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y9C1Ev();
extern void _ZN3ccc7CC1x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y9E[] = {
  NSPAIR(_ZN3ccc7CC1x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC1x1y93pqrEv();
extern void _ZN3ccc7CC1x1y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x1y93pqrEv,_ZTv0_n16_N3ccc7CC1x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y93pqrEv,_ZThn4_N3ccc7CC1x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x1y93efgEv,_ZTv0_n20_N3ccc7CC1x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y93efgEv,_ZThn4_N3ccc7CC1x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x1y93pqrEv,_ZTv0_n16_N3ccc7CC1x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x1y93efgEv,_ZTv0_n20_N3ccc7CC1x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x1y9E[] = {
  {&(_ZTVN3ccc7CC1x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x1y9E[];
static VTBL_ENTRY alt_thunk_names481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x1y93efgEv,_ZTv0_n20_N3ccc7CC1x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y93efgEv,_ZThn4_N3ccc7CC1x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x1y93pqrEv,_ZTv0_n16_N3ccc7CC1x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x1y93pqrEv,_ZThn4_N3ccc7CC1x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x1y9E = {  "_ZN3ccc7CC1x1y9E", // class name
  bases__ZN3ccc7CC1x1y9E, 2,
  &(vtc__ZN3ccc7CC1x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x1y9E),2, //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  DD1x1y9  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD1x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x1y93pqrEv
  ~DD1x1y9(); // tgen
  DD1x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x1y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x1y93efgEv");}
void  ccc::DD1x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x1y93pqrEv");}
ccc::DD1x1y9 ::~DD1x1y9(){ note_dtor("_ZN3ccc7DD1x1y9E", this);} // tgen
ccc::DD1x1y9 ::DD1x1y9(){ note_ctor("_ZN3ccc7DD1x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x1y9E, buf);
    ::ccc::DD1x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x1y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD1x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x1y9E);
    dp->::ccc::DD1x1y9::~DD1x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x1y9E(Test__ZN3ccc7DD1x1y9E, "_ZN3ccc7DD1x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x1y9C1Ev();
extern void _ZN3ccc7DD1x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x1y9E[] = {
  NSPAIR(_ZN3ccc7DD1x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD1x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x1y93pqrEv();
extern void _ZN3ccc7DD1x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x1y93pqrEv,_ZTv0_n16_N3ccc7DD1x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y93pqrEv,_ZThn4_N3ccc7DD1x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x1y93efgEv,_ZTv0_n20_N3ccc7DD1x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x1y93efgEv,_ZThn4_N3ccc7DD1x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x1y93pqrEv,_ZTv0_n16_N3ccc7DD1x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x1y93efgEv,_ZTv0_n20_N3ccc7DD1x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x1y9E[] = {
  {&(_ZTVN3ccc7DD1x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x1y9E[];
static VTBL_ENTRY alt_thunk_names482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x1y93efgEv,_ZTv0_n20_N3ccc7DD1x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y93efgEv,_ZThn4_N3ccc7DD1x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x1y93pqrEv,_ZTv0_n16_N3ccc7DD1x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x1y93pqrEv,_ZThn4_N3ccc7DD1x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x1y9E = {  "_ZN3ccc7DD1x1y9E", // class name
  bases__ZN3ccc7DD1x1y9E, 2,
  &(vtc__ZN3ccc7DD1x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x1y9E),3, //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  CC1x1y10  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x1y103abcEv
  ~CC1x1y10(); // tgen
  CC1x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y10E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y103pqrEv");}
void  ccc::CC1x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x1y103abcEv");}
ccc::CC1x1y10 ::~CC1x1y10(){ note_dtor("_ZN3ccc8CC1x1y10E", this);} // tgen
ccc::CC1x1y10 ::CC1x1y10(){ note_ctor("_ZN3ccc8CC1x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y10E, buf);
    ::ccc::CC1x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y10E);
    dp->::ccc::CC1x1y10::~CC1x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y10E(Test__ZN3ccc8CC1x1y10E, "_ZN3ccc8CC1x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y10C1Ev();
extern void _ZN3ccc8CC1x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y10E[] = {
  NSPAIR(_ZN3ccc8CC1x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y10E[];
extern void _ZN3ccc8CC1x1y103abcEv();
extern void _ZN3ccc8CC1x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x1y103abcEv,_ZTv0_n12_N3ccc8CC1x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y103abcEv,_ZThn4_N3ccc8CC1x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x1y103pqrEv,_ZTv0_n16_N3ccc8CC1x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y103pqrEv,_ZThn4_N3ccc8CC1x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x1y103abcEv,_ZTv0_n12_N3ccc8CC1x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x1y103pqrEv,_ZTv0_n16_N3ccc8CC1x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y10E[] = {
  {&(_ZTVN3ccc8CC1x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y10E[];
static VTBL_ENTRY alt_thunk_names483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x1y103pqrEv,_ZTv0_n16_N3ccc8CC1x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y103pqrEv,_ZThn4_N3ccc8CC1x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x1y103abcEv,_ZTv0_n12_N3ccc8CC1x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y103abcEv,_ZThn4_N3ccc8CC1x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x1y10E = {  "_ZN3ccc8CC1x1y10E", // class name
  bases__ZN3ccc8CC1x1y10E, 2,
  &(vtc__ZN3ccc8CC1x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y10E),2, //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  DD1x1y10  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD1x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x1y103abcEv
  ~DD1x1y10(); // tgen
  DD1x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x1y103pqrEv");}
void  ccc::DD1x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x1y103abcEv");}
ccc::DD1x1y10 ::~DD1x1y10(){ note_dtor("_ZN3ccc8DD1x1y10E", this);} // tgen
ccc::DD1x1y10 ::DD1x1y10(){ note_ctor("_ZN3ccc8DD1x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y10E, buf);
    ::ccc::DD1x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y10E);
    dp->::ccc::DD1x1y10::~DD1x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y10E(Test__ZN3ccc8DD1x1y10E, "_ZN3ccc8DD1x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y10C1Ev();
extern void _ZN3ccc8DD1x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y10E[] = {
  NSPAIR(_ZN3ccc8DD1x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y10E[];
extern void _ZN3ccc8DD1x1y103abcEv();
extern void _ZN3ccc8DD1x1y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x1y103abcEv,_ZTv0_n12_N3ccc8DD1x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y103abcEv,_ZThn4_N3ccc8DD1x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x1y103pqrEv,_ZTv0_n16_N3ccc8DD1x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y103pqrEv,_ZThn4_N3ccc8DD1x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x1y103abcEv,_ZTv0_n12_N3ccc8DD1x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x1y103pqrEv,_ZTv0_n16_N3ccc8DD1x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y10E[] = {
  {&(_ZTVN3ccc8DD1x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y10E[];
static VTBL_ENTRY alt_thunk_names484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x1y103pqrEv,_ZTv0_n16_N3ccc8DD1x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y103pqrEv,_ZThn4_N3ccc8DD1x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x1y103abcEv,_ZTv0_n12_N3ccc8DD1x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y103abcEv,_ZThn4_N3ccc8DD1x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x1y10E = {  "_ZN3ccc8DD1x1y10E", // class name
  bases__ZN3ccc8DD1x1y10E, 2,
  &(vtc__ZN3ccc8DD1x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y10E),3, //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  CC1x1y11  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x1y113efgEv
  ~CC1x1y11(); // tgen
  CC1x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y11E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y113pqrEv");}
void  ccc::CC1x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x1y113efgEv");}
ccc::CC1x1y11 ::~CC1x1y11(){ note_dtor("_ZN3ccc8CC1x1y11E", this);} // tgen
ccc::CC1x1y11 ::CC1x1y11(){ note_ctor("_ZN3ccc8CC1x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y11E, buf);
    ::ccc::CC1x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y11E);
    dp->::ccc::CC1x1y11::~CC1x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y11E(Test__ZN3ccc8CC1x1y11E, "_ZN3ccc8CC1x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y11C1Ev();
extern void _ZN3ccc8CC1x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y11E[] = {
  NSPAIR(_ZN3ccc8CC1x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC1x1y113pqrEv();
extern void _ZN3ccc8CC1x1y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x1y113pqrEv,_ZTv0_n16_N3ccc8CC1x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y113pqrEv,_ZThn4_N3ccc8CC1x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x1y113efgEv,_ZTv0_n20_N3ccc8CC1x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y113efgEv,_ZThn4_N3ccc8CC1x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x1y113pqrEv,_ZTv0_n16_N3ccc8CC1x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x1y113efgEv,_ZTv0_n20_N3ccc8CC1x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y11E[] = {
  {&(_ZTVN3ccc8CC1x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y11E[];
static VTBL_ENTRY alt_thunk_names485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x1y113efgEv,_ZTv0_n20_N3ccc8CC1x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y113efgEv,_ZThn4_N3ccc8CC1x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x1y113pqrEv,_ZTv0_n16_N3ccc8CC1x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y113pqrEv,_ZThn4_N3ccc8CC1x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x1y11E = {  "_ZN3ccc8CC1x1y11E", // class name
  bases__ZN3ccc8CC1x1y11E, 2,
  &(vtc__ZN3ccc8CC1x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y11E),2, //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  DD1x1y11  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD1x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x1y113efgEv
  ~DD1x1y11(); // tgen
  DD1x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x1y113pqrEv");}
void  ccc::DD1x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x1y113efgEv");}
ccc::DD1x1y11 ::~DD1x1y11(){ note_dtor("_ZN3ccc8DD1x1y11E", this);} // tgen
ccc::DD1x1y11 ::DD1x1y11(){ note_ctor("_ZN3ccc8DD1x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y11E, buf);
    ::ccc::DD1x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y11E);
    dp->::ccc::DD1x1y11::~DD1x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y11E(Test__ZN3ccc8DD1x1y11E, "_ZN3ccc8DD1x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y11C1Ev();
extern void _ZN3ccc8DD1x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y11E[] = {
  NSPAIR(_ZN3ccc8DD1x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x1y113pqrEv();
extern void _ZN3ccc8DD1x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x1y113pqrEv,_ZTv0_n16_N3ccc8DD1x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y113pqrEv,_ZThn4_N3ccc8DD1x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x1y113efgEv,_ZTv0_n20_N3ccc8DD1x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y113efgEv,_ZThn4_N3ccc8DD1x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x1y113pqrEv,_ZTv0_n16_N3ccc8DD1x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x1y113efgEv,_ZTv0_n20_N3ccc8DD1x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y11E[] = {
  {&(_ZTVN3ccc8DD1x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y11E[];
static VTBL_ENTRY alt_thunk_names486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x1y113efgEv,_ZTv0_n20_N3ccc8DD1x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y113efgEv,_ZThn4_N3ccc8DD1x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x1y113pqrEv,_ZTv0_n16_N3ccc8DD1x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y113pqrEv,_ZThn4_N3ccc8DD1x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x1y11E = {  "_ZN3ccc8DD1x1y11E", // class name
  bases__ZN3ccc8DD1x1y11E, 2,
  &(vtc__ZN3ccc8DD1x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y11E),3, //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  CC1x1y12  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC1x1y123abcEv
  ~CC1x1y12(); // tgen
  CC1x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x1y123abcEv");}
ccc::CC1x1y12 ::~CC1x1y12(){ note_dtor("_ZN3ccc8CC1x1y12E", this);} // tgen
ccc::CC1x1y12 ::CC1x1y12(){ note_ctor("_ZN3ccc8CC1x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y12E, buf);
    ::ccc::CC1x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y12E);
    dp->::ccc::CC1x1y12::~CC1x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y12E(Test__ZN3ccc8CC1x1y12E, "_ZN3ccc8CC1x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y12C1Ev();
extern void _ZN3ccc8CC1x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y12E[] = {
  NSPAIR(_ZN3ccc8CC1x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y12E[];
extern void _ZN3ccc8CC1x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x1y123abcEv,_ZTv0_n12_N3ccc8CC1x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y123abcEv,_ZThn4_N3ccc8CC1x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x1y123abcEv,_ZTv0_n12_N3ccc8CC1x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y12E[] = {
  {&(_ZTVN3ccc8CC1x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y12E[];
static VTBL_ENTRY alt_thunk_names487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x1y123abcEv,_ZTv0_n12_N3ccc8CC1x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y123abcEv,_ZThn4_N3ccc8CC1x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x1y12E = {  "_ZN3ccc8CC1x1y12E", // class name
  bases__ZN3ccc8CC1x1y12E, 2,
  &(vtc__ZN3ccc8CC1x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y12E),2, //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  DD1x1y12  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD1x1y123abcEv
  ~DD1x1y12(); // tgen
  DD1x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x1y123abcEv");}
ccc::DD1x1y12 ::~DD1x1y12(){ note_dtor("_ZN3ccc8DD1x1y12E", this);} // tgen
ccc::DD1x1y12 ::DD1x1y12(){ note_ctor("_ZN3ccc8DD1x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y12E, buf);
    ::ccc::DD1x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y12E);
    dp->::ccc::DD1x1y12::~DD1x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y12E(Test__ZN3ccc8DD1x1y12E, "_ZN3ccc8DD1x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y12C1Ev();
extern void _ZN3ccc8DD1x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y12E[] = {
  NSPAIR(_ZN3ccc8DD1x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y12E[];
extern void _ZN3ccc8DD1x1y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x1y123abcEv,_ZTv0_n12_N3ccc8DD1x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y123abcEv,_ZThn4_N3ccc8DD1x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x1y123abcEv,_ZTv0_n12_N3ccc8DD1x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y12E[] = {
  {&(_ZTVN3ccc8DD1x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y12E[];
static VTBL_ENTRY alt_thunk_names488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x1y123abcEv,_ZTv0_n12_N3ccc8DD1x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y123abcEv,_ZThn4_N3ccc8DD1x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x1y12E = {  "_ZN3ccc8DD1x1y12E", // class name
  bases__ZN3ccc8DD1x1y12E, 2,
  &(vtc__ZN3ccc8DD1x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y12E),3, //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  CC1x1y13  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC1x1y133efgEv
  ~CC1x1y13(); // tgen
  CC1x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x1y133efgEv");}
ccc::CC1x1y13 ::~CC1x1y13(){ note_dtor("_ZN3ccc8CC1x1y13E", this);} // tgen
ccc::CC1x1y13 ::CC1x1y13(){ note_ctor("_ZN3ccc8CC1x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y13E, buf);
    ::ccc::CC1x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y13E);
    dp->::ccc::CC1x1y13::~CC1x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y13E(Test__ZN3ccc8CC1x1y13E, "_ZN3ccc8CC1x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y13C1Ev();
extern void _ZN3ccc8CC1x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y13E[] = {
  NSPAIR(_ZN3ccc8CC1x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC1x1y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x1y133efgEv,_ZTv0_n20_N3ccc8CC1x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y133efgEv,_ZThn4_N3ccc8CC1x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x1y133efgEv,_ZTv0_n20_N3ccc8CC1x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y13E[] = {
  {&(_ZTVN3ccc8CC1x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y13E[];
static VTBL_ENTRY alt_thunk_names489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x1y133efgEv,_ZTv0_n20_N3ccc8CC1x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y133efgEv,_ZThn4_N3ccc8CC1x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x1y13E = {  "_ZN3ccc8CC1x1y13E", // class name
  bases__ZN3ccc8CC1x1y13E, 2,
  &(vtc__ZN3ccc8CC1x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y13E),2, //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  DD1x1y13  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD1x1y133efgEv
  ~DD1x1y13(); // tgen
  DD1x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x1y133efgEv");}
ccc::DD1x1y13 ::~DD1x1y13(){ note_dtor("_ZN3ccc8DD1x1y13E", this);} // tgen
ccc::DD1x1y13 ::DD1x1y13(){ note_ctor("_ZN3ccc8DD1x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y13E, buf);
    ::ccc::DD1x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y13E);
    dp->::ccc::DD1x1y13::~DD1x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y13E(Test__ZN3ccc8DD1x1y13E, "_ZN3ccc8DD1x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y13C1Ev();
extern void _ZN3ccc8DD1x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y13E[] = {
  NSPAIR(_ZN3ccc8DD1x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x1y133efgEv,_ZTv0_n20_N3ccc8DD1x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y133efgEv,_ZThn4_N3ccc8DD1x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x1y133efgEv,_ZTv0_n20_N3ccc8DD1x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y13E[] = {
  {&(_ZTVN3ccc8DD1x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y13E[];
static VTBL_ENTRY alt_thunk_names490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x1y133efgEv,_ZTv0_n20_N3ccc8DD1x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y133efgEv,_ZThn4_N3ccc8DD1x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x1y13E = {  "_ZN3ccc8DD1x1y13E", // class name
  bases__ZN3ccc8DD1x1y13E, 2,
  &(vtc__ZN3ccc8DD1x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y13E),3, //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  CC1x1y14  : virtual ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y143pqrEv
  ~CC1x1y14(); // tgen
  CC1x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y143pqrEv");}
ccc::CC1x1y14 ::~CC1x1y14(){ note_dtor("_ZN3ccc8CC1x1y14E", this);} // tgen
ccc::CC1x1y14 ::CC1x1y14(){ note_ctor("_ZN3ccc8CC1x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y14E, buf);
    ::ccc::CC1x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y14E);
    dp->::ccc::CC1x1y14::~CC1x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y14E(Test__ZN3ccc8CC1x1y14E, "_ZN3ccc8CC1x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y14C1Ev();
extern void _ZN3ccc8CC1x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y14E[] = {
  NSPAIR(_ZN3ccc8CC1x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC1x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x1y143pqrEv,_ZTv0_n16_N3ccc8CC1x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y143pqrEv,_ZThn4_N3ccc8CC1x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x1y143pqrEv,_ZTv0_n16_N3ccc8CC1x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y14E[] = {
  {&(_ZTVN3ccc8CC1x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y14E[];
static VTBL_ENTRY alt_thunk_names491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x1y143pqrEv,_ZTv0_n16_N3ccc8CC1x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x1y143pqrEv,_ZThn4_N3ccc8CC1x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x1y14E = {  "_ZN3ccc8CC1x1y14E", // class name
  bases__ZN3ccc8CC1x1y14E, 2,
  &(vtc__ZN3ccc8CC1x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y14E),2, //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  DD1x1y14  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD1x1y143pqrEv
  ~DD1x1y14(); // tgen
  DD1x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x1y143pqrEv");}
ccc::DD1x1y14 ::~DD1x1y14(){ note_dtor("_ZN3ccc8DD1x1y14E", this);} // tgen
ccc::DD1x1y14 ::DD1x1y14(){ note_ctor("_ZN3ccc8DD1x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y14E, buf);
    ::ccc::DD1x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y14E);
    dp->::ccc::DD1x1y14::~DD1x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y14E(Test__ZN3ccc8DD1x1y14E, "_ZN3ccc8DD1x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y14C1Ev();
extern void _ZN3ccc8DD1x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y14E[] = {
  NSPAIR(_ZN3ccc8DD1x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x1y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x1y143pqrEv,_ZTv0_n16_N3ccc8DD1x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x1y143pqrEv,_ZThn4_N3ccc8DD1x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x1y143pqrEv,_ZTv0_n16_N3ccc8DD1x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y14E[] = {
  {&(_ZTVN3ccc8DD1x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y14E[];
static VTBL_ENTRY alt_thunk_names492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x1y143pqrEv,_ZTv0_n16_N3ccc8DD1x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x1y143pqrEv,_ZThn4_N3ccc8DD1x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x1y14E = {  "_ZN3ccc8DD1x1y14E", // class name
  bases__ZN3ccc8DD1x1y14E, 2,
  &(vtc__ZN3ccc8DD1x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y14E),3, //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  CC1x1y15  : virtual ::ccc::AA1 , ::ccc::BB1 {
  ~CC1x1y15(); // tgen
  CC1x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x1y15 ::~CC1x1y15(){ note_dtor("_ZN3ccc8CC1x1y15E", this);} // tgen
ccc::CC1x1y15 ::CC1x1y15(){ note_ctor("_ZN3ccc8CC1x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y15E, buf);
    ::ccc::CC1x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC1x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y15E);
    dp->::ccc::CC1x1y15::~CC1x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y15E(Test__ZN3ccc8CC1x1y15E, "_ZN3ccc8CC1x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y15C1Ev();
extern void _ZN3ccc8CC1x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y15E[] = {
  NSPAIR(_ZN3ccc8CC1x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x1y15E[] = {
  {&(_ZTVN3ccc8CC1x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x1y15E[];
Class_Descriptor cd__ZN3ccc8CC1x1y15E = {  "_ZN3ccc8CC1x1y15E", // class name
  bases__ZN3ccc8CC1x1y15E, 2,
  &(vtc__ZN3ccc8CC1x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x1y15  : virtual ::ccc::AA1 , virtual ::ccc::BB1 {
  ~DD1x1y15(); // tgen
  DD1x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x1y15 ::~DD1x1y15(){ note_dtor("_ZN3ccc8DD1x1y15E", this);} // tgen
ccc::DD1x1y15 ::DD1x1y15(){ note_ctor("_ZN3ccc8DD1x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x1y15E, buf);
    ::ccc::DD1x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x1y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD1x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x1y15E);
    dp->::ccc::DD1x1y15::~DD1x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x1y15E(Test__ZN3ccc8DD1x1y15E, "_ZN3ccc8DD1x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x1y15C1Ev();
extern void _ZN3ccc8DD1x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x1y15E[] = {
  NSPAIR(_ZN3ccc8DD1x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD1x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x1y15E[] = {
  {&(_ZTVN3ccc8DD1x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x1y15E[];
Class_Descriptor cd__ZN3ccc8DD1x1y15E = {  "_ZN3ccc8DD1x1y15E", // class name
  bases__ZN3ccc8DD1x1y15E, 2,
  &(vtc__ZN3ccc8DD1x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y0  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y03pqrEv
  ~CC1x2y0(); // tgen
  CC1x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y0E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y03abcEv");}
void  ccc::CC1x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y03efgEv");}
void  ccc::CC1x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y03pqrEv");}
ccc::CC1x2y0 ::~CC1x2y0(){ note_dtor("_ZN3ccc7CC1x2y0E", this);} // tgen
ccc::CC1x2y0 ::CC1x2y0(){ note_ctor("_ZN3ccc7CC1x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y0E, buf);
    ::ccc::CC1x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y0E);
    dp->::ccc::CC1x2y0::~CC1x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y0E(Test__ZN3ccc7CC1x2y0E, "_ZN3ccc7CC1x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y0C1Ev();
extern void _ZN3ccc7CC1x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y0E[] = {
  NSPAIR(_ZN3ccc7CC1x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y0E[];
extern void _ZN3ccc7CC1x2y03efgEv();
extern void _ZN3ccc7CC1x2y03abcEv();
extern void _ZN3ccc7CC1x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y03abcEv,_ZTv0_n12_N3ccc7CC1x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03abcEv,_ZThn4_N3ccc7CC1x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y03pqrEv,_ZTv0_n16_N3ccc7CC1x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03pqrEv,_ZThn4_N3ccc7CC1x2y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y03efgEv,_ZTv0_n20_N3ccc7CC1x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03efgEv,_ZThn4_N3ccc7CC1x2y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y03abcEv,_ZTv0_n12_N3ccc7CC1x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y03pqrEv,_ZTv0_n16_N3ccc7CC1x2y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y03efgEv,_ZTv0_n20_N3ccc7CC1x2y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y0E[] = {
  {&(_ZTVN3ccc7CC1x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y0E[];
static VTBL_ENTRY alt_thunk_names493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y03efgEv,_ZTv0_n20_N3ccc7CC1x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y03efgEv,_ZThn4_N3ccc7CC1x2y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y03pqrEv,_ZTv0_n16_N3ccc7CC1x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y03pqrEv,_ZThn4_N3ccc7CC1x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y03abcEv,_ZTv0_n12_N3ccc7CC1x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y03abcEv,_ZThn4_N3ccc7CC1x2y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y0E = {  "_ZN3ccc7CC1x2y0E", // class name
  bases__ZN3ccc7CC1x2y0E, 2,
  &(vtc__ZN3ccc7CC1x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y0E),2, //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  DD1x2y0  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD1x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y03pqrEv
  ~DD1x2y0(); // tgen
  DD1x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y03abcEv");}
void  ccc::DD1x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y03efgEv");}
void  ccc::DD1x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y03pqrEv");}
ccc::DD1x2y0 ::~DD1x2y0(){ note_dtor("_ZN3ccc7DD1x2y0E", this);} // tgen
ccc::DD1x2y0 ::DD1x2y0(){ note_ctor("_ZN3ccc7DD1x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y0E, buf);
    ::ccc::DD1x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y0E);
    dp->::ccc::DD1x2y0::~DD1x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y0E(Test__ZN3ccc7DD1x2y0E, "_ZN3ccc7DD1x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y0C1Ev();
extern void _ZN3ccc7DD1x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y0E[] = {
  NSPAIR(_ZN3ccc7DD1x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y0E[];
extern void _ZN3ccc7DD1x2y03abcEv();
extern void _ZN3ccc7DD1x2y03pqrEv();
extern void _ZN3ccc7DD1x2y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y03efgEv,_ZTv0_n12_N3ccc7DD1x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y03efgEv,_ZThn4_N3ccc7DD1x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y03abcEv,_ZTv0_n16_N3ccc7DD1x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y03abcEv,_ZThn4_N3ccc7DD1x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y03pqrEv,_ZTv0_n20_N3ccc7DD1x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y03pqrEv,_ZThn4_N3ccc7DD1x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y03efgEv,_ZTv0_n12_N3ccc7DD1x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y03abcEv,_ZTv0_n16_N3ccc7DD1x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y03pqrEv,_ZTv0_n20_N3ccc7DD1x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y0E[] = {
  {&(_ZTVN3ccc7DD1x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y0E[];
static VTBL_ENTRY alt_thunk_names494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y03pqrEv,_ZTv0_n20_N3ccc7DD1x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y03pqrEv,_ZThn4_N3ccc7DD1x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y03abcEv,_ZTv0_n16_N3ccc7DD1x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y03abcEv,_ZThn4_N3ccc7DD1x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y03efgEv,_ZTv0_n12_N3ccc7DD1x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y03efgEv,_ZThn4_N3ccc7DD1x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y0E = {  "_ZN3ccc7DD1x2y0E", // class name
  bases__ZN3ccc7DD1x2y0E, 2,
  &(vtc__ZN3ccc7DD1x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y0E),3, //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  CC1x2y1  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x2y13efgEv
  ~CC1x2y1(); // tgen
  CC1x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y1E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y13abcEv");}
void  ccc::CC1x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y13pqrEv");}
void  ccc::CC1x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y13efgEv");}
ccc::CC1x2y1 ::~CC1x2y1(){ note_dtor("_ZN3ccc7CC1x2y1E", this);} // tgen
ccc::CC1x2y1 ::CC1x2y1(){ note_ctor("_ZN3ccc7CC1x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y1E, buf);
    ::ccc::CC1x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y1E);
    dp->::ccc::CC1x2y1::~CC1x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y1E(Test__ZN3ccc7CC1x2y1E, "_ZN3ccc7CC1x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y1C1Ev();
extern void _ZN3ccc7CC1x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y1E[] = {
  NSPAIR(_ZN3ccc7CC1x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y1E[];
extern void _ZN3ccc7CC1x2y13efgEv();
extern void _ZN3ccc7CC1x2y13abcEv();
extern void _ZN3ccc7CC1x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y13abcEv,_ZTv0_n12_N3ccc7CC1x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13abcEv,_ZThn4_N3ccc7CC1x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y13pqrEv,_ZTv0_n16_N3ccc7CC1x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13pqrEv,_ZThn4_N3ccc7CC1x2y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y13efgEv,_ZTv0_n20_N3ccc7CC1x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13efgEv,_ZThn4_N3ccc7CC1x2y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y13abcEv,_ZTv0_n12_N3ccc7CC1x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y13pqrEv,_ZTv0_n16_N3ccc7CC1x2y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y13efgEv,_ZTv0_n20_N3ccc7CC1x2y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y1E[] = {
  {&(_ZTVN3ccc7CC1x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y1E[];
static VTBL_ENTRY alt_thunk_names495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y13efgEv,_ZTv0_n20_N3ccc7CC1x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y13efgEv,_ZThn4_N3ccc7CC1x2y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y13pqrEv,_ZTv0_n16_N3ccc7CC1x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y13pqrEv,_ZThn4_N3ccc7CC1x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y13abcEv,_ZTv0_n12_N3ccc7CC1x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y13abcEv,_ZThn4_N3ccc7CC1x2y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y1E = {  "_ZN3ccc7CC1x2y1E", // class name
  bases__ZN3ccc7CC1x2y1E, 2,
  &(vtc__ZN3ccc7CC1x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y1E),2, //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  DD1x2y1  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD1x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x2y13efgEv
  ~DD1x2y1(); // tgen
  DD1x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y13abcEv");}
void  ccc::DD1x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y13pqrEv");}
void  ccc::DD1x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y13efgEv");}
ccc::DD1x2y1 ::~DD1x2y1(){ note_dtor("_ZN3ccc7DD1x2y1E", this);} // tgen
ccc::DD1x2y1 ::DD1x2y1(){ note_ctor("_ZN3ccc7DD1x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y1E, buf);
    ::ccc::DD1x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y1E);
    dp->::ccc::DD1x2y1::~DD1x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y1E(Test__ZN3ccc7DD1x2y1E, "_ZN3ccc7DD1x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y1C1Ev();
extern void _ZN3ccc7DD1x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y1E[] = {
  NSPAIR(_ZN3ccc7DD1x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y1E[];
extern void _ZN3ccc7DD1x2y13abcEv();
extern void _ZN3ccc7DD1x2y13pqrEv();
extern void _ZN3ccc7DD1x2y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y13efgEv,_ZTv0_n12_N3ccc7DD1x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y13efgEv,_ZThn4_N3ccc7DD1x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y13abcEv,_ZTv0_n16_N3ccc7DD1x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y13abcEv,_ZThn4_N3ccc7DD1x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y13pqrEv,_ZTv0_n20_N3ccc7DD1x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y13pqrEv,_ZThn4_N3ccc7DD1x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y13efgEv,_ZTv0_n12_N3ccc7DD1x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y13abcEv,_ZTv0_n16_N3ccc7DD1x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y13pqrEv,_ZTv0_n20_N3ccc7DD1x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y1E[] = {
  {&(_ZTVN3ccc7DD1x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y1E[];
static VTBL_ENTRY alt_thunk_names496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y13pqrEv,_ZTv0_n20_N3ccc7DD1x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y13pqrEv,_ZThn4_N3ccc7DD1x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y13abcEv,_ZTv0_n16_N3ccc7DD1x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y13abcEv,_ZThn4_N3ccc7DD1x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y13efgEv,_ZTv0_n12_N3ccc7DD1x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y13efgEv,_ZThn4_N3ccc7DD1x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y1E = {  "_ZN3ccc7DD1x2y1E", // class name
  bases__ZN3ccc7DD1x2y1E, 2,
  &(vtc__ZN3ccc7DD1x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y1E),3, //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  CC1x2y2  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y23pqrEv
  ~CC1x2y2(); // tgen
  CC1x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y2E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y23efgEv");}
void  ccc::CC1x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y23abcEv");}
void  ccc::CC1x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y23pqrEv");}
ccc::CC1x2y2 ::~CC1x2y2(){ note_dtor("_ZN3ccc7CC1x2y2E", this);} // tgen
ccc::CC1x2y2 ::CC1x2y2(){ note_ctor("_ZN3ccc7CC1x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y2E, buf);
    ::ccc::CC1x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y2E);
    dp->::ccc::CC1x2y2::~CC1x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y2E(Test__ZN3ccc7CC1x2y2E, "_ZN3ccc7CC1x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y2C1Ev();
extern void _ZN3ccc7CC1x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y2E[] = {
  NSPAIR(_ZN3ccc7CC1x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y2E[];
extern void _ZN3ccc7CC1x2y23efgEv();
extern void _ZN3ccc7CC1x2y23abcEv();
extern void _ZN3ccc7CC1x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y23abcEv,_ZTv0_n12_N3ccc7CC1x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23abcEv,_ZThn4_N3ccc7CC1x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y23pqrEv,_ZTv0_n16_N3ccc7CC1x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23pqrEv,_ZThn4_N3ccc7CC1x2y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y23efgEv,_ZTv0_n20_N3ccc7CC1x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23efgEv,_ZThn4_N3ccc7CC1x2y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y23abcEv,_ZTv0_n12_N3ccc7CC1x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y23pqrEv,_ZTv0_n16_N3ccc7CC1x2y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y23efgEv,_ZTv0_n20_N3ccc7CC1x2y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y2E[] = {
  {&(_ZTVN3ccc7CC1x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y2E[];
static VTBL_ENTRY alt_thunk_names497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y23efgEv,_ZTv0_n20_N3ccc7CC1x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y23efgEv,_ZThn4_N3ccc7CC1x2y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y23pqrEv,_ZTv0_n16_N3ccc7CC1x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y23pqrEv,_ZThn4_N3ccc7CC1x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y23abcEv,_ZTv0_n12_N3ccc7CC1x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y23abcEv,_ZThn4_N3ccc7CC1x2y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y2E = {  "_ZN3ccc7CC1x2y2E", // class name
  bases__ZN3ccc7CC1x2y2E, 2,
  &(vtc__ZN3ccc7CC1x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y2E),2, //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  DD1x2y2  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD1x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y23pqrEv
  ~DD1x2y2(); // tgen
  DD1x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y23efgEv");}
void  ccc::DD1x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y23abcEv");}
void  ccc::DD1x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y23pqrEv");}
ccc::DD1x2y2 ::~DD1x2y2(){ note_dtor("_ZN3ccc7DD1x2y2E", this);} // tgen
ccc::DD1x2y2 ::DD1x2y2(){ note_ctor("_ZN3ccc7DD1x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y2E, buf);
    ::ccc::DD1x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y2E);
    dp->::ccc::DD1x2y2::~DD1x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y2E(Test__ZN3ccc7DD1x2y2E, "_ZN3ccc7DD1x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y2C1Ev();
extern void _ZN3ccc7DD1x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y2E[] = {
  NSPAIR(_ZN3ccc7DD1x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y2E[];
extern void _ZN3ccc7DD1x2y23abcEv();
extern void _ZN3ccc7DD1x2y23pqrEv();
extern void _ZN3ccc7DD1x2y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y23efgEv,_ZTv0_n12_N3ccc7DD1x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y23efgEv,_ZThn4_N3ccc7DD1x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y23abcEv,_ZTv0_n16_N3ccc7DD1x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y23abcEv,_ZThn4_N3ccc7DD1x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y23pqrEv,_ZTv0_n20_N3ccc7DD1x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y23pqrEv,_ZThn4_N3ccc7DD1x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y23efgEv,_ZTv0_n12_N3ccc7DD1x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y23abcEv,_ZTv0_n16_N3ccc7DD1x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y23pqrEv,_ZTv0_n20_N3ccc7DD1x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y2E[] = {
  {&(_ZTVN3ccc7DD1x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y2E[];
static VTBL_ENTRY alt_thunk_names498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y23pqrEv,_ZTv0_n20_N3ccc7DD1x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y23pqrEv,_ZThn4_N3ccc7DD1x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y23abcEv,_ZTv0_n16_N3ccc7DD1x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y23abcEv,_ZThn4_N3ccc7DD1x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y23efgEv,_ZTv0_n12_N3ccc7DD1x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y23efgEv,_ZThn4_N3ccc7DD1x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y2E = {  "_ZN3ccc7DD1x2y2E", // class name
  bases__ZN3ccc7DD1x2y2E, 2,
  &(vtc__ZN3ccc7DD1x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y2E),3, //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  CC1x2y3  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x2y33abcEv
  ~CC1x2y3(); // tgen
  CC1x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y3E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y33efgEv");}
void  ccc::CC1x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y33pqrEv");}
void  ccc::CC1x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y33abcEv");}
ccc::CC1x2y3 ::~CC1x2y3(){ note_dtor("_ZN3ccc7CC1x2y3E", this);} // tgen
ccc::CC1x2y3 ::CC1x2y3(){ note_ctor("_ZN3ccc7CC1x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y3E, buf);
    ::ccc::CC1x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y3E);
    dp->::ccc::CC1x2y3::~CC1x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y3E(Test__ZN3ccc7CC1x2y3E, "_ZN3ccc7CC1x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y3C1Ev();
extern void _ZN3ccc7CC1x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y3E[] = {
  NSPAIR(_ZN3ccc7CC1x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y3E[];
extern void _ZN3ccc7CC1x2y33efgEv();
extern void _ZN3ccc7CC1x2y33abcEv();
extern void _ZN3ccc7CC1x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y33abcEv,_ZTv0_n12_N3ccc7CC1x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33abcEv,_ZThn4_N3ccc7CC1x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y33pqrEv,_ZTv0_n16_N3ccc7CC1x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33pqrEv,_ZThn4_N3ccc7CC1x2y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y33efgEv,_ZTv0_n20_N3ccc7CC1x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33efgEv,_ZThn4_N3ccc7CC1x2y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y33abcEv,_ZTv0_n12_N3ccc7CC1x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y33pqrEv,_ZTv0_n16_N3ccc7CC1x2y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y33efgEv,_ZTv0_n20_N3ccc7CC1x2y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y3E[] = {
  {&(_ZTVN3ccc7CC1x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y3E[];
static VTBL_ENTRY alt_thunk_names499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y33efgEv,_ZTv0_n20_N3ccc7CC1x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y33efgEv,_ZThn4_N3ccc7CC1x2y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y33pqrEv,_ZTv0_n16_N3ccc7CC1x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y33pqrEv,_ZThn4_N3ccc7CC1x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y33abcEv,_ZTv0_n12_N3ccc7CC1x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y33abcEv,_ZThn4_N3ccc7CC1x2y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y3E = {  "_ZN3ccc7CC1x2y3E", // class name
  bases__ZN3ccc7CC1x2y3E, 2,
  &(vtc__ZN3ccc7CC1x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y3E),2, //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  DD1x2y3  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD1x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x2y33abcEv
  ~DD1x2y3(); // tgen
  DD1x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y33efgEv");}
void  ccc::DD1x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y33pqrEv");}
void  ccc::DD1x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y33abcEv");}
ccc::DD1x2y3 ::~DD1x2y3(){ note_dtor("_ZN3ccc7DD1x2y3E", this);} // tgen
ccc::DD1x2y3 ::DD1x2y3(){ note_ctor("_ZN3ccc7DD1x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y3E, buf);
    ::ccc::DD1x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y3E);
    dp->::ccc::DD1x2y3::~DD1x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y3E(Test__ZN3ccc7DD1x2y3E, "_ZN3ccc7DD1x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y3C1Ev();
extern void _ZN3ccc7DD1x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y3E[] = {
  NSPAIR(_ZN3ccc7DD1x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y3E[];
extern void _ZN3ccc7DD1x2y33abcEv();
extern void _ZN3ccc7DD1x2y33pqrEv();
extern void _ZN3ccc7DD1x2y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y33efgEv,_ZTv0_n12_N3ccc7DD1x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y33efgEv,_ZThn4_N3ccc7DD1x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y33abcEv,_ZTv0_n16_N3ccc7DD1x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y33abcEv,_ZThn4_N3ccc7DD1x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y33pqrEv,_ZTv0_n20_N3ccc7DD1x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y33pqrEv,_ZThn4_N3ccc7DD1x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y33efgEv,_ZTv0_n12_N3ccc7DD1x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y33abcEv,_ZTv0_n16_N3ccc7DD1x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y33pqrEv,_ZTv0_n20_N3ccc7DD1x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y3E[] = {
  {&(_ZTVN3ccc7DD1x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y3E[];
static VTBL_ENTRY alt_thunk_names500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y33pqrEv,_ZTv0_n20_N3ccc7DD1x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y33pqrEv,_ZThn4_N3ccc7DD1x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y33abcEv,_ZTv0_n16_N3ccc7DD1x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y33abcEv,_ZThn4_N3ccc7DD1x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y33efgEv,_ZTv0_n12_N3ccc7DD1x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y33efgEv,_ZThn4_N3ccc7DD1x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y3E = {  "_ZN3ccc7DD1x2y3E", // class name
  bases__ZN3ccc7DD1x2y3E, 2,
  &(vtc__ZN3ccc7DD1x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y3E),3, //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  CC1x2y4  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC1x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y43efgEv
  ~CC1x2y4(); // tgen
  CC1x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y4E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y43pqrEv");}
void  ccc::CC1x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y43abcEv");}
void  ccc::CC1x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y43efgEv");}
ccc::CC1x2y4 ::~CC1x2y4(){ note_dtor("_ZN3ccc7CC1x2y4E", this);} // tgen
ccc::CC1x2y4 ::CC1x2y4(){ note_ctor("_ZN3ccc7CC1x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y4E, buf);
    ::ccc::CC1x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y4E);
    dp->::ccc::CC1x2y4::~CC1x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y4E(Test__ZN3ccc7CC1x2y4E, "_ZN3ccc7CC1x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y4C1Ev();
extern void _ZN3ccc7CC1x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y4E[] = {
  NSPAIR(_ZN3ccc7CC1x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y4E[];
extern void _ZN3ccc7CC1x2y43efgEv();
extern void _ZN3ccc7CC1x2y43abcEv();
extern void _ZN3ccc7CC1x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y43abcEv,_ZTv0_n12_N3ccc7CC1x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43abcEv,_ZThn4_N3ccc7CC1x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y43pqrEv,_ZTv0_n16_N3ccc7CC1x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43pqrEv,_ZThn4_N3ccc7CC1x2y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y43efgEv,_ZTv0_n20_N3ccc7CC1x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43efgEv,_ZThn4_N3ccc7CC1x2y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y43abcEv,_ZTv0_n12_N3ccc7CC1x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y43pqrEv,_ZTv0_n16_N3ccc7CC1x2y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y43efgEv,_ZTv0_n20_N3ccc7CC1x2y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y4E[] = {
  {&(_ZTVN3ccc7CC1x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y4E[];
static VTBL_ENTRY alt_thunk_names501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y43efgEv,_ZTv0_n20_N3ccc7CC1x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y43efgEv,_ZThn4_N3ccc7CC1x2y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y43pqrEv,_ZTv0_n16_N3ccc7CC1x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y43pqrEv,_ZThn4_N3ccc7CC1x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y43abcEv,_ZTv0_n12_N3ccc7CC1x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y43abcEv,_ZThn4_N3ccc7CC1x2y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y4E = {  "_ZN3ccc7CC1x2y4E", // class name
  bases__ZN3ccc7CC1x2y4E, 2,
  &(vtc__ZN3ccc7CC1x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y4E),2, //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  DD1x2y4  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD1x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x2y43efgEv
  ~DD1x2y4(); // tgen
  DD1x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y43pqrEv");}
void  ccc::DD1x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y43abcEv");}
void  ccc::DD1x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y43efgEv");}
ccc::DD1x2y4 ::~DD1x2y4(){ note_dtor("_ZN3ccc7DD1x2y4E", this);} // tgen
ccc::DD1x2y4 ::DD1x2y4(){ note_ctor("_ZN3ccc7DD1x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y4E, buf);
    ::ccc::DD1x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y4E);
    dp->::ccc::DD1x2y4::~DD1x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y4E(Test__ZN3ccc7DD1x2y4E, "_ZN3ccc7DD1x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y4C1Ev();
extern void _ZN3ccc7DD1x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y4E[] = {
  NSPAIR(_ZN3ccc7DD1x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y4E[];
extern void _ZN3ccc7DD1x2y43abcEv();
extern void _ZN3ccc7DD1x2y43pqrEv();
extern void _ZN3ccc7DD1x2y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y43efgEv,_ZTv0_n12_N3ccc7DD1x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y43efgEv,_ZThn4_N3ccc7DD1x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y43abcEv,_ZTv0_n16_N3ccc7DD1x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y43abcEv,_ZThn4_N3ccc7DD1x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y43pqrEv,_ZTv0_n20_N3ccc7DD1x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y43pqrEv,_ZThn4_N3ccc7DD1x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y43efgEv,_ZTv0_n12_N3ccc7DD1x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y43abcEv,_ZTv0_n16_N3ccc7DD1x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y43pqrEv,_ZTv0_n20_N3ccc7DD1x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y4E[] = {
  {&(_ZTVN3ccc7DD1x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y4E[];
static VTBL_ENTRY alt_thunk_names502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y43pqrEv,_ZTv0_n20_N3ccc7DD1x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y43pqrEv,_ZThn4_N3ccc7DD1x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y43abcEv,_ZTv0_n16_N3ccc7DD1x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y43abcEv,_ZThn4_N3ccc7DD1x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y43efgEv,_ZTv0_n12_N3ccc7DD1x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y43efgEv,_ZThn4_N3ccc7DD1x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y4E = {  "_ZN3ccc7DD1x2y4E", // class name
  bases__ZN3ccc7DD1x2y4E, 2,
  &(vtc__ZN3ccc7DD1x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y4E),3, //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  CC1x2y5  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC1x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y53abcEv
  ~CC1x2y5(); // tgen
  CC1x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y5E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y53pqrEv");}
void  ccc::CC1x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y53efgEv");}
void  ccc::CC1x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y53abcEv");}
ccc::CC1x2y5 ::~CC1x2y5(){ note_dtor("_ZN3ccc7CC1x2y5E", this);} // tgen
ccc::CC1x2y5 ::CC1x2y5(){ note_ctor("_ZN3ccc7CC1x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y5E, buf);
    ::ccc::CC1x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y5E);
    dp->::ccc::CC1x2y5::~CC1x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y5E(Test__ZN3ccc7CC1x2y5E, "_ZN3ccc7CC1x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y5C1Ev();
extern void _ZN3ccc7CC1x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y5E[] = {
  NSPAIR(_ZN3ccc7CC1x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y5E[];
extern void _ZN3ccc7CC1x2y53efgEv();
extern void _ZN3ccc7CC1x2y53abcEv();
extern void _ZN3ccc7CC1x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y53abcEv,_ZTv0_n12_N3ccc7CC1x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53abcEv,_ZThn4_N3ccc7CC1x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y53pqrEv,_ZTv0_n16_N3ccc7CC1x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53pqrEv,_ZThn4_N3ccc7CC1x2y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y53efgEv,_ZTv0_n20_N3ccc7CC1x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53efgEv,_ZThn4_N3ccc7CC1x2y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y53abcEv,_ZTv0_n12_N3ccc7CC1x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y53pqrEv,_ZTv0_n16_N3ccc7CC1x2y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y53efgEv,_ZTv0_n20_N3ccc7CC1x2y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y5E[] = {
  {&(_ZTVN3ccc7CC1x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y5E[];
static VTBL_ENTRY alt_thunk_names503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y53efgEv,_ZTv0_n20_N3ccc7CC1x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y53efgEv,_ZThn4_N3ccc7CC1x2y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y53pqrEv,_ZTv0_n16_N3ccc7CC1x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y53pqrEv,_ZThn4_N3ccc7CC1x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y53abcEv,_ZTv0_n12_N3ccc7CC1x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y53abcEv,_ZThn4_N3ccc7CC1x2y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y5E = {  "_ZN3ccc7CC1x2y5E", // class name
  bases__ZN3ccc7CC1x2y5E, 2,
  &(vtc__ZN3ccc7CC1x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y5E),2, //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  DD1x2y5  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD1x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x2y53abcEv
  ~DD1x2y5(); // tgen
  DD1x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y53pqrEv");}
void  ccc::DD1x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y53efgEv");}
void  ccc::DD1x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y53abcEv");}
ccc::DD1x2y5 ::~DD1x2y5(){ note_dtor("_ZN3ccc7DD1x2y5E", this);} // tgen
ccc::DD1x2y5 ::DD1x2y5(){ note_ctor("_ZN3ccc7DD1x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y5E, buf);
    ::ccc::DD1x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y5E);
    dp->::ccc::DD1x2y5::~DD1x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y5E(Test__ZN3ccc7DD1x2y5E, "_ZN3ccc7DD1x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y5C1Ev();
extern void _ZN3ccc7DD1x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y5E[] = {
  NSPAIR(_ZN3ccc7DD1x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y5E[];
extern void _ZN3ccc7DD1x2y53abcEv();
extern void _ZN3ccc7DD1x2y53pqrEv();
extern void _ZN3ccc7DD1x2y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y53efgEv,_ZTv0_n12_N3ccc7DD1x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y53efgEv,_ZThn4_N3ccc7DD1x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y53abcEv,_ZTv0_n16_N3ccc7DD1x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y53abcEv,_ZThn4_N3ccc7DD1x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y53pqrEv,_ZTv0_n20_N3ccc7DD1x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y53pqrEv,_ZThn4_N3ccc7DD1x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y53efgEv,_ZTv0_n12_N3ccc7DD1x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y53abcEv,_ZTv0_n16_N3ccc7DD1x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y53pqrEv,_ZTv0_n20_N3ccc7DD1x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y5E[] = {
  {&(_ZTVN3ccc7DD1x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y5E[];
static VTBL_ENTRY alt_thunk_names504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y53pqrEv,_ZTv0_n20_N3ccc7DD1x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y53pqrEv,_ZThn4_N3ccc7DD1x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y53abcEv,_ZTv0_n16_N3ccc7DD1x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y53abcEv,_ZThn4_N3ccc7DD1x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y53efgEv,_ZTv0_n12_N3ccc7DD1x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y53efgEv,_ZThn4_N3ccc7DD1x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y5E = {  "_ZN3ccc7DD1x2y5E", // class name
  bases__ZN3ccc7DD1x2y5E, 2,
  &(vtc__ZN3ccc7DD1x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y5E),3, //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  CC1x2y6  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y63efgEv
  ~CC1x2y6(); // tgen
  CC1x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y6E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y63abcEv");}
void  ccc::CC1x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y63efgEv");}
ccc::CC1x2y6 ::~CC1x2y6(){ note_dtor("_ZN3ccc7CC1x2y6E", this);} // tgen
ccc::CC1x2y6 ::CC1x2y6(){ note_ctor("_ZN3ccc7CC1x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y6E, buf);
    ::ccc::CC1x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y6E);
    dp->::ccc::CC1x2y6::~CC1x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y6E(Test__ZN3ccc7CC1x2y6E, "_ZN3ccc7CC1x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y6C1Ev();
extern void _ZN3ccc7CC1x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y6E[] = {
  NSPAIR(_ZN3ccc7CC1x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y6E[];
extern void _ZN3ccc7CC1x2y63efgEv();
extern void _ZN3ccc7CC1x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y63abcEv,_ZTv0_n12_N3ccc7CC1x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y63abcEv,_ZThn4_N3ccc7CC1x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y63efgEv,_ZTv0_n20_N3ccc7CC1x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y63efgEv,_ZThn4_N3ccc7CC1x2y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y63abcEv,_ZTv0_n12_N3ccc7CC1x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y63efgEv,_ZTv0_n20_N3ccc7CC1x2y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y6E[] = {
  {&(_ZTVN3ccc7CC1x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y6E[];
static VTBL_ENTRY alt_thunk_names505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y63efgEv,_ZTv0_n20_N3ccc7CC1x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y63efgEv,_ZThn4_N3ccc7CC1x2y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y63abcEv,_ZTv0_n12_N3ccc7CC1x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y63abcEv,_ZThn4_N3ccc7CC1x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y6E = {  "_ZN3ccc7CC1x2y6E", // class name
  bases__ZN3ccc7CC1x2y6E, 2,
  &(vtc__ZN3ccc7CC1x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y6E),2, //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  DD1x2y6  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD1x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x2y63efgEv
  ~DD1x2y6(); // tgen
  DD1x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y63abcEv");}
void  ccc::DD1x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y63efgEv");}
ccc::DD1x2y6 ::~DD1x2y6(){ note_dtor("_ZN3ccc7DD1x2y6E", this);} // tgen
ccc::DD1x2y6 ::DD1x2y6(){ note_ctor("_ZN3ccc7DD1x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y6E, buf);
    ::ccc::DD1x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y6E);
    dp->::ccc::DD1x2y6::~DD1x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y6E(Test__ZN3ccc7DD1x2y6E, "_ZN3ccc7DD1x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y6C1Ev();
extern void _ZN3ccc7DD1x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y6E[] = {
  NSPAIR(_ZN3ccc7DD1x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y6E[];
extern void _ZN3ccc7DD1x2y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x2y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y63efgEv,_ZTv0_n12_N3ccc7DD1x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y63efgEv,_ZThn4_N3ccc7DD1x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y63abcEv,_ZTv0_n16_N3ccc7DD1x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y63abcEv,_ZThn4_N3ccc7DD1x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y63efgEv,_ZTv0_n12_N3ccc7DD1x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y63abcEv,_ZTv0_n16_N3ccc7DD1x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y6E[] = {
  {&(_ZTVN3ccc7DD1x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y6E[];
static VTBL_ENTRY alt_thunk_names506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y63abcEv,_ZTv0_n16_N3ccc7DD1x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y63abcEv,_ZThn4_N3ccc7DD1x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y63efgEv,_ZTv0_n12_N3ccc7DD1x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y63efgEv,_ZThn4_N3ccc7DD1x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y6E = {  "_ZN3ccc7DD1x2y6E", // class name
  bases__ZN3ccc7DD1x2y6E, 2,
  &(vtc__ZN3ccc7DD1x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y6E),3, //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  CC1x2y7  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y73pqrEv
  ~CC1x2y7(); // tgen
  CC1x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y7E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y73abcEv");}
void  ccc::CC1x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y73pqrEv");}
ccc::CC1x2y7 ::~CC1x2y7(){ note_dtor("_ZN3ccc7CC1x2y7E", this);} // tgen
ccc::CC1x2y7 ::CC1x2y7(){ note_ctor("_ZN3ccc7CC1x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y7E, buf);
    ::ccc::CC1x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y7E);
    dp->::ccc::CC1x2y7::~CC1x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y7E(Test__ZN3ccc7CC1x2y7E, "_ZN3ccc7CC1x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y7C1Ev();
extern void _ZN3ccc7CC1x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y7E[] = {
  NSPAIR(_ZN3ccc7CC1x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC1x2y73abcEv();
extern void _ZN3ccc7CC1x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y73abcEv,_ZTv0_n12_N3ccc7CC1x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y73abcEv,_ZThn4_N3ccc7CC1x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y73pqrEv,_ZTv0_n16_N3ccc7CC1x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y73pqrEv,_ZThn4_N3ccc7CC1x2y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y73abcEv,_ZTv0_n12_N3ccc7CC1x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y73pqrEv,_ZTv0_n16_N3ccc7CC1x2y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y7E[] = {
  {&(_ZTVN3ccc7CC1x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y7E[];
static VTBL_ENTRY alt_thunk_names507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y73pqrEv,_ZTv0_n16_N3ccc7CC1x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y73pqrEv,_ZThn4_N3ccc7CC1x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y73abcEv,_ZTv0_n12_N3ccc7CC1x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y73abcEv,_ZThn4_N3ccc7CC1x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y7E = {  "_ZN3ccc7CC1x2y7E", // class name
  bases__ZN3ccc7CC1x2y7E, 2,
  &(vtc__ZN3ccc7CC1x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y7E),2, //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  DD1x2y7  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD1x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y73pqrEv
  ~DD1x2y7(); // tgen
  DD1x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y73abcEv");}
void  ccc::DD1x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y73pqrEv");}
ccc::DD1x2y7 ::~DD1x2y7(){ note_dtor("_ZN3ccc7DD1x2y7E", this);} // tgen
ccc::DD1x2y7 ::DD1x2y7(){ note_ctor("_ZN3ccc7DD1x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y7E, buf);
    ::ccc::DD1x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y7E);
    dp->::ccc::DD1x2y7::~DD1x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y7E(Test__ZN3ccc7DD1x2y7E, "_ZN3ccc7DD1x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y7C1Ev();
extern void _ZN3ccc7DD1x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y7E[] = {
  NSPAIR(_ZN3ccc7DD1x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y7E[];
extern void _ZN3ccc7DD1x2y73abcEv();
extern void _ZN3ccc7DD1x2y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y73abcEv,_ZTv0_n16_N3ccc7DD1x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y73abcEv,_ZThn4_N3ccc7DD1x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y73pqrEv,_ZTv0_n20_N3ccc7DD1x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y73pqrEv,_ZThn4_N3ccc7DD1x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y73abcEv,_ZTv0_n16_N3ccc7DD1x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y73pqrEv,_ZTv0_n20_N3ccc7DD1x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y7E[] = {
  {&(_ZTVN3ccc7DD1x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y7E[];
static VTBL_ENTRY alt_thunk_names508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y73pqrEv,_ZTv0_n20_N3ccc7DD1x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y73pqrEv,_ZThn4_N3ccc7DD1x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y73abcEv,_ZTv0_n16_N3ccc7DD1x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y73abcEv,_ZThn4_N3ccc7DD1x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y7E = {  "_ZN3ccc7DD1x2y7E", // class name
  bases__ZN3ccc7DD1x2y7E, 2,
  &(vtc__ZN3ccc7DD1x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y7E),3, //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  CC1x2y8  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y83abcEv
  ~CC1x2y8(); // tgen
  CC1x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y8E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y83efgEv");}
void  ccc::CC1x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y83abcEv");}
ccc::CC1x2y8 ::~CC1x2y8(){ note_dtor("_ZN3ccc7CC1x2y8E", this);} // tgen
ccc::CC1x2y8 ::CC1x2y8(){ note_ctor("_ZN3ccc7CC1x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y8E, buf);
    ::ccc::CC1x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y8E);
    dp->::ccc::CC1x2y8::~CC1x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y8E(Test__ZN3ccc7CC1x2y8E, "_ZN3ccc7CC1x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y8C1Ev();
extern void _ZN3ccc7CC1x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y8E[] = {
  NSPAIR(_ZN3ccc7CC1x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y8E[];
extern void _ZN3ccc7CC1x2y83efgEv();
extern void _ZN3ccc7CC1x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x2y83abcEv,_ZTv0_n12_N3ccc7CC1x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y83abcEv,_ZThn4_N3ccc7CC1x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y83efgEv,_ZTv0_n20_N3ccc7CC1x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y83efgEv,_ZThn4_N3ccc7CC1x2y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x2y83abcEv,_ZTv0_n12_N3ccc7CC1x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y83efgEv,_ZTv0_n20_N3ccc7CC1x2y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y8E[] = {
  {&(_ZTVN3ccc7CC1x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y8E[];
static VTBL_ENTRY alt_thunk_names509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y83efgEv,_ZTv0_n20_N3ccc7CC1x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y83efgEv,_ZThn4_N3ccc7CC1x2y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x2y83abcEv,_ZTv0_n12_N3ccc7CC1x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y83abcEv,_ZThn4_N3ccc7CC1x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y8E = {  "_ZN3ccc7CC1x2y8E", // class name
  bases__ZN3ccc7CC1x2y8E, 2,
  &(vtc__ZN3ccc7CC1x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y8E),2, //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  DD1x2y8  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD1x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x2y83abcEv
  ~DD1x2y8(); // tgen
  DD1x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y83efgEv");}
void  ccc::DD1x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x2y83abcEv");}
ccc::DD1x2y8 ::~DD1x2y8(){ note_dtor("_ZN3ccc7DD1x2y8E", this);} // tgen
ccc::DD1x2y8 ::DD1x2y8(){ note_ctor("_ZN3ccc7DD1x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y8E, buf);
    ::ccc::DD1x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y8E);
    dp->::ccc::DD1x2y8::~DD1x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y8E(Test__ZN3ccc7DD1x2y8E, "_ZN3ccc7DD1x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y8C1Ev();
extern void _ZN3ccc7DD1x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y8E[] = {
  NSPAIR(_ZN3ccc7DD1x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y8E[];
extern void _ZN3ccc7DD1x2y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x2y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y83efgEv,_ZTv0_n12_N3ccc7DD1x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y83efgEv,_ZThn4_N3ccc7DD1x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x2y83abcEv,_ZTv0_n16_N3ccc7DD1x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y83abcEv,_ZThn4_N3ccc7DD1x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y83efgEv,_ZTv0_n12_N3ccc7DD1x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x2y83abcEv,_ZTv0_n16_N3ccc7DD1x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y8E[] = {
  {&(_ZTVN3ccc7DD1x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y8E[];
static VTBL_ENTRY alt_thunk_names510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x2y83abcEv,_ZTv0_n16_N3ccc7DD1x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y83abcEv,_ZThn4_N3ccc7DD1x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y83efgEv,_ZTv0_n12_N3ccc7DD1x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y83efgEv,_ZThn4_N3ccc7DD1x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y8E = {  "_ZN3ccc7DD1x2y8E", // class name
  bases__ZN3ccc7DD1x2y8E, 2,
  &(vtc__ZN3ccc7DD1x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y8E),3, //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  CC1x2y9  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y93pqrEv
  ~CC1x2y9(); // tgen
  CC1x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y9E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y93efgEv");}
void  ccc::CC1x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y93pqrEv");}
ccc::CC1x2y9 ::~CC1x2y9(){ note_dtor("_ZN3ccc7CC1x2y9E", this);} // tgen
ccc::CC1x2y9 ::CC1x2y9(){ note_ctor("_ZN3ccc7CC1x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y9E, buf);
    ::ccc::CC1x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC1x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y9E);
    dp->::ccc::CC1x2y9::~CC1x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y9E(Test__ZN3ccc7CC1x2y9E, "_ZN3ccc7CC1x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y9C1Ev();
extern void _ZN3ccc7CC1x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y9E[] = {
  NSPAIR(_ZN3ccc7CC1x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y9E[];
extern void _ZN3ccc7CC1x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC1x2y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x2y93pqrEv,_ZTv0_n16_N3ccc7CC1x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y93pqrEv,_ZThn4_N3ccc7CC1x2y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x2y93efgEv,_ZTv0_n20_N3ccc7CC1x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y93efgEv,_ZThn4_N3ccc7CC1x2y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x2y93pqrEv,_ZTv0_n16_N3ccc7CC1x2y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x2y93efgEv,_ZTv0_n20_N3ccc7CC1x2y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x2y9E[] = {
  {&(_ZTVN3ccc7CC1x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x2y9E[];
static VTBL_ENTRY alt_thunk_names511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x2y93efgEv,_ZTv0_n20_N3ccc7CC1x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y93efgEv,_ZThn4_N3ccc7CC1x2y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x2y93pqrEv,_ZTv0_n16_N3ccc7CC1x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x2y93pqrEv,_ZThn4_N3ccc7CC1x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x2y9E = {  "_ZN3ccc7CC1x2y9E", // class name
  bases__ZN3ccc7CC1x2y9E, 2,
  &(vtc__ZN3ccc7CC1x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x2y9E),2, //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  DD1x2y9  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD1x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x2y93pqrEv
  ~DD1x2y9(); // tgen
  DD1x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x2y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x2y93efgEv");}
void  ccc::DD1x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x2y93pqrEv");}
ccc::DD1x2y9 ::~DD1x2y9(){ note_dtor("_ZN3ccc7DD1x2y9E", this);} // tgen
ccc::DD1x2y9 ::DD1x2y9(){ note_ctor("_ZN3ccc7DD1x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x2y9E, buf);
    ::ccc::DD1x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x2y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD1x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x2y9E);
    dp->::ccc::DD1x2y9::~DD1x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x2y9E(Test__ZN3ccc7DD1x2y9E, "_ZN3ccc7DD1x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x2y9C1Ev();
extern void _ZN3ccc7DD1x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x2y9E[] = {
  NSPAIR(_ZN3ccc7DD1x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD1x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x2y93pqrEv();
extern void _ZN3ccc7DD1x2y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x2y93efgEv,_ZTv0_n12_N3ccc7DD1x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y93efgEv,_ZThn4_N3ccc7DD1x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x2y93pqrEv,_ZTv0_n20_N3ccc7DD1x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x2y93pqrEv,_ZThn4_N3ccc7DD1x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x2y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x2y93efgEv,_ZTv0_n12_N3ccc7DD1x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x2y93pqrEv,_ZTv0_n20_N3ccc7DD1x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x2y9E[] = {
  {&(_ZTVN3ccc7DD1x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x2y9E[];
static VTBL_ENTRY alt_thunk_names512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x2y93pqrEv,_ZTv0_n20_N3ccc7DD1x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y93pqrEv,_ZThn4_N3ccc7DD1x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x2y93efgEv,_ZTv0_n12_N3ccc7DD1x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x2y93efgEv,_ZThn4_N3ccc7DD1x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x2y9E = {  "_ZN3ccc7DD1x2y9E", // class name
  bases__ZN3ccc7DD1x2y9E, 2,
  &(vtc__ZN3ccc7DD1x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x2y9E),3, //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  CC1x2y10  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x2y103abcEv
  ~CC1x2y10(); // tgen
  CC1x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y10E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y103pqrEv");}
void  ccc::CC1x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x2y103abcEv");}
ccc::CC1x2y10 ::~CC1x2y10(){ note_dtor("_ZN3ccc8CC1x2y10E", this);} // tgen
ccc::CC1x2y10 ::CC1x2y10(){ note_ctor("_ZN3ccc8CC1x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y10E, buf);
    ::ccc::CC1x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y10E);
    dp->::ccc::CC1x2y10::~CC1x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y10E(Test__ZN3ccc8CC1x2y10E, "_ZN3ccc8CC1x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y10C1Ev();
extern void _ZN3ccc8CC1x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y10E[] = {
  NSPAIR(_ZN3ccc8CC1x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC1x2y103abcEv();
extern void _ZN3ccc8CC1x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x2y103abcEv,_ZTv0_n12_N3ccc8CC1x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y103abcEv,_ZThn4_N3ccc8CC1x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x2y103pqrEv,_ZTv0_n16_N3ccc8CC1x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y103pqrEv,_ZThn4_N3ccc8CC1x2y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x2y103abcEv,_ZTv0_n12_N3ccc8CC1x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x2y103pqrEv,_ZTv0_n16_N3ccc8CC1x2y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y10E[] = {
  {&(_ZTVN3ccc8CC1x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y10E[];
static VTBL_ENTRY alt_thunk_names513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x2y103pqrEv,_ZTv0_n16_N3ccc8CC1x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y103pqrEv,_ZThn4_N3ccc8CC1x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x2y103abcEv,_ZTv0_n12_N3ccc8CC1x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y103abcEv,_ZThn4_N3ccc8CC1x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x2y10E = {  "_ZN3ccc8CC1x2y10E", // class name
  bases__ZN3ccc8CC1x2y10E, 2,
  &(vtc__ZN3ccc8CC1x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y10E),2, //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  DD1x2y10  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD1x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x2y103abcEv
  ~DD1x2y10(); // tgen
  DD1x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x2y103pqrEv");}
void  ccc::DD1x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x2y103abcEv");}
ccc::DD1x2y10 ::~DD1x2y10(){ note_dtor("_ZN3ccc8DD1x2y10E", this);} // tgen
ccc::DD1x2y10 ::DD1x2y10(){ note_ctor("_ZN3ccc8DD1x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y10E, buf);
    ::ccc::DD1x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y10E);
    dp->::ccc::DD1x2y10::~DD1x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y10E(Test__ZN3ccc8DD1x2y10E, "_ZN3ccc8DD1x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y10C1Ev();
extern void _ZN3ccc8DD1x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y10E[] = {
  NSPAIR(_ZN3ccc8DD1x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y10E[];
extern void _ZN3ccc8DD1x2y103abcEv();
extern void _ZN3ccc8DD1x2y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x2y103abcEv,_ZTv0_n16_N3ccc8DD1x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y103abcEv,_ZThn4_N3ccc8DD1x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x2y103pqrEv,_ZTv0_n20_N3ccc8DD1x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y103pqrEv,_ZThn4_N3ccc8DD1x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x2y103abcEv,_ZTv0_n16_N3ccc8DD1x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x2y103pqrEv,_ZTv0_n20_N3ccc8DD1x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y10E[] = {
  {&(_ZTVN3ccc8DD1x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y10E[];
static VTBL_ENTRY alt_thunk_names514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x2y103pqrEv,_ZTv0_n20_N3ccc8DD1x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y103pqrEv,_ZThn4_N3ccc8DD1x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x2y103abcEv,_ZTv0_n16_N3ccc8DD1x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y103abcEv,_ZThn4_N3ccc8DD1x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x2y10E = {  "_ZN3ccc8DD1x2y10E", // class name
  bases__ZN3ccc8DD1x2y10E, 2,
  &(vtc__ZN3ccc8DD1x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y10E),3, //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  CC1x2y11  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x2y113efgEv
  ~CC1x2y11(); // tgen
  CC1x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y11E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y113pqrEv");}
void  ccc::CC1x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x2y113efgEv");}
ccc::CC1x2y11 ::~CC1x2y11(){ note_dtor("_ZN3ccc8CC1x2y11E", this);} // tgen
ccc::CC1x2y11 ::CC1x2y11(){ note_ctor("_ZN3ccc8CC1x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y11E, buf);
    ::ccc::CC1x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y11E);
    dp->::ccc::CC1x2y11::~CC1x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y11E(Test__ZN3ccc8CC1x2y11E, "_ZN3ccc8CC1x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y11C1Ev();
extern void _ZN3ccc8CC1x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y11E[] = {
  NSPAIR(_ZN3ccc8CC1x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y11E[];
extern void _ZN3ccc8CC1x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC1x2y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x2y113pqrEv,_ZTv0_n16_N3ccc8CC1x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y113pqrEv,_ZThn4_N3ccc8CC1x2y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x2y113efgEv,_ZTv0_n20_N3ccc8CC1x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y113efgEv,_ZThn4_N3ccc8CC1x2y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x2y113pqrEv,_ZTv0_n16_N3ccc8CC1x2y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x2y113efgEv,_ZTv0_n20_N3ccc8CC1x2y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y11E[] = {
  {&(_ZTVN3ccc8CC1x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y11E[];
static VTBL_ENTRY alt_thunk_names515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x2y113efgEv,_ZTv0_n20_N3ccc8CC1x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y113efgEv,_ZThn4_N3ccc8CC1x2y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x2y113pqrEv,_ZTv0_n16_N3ccc8CC1x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y113pqrEv,_ZThn4_N3ccc8CC1x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x2y11E = {  "_ZN3ccc8CC1x2y11E", // class name
  bases__ZN3ccc8CC1x2y11E, 2,
  &(vtc__ZN3ccc8CC1x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y11E),2, //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  DD1x2y11  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD1x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x2y113efgEv
  ~DD1x2y11(); // tgen
  DD1x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x2y113pqrEv");}
void  ccc::DD1x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x2y113efgEv");}
ccc::DD1x2y11 ::~DD1x2y11(){ note_dtor("_ZN3ccc8DD1x2y11E", this);} // tgen
ccc::DD1x2y11 ::DD1x2y11(){ note_ctor("_ZN3ccc8DD1x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y11E, buf);
    ::ccc::DD1x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y11E);
    dp->::ccc::DD1x2y11::~DD1x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y11E(Test__ZN3ccc8DD1x2y11E, "_ZN3ccc8DD1x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y11C1Ev();
extern void _ZN3ccc8DD1x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y11E[] = {
  NSPAIR(_ZN3ccc8DD1x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x2y113pqrEv();
extern void _ZN3ccc8DD1x2y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x2y113efgEv,_ZTv0_n12_N3ccc8DD1x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y113efgEv,_ZThn4_N3ccc8DD1x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x2y113pqrEv,_ZTv0_n20_N3ccc8DD1x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y113pqrEv,_ZThn4_N3ccc8DD1x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x2y113efgEv,_ZTv0_n12_N3ccc8DD1x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x2y113pqrEv,_ZTv0_n20_N3ccc8DD1x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y11E[] = {
  {&(_ZTVN3ccc8DD1x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y11E[];
static VTBL_ENTRY alt_thunk_names516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x2y113pqrEv,_ZTv0_n20_N3ccc8DD1x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y113pqrEv,_ZThn4_N3ccc8DD1x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x2y113efgEv,_ZTv0_n12_N3ccc8DD1x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y113efgEv,_ZThn4_N3ccc8DD1x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x2y11E = {  "_ZN3ccc8DD1x2y11E", // class name
  bases__ZN3ccc8DD1x2y11E, 2,
  &(vtc__ZN3ccc8DD1x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y11E),3, //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  CC1x2y12  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC1x2y123abcEv
  ~CC1x2y12(); // tgen
  CC1x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x2y123abcEv");}
ccc::CC1x2y12 ::~CC1x2y12(){ note_dtor("_ZN3ccc8CC1x2y12E", this);} // tgen
ccc::CC1x2y12 ::CC1x2y12(){ note_ctor("_ZN3ccc8CC1x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y12E, buf);
    ::ccc::CC1x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y12E);
    dp->::ccc::CC1x2y12::~CC1x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y12E(Test__ZN3ccc8CC1x2y12E, "_ZN3ccc8CC1x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y12C1Ev();
extern void _ZN3ccc8CC1x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y12E[] = {
  NSPAIR(_ZN3ccc8CC1x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC1x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x2y123abcEv,_ZTv0_n12_N3ccc8CC1x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y123abcEv,_ZThn4_N3ccc8CC1x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x2y123abcEv,_ZTv0_n12_N3ccc8CC1x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y12E[] = {
  {&(_ZTVN3ccc8CC1x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y12E[];
static VTBL_ENTRY alt_thunk_names517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x2y123abcEv,_ZTv0_n12_N3ccc8CC1x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y123abcEv,_ZThn4_N3ccc8CC1x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x2y12E = {  "_ZN3ccc8CC1x2y12E", // class name
  bases__ZN3ccc8CC1x2y12E, 2,
  &(vtc__ZN3ccc8CC1x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y12E),2, //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  DD1x2y12  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD1x2y123abcEv
  ~DD1x2y12(); // tgen
  DD1x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x2y123abcEv");}
ccc::DD1x2y12 ::~DD1x2y12(){ note_dtor("_ZN3ccc8DD1x2y12E", this);} // tgen
ccc::DD1x2y12 ::DD1x2y12(){ note_ctor("_ZN3ccc8DD1x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y12E, buf);
    ::ccc::DD1x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y12E);
    dp->::ccc::DD1x2y12::~DD1x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y12E(Test__ZN3ccc8DD1x2y12E, "_ZN3ccc8DD1x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y12C1Ev();
extern void _ZN3ccc8DD1x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y12E[] = {
  NSPAIR(_ZN3ccc8DD1x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y12E[];
extern void _ZN3ccc8DD1x2y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x2y123abcEv,_ZTv0_n16_N3ccc8DD1x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y123abcEv,_ZThn4_N3ccc8DD1x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x2y123abcEv,_ZTv0_n16_N3ccc8DD1x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y12E[] = {
  {&(_ZTVN3ccc8DD1x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y12E[];
static VTBL_ENTRY alt_thunk_names518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x2y123abcEv,_ZTv0_n16_N3ccc8DD1x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y123abcEv,_ZThn4_N3ccc8DD1x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x2y12E = {  "_ZN3ccc8DD1x2y12E", // class name
  bases__ZN3ccc8DD1x2y12E, 2,
  &(vtc__ZN3ccc8DD1x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y12E),3, //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  CC1x2y13  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC1x2y133efgEv
  ~CC1x2y13(); // tgen
  CC1x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x2y133efgEv");}
ccc::CC1x2y13 ::~CC1x2y13(){ note_dtor("_ZN3ccc8CC1x2y13E", this);} // tgen
ccc::CC1x2y13 ::CC1x2y13(){ note_ctor("_ZN3ccc8CC1x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y13E, buf);
    ::ccc::CC1x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y13E);
    dp->::ccc::CC1x2y13::~CC1x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y13E(Test__ZN3ccc8CC1x2y13E, "_ZN3ccc8CC1x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y13C1Ev();
extern void _ZN3ccc8CC1x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y13E[] = {
  NSPAIR(_ZN3ccc8CC1x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y13E[];
extern void _ZN3ccc8CC1x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x2y133efgEv,_ZTv0_n20_N3ccc8CC1x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y133efgEv,_ZThn4_N3ccc8CC1x2y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x2y133efgEv,_ZTv0_n20_N3ccc8CC1x2y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y13E[] = {
  {&(_ZTVN3ccc8CC1x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y13E[];
static VTBL_ENTRY alt_thunk_names519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x2y133efgEv,_ZTv0_n20_N3ccc8CC1x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y133efgEv,_ZThn4_N3ccc8CC1x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x2y13E = {  "_ZN3ccc8CC1x2y13E", // class name
  bases__ZN3ccc8CC1x2y13E, 2,
  &(vtc__ZN3ccc8CC1x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y13E),2, //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  DD1x2y13  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD1x2y133efgEv
  ~DD1x2y13(); // tgen
  DD1x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x2y133efgEv");}
ccc::DD1x2y13 ::~DD1x2y13(){ note_dtor("_ZN3ccc8DD1x2y13E", this);} // tgen
ccc::DD1x2y13 ::DD1x2y13(){ note_ctor("_ZN3ccc8DD1x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y13E, buf);
    ::ccc::DD1x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y13E);
    dp->::ccc::DD1x2y13::~DD1x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y13E(Test__ZN3ccc8DD1x2y13E, "_ZN3ccc8DD1x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y13C1Ev();
extern void _ZN3ccc8DD1x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y13E[] = {
  NSPAIR(_ZN3ccc8DD1x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x2y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x2y133efgEv,_ZTv0_n12_N3ccc8DD1x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y133efgEv,_ZThn4_N3ccc8DD1x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x2y133efgEv,_ZTv0_n12_N3ccc8DD1x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y13E[] = {
  {&(_ZTVN3ccc8DD1x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y13E[];
static VTBL_ENTRY alt_thunk_names520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x2y133efgEv,_ZTv0_n12_N3ccc8DD1x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y133efgEv,_ZThn4_N3ccc8DD1x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x2y13E = {  "_ZN3ccc8DD1x2y13E", // class name
  bases__ZN3ccc8DD1x2y13E, 2,
  &(vtc__ZN3ccc8DD1x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y13E),3, //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  CC1x2y14  : virtual ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y143pqrEv
  ~CC1x2y14(); // tgen
  CC1x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y143pqrEv");}
ccc::CC1x2y14 ::~CC1x2y14(){ note_dtor("_ZN3ccc8CC1x2y14E", this);} // tgen
ccc::CC1x2y14 ::CC1x2y14(){ note_ctor("_ZN3ccc8CC1x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y14E, buf);
    ::ccc::CC1x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y14E);
    dp->::ccc::CC1x2y14::~CC1x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y14E(Test__ZN3ccc8CC1x2y14E, "_ZN3ccc8CC1x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y14C1Ev();
extern void _ZN3ccc8CC1x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y14E[] = {
  NSPAIR(_ZN3ccc8CC1x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC1x2y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x2y143pqrEv,_ZTv0_n16_N3ccc8CC1x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y143pqrEv,_ZThn4_N3ccc8CC1x2y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x2y143pqrEv,_ZTv0_n16_N3ccc8CC1x2y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y14E[] = {
  {&(_ZTVN3ccc8CC1x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y14E[];
static VTBL_ENTRY alt_thunk_names521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x2y143pqrEv,_ZTv0_n16_N3ccc8CC1x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x2y143pqrEv,_ZThn4_N3ccc8CC1x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x2y14E = {  "_ZN3ccc8CC1x2y14E", // class name
  bases__ZN3ccc8CC1x2y14E, 2,
  &(vtc__ZN3ccc8CC1x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y14E),2, //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  DD1x2y14  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD1x2y143pqrEv
  ~DD1x2y14(); // tgen
  DD1x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x2y143pqrEv");}
ccc::DD1x2y14 ::~DD1x2y14(){ note_dtor("_ZN3ccc8DD1x2y14E", this);} // tgen
ccc::DD1x2y14 ::DD1x2y14(){ note_ctor("_ZN3ccc8DD1x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y14E, buf);
    ::ccc::DD1x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y14E);
    dp->::ccc::DD1x2y14::~DD1x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y14E(Test__ZN3ccc8DD1x2y14E, "_ZN3ccc8DD1x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y14C1Ev();
extern void _ZN3ccc8DD1x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y14E[] = {
  NSPAIR(_ZN3ccc8DD1x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x2y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x2y143pqrEv,_ZTv0_n20_N3ccc8DD1x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x2y143pqrEv,_ZThn4_N3ccc8DD1x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x2y143pqrEv,_ZTv0_n20_N3ccc8DD1x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y14E[] = {
  {&(_ZTVN3ccc8DD1x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y14E[];
static VTBL_ENTRY alt_thunk_names522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x2y143pqrEv,_ZTv0_n20_N3ccc8DD1x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x2y143pqrEv,_ZThn4_N3ccc8DD1x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x2y14E = {  "_ZN3ccc8DD1x2y14E", // class name
  bases__ZN3ccc8DD1x2y14E, 2,
  &(vtc__ZN3ccc8DD1x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y14E),3, //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  CC1x2y15  : virtual ::ccc::AA1 , ::ccc::BB2 {
  ~CC1x2y15(); // tgen
  CC1x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x2y15 ::~CC1x2y15(){ note_dtor("_ZN3ccc8CC1x2y15E", this);} // tgen
ccc::CC1x2y15 ::CC1x2y15(){ note_ctor("_ZN3ccc8CC1x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y15E, buf);
    ::ccc::CC1x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC1x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y15E);
    dp->::ccc::CC1x2y15::~CC1x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y15E(Test__ZN3ccc8CC1x2y15E, "_ZN3ccc8CC1x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y15C1Ev();
extern void _ZN3ccc8CC1x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y15E[] = {
  NSPAIR(_ZN3ccc8CC1x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x2y15E[] = {
  {&(_ZTVN3ccc8CC1x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x2y15E[];
Class_Descriptor cd__ZN3ccc8CC1x2y15E = {  "_ZN3ccc8CC1x2y15E", // class name
  bases__ZN3ccc8CC1x2y15E, 2,
  &(vtc__ZN3ccc8CC1x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x2y15  : virtual ::ccc::AA1 , virtual ::ccc::BB2 {
  ~DD1x2y15(); // tgen
  DD1x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x2y15 ::~DD1x2y15(){ note_dtor("_ZN3ccc8DD1x2y15E", this);} // tgen
ccc::DD1x2y15 ::DD1x2y15(){ note_ctor("_ZN3ccc8DD1x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x2y15E, buf);
    ::ccc::DD1x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x2y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD1x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x2y15E);
    dp->::ccc::DD1x2y15::~DD1x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x2y15E(Test__ZN3ccc8DD1x2y15E, "_ZN3ccc8DD1x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x2y15C1Ev();
extern void _ZN3ccc8DD1x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x2y15E[] = {
  NSPAIR(_ZN3ccc8DD1x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD1x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x2y15E[] = {
  {&(_ZTVN3ccc8DD1x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x2y15E[];
Class_Descriptor cd__ZN3ccc8DD1x2y15E = {  "_ZN3ccc8DD1x2y15E", // class name
  bases__ZN3ccc8DD1x2y15E, 2,
  &(vtc__ZN3ccc8DD1x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y0  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y03pqrEv
  ~CC1x3y0(); // tgen
  CC1x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y0E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y03abcEv");}
void  ccc::CC1x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y03efgEv");}
void  ccc::CC1x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y03pqrEv");}
ccc::CC1x3y0 ::~CC1x3y0(){ note_dtor("_ZN3ccc7CC1x3y0E", this);} // tgen
ccc::CC1x3y0 ::CC1x3y0(){ note_ctor("_ZN3ccc7CC1x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y0E, buf);
    ::ccc::CC1x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y0E);
    dp->::ccc::CC1x3y0::~CC1x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y0E(Test__ZN3ccc7CC1x3y0E, "_ZN3ccc7CC1x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y0C1Ev();
extern void _ZN3ccc7CC1x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y0E[] = {
  NSPAIR(_ZN3ccc7CC1x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y0E[];
extern void _ZN3ccc7CC1x3y03efgEv();
extern void _ZN3ccc7CC1x3y03pqrEv();
extern void _ZN3ccc7CC1x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y03abcEv,_ZTv0_n12_N3ccc7CC1x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03abcEv,_ZThn4_N3ccc7CC1x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y03pqrEv,_ZTv0_n16_N3ccc7CC1x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03pqrEv,_ZThn4_N3ccc7CC1x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y03efgEv,_ZTv0_n20_N3ccc7CC1x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03efgEv,_ZThn4_N3ccc7CC1x3y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y03abcEv,_ZTv0_n12_N3ccc7CC1x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y03pqrEv,_ZTv0_n16_N3ccc7CC1x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y03efgEv,_ZTv0_n20_N3ccc7CC1x3y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y0E[] = {
  {&(_ZTVN3ccc7CC1x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y0E[];
static VTBL_ENTRY alt_thunk_names523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y03efgEv,_ZTv0_n20_N3ccc7CC1x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y03efgEv,_ZThn4_N3ccc7CC1x3y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y03pqrEv,_ZTv0_n16_N3ccc7CC1x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y03pqrEv,_ZThn4_N3ccc7CC1x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y03abcEv,_ZTv0_n12_N3ccc7CC1x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y03abcEv,_ZThn4_N3ccc7CC1x3y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y0E = {  "_ZN3ccc7CC1x3y0E", // class name
  bases__ZN3ccc7CC1x3y0E, 2,
  &(vtc__ZN3ccc7CC1x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y0E),2, //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  DD1x3y0  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD1x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y03pqrEv
  ~DD1x3y0(); // tgen
  DD1x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y03abcEv");}
void  ccc::DD1x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y03efgEv");}
void  ccc::DD1x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y03pqrEv");}
ccc::DD1x3y0 ::~DD1x3y0(){ note_dtor("_ZN3ccc7DD1x3y0E", this);} // tgen
ccc::DD1x3y0 ::DD1x3y0(){ note_ctor("_ZN3ccc7DD1x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y0E, buf);
    ::ccc::DD1x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y0E);
    dp->::ccc::DD1x3y0::~DD1x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y0E(Test__ZN3ccc7DD1x3y0E, "_ZN3ccc7DD1x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y0C1Ev();
extern void _ZN3ccc7DD1x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y0E[] = {
  NSPAIR(_ZN3ccc7DD1x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y0E[];
extern void _ZN3ccc7DD1x3y03abcEv();
extern void _ZN3ccc7DD1x3y03pqrEv();
extern void _ZN3ccc7DD1x3y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y03efgEv,_ZTv0_n12_N3ccc7DD1x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y03efgEv,_ZThn4_N3ccc7DD1x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y03pqrEv,_ZTv0_n16_N3ccc7DD1x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y03pqrEv,_ZThn4_N3ccc7DD1x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y03abcEv,_ZTv0_n20_N3ccc7DD1x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y03abcEv,_ZThn4_N3ccc7DD1x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y03efgEv,_ZTv0_n12_N3ccc7DD1x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y03pqrEv,_ZTv0_n16_N3ccc7DD1x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y03abcEv,_ZTv0_n20_N3ccc7DD1x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y0E[] = {
  {&(_ZTVN3ccc7DD1x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y0E[];
static VTBL_ENTRY alt_thunk_names524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y03abcEv,_ZTv0_n20_N3ccc7DD1x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y03abcEv,_ZThn4_N3ccc7DD1x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y03pqrEv,_ZTv0_n16_N3ccc7DD1x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y03pqrEv,_ZThn4_N3ccc7DD1x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y03efgEv,_ZTv0_n12_N3ccc7DD1x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y03efgEv,_ZThn4_N3ccc7DD1x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y0E = {  "_ZN3ccc7DD1x3y0E", // class name
  bases__ZN3ccc7DD1x3y0E, 2,
  &(vtc__ZN3ccc7DD1x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y0E),3, //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  CC1x3y1  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x3y13efgEv
  ~CC1x3y1(); // tgen
  CC1x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y1E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y13abcEv");}
void  ccc::CC1x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y13pqrEv");}
void  ccc::CC1x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y13efgEv");}
ccc::CC1x3y1 ::~CC1x3y1(){ note_dtor("_ZN3ccc7CC1x3y1E", this);} // tgen
ccc::CC1x3y1 ::CC1x3y1(){ note_ctor("_ZN3ccc7CC1x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y1E, buf);
    ::ccc::CC1x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y1E);
    dp->::ccc::CC1x3y1::~CC1x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y1E(Test__ZN3ccc7CC1x3y1E, "_ZN3ccc7CC1x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y1C1Ev();
extern void _ZN3ccc7CC1x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y1E[] = {
  NSPAIR(_ZN3ccc7CC1x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y1E[];
extern void _ZN3ccc7CC1x3y13efgEv();
extern void _ZN3ccc7CC1x3y13pqrEv();
extern void _ZN3ccc7CC1x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y13abcEv,_ZTv0_n12_N3ccc7CC1x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13abcEv,_ZThn4_N3ccc7CC1x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y13pqrEv,_ZTv0_n16_N3ccc7CC1x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13pqrEv,_ZThn4_N3ccc7CC1x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y13efgEv,_ZTv0_n20_N3ccc7CC1x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13efgEv,_ZThn4_N3ccc7CC1x3y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y13abcEv,_ZTv0_n12_N3ccc7CC1x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y13pqrEv,_ZTv0_n16_N3ccc7CC1x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y13efgEv,_ZTv0_n20_N3ccc7CC1x3y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y1E[] = {
  {&(_ZTVN3ccc7CC1x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y1E[];
static VTBL_ENTRY alt_thunk_names525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y13efgEv,_ZTv0_n20_N3ccc7CC1x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y13efgEv,_ZThn4_N3ccc7CC1x3y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y13pqrEv,_ZTv0_n16_N3ccc7CC1x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y13pqrEv,_ZThn4_N3ccc7CC1x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y13abcEv,_ZTv0_n12_N3ccc7CC1x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y13abcEv,_ZThn4_N3ccc7CC1x3y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y1E = {  "_ZN3ccc7CC1x3y1E", // class name
  bases__ZN3ccc7CC1x3y1E, 2,
  &(vtc__ZN3ccc7CC1x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y1E),2, //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  DD1x3y1  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD1x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x3y13efgEv
  ~DD1x3y1(); // tgen
  DD1x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y13abcEv");}
void  ccc::DD1x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y13pqrEv");}
void  ccc::DD1x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y13efgEv");}
ccc::DD1x3y1 ::~DD1x3y1(){ note_dtor("_ZN3ccc7DD1x3y1E", this);} // tgen
ccc::DD1x3y1 ::DD1x3y1(){ note_ctor("_ZN3ccc7DD1x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y1E, buf);
    ::ccc::DD1x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y1E);
    dp->::ccc::DD1x3y1::~DD1x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y1E(Test__ZN3ccc7DD1x3y1E, "_ZN3ccc7DD1x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y1C1Ev();
extern void _ZN3ccc7DD1x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y1E[] = {
  NSPAIR(_ZN3ccc7DD1x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y1E[];
extern void _ZN3ccc7DD1x3y13abcEv();
extern void _ZN3ccc7DD1x3y13pqrEv();
extern void _ZN3ccc7DD1x3y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y13efgEv,_ZTv0_n12_N3ccc7DD1x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y13efgEv,_ZThn4_N3ccc7DD1x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y13pqrEv,_ZTv0_n16_N3ccc7DD1x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y13pqrEv,_ZThn4_N3ccc7DD1x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y13abcEv,_ZTv0_n20_N3ccc7DD1x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y13abcEv,_ZThn4_N3ccc7DD1x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y13efgEv,_ZTv0_n12_N3ccc7DD1x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y13pqrEv,_ZTv0_n16_N3ccc7DD1x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y13abcEv,_ZTv0_n20_N3ccc7DD1x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y1E[] = {
  {&(_ZTVN3ccc7DD1x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y1E[];
static VTBL_ENTRY alt_thunk_names526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y13abcEv,_ZTv0_n20_N3ccc7DD1x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y13abcEv,_ZThn4_N3ccc7DD1x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y13pqrEv,_ZTv0_n16_N3ccc7DD1x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y13pqrEv,_ZThn4_N3ccc7DD1x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y13efgEv,_ZTv0_n12_N3ccc7DD1x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y13efgEv,_ZThn4_N3ccc7DD1x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y1E = {  "_ZN3ccc7DD1x3y1E", // class name
  bases__ZN3ccc7DD1x3y1E, 2,
  &(vtc__ZN3ccc7DD1x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y1E),3, //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  CC1x3y2  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y23pqrEv
  ~CC1x3y2(); // tgen
  CC1x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y2E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y23efgEv");}
void  ccc::CC1x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y23abcEv");}
void  ccc::CC1x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y23pqrEv");}
ccc::CC1x3y2 ::~CC1x3y2(){ note_dtor("_ZN3ccc7CC1x3y2E", this);} // tgen
ccc::CC1x3y2 ::CC1x3y2(){ note_ctor("_ZN3ccc7CC1x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y2E, buf);
    ::ccc::CC1x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y2E);
    dp->::ccc::CC1x3y2::~CC1x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y2E(Test__ZN3ccc7CC1x3y2E, "_ZN3ccc7CC1x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y2C1Ev();
extern void _ZN3ccc7CC1x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y2E[] = {
  NSPAIR(_ZN3ccc7CC1x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y2E[];
extern void _ZN3ccc7CC1x3y23efgEv();
extern void _ZN3ccc7CC1x3y23pqrEv();
extern void _ZN3ccc7CC1x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y23abcEv,_ZTv0_n12_N3ccc7CC1x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23abcEv,_ZThn4_N3ccc7CC1x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y23pqrEv,_ZTv0_n16_N3ccc7CC1x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23pqrEv,_ZThn4_N3ccc7CC1x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y23efgEv,_ZTv0_n20_N3ccc7CC1x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23efgEv,_ZThn4_N3ccc7CC1x3y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y23abcEv,_ZTv0_n12_N3ccc7CC1x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y23pqrEv,_ZTv0_n16_N3ccc7CC1x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y23efgEv,_ZTv0_n20_N3ccc7CC1x3y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y2E[] = {
  {&(_ZTVN3ccc7CC1x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y2E[];
static VTBL_ENTRY alt_thunk_names527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y23efgEv,_ZTv0_n20_N3ccc7CC1x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y23efgEv,_ZThn4_N3ccc7CC1x3y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y23pqrEv,_ZTv0_n16_N3ccc7CC1x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y23pqrEv,_ZThn4_N3ccc7CC1x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y23abcEv,_ZTv0_n12_N3ccc7CC1x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y23abcEv,_ZThn4_N3ccc7CC1x3y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y2E = {  "_ZN3ccc7CC1x3y2E", // class name
  bases__ZN3ccc7CC1x3y2E, 2,
  &(vtc__ZN3ccc7CC1x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y2E),2, //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  DD1x3y2  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD1x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y23pqrEv
  ~DD1x3y2(); // tgen
  DD1x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y23efgEv");}
void  ccc::DD1x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y23abcEv");}
void  ccc::DD1x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y23pqrEv");}
ccc::DD1x3y2 ::~DD1x3y2(){ note_dtor("_ZN3ccc7DD1x3y2E", this);} // tgen
ccc::DD1x3y2 ::DD1x3y2(){ note_ctor("_ZN3ccc7DD1x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y2E, buf);
    ::ccc::DD1x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y2E);
    dp->::ccc::DD1x3y2::~DD1x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y2E(Test__ZN3ccc7DD1x3y2E, "_ZN3ccc7DD1x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y2C1Ev();
extern void _ZN3ccc7DD1x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y2E[] = {
  NSPAIR(_ZN3ccc7DD1x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y2E[];
extern void _ZN3ccc7DD1x3y23abcEv();
extern void _ZN3ccc7DD1x3y23pqrEv();
extern void _ZN3ccc7DD1x3y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y23efgEv,_ZTv0_n12_N3ccc7DD1x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y23efgEv,_ZThn4_N3ccc7DD1x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y23pqrEv,_ZTv0_n16_N3ccc7DD1x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y23pqrEv,_ZThn4_N3ccc7DD1x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y23abcEv,_ZTv0_n20_N3ccc7DD1x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y23abcEv,_ZThn4_N3ccc7DD1x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y23efgEv,_ZTv0_n12_N3ccc7DD1x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y23pqrEv,_ZTv0_n16_N3ccc7DD1x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y23abcEv,_ZTv0_n20_N3ccc7DD1x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y2E[] = {
  {&(_ZTVN3ccc7DD1x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y2E[];
static VTBL_ENTRY alt_thunk_names528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y23abcEv,_ZTv0_n20_N3ccc7DD1x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y23abcEv,_ZThn4_N3ccc7DD1x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y23pqrEv,_ZTv0_n16_N3ccc7DD1x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y23pqrEv,_ZThn4_N3ccc7DD1x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y23efgEv,_ZTv0_n12_N3ccc7DD1x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y23efgEv,_ZThn4_N3ccc7DD1x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y2E = {  "_ZN3ccc7DD1x3y2E", // class name
  bases__ZN3ccc7DD1x3y2E, 2,
  &(vtc__ZN3ccc7DD1x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y2E),3, //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  CC1x3y3  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x3y33abcEv
  ~CC1x3y3(); // tgen
  CC1x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y3E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y33efgEv");}
void  ccc::CC1x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y33pqrEv");}
void  ccc::CC1x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y33abcEv");}
ccc::CC1x3y3 ::~CC1x3y3(){ note_dtor("_ZN3ccc7CC1x3y3E", this);} // tgen
ccc::CC1x3y3 ::CC1x3y3(){ note_ctor("_ZN3ccc7CC1x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y3E, buf);
    ::ccc::CC1x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y3E);
    dp->::ccc::CC1x3y3::~CC1x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y3E(Test__ZN3ccc7CC1x3y3E, "_ZN3ccc7CC1x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y3C1Ev();
extern void _ZN3ccc7CC1x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y3E[] = {
  NSPAIR(_ZN3ccc7CC1x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y3E[];
extern void _ZN3ccc7CC1x3y33efgEv();
extern void _ZN3ccc7CC1x3y33pqrEv();
extern void _ZN3ccc7CC1x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y33abcEv,_ZTv0_n12_N3ccc7CC1x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33abcEv,_ZThn4_N3ccc7CC1x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y33pqrEv,_ZTv0_n16_N3ccc7CC1x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33pqrEv,_ZThn4_N3ccc7CC1x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y33efgEv,_ZTv0_n20_N3ccc7CC1x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33efgEv,_ZThn4_N3ccc7CC1x3y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y33abcEv,_ZTv0_n12_N3ccc7CC1x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y33pqrEv,_ZTv0_n16_N3ccc7CC1x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y33efgEv,_ZTv0_n20_N3ccc7CC1x3y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y3E[] = {
  {&(_ZTVN3ccc7CC1x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y3E[];
static VTBL_ENTRY alt_thunk_names529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y33efgEv,_ZTv0_n20_N3ccc7CC1x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y33efgEv,_ZThn4_N3ccc7CC1x3y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y33pqrEv,_ZTv0_n16_N3ccc7CC1x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y33pqrEv,_ZThn4_N3ccc7CC1x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y33abcEv,_ZTv0_n12_N3ccc7CC1x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y33abcEv,_ZThn4_N3ccc7CC1x3y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y3E = {  "_ZN3ccc7CC1x3y3E", // class name
  bases__ZN3ccc7CC1x3y3E, 2,
  &(vtc__ZN3ccc7CC1x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y3E),2, //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  DD1x3y3  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD1x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x3y33abcEv
  ~DD1x3y3(); // tgen
  DD1x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y33efgEv");}
void  ccc::DD1x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y33pqrEv");}
void  ccc::DD1x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y33abcEv");}
ccc::DD1x3y3 ::~DD1x3y3(){ note_dtor("_ZN3ccc7DD1x3y3E", this);} // tgen
ccc::DD1x3y3 ::DD1x3y3(){ note_ctor("_ZN3ccc7DD1x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y3E, buf);
    ::ccc::DD1x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y3E);
    dp->::ccc::DD1x3y3::~DD1x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y3E(Test__ZN3ccc7DD1x3y3E, "_ZN3ccc7DD1x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y3C1Ev();
extern void _ZN3ccc7DD1x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y3E[] = {
  NSPAIR(_ZN3ccc7DD1x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y3E[];
extern void _ZN3ccc7DD1x3y33abcEv();
extern void _ZN3ccc7DD1x3y33pqrEv();
extern void _ZN3ccc7DD1x3y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y33efgEv,_ZTv0_n12_N3ccc7DD1x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y33efgEv,_ZThn4_N3ccc7DD1x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y33pqrEv,_ZTv0_n16_N3ccc7DD1x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y33pqrEv,_ZThn4_N3ccc7DD1x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y33abcEv,_ZTv0_n20_N3ccc7DD1x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y33abcEv,_ZThn4_N3ccc7DD1x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y33efgEv,_ZTv0_n12_N3ccc7DD1x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y33pqrEv,_ZTv0_n16_N3ccc7DD1x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y33abcEv,_ZTv0_n20_N3ccc7DD1x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y3E[] = {
  {&(_ZTVN3ccc7DD1x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y3E[];
static VTBL_ENTRY alt_thunk_names530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y33abcEv,_ZTv0_n20_N3ccc7DD1x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y33abcEv,_ZThn4_N3ccc7DD1x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y33pqrEv,_ZTv0_n16_N3ccc7DD1x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y33pqrEv,_ZThn4_N3ccc7DD1x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y33efgEv,_ZTv0_n12_N3ccc7DD1x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y33efgEv,_ZThn4_N3ccc7DD1x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y3E = {  "_ZN3ccc7DD1x3y3E", // class name
  bases__ZN3ccc7DD1x3y3E, 2,
  &(vtc__ZN3ccc7DD1x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y3E),3, //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  CC1x3y4  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC1x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y43efgEv
  ~CC1x3y4(); // tgen
  CC1x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y4E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y43pqrEv");}
void  ccc::CC1x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y43abcEv");}
void  ccc::CC1x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y43efgEv");}
ccc::CC1x3y4 ::~CC1x3y4(){ note_dtor("_ZN3ccc7CC1x3y4E", this);} // tgen
ccc::CC1x3y4 ::CC1x3y4(){ note_ctor("_ZN3ccc7CC1x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y4E, buf);
    ::ccc::CC1x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y4E);
    dp->::ccc::CC1x3y4::~CC1x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y4E(Test__ZN3ccc7CC1x3y4E, "_ZN3ccc7CC1x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y4C1Ev();
extern void _ZN3ccc7CC1x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y4E[] = {
  NSPAIR(_ZN3ccc7CC1x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y4E[];
extern void _ZN3ccc7CC1x3y43efgEv();
extern void _ZN3ccc7CC1x3y43pqrEv();
extern void _ZN3ccc7CC1x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y43abcEv,_ZTv0_n12_N3ccc7CC1x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43abcEv,_ZThn4_N3ccc7CC1x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y43pqrEv,_ZTv0_n16_N3ccc7CC1x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43pqrEv,_ZThn4_N3ccc7CC1x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y43efgEv,_ZTv0_n20_N3ccc7CC1x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43efgEv,_ZThn4_N3ccc7CC1x3y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y43abcEv,_ZTv0_n12_N3ccc7CC1x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y43pqrEv,_ZTv0_n16_N3ccc7CC1x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y43efgEv,_ZTv0_n20_N3ccc7CC1x3y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y4E[] = {
  {&(_ZTVN3ccc7CC1x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y4E[];
static VTBL_ENTRY alt_thunk_names531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y43efgEv,_ZTv0_n20_N3ccc7CC1x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y43efgEv,_ZThn4_N3ccc7CC1x3y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y43pqrEv,_ZTv0_n16_N3ccc7CC1x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y43pqrEv,_ZThn4_N3ccc7CC1x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y43abcEv,_ZTv0_n12_N3ccc7CC1x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y43abcEv,_ZThn4_N3ccc7CC1x3y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y4E = {  "_ZN3ccc7CC1x3y4E", // class name
  bases__ZN3ccc7CC1x3y4E, 2,
  &(vtc__ZN3ccc7CC1x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y4E),2, //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  DD1x3y4  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD1x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x3y43efgEv
  ~DD1x3y4(); // tgen
  DD1x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y43pqrEv");}
void  ccc::DD1x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y43abcEv");}
void  ccc::DD1x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y43efgEv");}
ccc::DD1x3y4 ::~DD1x3y4(){ note_dtor("_ZN3ccc7DD1x3y4E", this);} // tgen
ccc::DD1x3y4 ::DD1x3y4(){ note_ctor("_ZN3ccc7DD1x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y4E, buf);
    ::ccc::DD1x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y4E);
    dp->::ccc::DD1x3y4::~DD1x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y4E(Test__ZN3ccc7DD1x3y4E, "_ZN3ccc7DD1x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y4C1Ev();
extern void _ZN3ccc7DD1x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y4E[] = {
  NSPAIR(_ZN3ccc7DD1x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y4E[];
extern void _ZN3ccc7DD1x3y43abcEv();
extern void _ZN3ccc7DD1x3y43pqrEv();
extern void _ZN3ccc7DD1x3y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y43efgEv,_ZTv0_n12_N3ccc7DD1x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y43efgEv,_ZThn4_N3ccc7DD1x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y43pqrEv,_ZTv0_n16_N3ccc7DD1x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y43pqrEv,_ZThn4_N3ccc7DD1x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y43abcEv,_ZTv0_n20_N3ccc7DD1x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y43abcEv,_ZThn4_N3ccc7DD1x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y43efgEv,_ZTv0_n12_N3ccc7DD1x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y43pqrEv,_ZTv0_n16_N3ccc7DD1x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y43abcEv,_ZTv0_n20_N3ccc7DD1x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y4E[] = {
  {&(_ZTVN3ccc7DD1x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y4E[];
static VTBL_ENTRY alt_thunk_names532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y43abcEv,_ZTv0_n20_N3ccc7DD1x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y43abcEv,_ZThn4_N3ccc7DD1x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y43pqrEv,_ZTv0_n16_N3ccc7DD1x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y43pqrEv,_ZThn4_N3ccc7DD1x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y43efgEv,_ZTv0_n12_N3ccc7DD1x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y43efgEv,_ZThn4_N3ccc7DD1x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y4E = {  "_ZN3ccc7DD1x3y4E", // class name
  bases__ZN3ccc7DD1x3y4E, 2,
  &(vtc__ZN3ccc7DD1x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y4E),3, //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  CC1x3y5  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC1x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y53abcEv
  ~CC1x3y5(); // tgen
  CC1x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y5E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y53pqrEv");}
void  ccc::CC1x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y53efgEv");}
void  ccc::CC1x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y53abcEv");}
ccc::CC1x3y5 ::~CC1x3y5(){ note_dtor("_ZN3ccc7CC1x3y5E", this);} // tgen
ccc::CC1x3y5 ::CC1x3y5(){ note_ctor("_ZN3ccc7CC1x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y5E, buf);
    ::ccc::CC1x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y5E);
    dp->::ccc::CC1x3y5::~CC1x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y5E(Test__ZN3ccc7CC1x3y5E, "_ZN3ccc7CC1x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y5C1Ev();
extern void _ZN3ccc7CC1x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y5E[] = {
  NSPAIR(_ZN3ccc7CC1x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y5E[];
extern void _ZN3ccc7CC1x3y53efgEv();
extern void _ZN3ccc7CC1x3y53pqrEv();
extern void _ZN3ccc7CC1x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y53abcEv,_ZTv0_n12_N3ccc7CC1x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53abcEv,_ZThn4_N3ccc7CC1x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y53pqrEv,_ZTv0_n16_N3ccc7CC1x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53pqrEv,_ZThn4_N3ccc7CC1x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y53efgEv,_ZTv0_n20_N3ccc7CC1x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53efgEv,_ZThn4_N3ccc7CC1x3y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y53abcEv,_ZTv0_n12_N3ccc7CC1x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y53pqrEv,_ZTv0_n16_N3ccc7CC1x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y53efgEv,_ZTv0_n20_N3ccc7CC1x3y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y5E[] = {
  {&(_ZTVN3ccc7CC1x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y5E[];
static VTBL_ENTRY alt_thunk_names533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y53efgEv,_ZTv0_n20_N3ccc7CC1x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y53efgEv,_ZThn4_N3ccc7CC1x3y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y53pqrEv,_ZTv0_n16_N3ccc7CC1x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y53pqrEv,_ZThn4_N3ccc7CC1x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y53abcEv,_ZTv0_n12_N3ccc7CC1x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y53abcEv,_ZThn4_N3ccc7CC1x3y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y5E = {  "_ZN3ccc7CC1x3y5E", // class name
  bases__ZN3ccc7CC1x3y5E, 2,
  &(vtc__ZN3ccc7CC1x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y5E),2, //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  DD1x3y5  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD1x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x3y53abcEv
  ~DD1x3y5(); // tgen
  DD1x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y53pqrEv");}
void  ccc::DD1x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y53efgEv");}
void  ccc::DD1x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y53abcEv");}
ccc::DD1x3y5 ::~DD1x3y5(){ note_dtor("_ZN3ccc7DD1x3y5E", this);} // tgen
ccc::DD1x3y5 ::DD1x3y5(){ note_ctor("_ZN3ccc7DD1x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y5E, buf);
    ::ccc::DD1x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y5E);
    dp->::ccc::DD1x3y5::~DD1x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y5E(Test__ZN3ccc7DD1x3y5E, "_ZN3ccc7DD1x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y5C1Ev();
extern void _ZN3ccc7DD1x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y5E[] = {
  NSPAIR(_ZN3ccc7DD1x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y5E[];
extern void _ZN3ccc7DD1x3y53abcEv();
extern void _ZN3ccc7DD1x3y53pqrEv();
extern void _ZN3ccc7DD1x3y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y53efgEv,_ZTv0_n12_N3ccc7DD1x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y53efgEv,_ZThn4_N3ccc7DD1x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y53pqrEv,_ZTv0_n16_N3ccc7DD1x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y53pqrEv,_ZThn4_N3ccc7DD1x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y53abcEv,_ZTv0_n20_N3ccc7DD1x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y53abcEv,_ZThn4_N3ccc7DD1x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y53efgEv,_ZTv0_n12_N3ccc7DD1x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y53pqrEv,_ZTv0_n16_N3ccc7DD1x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y53abcEv,_ZTv0_n20_N3ccc7DD1x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y5E[] = {
  {&(_ZTVN3ccc7DD1x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y5E[];
static VTBL_ENTRY alt_thunk_names534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y53abcEv,_ZTv0_n20_N3ccc7DD1x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y53abcEv,_ZThn4_N3ccc7DD1x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y53pqrEv,_ZTv0_n16_N3ccc7DD1x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y53pqrEv,_ZThn4_N3ccc7DD1x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y53efgEv,_ZTv0_n12_N3ccc7DD1x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y53efgEv,_ZThn4_N3ccc7DD1x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y5E = {  "_ZN3ccc7DD1x3y5E", // class name
  bases__ZN3ccc7DD1x3y5E, 2,
  &(vtc__ZN3ccc7DD1x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y5E),3, //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  CC1x3y6  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y63efgEv
  ~CC1x3y6(); // tgen
  CC1x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y6E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y63abcEv");}
void  ccc::CC1x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y63efgEv");}
ccc::CC1x3y6 ::~CC1x3y6(){ note_dtor("_ZN3ccc7CC1x3y6E", this);} // tgen
ccc::CC1x3y6 ::CC1x3y6(){ note_ctor("_ZN3ccc7CC1x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y6E, buf);
    ::ccc::CC1x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y6E);
    dp->::ccc::CC1x3y6::~CC1x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y6E(Test__ZN3ccc7CC1x3y6E, "_ZN3ccc7CC1x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y6C1Ev();
extern void _ZN3ccc7CC1x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y6E[] = {
  NSPAIR(_ZN3ccc7CC1x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y6E[];
extern void _ZN3ccc7CC1x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC1x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y63abcEv,_ZTv0_n12_N3ccc7CC1x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y63abcEv,_ZThn4_N3ccc7CC1x3y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y63efgEv,_ZTv0_n20_N3ccc7CC1x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y63efgEv,_ZThn4_N3ccc7CC1x3y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y63abcEv,_ZTv0_n12_N3ccc7CC1x3y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y63efgEv,_ZTv0_n20_N3ccc7CC1x3y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y6E[] = {
  {&(_ZTVN3ccc7CC1x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y6E[];
static VTBL_ENTRY alt_thunk_names535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y63efgEv,_ZTv0_n20_N3ccc7CC1x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y63efgEv,_ZThn4_N3ccc7CC1x3y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y63abcEv,_ZTv0_n12_N3ccc7CC1x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y63abcEv,_ZThn4_N3ccc7CC1x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y6E = {  "_ZN3ccc7CC1x3y6E", // class name
  bases__ZN3ccc7CC1x3y6E, 2,
  &(vtc__ZN3ccc7CC1x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y6E),2, //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  DD1x3y6  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD1x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x3y63efgEv
  ~DD1x3y6(); // tgen
  DD1x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y63abcEv");}
void  ccc::DD1x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y63efgEv");}
ccc::DD1x3y6 ::~DD1x3y6(){ note_dtor("_ZN3ccc7DD1x3y6E", this);} // tgen
ccc::DD1x3y6 ::DD1x3y6(){ note_ctor("_ZN3ccc7DD1x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y6E, buf);
    ::ccc::DD1x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y6E);
    dp->::ccc::DD1x3y6::~DD1x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y6E(Test__ZN3ccc7DD1x3y6E, "_ZN3ccc7DD1x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y6C1Ev();
extern void _ZN3ccc7DD1x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y6E[] = {
  NSPAIR(_ZN3ccc7DD1x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y6E[];
extern void _ZN3ccc7DD1x3y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x3y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y63efgEv,_ZTv0_n12_N3ccc7DD1x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y63efgEv,_ZThn4_N3ccc7DD1x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y63abcEv,_ZTv0_n20_N3ccc7DD1x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y63abcEv,_ZThn4_N3ccc7DD1x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y63efgEv,_ZTv0_n12_N3ccc7DD1x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y63abcEv,_ZTv0_n20_N3ccc7DD1x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y6E[] = {
  {&(_ZTVN3ccc7DD1x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y6E[];
static VTBL_ENTRY alt_thunk_names536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y63abcEv,_ZTv0_n20_N3ccc7DD1x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y63abcEv,_ZThn4_N3ccc7DD1x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y63efgEv,_ZTv0_n12_N3ccc7DD1x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y63efgEv,_ZThn4_N3ccc7DD1x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y6E = {  "_ZN3ccc7DD1x3y6E", // class name
  bases__ZN3ccc7DD1x3y6E, 2,
  &(vtc__ZN3ccc7DD1x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y6E),3, //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  CC1x3y7  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y73pqrEv
  ~CC1x3y7(); // tgen
  CC1x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y7E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y73abcEv");}
void  ccc::CC1x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y73pqrEv");}
ccc::CC1x3y7 ::~CC1x3y7(){ note_dtor("_ZN3ccc7CC1x3y7E", this);} // tgen
ccc::CC1x3y7 ::CC1x3y7(){ note_ctor("_ZN3ccc7CC1x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y7E, buf);
    ::ccc::CC1x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y7E);
    dp->::ccc::CC1x3y7::~CC1x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y7E(Test__ZN3ccc7CC1x3y7E, "_ZN3ccc7CC1x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y7C1Ev();
extern void _ZN3ccc7CC1x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y7E[] = {
  NSPAIR(_ZN3ccc7CC1x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC1x3y73pqrEv();
extern void _ZN3ccc7CC1x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y73abcEv,_ZTv0_n12_N3ccc7CC1x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y73abcEv,_ZThn4_N3ccc7CC1x3y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y73pqrEv,_ZTv0_n16_N3ccc7CC1x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y73pqrEv,_ZThn4_N3ccc7CC1x3y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y73abcEv,_ZTv0_n12_N3ccc7CC1x3y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y73pqrEv,_ZTv0_n16_N3ccc7CC1x3y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y7E[] = {
  {&(_ZTVN3ccc7CC1x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y7E[];
static VTBL_ENTRY alt_thunk_names537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y73pqrEv,_ZTv0_n16_N3ccc7CC1x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y73pqrEv,_ZThn4_N3ccc7CC1x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y73abcEv,_ZTv0_n12_N3ccc7CC1x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y73abcEv,_ZThn4_N3ccc7CC1x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y7E = {  "_ZN3ccc7CC1x3y7E", // class name
  bases__ZN3ccc7CC1x3y7E, 2,
  &(vtc__ZN3ccc7CC1x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y7E),2, //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  DD1x3y7  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD1x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y73pqrEv
  ~DD1x3y7(); // tgen
  DD1x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y73abcEv");}
void  ccc::DD1x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y73pqrEv");}
ccc::DD1x3y7 ::~DD1x3y7(){ note_dtor("_ZN3ccc7DD1x3y7E", this);} // tgen
ccc::DD1x3y7 ::DD1x3y7(){ note_ctor("_ZN3ccc7DD1x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y7E, buf);
    ::ccc::DD1x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y7E);
    dp->::ccc::DD1x3y7::~DD1x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y7E(Test__ZN3ccc7DD1x3y7E, "_ZN3ccc7DD1x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y7C1Ev();
extern void _ZN3ccc7DD1x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y7E[] = {
  NSPAIR(_ZN3ccc7DD1x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y7E[];
extern void _ZN3ccc7DD1x3y73abcEv();
extern void _ZN3ccc7DD1x3y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y73pqrEv,_ZTv0_n16_N3ccc7DD1x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y73pqrEv,_ZThn4_N3ccc7DD1x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y73abcEv,_ZTv0_n20_N3ccc7DD1x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y73abcEv,_ZThn4_N3ccc7DD1x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y73pqrEv,_ZTv0_n16_N3ccc7DD1x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y73abcEv,_ZTv0_n20_N3ccc7DD1x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y7E[] = {
  {&(_ZTVN3ccc7DD1x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y7E[];
static VTBL_ENTRY alt_thunk_names538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y73abcEv,_ZTv0_n20_N3ccc7DD1x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y73abcEv,_ZThn4_N3ccc7DD1x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y73pqrEv,_ZTv0_n16_N3ccc7DD1x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y73pqrEv,_ZThn4_N3ccc7DD1x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y7E = {  "_ZN3ccc7DD1x3y7E", // class name
  bases__ZN3ccc7DD1x3y7E, 2,
  &(vtc__ZN3ccc7DD1x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y7E),3, //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  CC1x3y8  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y83abcEv
  ~CC1x3y8(); // tgen
  CC1x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y8E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y83efgEv");}
void  ccc::CC1x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y83abcEv");}
ccc::CC1x3y8 ::~CC1x3y8(){ note_dtor("_ZN3ccc7CC1x3y8E", this);} // tgen
ccc::CC1x3y8 ::CC1x3y8(){ note_ctor("_ZN3ccc7CC1x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y8E, buf);
    ::ccc::CC1x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y8E);
    dp->::ccc::CC1x3y8::~CC1x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y8E(Test__ZN3ccc7CC1x3y8E, "_ZN3ccc7CC1x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y8C1Ev();
extern void _ZN3ccc7CC1x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y8E[] = {
  NSPAIR(_ZN3ccc7CC1x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y8E[];
extern void _ZN3ccc7CC1x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC1x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x3y83abcEv,_ZTv0_n12_N3ccc7CC1x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y83abcEv,_ZThn4_N3ccc7CC1x3y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y83efgEv,_ZTv0_n20_N3ccc7CC1x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y83efgEv,_ZThn4_N3ccc7CC1x3y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x3y83abcEv,_ZTv0_n12_N3ccc7CC1x3y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y83efgEv,_ZTv0_n20_N3ccc7CC1x3y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y8E[] = {
  {&(_ZTVN3ccc7CC1x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y8E[];
static VTBL_ENTRY alt_thunk_names539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y83efgEv,_ZTv0_n20_N3ccc7CC1x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y83efgEv,_ZThn4_N3ccc7CC1x3y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x3y83abcEv,_ZTv0_n12_N3ccc7CC1x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y83abcEv,_ZThn4_N3ccc7CC1x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y8E = {  "_ZN3ccc7CC1x3y8E", // class name
  bases__ZN3ccc7CC1x3y8E, 2,
  &(vtc__ZN3ccc7CC1x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y8E),2, //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  DD1x3y8  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD1x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x3y83abcEv
  ~DD1x3y8(); // tgen
  DD1x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y83efgEv");}
void  ccc::DD1x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x3y83abcEv");}
ccc::DD1x3y8 ::~DD1x3y8(){ note_dtor("_ZN3ccc7DD1x3y8E", this);} // tgen
ccc::DD1x3y8 ::DD1x3y8(){ note_ctor("_ZN3ccc7DD1x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y8E, buf);
    ::ccc::DD1x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y8E);
    dp->::ccc::DD1x3y8::~DD1x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y8E(Test__ZN3ccc7DD1x3y8E, "_ZN3ccc7DD1x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y8C1Ev();
extern void _ZN3ccc7DD1x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y8E[] = {
  NSPAIR(_ZN3ccc7DD1x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y8E[];
extern void _ZN3ccc7DD1x3y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x3y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y83efgEv,_ZTv0_n12_N3ccc7DD1x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y83efgEv,_ZThn4_N3ccc7DD1x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x3y83abcEv,_ZTv0_n20_N3ccc7DD1x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y83abcEv,_ZThn4_N3ccc7DD1x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y83efgEv,_ZTv0_n12_N3ccc7DD1x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x3y83abcEv,_ZTv0_n20_N3ccc7DD1x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y8E[] = {
  {&(_ZTVN3ccc7DD1x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y8E[];
static VTBL_ENTRY alt_thunk_names540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x3y83abcEv,_ZTv0_n20_N3ccc7DD1x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y83abcEv,_ZThn4_N3ccc7DD1x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y83efgEv,_ZTv0_n12_N3ccc7DD1x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y83efgEv,_ZThn4_N3ccc7DD1x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y8E = {  "_ZN3ccc7DD1x3y8E", // class name
  bases__ZN3ccc7DD1x3y8E, 2,
  &(vtc__ZN3ccc7DD1x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y8E),3, //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  CC1x3y9  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y93pqrEv
  ~CC1x3y9(); // tgen
  CC1x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y9E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y93efgEv");}
void  ccc::CC1x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y93pqrEv");}
ccc::CC1x3y9 ::~CC1x3y9(){ note_dtor("_ZN3ccc7CC1x3y9E", this);} // tgen
ccc::CC1x3y9 ::CC1x3y9(){ note_ctor("_ZN3ccc7CC1x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y9E, buf);
    ::ccc::CC1x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC1x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y9E);
    dp->::ccc::CC1x3y9::~CC1x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y9E(Test__ZN3ccc7CC1x3y9E, "_ZN3ccc7CC1x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y9C1Ev();
extern void _ZN3ccc7CC1x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y9E[] = {
  NSPAIR(_ZN3ccc7CC1x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y9E[];
extern void _ZN3ccc7CC1x3y93efgEv();
extern void _ZN3ccc7CC1x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x3y93pqrEv,_ZTv0_n16_N3ccc7CC1x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y93pqrEv,_ZThn4_N3ccc7CC1x3y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x3y93efgEv,_ZTv0_n20_N3ccc7CC1x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y93efgEv,_ZThn4_N3ccc7CC1x3y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x3y93pqrEv,_ZTv0_n16_N3ccc7CC1x3y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x3y93efgEv,_ZTv0_n20_N3ccc7CC1x3y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x3y9E[] = {
  {&(_ZTVN3ccc7CC1x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x3y9E[];
static VTBL_ENTRY alt_thunk_names541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x3y93efgEv,_ZTv0_n20_N3ccc7CC1x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y93efgEv,_ZThn4_N3ccc7CC1x3y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x3y93pqrEv,_ZTv0_n16_N3ccc7CC1x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x3y93pqrEv,_ZThn4_N3ccc7CC1x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x3y9E = {  "_ZN3ccc7CC1x3y9E", // class name
  bases__ZN3ccc7CC1x3y9E, 2,
  &(vtc__ZN3ccc7CC1x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x3y9E),2, //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  DD1x3y9  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD1x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x3y93pqrEv
  ~DD1x3y9(); // tgen
  DD1x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x3y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x3y93efgEv");}
void  ccc::DD1x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x3y93pqrEv");}
ccc::DD1x3y9 ::~DD1x3y9(){ note_dtor("_ZN3ccc7DD1x3y9E", this);} // tgen
ccc::DD1x3y9 ::DD1x3y9(){ note_ctor("_ZN3ccc7DD1x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x3y9E, buf);
    ::ccc::DD1x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x3y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD1x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x3y9E);
    dp->::ccc::DD1x3y9::~DD1x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x3y9E(Test__ZN3ccc7DD1x3y9E, "_ZN3ccc7DD1x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x3y9C1Ev();
extern void _ZN3ccc7DD1x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x3y9E[] = {
  NSPAIR(_ZN3ccc7DD1x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD1x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x3y93pqrEv();
extern void _ZN3ccc7DD1x3y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x3y93efgEv,_ZTv0_n12_N3ccc7DD1x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y93efgEv,_ZThn4_N3ccc7DD1x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x3y93pqrEv,_ZTv0_n16_N3ccc7DD1x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x3y93pqrEv,_ZThn4_N3ccc7DD1x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x3y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x3y93efgEv,_ZTv0_n12_N3ccc7DD1x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x3y93pqrEv,_ZTv0_n16_N3ccc7DD1x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x3y9E[] = {
  {&(_ZTVN3ccc7DD1x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x3y9E[];
static VTBL_ENTRY alt_thunk_names542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x3y93pqrEv,_ZTv0_n16_N3ccc7DD1x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y93pqrEv,_ZThn4_N3ccc7DD1x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x3y93efgEv,_ZTv0_n12_N3ccc7DD1x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x3y93efgEv,_ZThn4_N3ccc7DD1x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x3y9E = {  "_ZN3ccc7DD1x3y9E", // class name
  bases__ZN3ccc7DD1x3y9E, 2,
  &(vtc__ZN3ccc7DD1x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x3y9E),3, //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  CC1x3y10  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x3y103abcEv
  ~CC1x3y10(); // tgen
  CC1x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y10E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y103pqrEv");}
void  ccc::CC1x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x3y103abcEv");}
ccc::CC1x3y10 ::~CC1x3y10(){ note_dtor("_ZN3ccc8CC1x3y10E", this);} // tgen
ccc::CC1x3y10 ::CC1x3y10(){ note_ctor("_ZN3ccc8CC1x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y10E, buf);
    ::ccc::CC1x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y10E);
    dp->::ccc::CC1x3y10::~CC1x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y10E(Test__ZN3ccc8CC1x3y10E, "_ZN3ccc8CC1x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y10C1Ev();
extern void _ZN3ccc8CC1x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y10E[] = {
  NSPAIR(_ZN3ccc8CC1x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC1x3y103pqrEv();
extern void _ZN3ccc8CC1x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x3y103abcEv,_ZTv0_n12_N3ccc8CC1x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y103abcEv,_ZThn4_N3ccc8CC1x3y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x3y103pqrEv,_ZTv0_n16_N3ccc8CC1x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y103pqrEv,_ZThn4_N3ccc8CC1x3y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x3y103abcEv,_ZTv0_n12_N3ccc8CC1x3y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x3y103pqrEv,_ZTv0_n16_N3ccc8CC1x3y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y10E[] = {
  {&(_ZTVN3ccc8CC1x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y10E[];
static VTBL_ENTRY alt_thunk_names543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x3y103pqrEv,_ZTv0_n16_N3ccc8CC1x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y103pqrEv,_ZThn4_N3ccc8CC1x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x3y103abcEv,_ZTv0_n12_N3ccc8CC1x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y103abcEv,_ZThn4_N3ccc8CC1x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x3y10E = {  "_ZN3ccc8CC1x3y10E", // class name
  bases__ZN3ccc8CC1x3y10E, 2,
  &(vtc__ZN3ccc8CC1x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y10E),2, //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  DD1x3y10  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD1x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x3y103abcEv
  ~DD1x3y10(); // tgen
  DD1x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x3y103pqrEv");}
void  ccc::DD1x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x3y103abcEv");}
ccc::DD1x3y10 ::~DD1x3y10(){ note_dtor("_ZN3ccc8DD1x3y10E", this);} // tgen
ccc::DD1x3y10 ::DD1x3y10(){ note_ctor("_ZN3ccc8DD1x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y10E, buf);
    ::ccc::DD1x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y10E);
    dp->::ccc::DD1x3y10::~DD1x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y10E(Test__ZN3ccc8DD1x3y10E, "_ZN3ccc8DD1x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y10C1Ev();
extern void _ZN3ccc8DD1x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y10E[] = {
  NSPAIR(_ZN3ccc8DD1x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y10E[];
extern void _ZN3ccc8DD1x3y103abcEv();
extern void _ZN3ccc8DD1x3y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x3y103pqrEv,_ZTv0_n16_N3ccc8DD1x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y103pqrEv,_ZThn4_N3ccc8DD1x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x3y103abcEv,_ZTv0_n20_N3ccc8DD1x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y103abcEv,_ZThn4_N3ccc8DD1x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x3y103pqrEv,_ZTv0_n16_N3ccc8DD1x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x3y103abcEv,_ZTv0_n20_N3ccc8DD1x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y10E[] = {
  {&(_ZTVN3ccc8DD1x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y10E[];
static VTBL_ENTRY alt_thunk_names544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x3y103abcEv,_ZTv0_n20_N3ccc8DD1x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y103abcEv,_ZThn4_N3ccc8DD1x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x3y103pqrEv,_ZTv0_n16_N3ccc8DD1x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y103pqrEv,_ZThn4_N3ccc8DD1x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x3y10E = {  "_ZN3ccc8DD1x3y10E", // class name
  bases__ZN3ccc8DD1x3y10E, 2,
  &(vtc__ZN3ccc8DD1x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y10E),3, //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  CC1x3y11  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x3y113efgEv
  ~CC1x3y11(); // tgen
  CC1x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y11E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y113pqrEv");}
void  ccc::CC1x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x3y113efgEv");}
ccc::CC1x3y11 ::~CC1x3y11(){ note_dtor("_ZN3ccc8CC1x3y11E", this);} // tgen
ccc::CC1x3y11 ::CC1x3y11(){ note_ctor("_ZN3ccc8CC1x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y11E, buf);
    ::ccc::CC1x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y11E);
    dp->::ccc::CC1x3y11::~CC1x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y11E(Test__ZN3ccc8CC1x3y11E, "_ZN3ccc8CC1x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y11C1Ev();
extern void _ZN3ccc8CC1x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y11E[] = {
  NSPAIR(_ZN3ccc8CC1x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y11E[];
extern void _ZN3ccc8CC1x3y113efgEv();
extern void _ZN3ccc8CC1x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x3y113pqrEv,_ZTv0_n16_N3ccc8CC1x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y113pqrEv,_ZThn4_N3ccc8CC1x3y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x3y113efgEv,_ZTv0_n20_N3ccc8CC1x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y113efgEv,_ZThn4_N3ccc8CC1x3y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x3y113pqrEv,_ZTv0_n16_N3ccc8CC1x3y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x3y113efgEv,_ZTv0_n20_N3ccc8CC1x3y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y11E[] = {
  {&(_ZTVN3ccc8CC1x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y11E[];
static VTBL_ENTRY alt_thunk_names545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x3y113efgEv,_ZTv0_n20_N3ccc8CC1x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y113efgEv,_ZThn4_N3ccc8CC1x3y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x3y113pqrEv,_ZTv0_n16_N3ccc8CC1x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y113pqrEv,_ZThn4_N3ccc8CC1x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x3y11E = {  "_ZN3ccc8CC1x3y11E", // class name
  bases__ZN3ccc8CC1x3y11E, 2,
  &(vtc__ZN3ccc8CC1x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y11E),2, //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  DD1x3y11  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD1x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x3y113efgEv
  ~DD1x3y11(); // tgen
  DD1x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x3y113pqrEv");}
void  ccc::DD1x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x3y113efgEv");}
ccc::DD1x3y11 ::~DD1x3y11(){ note_dtor("_ZN3ccc8DD1x3y11E", this);} // tgen
ccc::DD1x3y11 ::DD1x3y11(){ note_ctor("_ZN3ccc8DD1x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y11E, buf);
    ::ccc::DD1x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y11E);
    dp->::ccc::DD1x3y11::~DD1x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y11E(Test__ZN3ccc8DD1x3y11E, "_ZN3ccc8DD1x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y11C1Ev();
extern void _ZN3ccc8DD1x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y11E[] = {
  NSPAIR(_ZN3ccc8DD1x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x3y113pqrEv();
extern void _ZN3ccc8DD1x3y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x3y113efgEv,_ZTv0_n12_N3ccc8DD1x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y113efgEv,_ZThn4_N3ccc8DD1x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x3y113pqrEv,_ZTv0_n16_N3ccc8DD1x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y113pqrEv,_ZThn4_N3ccc8DD1x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x3y113efgEv,_ZTv0_n12_N3ccc8DD1x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x3y113pqrEv,_ZTv0_n16_N3ccc8DD1x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y11E[] = {
  {&(_ZTVN3ccc8DD1x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y11E[];
static VTBL_ENTRY alt_thunk_names546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x3y113pqrEv,_ZTv0_n16_N3ccc8DD1x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y113pqrEv,_ZThn4_N3ccc8DD1x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x3y113efgEv,_ZTv0_n12_N3ccc8DD1x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y113efgEv,_ZThn4_N3ccc8DD1x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x3y11E = {  "_ZN3ccc8DD1x3y11E", // class name
  bases__ZN3ccc8DD1x3y11E, 2,
  &(vtc__ZN3ccc8DD1x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y11E),3, //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  CC1x3y12  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC1x3y123abcEv
  ~CC1x3y12(); // tgen
  CC1x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x3y123abcEv");}
ccc::CC1x3y12 ::~CC1x3y12(){ note_dtor("_ZN3ccc8CC1x3y12E", this);} // tgen
ccc::CC1x3y12 ::CC1x3y12(){ note_ctor("_ZN3ccc8CC1x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y12E, buf);
    ::ccc::CC1x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y12E);
    dp->::ccc::CC1x3y12::~CC1x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y12E(Test__ZN3ccc8CC1x3y12E, "_ZN3ccc8CC1x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y12C1Ev();
extern void _ZN3ccc8CC1x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y12E[] = {
  NSPAIR(_ZN3ccc8CC1x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC1x3y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x3y123abcEv,_ZTv0_n12_N3ccc8CC1x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y123abcEv,_ZThn4_N3ccc8CC1x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x3y123abcEv,_ZTv0_n12_N3ccc8CC1x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y12E[] = {
  {&(_ZTVN3ccc8CC1x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y12E[];
static VTBL_ENTRY alt_thunk_names547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x3y123abcEv,_ZTv0_n12_N3ccc8CC1x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y123abcEv,_ZThn4_N3ccc8CC1x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x3y12E = {  "_ZN3ccc8CC1x3y12E", // class name
  bases__ZN3ccc8CC1x3y12E, 2,
  &(vtc__ZN3ccc8CC1x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y12E),2, //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  DD1x3y12  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD1x3y123abcEv
  ~DD1x3y12(); // tgen
  DD1x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x3y123abcEv");}
ccc::DD1x3y12 ::~DD1x3y12(){ note_dtor("_ZN3ccc8DD1x3y12E", this);} // tgen
ccc::DD1x3y12 ::DD1x3y12(){ note_ctor("_ZN3ccc8DD1x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y12E, buf);
    ::ccc::DD1x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y12E);
    dp->::ccc::DD1x3y12::~DD1x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y12E(Test__ZN3ccc8DD1x3y12E, "_ZN3ccc8DD1x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y12C1Ev();
extern void _ZN3ccc8DD1x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y12E[] = {
  NSPAIR(_ZN3ccc8DD1x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y12E[];
extern void _ZN3ccc8DD1x3y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x3y123abcEv,_ZTv0_n20_N3ccc8DD1x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y123abcEv,_ZThn4_N3ccc8DD1x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x3y123abcEv,_ZTv0_n20_N3ccc8DD1x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y12E[] = {
  {&(_ZTVN3ccc8DD1x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y12E[];
static VTBL_ENTRY alt_thunk_names548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x3y123abcEv,_ZTv0_n20_N3ccc8DD1x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y123abcEv,_ZThn4_N3ccc8DD1x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x3y12E = {  "_ZN3ccc8DD1x3y12E", // class name
  bases__ZN3ccc8DD1x3y12E, 2,
  &(vtc__ZN3ccc8DD1x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names548,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y13  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC1x3y133efgEv
  ~CC1x3y13(); // tgen
  CC1x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x3y133efgEv");}
ccc::CC1x3y13 ::~CC1x3y13(){ note_dtor("_ZN3ccc8CC1x3y13E", this);} // tgen
ccc::CC1x3y13 ::CC1x3y13(){ note_ctor("_ZN3ccc8CC1x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y13E, buf);
    ::ccc::CC1x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y13E);
    dp->::ccc::CC1x3y13::~CC1x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y13E(Test__ZN3ccc8CC1x3y13E, "_ZN3ccc8CC1x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y13C1Ev();
extern void _ZN3ccc8CC1x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y13E[] = {
  NSPAIR(_ZN3ccc8CC1x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y13E[];
extern void _ZN3ccc8CC1x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x3y133efgEv,_ZTv0_n20_N3ccc8CC1x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y133efgEv,_ZThn4_N3ccc8CC1x3y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x3y133efgEv,_ZTv0_n20_N3ccc8CC1x3y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y13E[] = {
  {&(_ZTVN3ccc8CC1x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y13E[];
static VTBL_ENTRY alt_thunk_names549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x3y133efgEv,_ZTv0_n20_N3ccc8CC1x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y133efgEv,_ZThn4_N3ccc8CC1x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x3y13E = {  "_ZN3ccc8CC1x3y13E", // class name
  bases__ZN3ccc8CC1x3y13E, 2,
  &(vtc__ZN3ccc8CC1x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y13E),2, //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  DD1x3y13  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD1x3y133efgEv
  ~DD1x3y13(); // tgen
  DD1x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x3y133efgEv");}
ccc::DD1x3y13 ::~DD1x3y13(){ note_dtor("_ZN3ccc8DD1x3y13E", this);} // tgen
ccc::DD1x3y13 ::DD1x3y13(){ note_ctor("_ZN3ccc8DD1x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y13E, buf);
    ::ccc::DD1x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y13E);
    dp->::ccc::DD1x3y13::~DD1x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y13E(Test__ZN3ccc8DD1x3y13E, "_ZN3ccc8DD1x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y13C1Ev();
extern void _ZN3ccc8DD1x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y13E[] = {
  NSPAIR(_ZN3ccc8DD1x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x3y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x3y133efgEv,_ZTv0_n12_N3ccc8DD1x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y133efgEv,_ZThn4_N3ccc8DD1x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x3y133efgEv,_ZTv0_n12_N3ccc8DD1x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y13E[] = {
  {&(_ZTVN3ccc8DD1x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y13E[];
static VTBL_ENTRY alt_thunk_names550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x3y133efgEv,_ZTv0_n12_N3ccc8DD1x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y133efgEv,_ZThn4_N3ccc8DD1x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x3y13E = {  "_ZN3ccc8DD1x3y13E", // class name
  bases__ZN3ccc8DD1x3y13E, 2,
  &(vtc__ZN3ccc8DD1x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y13E),3, //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  CC1x3y14  : virtual ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y143pqrEv
  ~CC1x3y14(); // tgen
  CC1x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y143pqrEv");}
ccc::CC1x3y14 ::~CC1x3y14(){ note_dtor("_ZN3ccc8CC1x3y14E", this);} // tgen
ccc::CC1x3y14 ::CC1x3y14(){ note_ctor("_ZN3ccc8CC1x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y14E, buf);
    ::ccc::CC1x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y14E);
    dp->::ccc::CC1x3y14::~CC1x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y14E(Test__ZN3ccc8CC1x3y14E, "_ZN3ccc8CC1x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y14C1Ev();
extern void _ZN3ccc8CC1x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y14E[] = {
  NSPAIR(_ZN3ccc8CC1x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC1x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x3y143pqrEv,_ZTv0_n16_N3ccc8CC1x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y143pqrEv,_ZThn4_N3ccc8CC1x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x3y143pqrEv,_ZTv0_n16_N3ccc8CC1x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y14E[] = {
  {&(_ZTVN3ccc8CC1x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y14E[];
static VTBL_ENTRY alt_thunk_names551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x3y143pqrEv,_ZTv0_n16_N3ccc8CC1x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x3y143pqrEv,_ZThn4_N3ccc8CC1x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x3y14E = {  "_ZN3ccc8CC1x3y14E", // class name
  bases__ZN3ccc8CC1x3y14E, 2,
  &(vtc__ZN3ccc8CC1x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y14E),2, //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  DD1x3y14  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD1x3y143pqrEv
  ~DD1x3y14(); // tgen
  DD1x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x3y143pqrEv");}
ccc::DD1x3y14 ::~DD1x3y14(){ note_dtor("_ZN3ccc8DD1x3y14E", this);} // tgen
ccc::DD1x3y14 ::DD1x3y14(){ note_ctor("_ZN3ccc8DD1x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y14E, buf);
    ::ccc::DD1x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y14E);
    dp->::ccc::DD1x3y14::~DD1x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y14E(Test__ZN3ccc8DD1x3y14E, "_ZN3ccc8DD1x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y14C1Ev();
extern void _ZN3ccc8DD1x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y14E[] = {
  NSPAIR(_ZN3ccc8DD1x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x3y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x3y143pqrEv,_ZTv0_n16_N3ccc8DD1x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x3y143pqrEv,_ZThn4_N3ccc8DD1x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x3y143pqrEv,_ZTv0_n16_N3ccc8DD1x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y14E[] = {
  {&(_ZTVN3ccc8DD1x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y14E[];
static VTBL_ENTRY alt_thunk_names552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x3y143pqrEv,_ZTv0_n16_N3ccc8DD1x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x3y143pqrEv,_ZThn4_N3ccc8DD1x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x3y14E = {  "_ZN3ccc8DD1x3y14E", // class name
  bases__ZN3ccc8DD1x3y14E, 2,
  &(vtc__ZN3ccc8DD1x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y14E),3, //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  CC1x3y15  : virtual ::ccc::AA1 , ::ccc::BB3 {
  ~CC1x3y15(); // tgen
  CC1x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x3y15 ::~CC1x3y15(){ note_dtor("_ZN3ccc8CC1x3y15E", this);} // tgen
ccc::CC1x3y15 ::CC1x3y15(){ note_ctor("_ZN3ccc8CC1x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y15E, buf);
    ::ccc::CC1x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC1x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y15E);
    dp->::ccc::CC1x3y15::~CC1x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y15E(Test__ZN3ccc8CC1x3y15E, "_ZN3ccc8CC1x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y15C1Ev();
extern void _ZN3ccc8CC1x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y15E[] = {
  NSPAIR(_ZN3ccc8CC1x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x3y15E[] = {
  {&(_ZTVN3ccc8CC1x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x3y15E[];
Class_Descriptor cd__ZN3ccc8CC1x3y15E = {  "_ZN3ccc8CC1x3y15E", // class name
  bases__ZN3ccc8CC1x3y15E, 2,
  &(vtc__ZN3ccc8CC1x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x3y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x3y15  : virtual ::ccc::AA1 , virtual ::ccc::BB3 {
  ~DD1x3y15(); // tgen
  DD1x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x3y15 ::~DD1x3y15(){ note_dtor("_ZN3ccc8DD1x3y15E", this);} // tgen
ccc::DD1x3y15 ::DD1x3y15(){ note_ctor("_ZN3ccc8DD1x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x3y15E, buf);
    ::ccc::DD1x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x3y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD1x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x3y15E);
    dp->::ccc::DD1x3y15::~DD1x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x3y15E(Test__ZN3ccc8DD1x3y15E, "_ZN3ccc8DD1x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x3y15C1Ev();
extern void _ZN3ccc8DD1x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x3y15E[] = {
  NSPAIR(_ZN3ccc8DD1x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD1x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x3y15E[] = {
  {&(_ZTVN3ccc8DD1x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x3y15E[];
Class_Descriptor cd__ZN3ccc8DD1x3y15E = {  "_ZN3ccc8DD1x3y15E", // class name
  bases__ZN3ccc8DD1x3y15E, 2,
  &(vtc__ZN3ccc8DD1x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x3y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y0  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y03pqrEv
  ~CC1x4y0(); // tgen
  CC1x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y0E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y03abcEv");}
void  ccc::CC1x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y03efgEv");}
void  ccc::CC1x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y03pqrEv");}
ccc::CC1x4y0 ::~CC1x4y0(){ note_dtor("_ZN3ccc7CC1x4y0E", this);} // tgen
ccc::CC1x4y0 ::CC1x4y0(){ note_ctor("_ZN3ccc7CC1x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y0E, buf);
    ::ccc::CC1x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y0E);
    dp->::ccc::CC1x4y0::~CC1x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y0E(Test__ZN3ccc7CC1x4y0E, "_ZN3ccc7CC1x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y0C1Ev();
extern void _ZN3ccc7CC1x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y0E[] = {
  NSPAIR(_ZN3ccc7CC1x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y0E[];
extern void _ZN3ccc7CC1x4y03pqrEv();
extern void _ZN3ccc7CC1x4y03abcEv();
extern void _ZN3ccc7CC1x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y03abcEv,_ZTv0_n12_N3ccc7CC1x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03abcEv,_ZThn4_N3ccc7CC1x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y03pqrEv,_ZTv0_n16_N3ccc7CC1x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03pqrEv,_ZThn4_N3ccc7CC1x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y03efgEv,_ZTv0_n20_N3ccc7CC1x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03efgEv,_ZThn4_N3ccc7CC1x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y03abcEv,_ZTv0_n12_N3ccc7CC1x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y03pqrEv,_ZTv0_n16_N3ccc7CC1x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y03efgEv,_ZTv0_n20_N3ccc7CC1x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y0E[] = {
  {&(_ZTVN3ccc7CC1x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y0E[];
static VTBL_ENTRY alt_thunk_names553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y03efgEv,_ZTv0_n20_N3ccc7CC1x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y03efgEv,_ZThn4_N3ccc7CC1x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y03pqrEv,_ZTv0_n16_N3ccc7CC1x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y03pqrEv,_ZThn4_N3ccc7CC1x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y03abcEv,_ZTv0_n12_N3ccc7CC1x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y03abcEv,_ZThn4_N3ccc7CC1x4y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y0E = {  "_ZN3ccc7CC1x4y0E", // class name
  bases__ZN3ccc7CC1x4y0E, 2,
  &(vtc__ZN3ccc7CC1x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y0E),2, //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  DD1x4y0  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD1x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y03pqrEv
  ~DD1x4y0(); // tgen
  DD1x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y03abcEv");}
void  ccc::DD1x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y03efgEv");}
void  ccc::DD1x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y03pqrEv");}
ccc::DD1x4y0 ::~DD1x4y0(){ note_dtor("_ZN3ccc7DD1x4y0E", this);} // tgen
ccc::DD1x4y0 ::DD1x4y0(){ note_ctor("_ZN3ccc7DD1x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y0E, buf);
    ::ccc::DD1x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y0E);
    dp->::ccc::DD1x4y0::~DD1x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y0E(Test__ZN3ccc7DD1x4y0E, "_ZN3ccc7DD1x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y0C1Ev();
extern void _ZN3ccc7DD1x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y0E[] = {
  NSPAIR(_ZN3ccc7DD1x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y0E[];
extern void _ZN3ccc7DD1x4y03abcEv();
extern void _ZN3ccc7DD1x4y03pqrEv();
extern void _ZN3ccc7DD1x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y03pqrEv,_ZTv0_n12_N3ccc7DD1x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y03pqrEv,_ZThn4_N3ccc7DD1x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y03abcEv,_ZTv0_n16_N3ccc7DD1x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y03abcEv,_ZThn4_N3ccc7DD1x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y03efgEv,_ZTv0_n20_N3ccc7DD1x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y03efgEv,_ZThn4_N3ccc7DD1x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y03pqrEv,_ZTv0_n12_N3ccc7DD1x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y03abcEv,_ZTv0_n16_N3ccc7DD1x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y03efgEv,_ZTv0_n20_N3ccc7DD1x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y0E[] = {
  {&(_ZTVN3ccc7DD1x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y0E[];
static VTBL_ENTRY alt_thunk_names554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y03efgEv,_ZTv0_n20_N3ccc7DD1x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y03efgEv,_ZThn4_N3ccc7DD1x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y03abcEv,_ZTv0_n16_N3ccc7DD1x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y03abcEv,_ZThn4_N3ccc7DD1x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y03pqrEv,_ZTv0_n12_N3ccc7DD1x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y03pqrEv,_ZThn4_N3ccc7DD1x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y0E = {  "_ZN3ccc7DD1x4y0E", // class name
  bases__ZN3ccc7DD1x4y0E, 2,
  &(vtc__ZN3ccc7DD1x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y0E),3, //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  CC1x4y1  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x4y13efgEv
  ~CC1x4y1(); // tgen
  CC1x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y1E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y13abcEv");}
void  ccc::CC1x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y13pqrEv");}
void  ccc::CC1x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y13efgEv");}
ccc::CC1x4y1 ::~CC1x4y1(){ note_dtor("_ZN3ccc7CC1x4y1E", this);} // tgen
ccc::CC1x4y1 ::CC1x4y1(){ note_ctor("_ZN3ccc7CC1x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y1E, buf);
    ::ccc::CC1x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y1E);
    dp->::ccc::CC1x4y1::~CC1x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y1E(Test__ZN3ccc7CC1x4y1E, "_ZN3ccc7CC1x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y1C1Ev();
extern void _ZN3ccc7CC1x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y1E[] = {
  NSPAIR(_ZN3ccc7CC1x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y1E[];
extern void _ZN3ccc7CC1x4y13pqrEv();
extern void _ZN3ccc7CC1x4y13abcEv();
extern void _ZN3ccc7CC1x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y13abcEv,_ZTv0_n12_N3ccc7CC1x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13abcEv,_ZThn4_N3ccc7CC1x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y13pqrEv,_ZTv0_n16_N3ccc7CC1x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13pqrEv,_ZThn4_N3ccc7CC1x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y13efgEv,_ZTv0_n20_N3ccc7CC1x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13efgEv,_ZThn4_N3ccc7CC1x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y13abcEv,_ZTv0_n12_N3ccc7CC1x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y13pqrEv,_ZTv0_n16_N3ccc7CC1x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y13efgEv,_ZTv0_n20_N3ccc7CC1x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y1E[] = {
  {&(_ZTVN3ccc7CC1x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y1E[];
static VTBL_ENTRY alt_thunk_names555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y13efgEv,_ZTv0_n20_N3ccc7CC1x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y13efgEv,_ZThn4_N3ccc7CC1x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y13pqrEv,_ZTv0_n16_N3ccc7CC1x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y13pqrEv,_ZThn4_N3ccc7CC1x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y13abcEv,_ZTv0_n12_N3ccc7CC1x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y13abcEv,_ZThn4_N3ccc7CC1x4y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y1E = {  "_ZN3ccc7CC1x4y1E", // class name
  bases__ZN3ccc7CC1x4y1E, 2,
  &(vtc__ZN3ccc7CC1x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y1E),2, //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  DD1x4y1  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD1x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x4y13efgEv
  ~DD1x4y1(); // tgen
  DD1x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y13abcEv");}
void  ccc::DD1x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y13pqrEv");}
void  ccc::DD1x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y13efgEv");}
ccc::DD1x4y1 ::~DD1x4y1(){ note_dtor("_ZN3ccc7DD1x4y1E", this);} // tgen
ccc::DD1x4y1 ::DD1x4y1(){ note_ctor("_ZN3ccc7DD1x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y1E, buf);
    ::ccc::DD1x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y1E);
    dp->::ccc::DD1x4y1::~DD1x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y1E(Test__ZN3ccc7DD1x4y1E, "_ZN3ccc7DD1x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y1C1Ev();
extern void _ZN3ccc7DD1x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y1E[] = {
  NSPAIR(_ZN3ccc7DD1x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y1E[];
extern void _ZN3ccc7DD1x4y13abcEv();
extern void _ZN3ccc7DD1x4y13pqrEv();
extern void _ZN3ccc7DD1x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y13pqrEv,_ZTv0_n12_N3ccc7DD1x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y13pqrEv,_ZThn4_N3ccc7DD1x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y13abcEv,_ZTv0_n16_N3ccc7DD1x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y13abcEv,_ZThn4_N3ccc7DD1x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y13efgEv,_ZTv0_n20_N3ccc7DD1x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y13efgEv,_ZThn4_N3ccc7DD1x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y13pqrEv,_ZTv0_n12_N3ccc7DD1x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y13abcEv,_ZTv0_n16_N3ccc7DD1x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y13efgEv,_ZTv0_n20_N3ccc7DD1x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y1E[] = {
  {&(_ZTVN3ccc7DD1x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y1E[];
static VTBL_ENTRY alt_thunk_names556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y13efgEv,_ZTv0_n20_N3ccc7DD1x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y13efgEv,_ZThn4_N3ccc7DD1x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y13abcEv,_ZTv0_n16_N3ccc7DD1x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y13abcEv,_ZThn4_N3ccc7DD1x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y13pqrEv,_ZTv0_n12_N3ccc7DD1x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y13pqrEv,_ZThn4_N3ccc7DD1x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y1E = {  "_ZN3ccc7DD1x4y1E", // class name
  bases__ZN3ccc7DD1x4y1E, 2,
  &(vtc__ZN3ccc7DD1x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y1E),3, //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  CC1x4y2  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y23pqrEv
  ~CC1x4y2(); // tgen
  CC1x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y2E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y23efgEv");}
void  ccc::CC1x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y23abcEv");}
void  ccc::CC1x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y23pqrEv");}
ccc::CC1x4y2 ::~CC1x4y2(){ note_dtor("_ZN3ccc7CC1x4y2E", this);} // tgen
ccc::CC1x4y2 ::CC1x4y2(){ note_ctor("_ZN3ccc7CC1x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y2E, buf);
    ::ccc::CC1x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y2E);
    dp->::ccc::CC1x4y2::~CC1x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y2E(Test__ZN3ccc7CC1x4y2E, "_ZN3ccc7CC1x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y2C1Ev();
extern void _ZN3ccc7CC1x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y2E[] = {
  NSPAIR(_ZN3ccc7CC1x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y2E[];
extern void _ZN3ccc7CC1x4y23pqrEv();
extern void _ZN3ccc7CC1x4y23abcEv();
extern void _ZN3ccc7CC1x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y23abcEv,_ZTv0_n12_N3ccc7CC1x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23abcEv,_ZThn4_N3ccc7CC1x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y23pqrEv,_ZTv0_n16_N3ccc7CC1x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23pqrEv,_ZThn4_N3ccc7CC1x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y23efgEv,_ZTv0_n20_N3ccc7CC1x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23efgEv,_ZThn4_N3ccc7CC1x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y23abcEv,_ZTv0_n12_N3ccc7CC1x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y23pqrEv,_ZTv0_n16_N3ccc7CC1x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y23efgEv,_ZTv0_n20_N3ccc7CC1x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y2E[] = {
  {&(_ZTVN3ccc7CC1x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y2E[];
static VTBL_ENTRY alt_thunk_names557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y23efgEv,_ZTv0_n20_N3ccc7CC1x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y23efgEv,_ZThn4_N3ccc7CC1x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y23pqrEv,_ZTv0_n16_N3ccc7CC1x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y23pqrEv,_ZThn4_N3ccc7CC1x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y23abcEv,_ZTv0_n12_N3ccc7CC1x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y23abcEv,_ZThn4_N3ccc7CC1x4y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y2E = {  "_ZN3ccc7CC1x4y2E", // class name
  bases__ZN3ccc7CC1x4y2E, 2,
  &(vtc__ZN3ccc7CC1x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y2E),2, //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  DD1x4y2  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD1x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y23pqrEv
  ~DD1x4y2(); // tgen
  DD1x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y23efgEv");}
void  ccc::DD1x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y23abcEv");}
void  ccc::DD1x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y23pqrEv");}
ccc::DD1x4y2 ::~DD1x4y2(){ note_dtor("_ZN3ccc7DD1x4y2E", this);} // tgen
ccc::DD1x4y2 ::DD1x4y2(){ note_ctor("_ZN3ccc7DD1x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y2E, buf);
    ::ccc::DD1x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y2E);
    dp->::ccc::DD1x4y2::~DD1x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y2E(Test__ZN3ccc7DD1x4y2E, "_ZN3ccc7DD1x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y2C1Ev();
extern void _ZN3ccc7DD1x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y2E[] = {
  NSPAIR(_ZN3ccc7DD1x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y2E[];
extern void _ZN3ccc7DD1x4y23abcEv();
extern void _ZN3ccc7DD1x4y23pqrEv();
extern void _ZN3ccc7DD1x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y23pqrEv,_ZTv0_n12_N3ccc7DD1x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y23pqrEv,_ZThn4_N3ccc7DD1x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y23abcEv,_ZTv0_n16_N3ccc7DD1x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y23abcEv,_ZThn4_N3ccc7DD1x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y23efgEv,_ZTv0_n20_N3ccc7DD1x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y23efgEv,_ZThn4_N3ccc7DD1x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y23pqrEv,_ZTv0_n12_N3ccc7DD1x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y23abcEv,_ZTv0_n16_N3ccc7DD1x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y23efgEv,_ZTv0_n20_N3ccc7DD1x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y2E[] = {
  {&(_ZTVN3ccc7DD1x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y2E[];
static VTBL_ENTRY alt_thunk_names558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y23efgEv,_ZTv0_n20_N3ccc7DD1x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y23efgEv,_ZThn4_N3ccc7DD1x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y23abcEv,_ZTv0_n16_N3ccc7DD1x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y23abcEv,_ZThn4_N3ccc7DD1x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y23pqrEv,_ZTv0_n12_N3ccc7DD1x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y23pqrEv,_ZThn4_N3ccc7DD1x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y2E = {  "_ZN3ccc7DD1x4y2E", // class name
  bases__ZN3ccc7DD1x4y2E, 2,
  &(vtc__ZN3ccc7DD1x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y2E),3, //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  CC1x4y3  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x4y33abcEv
  ~CC1x4y3(); // tgen
  CC1x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y3E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y33efgEv");}
void  ccc::CC1x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y33pqrEv");}
void  ccc::CC1x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y33abcEv");}
ccc::CC1x4y3 ::~CC1x4y3(){ note_dtor("_ZN3ccc7CC1x4y3E", this);} // tgen
ccc::CC1x4y3 ::CC1x4y3(){ note_ctor("_ZN3ccc7CC1x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y3E, buf);
    ::ccc::CC1x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y3E);
    dp->::ccc::CC1x4y3::~CC1x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y3E(Test__ZN3ccc7CC1x4y3E, "_ZN3ccc7CC1x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y3C1Ev();
extern void _ZN3ccc7CC1x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y3E[] = {
  NSPAIR(_ZN3ccc7CC1x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y3E[];
extern void _ZN3ccc7CC1x4y33pqrEv();
extern void _ZN3ccc7CC1x4y33abcEv();
extern void _ZN3ccc7CC1x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y33abcEv,_ZTv0_n12_N3ccc7CC1x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33abcEv,_ZThn4_N3ccc7CC1x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y33pqrEv,_ZTv0_n16_N3ccc7CC1x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33pqrEv,_ZThn4_N3ccc7CC1x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y33efgEv,_ZTv0_n20_N3ccc7CC1x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33efgEv,_ZThn4_N3ccc7CC1x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y33abcEv,_ZTv0_n12_N3ccc7CC1x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y33pqrEv,_ZTv0_n16_N3ccc7CC1x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y33efgEv,_ZTv0_n20_N3ccc7CC1x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y3E[] = {
  {&(_ZTVN3ccc7CC1x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y3E[];
static VTBL_ENTRY alt_thunk_names559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y33efgEv,_ZTv0_n20_N3ccc7CC1x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y33efgEv,_ZThn4_N3ccc7CC1x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y33pqrEv,_ZTv0_n16_N3ccc7CC1x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y33pqrEv,_ZThn4_N3ccc7CC1x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y33abcEv,_ZTv0_n12_N3ccc7CC1x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y33abcEv,_ZThn4_N3ccc7CC1x4y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y3E = {  "_ZN3ccc7CC1x4y3E", // class name
  bases__ZN3ccc7CC1x4y3E, 2,
  &(vtc__ZN3ccc7CC1x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y3E),2, //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  DD1x4y3  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD1x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x4y33abcEv
  ~DD1x4y3(); // tgen
  DD1x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y33efgEv");}
void  ccc::DD1x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y33pqrEv");}
void  ccc::DD1x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y33abcEv");}
ccc::DD1x4y3 ::~DD1x4y3(){ note_dtor("_ZN3ccc7DD1x4y3E", this);} // tgen
ccc::DD1x4y3 ::DD1x4y3(){ note_ctor("_ZN3ccc7DD1x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y3E, buf);
    ::ccc::DD1x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y3E);
    dp->::ccc::DD1x4y3::~DD1x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y3E(Test__ZN3ccc7DD1x4y3E, "_ZN3ccc7DD1x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y3C1Ev();
extern void _ZN3ccc7DD1x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y3E[] = {
  NSPAIR(_ZN3ccc7DD1x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y3E[];
extern void _ZN3ccc7DD1x4y33abcEv();
extern void _ZN3ccc7DD1x4y33pqrEv();
extern void _ZN3ccc7DD1x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y33pqrEv,_ZTv0_n12_N3ccc7DD1x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y33pqrEv,_ZThn4_N3ccc7DD1x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y33abcEv,_ZTv0_n16_N3ccc7DD1x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y33abcEv,_ZThn4_N3ccc7DD1x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y33efgEv,_ZTv0_n20_N3ccc7DD1x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y33efgEv,_ZThn4_N3ccc7DD1x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y33pqrEv,_ZTv0_n12_N3ccc7DD1x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y33abcEv,_ZTv0_n16_N3ccc7DD1x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y33efgEv,_ZTv0_n20_N3ccc7DD1x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y3E[] = {
  {&(_ZTVN3ccc7DD1x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y3E[];
static VTBL_ENTRY alt_thunk_names560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y33efgEv,_ZTv0_n20_N3ccc7DD1x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y33efgEv,_ZThn4_N3ccc7DD1x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y33abcEv,_ZTv0_n16_N3ccc7DD1x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y33abcEv,_ZThn4_N3ccc7DD1x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y33pqrEv,_ZTv0_n12_N3ccc7DD1x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y33pqrEv,_ZThn4_N3ccc7DD1x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y3E = {  "_ZN3ccc7DD1x4y3E", // class name
  bases__ZN3ccc7DD1x4y3E, 2,
  &(vtc__ZN3ccc7DD1x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y3E),3, //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  CC1x4y4  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC1x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y43efgEv
  ~CC1x4y4(); // tgen
  CC1x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y4E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y43pqrEv");}
void  ccc::CC1x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y43abcEv");}
void  ccc::CC1x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y43efgEv");}
ccc::CC1x4y4 ::~CC1x4y4(){ note_dtor("_ZN3ccc7CC1x4y4E", this);} // tgen
ccc::CC1x4y4 ::CC1x4y4(){ note_ctor("_ZN3ccc7CC1x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y4E, buf);
    ::ccc::CC1x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y4E);
    dp->::ccc::CC1x4y4::~CC1x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y4E(Test__ZN3ccc7CC1x4y4E, "_ZN3ccc7CC1x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y4C1Ev();
extern void _ZN3ccc7CC1x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y4E[] = {
  NSPAIR(_ZN3ccc7CC1x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y4E[];
extern void _ZN3ccc7CC1x4y43pqrEv();
extern void _ZN3ccc7CC1x4y43abcEv();
extern void _ZN3ccc7CC1x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y43abcEv,_ZTv0_n12_N3ccc7CC1x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43abcEv,_ZThn4_N3ccc7CC1x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y43pqrEv,_ZTv0_n16_N3ccc7CC1x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43pqrEv,_ZThn4_N3ccc7CC1x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y43efgEv,_ZTv0_n20_N3ccc7CC1x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43efgEv,_ZThn4_N3ccc7CC1x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y43abcEv,_ZTv0_n12_N3ccc7CC1x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y43pqrEv,_ZTv0_n16_N3ccc7CC1x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y43efgEv,_ZTv0_n20_N3ccc7CC1x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y4E[] = {
  {&(_ZTVN3ccc7CC1x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y4E[];
static VTBL_ENTRY alt_thunk_names561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y43efgEv,_ZTv0_n20_N3ccc7CC1x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y43efgEv,_ZThn4_N3ccc7CC1x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y43pqrEv,_ZTv0_n16_N3ccc7CC1x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y43pqrEv,_ZThn4_N3ccc7CC1x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y43abcEv,_ZTv0_n12_N3ccc7CC1x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y43abcEv,_ZThn4_N3ccc7CC1x4y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y4E = {  "_ZN3ccc7CC1x4y4E", // class name
  bases__ZN3ccc7CC1x4y4E, 2,
  &(vtc__ZN3ccc7CC1x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y4E),2, //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  DD1x4y4  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD1x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x4y43efgEv
  ~DD1x4y4(); // tgen
  DD1x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y43pqrEv");}
void  ccc::DD1x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y43abcEv");}
void  ccc::DD1x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y43efgEv");}
ccc::DD1x4y4 ::~DD1x4y4(){ note_dtor("_ZN3ccc7DD1x4y4E", this);} // tgen
ccc::DD1x4y4 ::DD1x4y4(){ note_ctor("_ZN3ccc7DD1x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y4E, buf);
    ::ccc::DD1x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y4E);
    dp->::ccc::DD1x4y4::~DD1x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y4E(Test__ZN3ccc7DD1x4y4E, "_ZN3ccc7DD1x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y4C1Ev();
extern void _ZN3ccc7DD1x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y4E[] = {
  NSPAIR(_ZN3ccc7DD1x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y4E[];
extern void _ZN3ccc7DD1x4y43abcEv();
extern void _ZN3ccc7DD1x4y43pqrEv();
extern void _ZN3ccc7DD1x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y43pqrEv,_ZTv0_n12_N3ccc7DD1x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y43pqrEv,_ZThn4_N3ccc7DD1x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y43abcEv,_ZTv0_n16_N3ccc7DD1x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y43abcEv,_ZThn4_N3ccc7DD1x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y43efgEv,_ZTv0_n20_N3ccc7DD1x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y43efgEv,_ZThn4_N3ccc7DD1x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y43pqrEv,_ZTv0_n12_N3ccc7DD1x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y43abcEv,_ZTv0_n16_N3ccc7DD1x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y43efgEv,_ZTv0_n20_N3ccc7DD1x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y4E[] = {
  {&(_ZTVN3ccc7DD1x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y4E[];
static VTBL_ENTRY alt_thunk_names562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y43efgEv,_ZTv0_n20_N3ccc7DD1x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y43efgEv,_ZThn4_N3ccc7DD1x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y43abcEv,_ZTv0_n16_N3ccc7DD1x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y43abcEv,_ZThn4_N3ccc7DD1x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y43pqrEv,_ZTv0_n12_N3ccc7DD1x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y43pqrEv,_ZThn4_N3ccc7DD1x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y4E = {  "_ZN3ccc7DD1x4y4E", // class name
  bases__ZN3ccc7DD1x4y4E, 2,
  &(vtc__ZN3ccc7DD1x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y4E),3, //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  CC1x4y5  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC1x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y53abcEv
  ~CC1x4y5(); // tgen
  CC1x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y5E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y53pqrEv");}
void  ccc::CC1x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y53efgEv");}
void  ccc::CC1x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y53abcEv");}
ccc::CC1x4y5 ::~CC1x4y5(){ note_dtor("_ZN3ccc7CC1x4y5E", this);} // tgen
ccc::CC1x4y5 ::CC1x4y5(){ note_ctor("_ZN3ccc7CC1x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y5E, buf);
    ::ccc::CC1x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y5E);
    dp->::ccc::CC1x4y5::~CC1x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y5E(Test__ZN3ccc7CC1x4y5E, "_ZN3ccc7CC1x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y5C1Ev();
extern void _ZN3ccc7CC1x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y5E[] = {
  NSPAIR(_ZN3ccc7CC1x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y5E[];
extern void _ZN3ccc7CC1x4y53pqrEv();
extern void _ZN3ccc7CC1x4y53abcEv();
extern void _ZN3ccc7CC1x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y53abcEv,_ZTv0_n12_N3ccc7CC1x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53abcEv,_ZThn4_N3ccc7CC1x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y53pqrEv,_ZTv0_n16_N3ccc7CC1x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53pqrEv,_ZThn4_N3ccc7CC1x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y53efgEv,_ZTv0_n20_N3ccc7CC1x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53efgEv,_ZThn4_N3ccc7CC1x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y53abcEv,_ZTv0_n12_N3ccc7CC1x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y53pqrEv,_ZTv0_n16_N3ccc7CC1x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y53efgEv,_ZTv0_n20_N3ccc7CC1x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y5E[] = {
  {&(_ZTVN3ccc7CC1x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y5E[];
static VTBL_ENTRY alt_thunk_names563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y53efgEv,_ZTv0_n20_N3ccc7CC1x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y53efgEv,_ZThn4_N3ccc7CC1x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y53pqrEv,_ZTv0_n16_N3ccc7CC1x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y53pqrEv,_ZThn4_N3ccc7CC1x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y53abcEv,_ZTv0_n12_N3ccc7CC1x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y53abcEv,_ZThn4_N3ccc7CC1x4y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y5E = {  "_ZN3ccc7CC1x4y5E", // class name
  bases__ZN3ccc7CC1x4y5E, 2,
  &(vtc__ZN3ccc7CC1x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y5E),2, //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  DD1x4y5  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD1x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x4y53abcEv
  ~DD1x4y5(); // tgen
  DD1x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y53pqrEv");}
void  ccc::DD1x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y53efgEv");}
void  ccc::DD1x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y53abcEv");}
ccc::DD1x4y5 ::~DD1x4y5(){ note_dtor("_ZN3ccc7DD1x4y5E", this);} // tgen
ccc::DD1x4y5 ::DD1x4y5(){ note_ctor("_ZN3ccc7DD1x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y5E, buf);
    ::ccc::DD1x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y5E);
    dp->::ccc::DD1x4y5::~DD1x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y5E(Test__ZN3ccc7DD1x4y5E, "_ZN3ccc7DD1x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y5C1Ev();
extern void _ZN3ccc7DD1x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y5E[] = {
  NSPAIR(_ZN3ccc7DD1x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y5E[];
extern void _ZN3ccc7DD1x4y53abcEv();
extern void _ZN3ccc7DD1x4y53pqrEv();
extern void _ZN3ccc7DD1x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y53pqrEv,_ZTv0_n12_N3ccc7DD1x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y53pqrEv,_ZThn4_N3ccc7DD1x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y53abcEv,_ZTv0_n16_N3ccc7DD1x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y53abcEv,_ZThn4_N3ccc7DD1x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y53efgEv,_ZTv0_n20_N3ccc7DD1x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y53efgEv,_ZThn4_N3ccc7DD1x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y53pqrEv,_ZTv0_n12_N3ccc7DD1x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y53abcEv,_ZTv0_n16_N3ccc7DD1x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y53efgEv,_ZTv0_n20_N3ccc7DD1x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y5E[] = {
  {&(_ZTVN3ccc7DD1x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y5E[];
static VTBL_ENTRY alt_thunk_names564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y53efgEv,_ZTv0_n20_N3ccc7DD1x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y53efgEv,_ZThn4_N3ccc7DD1x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y53abcEv,_ZTv0_n16_N3ccc7DD1x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y53abcEv,_ZThn4_N3ccc7DD1x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y53pqrEv,_ZTv0_n12_N3ccc7DD1x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y53pqrEv,_ZThn4_N3ccc7DD1x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y5E = {  "_ZN3ccc7DD1x4y5E", // class name
  bases__ZN3ccc7DD1x4y5E, 2,
  &(vtc__ZN3ccc7DD1x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y5E),3, //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  CC1x4y6  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y63efgEv
  ~CC1x4y6(); // tgen
  CC1x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y6E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y63abcEv");}
void  ccc::CC1x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y63efgEv");}
ccc::CC1x4y6 ::~CC1x4y6(){ note_dtor("_ZN3ccc7CC1x4y6E", this);} // tgen
ccc::CC1x4y6 ::CC1x4y6(){ note_ctor("_ZN3ccc7CC1x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y6E, buf);
    ::ccc::CC1x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y6E);
    dp->::ccc::CC1x4y6::~CC1x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y6E(Test__ZN3ccc7CC1x4y6E, "_ZN3ccc7CC1x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y6C1Ev();
extern void _ZN3ccc7CC1x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y6E[] = {
  NSPAIR(_ZN3ccc7CC1x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC1x4y63abcEv();
extern void _ZN3ccc7CC1x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y63abcEv,_ZTv0_n12_N3ccc7CC1x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y63abcEv,_ZThn4_N3ccc7CC1x4y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y63efgEv,_ZTv0_n20_N3ccc7CC1x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y63efgEv,_ZThn4_N3ccc7CC1x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y63abcEv,_ZTv0_n12_N3ccc7CC1x4y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y63efgEv,_ZTv0_n20_N3ccc7CC1x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y6E[] = {
  {&(_ZTVN3ccc7CC1x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y6E[];
static VTBL_ENTRY alt_thunk_names565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y63efgEv,_ZTv0_n20_N3ccc7CC1x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y63efgEv,_ZThn4_N3ccc7CC1x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y63abcEv,_ZTv0_n12_N3ccc7CC1x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y63abcEv,_ZThn4_N3ccc7CC1x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y6E = {  "_ZN3ccc7CC1x4y6E", // class name
  bases__ZN3ccc7CC1x4y6E, 2,
  &(vtc__ZN3ccc7CC1x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y6E),2, //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  DD1x4y6  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD1x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x4y63efgEv
  ~DD1x4y6(); // tgen
  DD1x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y63abcEv");}
void  ccc::DD1x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y63efgEv");}
ccc::DD1x4y6 ::~DD1x4y6(){ note_dtor("_ZN3ccc7DD1x4y6E", this);} // tgen
ccc::DD1x4y6 ::DD1x4y6(){ note_ctor("_ZN3ccc7DD1x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y6E, buf);
    ::ccc::DD1x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y6E);
    dp->::ccc::DD1x4y6::~DD1x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y6E(Test__ZN3ccc7DD1x4y6E, "_ZN3ccc7DD1x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y6C1Ev();
extern void _ZN3ccc7DD1x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y6E[] = {
  NSPAIR(_ZN3ccc7DD1x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y6E[];
extern void _ZN3ccc7DD1x4y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y63abcEv,_ZTv0_n16_N3ccc7DD1x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y63abcEv,_ZThn4_N3ccc7DD1x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y63efgEv,_ZTv0_n20_N3ccc7DD1x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y63efgEv,_ZThn4_N3ccc7DD1x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y63abcEv,_ZTv0_n16_N3ccc7DD1x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y63efgEv,_ZTv0_n20_N3ccc7DD1x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y6E[] = {
  {&(_ZTVN3ccc7DD1x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y6E[];
static VTBL_ENTRY alt_thunk_names566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y63efgEv,_ZTv0_n20_N3ccc7DD1x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y63efgEv,_ZThn4_N3ccc7DD1x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y63abcEv,_ZTv0_n16_N3ccc7DD1x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y63abcEv,_ZThn4_N3ccc7DD1x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y6E = {  "_ZN3ccc7DD1x4y6E", // class name
  bases__ZN3ccc7DD1x4y6E, 2,
  &(vtc__ZN3ccc7DD1x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names566,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y7  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y73pqrEv
  ~CC1x4y7(); // tgen
  CC1x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y7E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y73abcEv");}
void  ccc::CC1x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y73pqrEv");}
ccc::CC1x4y7 ::~CC1x4y7(){ note_dtor("_ZN3ccc7CC1x4y7E", this);} // tgen
ccc::CC1x4y7 ::CC1x4y7(){ note_ctor("_ZN3ccc7CC1x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y7E, buf);
    ::ccc::CC1x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y7E);
    dp->::ccc::CC1x4y7::~CC1x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y7E(Test__ZN3ccc7CC1x4y7E, "_ZN3ccc7CC1x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y7C1Ev();
extern void _ZN3ccc7CC1x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y7E[] = {
  NSPAIR(_ZN3ccc7CC1x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y7E[];
extern void _ZN3ccc7CC1x4y73pqrEv();
extern void _ZN3ccc7CC1x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y73abcEv,_ZTv0_n12_N3ccc7CC1x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y73abcEv,_ZThn4_N3ccc7CC1x4y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y73pqrEv,_ZTv0_n16_N3ccc7CC1x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y73pqrEv,_ZThn4_N3ccc7CC1x4y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y73abcEv,_ZTv0_n12_N3ccc7CC1x4y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y73pqrEv,_ZTv0_n16_N3ccc7CC1x4y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y7E[] = {
  {&(_ZTVN3ccc7CC1x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y7E[];
static VTBL_ENTRY alt_thunk_names567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y73pqrEv,_ZTv0_n16_N3ccc7CC1x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y73pqrEv,_ZThn4_N3ccc7CC1x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y73abcEv,_ZTv0_n12_N3ccc7CC1x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y73abcEv,_ZThn4_N3ccc7CC1x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y7E = {  "_ZN3ccc7CC1x4y7E", // class name
  bases__ZN3ccc7CC1x4y7E, 2,
  &(vtc__ZN3ccc7CC1x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y7E),2, //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  DD1x4y7  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD1x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y73pqrEv
  ~DD1x4y7(); // tgen
  DD1x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y73abcEv");}
void  ccc::DD1x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y73pqrEv");}
ccc::DD1x4y7 ::~DD1x4y7(){ note_dtor("_ZN3ccc7DD1x4y7E", this);} // tgen
ccc::DD1x4y7 ::DD1x4y7(){ note_ctor("_ZN3ccc7DD1x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y7E, buf);
    ::ccc::DD1x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y7E);
    dp->::ccc::DD1x4y7::~DD1x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y7E(Test__ZN3ccc7DD1x4y7E, "_ZN3ccc7DD1x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y7C1Ev();
extern void _ZN3ccc7DD1x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y7E[] = {
  NSPAIR(_ZN3ccc7DD1x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y7E[];
extern void _ZN3ccc7DD1x4y73abcEv();
extern void _ZN3ccc7DD1x4y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y73pqrEv,_ZTv0_n12_N3ccc7DD1x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y73pqrEv,_ZThn4_N3ccc7DD1x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y73abcEv,_ZTv0_n16_N3ccc7DD1x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y73abcEv,_ZThn4_N3ccc7DD1x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y73pqrEv,_ZTv0_n12_N3ccc7DD1x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y73abcEv,_ZTv0_n16_N3ccc7DD1x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y7E[] = {
  {&(_ZTVN3ccc7DD1x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y7E[];
static VTBL_ENTRY alt_thunk_names568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y73abcEv,_ZTv0_n16_N3ccc7DD1x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y73abcEv,_ZThn4_N3ccc7DD1x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y73pqrEv,_ZTv0_n12_N3ccc7DD1x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y73pqrEv,_ZThn4_N3ccc7DD1x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y7E = {  "_ZN3ccc7DD1x4y7E", // class name
  bases__ZN3ccc7DD1x4y7E, 2,
  &(vtc__ZN3ccc7DD1x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y7E),3, //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  CC1x4y8  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y83abcEv
  ~CC1x4y8(); // tgen
  CC1x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y8E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y83efgEv");}
void  ccc::CC1x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y83abcEv");}
ccc::CC1x4y8 ::~CC1x4y8(){ note_dtor("_ZN3ccc7CC1x4y8E", this);} // tgen
ccc::CC1x4y8 ::CC1x4y8(){ note_ctor("_ZN3ccc7CC1x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y8E, buf);
    ::ccc::CC1x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y8E);
    dp->::ccc::CC1x4y8::~CC1x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y8E(Test__ZN3ccc7CC1x4y8E, "_ZN3ccc7CC1x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y8C1Ev();
extern void _ZN3ccc7CC1x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y8E[] = {
  NSPAIR(_ZN3ccc7CC1x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC1x4y83abcEv();
extern void _ZN3ccc7CC1x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x4y83abcEv,_ZTv0_n12_N3ccc7CC1x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y83abcEv,_ZThn4_N3ccc7CC1x4y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y83efgEv,_ZTv0_n20_N3ccc7CC1x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y83efgEv,_ZThn4_N3ccc7CC1x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x4y83abcEv,_ZTv0_n12_N3ccc7CC1x4y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y83efgEv,_ZTv0_n20_N3ccc7CC1x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y8E[] = {
  {&(_ZTVN3ccc7CC1x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y8E[];
static VTBL_ENTRY alt_thunk_names569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y83efgEv,_ZTv0_n20_N3ccc7CC1x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y83efgEv,_ZThn4_N3ccc7CC1x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x4y83abcEv,_ZTv0_n12_N3ccc7CC1x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y83abcEv,_ZThn4_N3ccc7CC1x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y8E = {  "_ZN3ccc7CC1x4y8E", // class name
  bases__ZN3ccc7CC1x4y8E, 2,
  &(vtc__ZN3ccc7CC1x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y8E),2, //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  DD1x4y8  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD1x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x4y83abcEv
  ~DD1x4y8(); // tgen
  DD1x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y83efgEv");}
void  ccc::DD1x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x4y83abcEv");}
ccc::DD1x4y8 ::~DD1x4y8(){ note_dtor("_ZN3ccc7DD1x4y8E", this);} // tgen
ccc::DD1x4y8 ::DD1x4y8(){ note_ctor("_ZN3ccc7DD1x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y8E, buf);
    ::ccc::DD1x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y8E);
    dp->::ccc::DD1x4y8::~DD1x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y8E(Test__ZN3ccc7DD1x4y8E, "_ZN3ccc7DD1x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y8C1Ev();
extern void _ZN3ccc7DD1x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y8E[] = {
  NSPAIR(_ZN3ccc7DD1x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y8E[];
extern void _ZN3ccc7DD1x4y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x4y83abcEv,_ZTv0_n16_N3ccc7DD1x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y83abcEv,_ZThn4_N3ccc7DD1x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y83efgEv,_ZTv0_n20_N3ccc7DD1x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y83efgEv,_ZThn4_N3ccc7DD1x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x4y83abcEv,_ZTv0_n16_N3ccc7DD1x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y83efgEv,_ZTv0_n20_N3ccc7DD1x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y8E[] = {
  {&(_ZTVN3ccc7DD1x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y8E[];
static VTBL_ENTRY alt_thunk_names570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y83efgEv,_ZTv0_n20_N3ccc7DD1x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y83efgEv,_ZThn4_N3ccc7DD1x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x4y83abcEv,_ZTv0_n16_N3ccc7DD1x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y83abcEv,_ZThn4_N3ccc7DD1x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y8E = {  "_ZN3ccc7DD1x4y8E", // class name
  bases__ZN3ccc7DD1x4y8E, 2,
  &(vtc__ZN3ccc7DD1x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y8E),3, //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  CC1x4y9  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y93pqrEv
  ~CC1x4y9(); // tgen
  CC1x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y9E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y93efgEv");}
void  ccc::CC1x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y93pqrEv");}
ccc::CC1x4y9 ::~CC1x4y9(){ note_dtor("_ZN3ccc7CC1x4y9E", this);} // tgen
ccc::CC1x4y9 ::CC1x4y9(){ note_ctor("_ZN3ccc7CC1x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y9E, buf);
    ::ccc::CC1x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC1x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y9E);
    dp->::ccc::CC1x4y9::~CC1x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y9E(Test__ZN3ccc7CC1x4y9E, "_ZN3ccc7CC1x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y9C1Ev();
extern void _ZN3ccc7CC1x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y9E[] = {
  NSPAIR(_ZN3ccc7CC1x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y9E[];
extern void _ZN3ccc7CC1x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC1x4y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x4y93pqrEv,_ZTv0_n16_N3ccc7CC1x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y93pqrEv,_ZThn4_N3ccc7CC1x4y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x4y93efgEv,_ZTv0_n20_N3ccc7CC1x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y93efgEv,_ZThn4_N3ccc7CC1x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x4y93pqrEv,_ZTv0_n16_N3ccc7CC1x4y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x4y93efgEv,_ZTv0_n20_N3ccc7CC1x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x4y9E[] = {
  {&(_ZTVN3ccc7CC1x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x4y9E[];
static VTBL_ENTRY alt_thunk_names571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x4y93efgEv,_ZTv0_n20_N3ccc7CC1x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y93efgEv,_ZThn4_N3ccc7CC1x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x4y93pqrEv,_ZTv0_n16_N3ccc7CC1x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x4y93pqrEv,_ZThn4_N3ccc7CC1x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x4y9E = {  "_ZN3ccc7CC1x4y9E", // class name
  bases__ZN3ccc7CC1x4y9E, 2,
  &(vtc__ZN3ccc7CC1x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x4y9E),2, //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  DD1x4y9  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD1x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x4y93pqrEv
  ~DD1x4y9(); // tgen
  DD1x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x4y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x4y93efgEv");}
void  ccc::DD1x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x4y93pqrEv");}
ccc::DD1x4y9 ::~DD1x4y9(){ note_dtor("_ZN3ccc7DD1x4y9E", this);} // tgen
ccc::DD1x4y9 ::DD1x4y9(){ note_ctor("_ZN3ccc7DD1x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x4y9E, buf);
    ::ccc::DD1x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x4y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD1x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x4y9E);
    dp->::ccc::DD1x4y9::~DD1x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x4y9E(Test__ZN3ccc7DD1x4y9E, "_ZN3ccc7DD1x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x4y9C1Ev();
extern void _ZN3ccc7DD1x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x4y9E[] = {
  NSPAIR(_ZN3ccc7DD1x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD1x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x4y93pqrEv();
extern void _ZN3ccc7DD1x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x4y93pqrEv,_ZTv0_n12_N3ccc7DD1x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y93pqrEv,_ZThn4_N3ccc7DD1x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x4y93efgEv,_ZTv0_n20_N3ccc7DD1x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x4y93efgEv,_ZThn4_N3ccc7DD1x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x4y93pqrEv,_ZTv0_n12_N3ccc7DD1x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x4y93efgEv,_ZTv0_n20_N3ccc7DD1x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x4y9E[] = {
  {&(_ZTVN3ccc7DD1x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x4y9E[];
static VTBL_ENTRY alt_thunk_names572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x4y93efgEv,_ZTv0_n20_N3ccc7DD1x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y93efgEv,_ZThn4_N3ccc7DD1x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x4y93pqrEv,_ZTv0_n12_N3ccc7DD1x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x4y93pqrEv,_ZThn4_N3ccc7DD1x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x4y9E = {  "_ZN3ccc7DD1x4y9E", // class name
  bases__ZN3ccc7DD1x4y9E, 2,
  &(vtc__ZN3ccc7DD1x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x4y9E),3, //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  CC1x4y10  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x4y103abcEv
  ~CC1x4y10(); // tgen
  CC1x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y10E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y103pqrEv");}
void  ccc::CC1x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x4y103abcEv");}
ccc::CC1x4y10 ::~CC1x4y10(){ note_dtor("_ZN3ccc8CC1x4y10E", this);} // tgen
ccc::CC1x4y10 ::CC1x4y10(){ note_ctor("_ZN3ccc8CC1x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y10E, buf);
    ::ccc::CC1x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y10E);
    dp->::ccc::CC1x4y10::~CC1x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y10E(Test__ZN3ccc8CC1x4y10E, "_ZN3ccc8CC1x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y10C1Ev();
extern void _ZN3ccc8CC1x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y10E[] = {
  NSPAIR(_ZN3ccc8CC1x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y10E[];
extern void _ZN3ccc8CC1x4y103pqrEv();
extern void _ZN3ccc8CC1x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x4y103abcEv,_ZTv0_n12_N3ccc8CC1x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y103abcEv,_ZThn4_N3ccc8CC1x4y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x4y103pqrEv,_ZTv0_n16_N3ccc8CC1x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y103pqrEv,_ZThn4_N3ccc8CC1x4y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x4y103abcEv,_ZTv0_n12_N3ccc8CC1x4y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x4y103pqrEv,_ZTv0_n16_N3ccc8CC1x4y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y10E[] = {
  {&(_ZTVN3ccc8CC1x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y10E[];
static VTBL_ENTRY alt_thunk_names573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x4y103pqrEv,_ZTv0_n16_N3ccc8CC1x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y103pqrEv,_ZThn4_N3ccc8CC1x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x4y103abcEv,_ZTv0_n12_N3ccc8CC1x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y103abcEv,_ZThn4_N3ccc8CC1x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x4y10E = {  "_ZN3ccc8CC1x4y10E", // class name
  bases__ZN3ccc8CC1x4y10E, 2,
  &(vtc__ZN3ccc8CC1x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y10E),2, //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  DD1x4y10  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD1x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x4y103abcEv
  ~DD1x4y10(); // tgen
  DD1x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x4y103pqrEv");}
void  ccc::DD1x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x4y103abcEv");}
ccc::DD1x4y10 ::~DD1x4y10(){ note_dtor("_ZN3ccc8DD1x4y10E", this);} // tgen
ccc::DD1x4y10 ::DD1x4y10(){ note_ctor("_ZN3ccc8DD1x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y10E, buf);
    ::ccc::DD1x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y10E);
    dp->::ccc::DD1x4y10::~DD1x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y10E(Test__ZN3ccc8DD1x4y10E, "_ZN3ccc8DD1x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y10C1Ev();
extern void _ZN3ccc8DD1x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y10E[] = {
  NSPAIR(_ZN3ccc8DD1x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y10E[];
extern void _ZN3ccc8DD1x4y103abcEv();
extern void _ZN3ccc8DD1x4y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x4y103pqrEv,_ZTv0_n12_N3ccc8DD1x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y103pqrEv,_ZThn4_N3ccc8DD1x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x4y103abcEv,_ZTv0_n16_N3ccc8DD1x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y103abcEv,_ZThn4_N3ccc8DD1x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x4y103pqrEv,_ZTv0_n12_N3ccc8DD1x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x4y103abcEv,_ZTv0_n16_N3ccc8DD1x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y10E[] = {
  {&(_ZTVN3ccc8DD1x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y10E[];
static VTBL_ENTRY alt_thunk_names574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x4y103abcEv,_ZTv0_n16_N3ccc8DD1x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y103abcEv,_ZThn4_N3ccc8DD1x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x4y103pqrEv,_ZTv0_n12_N3ccc8DD1x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y103pqrEv,_ZThn4_N3ccc8DD1x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x4y10E = {  "_ZN3ccc8DD1x4y10E", // class name
  bases__ZN3ccc8DD1x4y10E, 2,
  &(vtc__ZN3ccc8DD1x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y10E),3, //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  CC1x4y11  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x4y113efgEv
  ~CC1x4y11(); // tgen
  CC1x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y11E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y113pqrEv");}
void  ccc::CC1x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x4y113efgEv");}
ccc::CC1x4y11 ::~CC1x4y11(){ note_dtor("_ZN3ccc8CC1x4y11E", this);} // tgen
ccc::CC1x4y11 ::CC1x4y11(){ note_ctor("_ZN3ccc8CC1x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y11E, buf);
    ::ccc::CC1x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y11E);
    dp->::ccc::CC1x4y11::~CC1x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y11E(Test__ZN3ccc8CC1x4y11E, "_ZN3ccc8CC1x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y11C1Ev();
extern void _ZN3ccc8CC1x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y11E[] = {
  NSPAIR(_ZN3ccc8CC1x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y11E[];
extern void _ZN3ccc8CC1x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC1x4y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x4y113pqrEv,_ZTv0_n16_N3ccc8CC1x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y113pqrEv,_ZThn4_N3ccc8CC1x4y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x4y113efgEv,_ZTv0_n20_N3ccc8CC1x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y113efgEv,_ZThn4_N3ccc8CC1x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x4y113pqrEv,_ZTv0_n16_N3ccc8CC1x4y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x4y113efgEv,_ZTv0_n20_N3ccc8CC1x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y11E[] = {
  {&(_ZTVN3ccc8CC1x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y11E[];
static VTBL_ENTRY alt_thunk_names575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x4y113efgEv,_ZTv0_n20_N3ccc8CC1x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y113efgEv,_ZThn4_N3ccc8CC1x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x4y113pqrEv,_ZTv0_n16_N3ccc8CC1x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y113pqrEv,_ZThn4_N3ccc8CC1x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x4y11E = {  "_ZN3ccc8CC1x4y11E", // class name
  bases__ZN3ccc8CC1x4y11E, 2,
  &(vtc__ZN3ccc8CC1x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y11E),2, //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  DD1x4y11  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD1x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x4y113efgEv
  ~DD1x4y11(); // tgen
  DD1x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x4y113pqrEv");}
void  ccc::DD1x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x4y113efgEv");}
ccc::DD1x4y11 ::~DD1x4y11(){ note_dtor("_ZN3ccc8DD1x4y11E", this);} // tgen
ccc::DD1x4y11 ::DD1x4y11(){ note_ctor("_ZN3ccc8DD1x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y11E, buf);
    ::ccc::DD1x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y11E);
    dp->::ccc::DD1x4y11::~DD1x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y11E(Test__ZN3ccc8DD1x4y11E, "_ZN3ccc8DD1x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y11C1Ev();
extern void _ZN3ccc8DD1x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y11E[] = {
  NSPAIR(_ZN3ccc8DD1x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x4y113pqrEv();
extern void _ZN3ccc8DD1x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x4y113pqrEv,_ZTv0_n12_N3ccc8DD1x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y113pqrEv,_ZThn4_N3ccc8DD1x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x4y113efgEv,_ZTv0_n20_N3ccc8DD1x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y113efgEv,_ZThn4_N3ccc8DD1x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x4y113pqrEv,_ZTv0_n12_N3ccc8DD1x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x4y113efgEv,_ZTv0_n20_N3ccc8DD1x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y11E[] = {
  {&(_ZTVN3ccc8DD1x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y11E[];
static VTBL_ENTRY alt_thunk_names576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x4y113efgEv,_ZTv0_n20_N3ccc8DD1x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y113efgEv,_ZThn4_N3ccc8DD1x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x4y113pqrEv,_ZTv0_n12_N3ccc8DD1x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y113pqrEv,_ZThn4_N3ccc8DD1x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x4y11E = {  "_ZN3ccc8DD1x4y11E", // class name
  bases__ZN3ccc8DD1x4y11E, 2,
  &(vtc__ZN3ccc8DD1x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y11E),3, //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  CC1x4y12  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC1x4y123abcEv
  ~CC1x4y12(); // tgen
  CC1x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x4y123abcEv");}
ccc::CC1x4y12 ::~CC1x4y12(){ note_dtor("_ZN3ccc8CC1x4y12E", this);} // tgen
ccc::CC1x4y12 ::CC1x4y12(){ note_ctor("_ZN3ccc8CC1x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y12E, buf);
    ::ccc::CC1x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y12E);
    dp->::ccc::CC1x4y12::~CC1x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y12E(Test__ZN3ccc8CC1x4y12E, "_ZN3ccc8CC1x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y12C1Ev();
extern void _ZN3ccc8CC1x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y12E[] = {
  NSPAIR(_ZN3ccc8CC1x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC1x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x4y123abcEv,_ZTv0_n12_N3ccc8CC1x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y123abcEv,_ZThn4_N3ccc8CC1x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x4y123abcEv,_ZTv0_n12_N3ccc8CC1x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y12E[] = {
  {&(_ZTVN3ccc8CC1x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y12E[];
static VTBL_ENTRY alt_thunk_names577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x4y123abcEv,_ZTv0_n12_N3ccc8CC1x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y123abcEv,_ZThn4_N3ccc8CC1x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x4y12E = {  "_ZN3ccc8CC1x4y12E", // class name
  bases__ZN3ccc8CC1x4y12E, 2,
  &(vtc__ZN3ccc8CC1x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y12E),2, //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  DD1x4y12  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD1x4y123abcEv
  ~DD1x4y12(); // tgen
  DD1x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x4y123abcEv");}
ccc::DD1x4y12 ::~DD1x4y12(){ note_dtor("_ZN3ccc8DD1x4y12E", this);} // tgen
ccc::DD1x4y12 ::DD1x4y12(){ note_ctor("_ZN3ccc8DD1x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y12E, buf);
    ::ccc::DD1x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y12E);
    dp->::ccc::DD1x4y12::~DD1x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y12E(Test__ZN3ccc8DD1x4y12E, "_ZN3ccc8DD1x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y12C1Ev();
extern void _ZN3ccc8DD1x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y12E[] = {
  NSPAIR(_ZN3ccc8DD1x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y12E[];
extern void _ZN3ccc8DD1x4y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x4y123abcEv,_ZTv0_n16_N3ccc8DD1x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y123abcEv,_ZThn4_N3ccc8DD1x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x4y123abcEv,_ZTv0_n16_N3ccc8DD1x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y12E[] = {
  {&(_ZTVN3ccc8DD1x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y12E[];
static VTBL_ENTRY alt_thunk_names578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x4y123abcEv,_ZTv0_n16_N3ccc8DD1x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y123abcEv,_ZThn4_N3ccc8DD1x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x4y12E = {  "_ZN3ccc8DD1x4y12E", // class name
  bases__ZN3ccc8DD1x4y12E, 2,
  &(vtc__ZN3ccc8DD1x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y12E),3, //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  CC1x4y13  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC1x4y133efgEv
  ~CC1x4y13(); // tgen
  CC1x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x4y133efgEv");}
ccc::CC1x4y13 ::~CC1x4y13(){ note_dtor("_ZN3ccc8CC1x4y13E", this);} // tgen
ccc::CC1x4y13 ::CC1x4y13(){ note_ctor("_ZN3ccc8CC1x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y13E, buf);
    ::ccc::CC1x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y13E);
    dp->::ccc::CC1x4y13::~CC1x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y13E(Test__ZN3ccc8CC1x4y13E, "_ZN3ccc8CC1x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y13C1Ev();
extern void _ZN3ccc8CC1x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y13E[] = {
  NSPAIR(_ZN3ccc8CC1x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC1x4y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x4y133efgEv,_ZTv0_n20_N3ccc8CC1x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y133efgEv,_ZThn4_N3ccc8CC1x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x4y133efgEv,_ZTv0_n20_N3ccc8CC1x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y13E[] = {
  {&(_ZTVN3ccc8CC1x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y13E[];
static VTBL_ENTRY alt_thunk_names579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x4y133efgEv,_ZTv0_n20_N3ccc8CC1x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y133efgEv,_ZThn4_N3ccc8CC1x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x4y13E = {  "_ZN3ccc8CC1x4y13E", // class name
  bases__ZN3ccc8CC1x4y13E, 2,
  &(vtc__ZN3ccc8CC1x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y13E),2, //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  DD1x4y13  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD1x4y133efgEv
  ~DD1x4y13(); // tgen
  DD1x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x4y133efgEv");}
ccc::DD1x4y13 ::~DD1x4y13(){ note_dtor("_ZN3ccc8DD1x4y13E", this);} // tgen
ccc::DD1x4y13 ::DD1x4y13(){ note_ctor("_ZN3ccc8DD1x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y13E, buf);
    ::ccc::DD1x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y13E);
    dp->::ccc::DD1x4y13::~DD1x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y13E(Test__ZN3ccc8DD1x4y13E, "_ZN3ccc8DD1x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y13C1Ev();
extern void _ZN3ccc8DD1x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y13E[] = {
  NSPAIR(_ZN3ccc8DD1x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x4y133efgEv,_ZTv0_n20_N3ccc8DD1x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y133efgEv,_ZThn4_N3ccc8DD1x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x4y133efgEv,_ZTv0_n20_N3ccc8DD1x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y13E[] = {
  {&(_ZTVN3ccc8DD1x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y13E[];
static VTBL_ENTRY alt_thunk_names580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x4y133efgEv,_ZTv0_n20_N3ccc8DD1x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y133efgEv,_ZThn4_N3ccc8DD1x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x4y13E = {  "_ZN3ccc8DD1x4y13E", // class name
  bases__ZN3ccc8DD1x4y13E, 2,
  &(vtc__ZN3ccc8DD1x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y13E),3, //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  CC1x4y14  : virtual ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y143pqrEv
  ~CC1x4y14(); // tgen
  CC1x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y143pqrEv");}
ccc::CC1x4y14 ::~CC1x4y14(){ note_dtor("_ZN3ccc8CC1x4y14E", this);} // tgen
ccc::CC1x4y14 ::CC1x4y14(){ note_ctor("_ZN3ccc8CC1x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y14E, buf);
    ::ccc::CC1x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y14E);
    dp->::ccc::CC1x4y14::~CC1x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y14E(Test__ZN3ccc8CC1x4y14E, "_ZN3ccc8CC1x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y14C1Ev();
extern void _ZN3ccc8CC1x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y14E[] = {
  NSPAIR(_ZN3ccc8CC1x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y14E[];
extern void _ZN3ccc8CC1x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x4y143pqrEv,_ZTv0_n16_N3ccc8CC1x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y143pqrEv,_ZThn4_N3ccc8CC1x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x4y143pqrEv,_ZTv0_n16_N3ccc8CC1x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y14E[] = {
  {&(_ZTVN3ccc8CC1x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y14E[];
static VTBL_ENTRY alt_thunk_names581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x4y143pqrEv,_ZTv0_n16_N3ccc8CC1x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x4y143pqrEv,_ZThn4_N3ccc8CC1x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x4y14E = {  "_ZN3ccc8CC1x4y14E", // class name
  bases__ZN3ccc8CC1x4y14E, 2,
  &(vtc__ZN3ccc8CC1x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y14E),2, //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  DD1x4y14  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD1x4y143pqrEv
  ~DD1x4y14(); // tgen
  DD1x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x4y143pqrEv");}
ccc::DD1x4y14 ::~DD1x4y14(){ note_dtor("_ZN3ccc8DD1x4y14E", this);} // tgen
ccc::DD1x4y14 ::DD1x4y14(){ note_ctor("_ZN3ccc8DD1x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y14E, buf);
    ::ccc::DD1x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y14E);
    dp->::ccc::DD1x4y14::~DD1x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y14E(Test__ZN3ccc8DD1x4y14E, "_ZN3ccc8DD1x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y14C1Ev();
extern void _ZN3ccc8DD1x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y14E[] = {
  NSPAIR(_ZN3ccc8DD1x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x4y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x4y143pqrEv,_ZTv0_n12_N3ccc8DD1x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x4y143pqrEv,_ZThn4_N3ccc8DD1x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x4y143pqrEv,_ZTv0_n12_N3ccc8DD1x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y14E[] = {
  {&(_ZTVN3ccc8DD1x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y14E[];
static VTBL_ENTRY alt_thunk_names582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x4y143pqrEv,_ZTv0_n12_N3ccc8DD1x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x4y143pqrEv,_ZThn4_N3ccc8DD1x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x4y14E = {  "_ZN3ccc8DD1x4y14E", // class name
  bases__ZN3ccc8DD1x4y14E, 2,
  &(vtc__ZN3ccc8DD1x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y14E),3, //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  CC1x4y15  : virtual ::ccc::AA1 , ::ccc::BB4 {
  ~CC1x4y15(); // tgen
  CC1x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x4y15 ::~CC1x4y15(){ note_dtor("_ZN3ccc8CC1x4y15E", this);} // tgen
ccc::CC1x4y15 ::CC1x4y15(){ note_ctor("_ZN3ccc8CC1x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y15E, buf);
    ::ccc::CC1x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC1x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y15E);
    dp->::ccc::CC1x4y15::~CC1x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y15E(Test__ZN3ccc8CC1x4y15E, "_ZN3ccc8CC1x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y15C1Ev();
extern void _ZN3ccc8CC1x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y15E[] = {
  NSPAIR(_ZN3ccc8CC1x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x4y15E[] = {
  {&(_ZTVN3ccc8CC1x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x4y15E[];
Class_Descriptor cd__ZN3ccc8CC1x4y15E = {  "_ZN3ccc8CC1x4y15E", // class name
  bases__ZN3ccc8CC1x4y15E, 2,
  &(vtc__ZN3ccc8CC1x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x4y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x4y15  : virtual ::ccc::AA1 , virtual ::ccc::BB4 {
  ~DD1x4y15(); // tgen
  DD1x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x4y15 ::~DD1x4y15(){ note_dtor("_ZN3ccc8DD1x4y15E", this);} // tgen
ccc::DD1x4y15 ::DD1x4y15(){ note_ctor("_ZN3ccc8DD1x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x4y15E, buf);
    ::ccc::DD1x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x4y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD1x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x4y15E);
    dp->::ccc::DD1x4y15::~DD1x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x4y15E(Test__ZN3ccc8DD1x4y15E, "_ZN3ccc8DD1x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x4y15C1Ev();
extern void _ZN3ccc8DD1x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x4y15E[] = {
  NSPAIR(_ZN3ccc8DD1x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD1x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x4y15E[] = {
  {&(_ZTVN3ccc8DD1x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x4y15E[];
Class_Descriptor cd__ZN3ccc8DD1x4y15E = {  "_ZN3ccc8DD1x4y15E", // class name
  bases__ZN3ccc8DD1x4y15E, 2,
  &(vtc__ZN3ccc8DD1x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x4y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y0  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y03pqrEv
  ~CC1x5y0(); // tgen
  CC1x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y0E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y03abcEv");}
void  ccc::CC1x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y03efgEv");}
void  ccc::CC1x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y03pqrEv");}
ccc::CC1x5y0 ::~CC1x5y0(){ note_dtor("_ZN3ccc7CC1x5y0E", this);} // tgen
ccc::CC1x5y0 ::CC1x5y0(){ note_ctor("_ZN3ccc7CC1x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y0E, buf);
    ::ccc::CC1x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y0E);
    dp->::ccc::CC1x5y0::~CC1x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y0E(Test__ZN3ccc7CC1x5y0E, "_ZN3ccc7CC1x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y0C1Ev();
extern void _ZN3ccc7CC1x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y0E[] = {
  NSPAIR(_ZN3ccc7CC1x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y0E[];
extern void _ZN3ccc7CC1x5y03pqrEv();
extern void _ZN3ccc7CC1x5y03efgEv();
extern void _ZN3ccc7CC1x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y03abcEv,_ZTv0_n12_N3ccc7CC1x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03abcEv,_ZThn4_N3ccc7CC1x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y03pqrEv,_ZTv0_n16_N3ccc7CC1x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03pqrEv,_ZThn4_N3ccc7CC1x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y03efgEv,_ZTv0_n20_N3ccc7CC1x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03efgEv,_ZThn4_N3ccc7CC1x5y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y03abcEv,_ZTv0_n12_N3ccc7CC1x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y03pqrEv,_ZTv0_n16_N3ccc7CC1x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y03efgEv,_ZTv0_n20_N3ccc7CC1x5y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y0E[] = {
  {&(_ZTVN3ccc7CC1x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y0E[];
static VTBL_ENTRY alt_thunk_names583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y03efgEv,_ZTv0_n20_N3ccc7CC1x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y03efgEv,_ZThn4_N3ccc7CC1x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y03pqrEv,_ZTv0_n16_N3ccc7CC1x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y03pqrEv,_ZThn4_N3ccc7CC1x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y03abcEv,_ZTv0_n12_N3ccc7CC1x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y03abcEv,_ZThn4_N3ccc7CC1x5y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y0E = {  "_ZN3ccc7CC1x5y0E", // class name
  bases__ZN3ccc7CC1x5y0E, 2,
  &(vtc__ZN3ccc7CC1x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y0E),2, //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  DD1x5y0  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD1x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y03pqrEv
  ~DD1x5y0(); // tgen
  DD1x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y03abcEv");}
void  ccc::DD1x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y03efgEv");}
void  ccc::DD1x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y03pqrEv");}
ccc::DD1x5y0 ::~DD1x5y0(){ note_dtor("_ZN3ccc7DD1x5y0E", this);} // tgen
ccc::DD1x5y0 ::DD1x5y0(){ note_ctor("_ZN3ccc7DD1x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y0E, buf);
    ::ccc::DD1x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y0E);
    dp->::ccc::DD1x5y0::~DD1x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y0E(Test__ZN3ccc7DD1x5y0E, "_ZN3ccc7DD1x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y0C1Ev();
extern void _ZN3ccc7DD1x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y0E[] = {
  NSPAIR(_ZN3ccc7DD1x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y0E[];
extern void _ZN3ccc7DD1x5y03abcEv();
extern void _ZN3ccc7DD1x5y03pqrEv();
extern void _ZN3ccc7DD1x5y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y03pqrEv,_ZTv0_n12_N3ccc7DD1x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y03pqrEv,_ZThn4_N3ccc7DD1x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y03efgEv,_ZTv0_n16_N3ccc7DD1x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y03efgEv,_ZThn4_N3ccc7DD1x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y03abcEv,_ZTv0_n20_N3ccc7DD1x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y03abcEv,_ZThn4_N3ccc7DD1x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y03pqrEv,_ZTv0_n12_N3ccc7DD1x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y03efgEv,_ZTv0_n16_N3ccc7DD1x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y03abcEv,_ZTv0_n20_N3ccc7DD1x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y0E[] = {
  {&(_ZTVN3ccc7DD1x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y0E[];
static VTBL_ENTRY alt_thunk_names584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y03abcEv,_ZTv0_n20_N3ccc7DD1x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y03abcEv,_ZThn4_N3ccc7DD1x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y03efgEv,_ZTv0_n16_N3ccc7DD1x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y03efgEv,_ZThn4_N3ccc7DD1x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y03pqrEv,_ZTv0_n12_N3ccc7DD1x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y03pqrEv,_ZThn4_N3ccc7DD1x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y0E = {  "_ZN3ccc7DD1x5y0E", // class name
  bases__ZN3ccc7DD1x5y0E, 2,
  &(vtc__ZN3ccc7DD1x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y0E),3, //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  CC1x5y1  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x5y13efgEv
  ~CC1x5y1(); // tgen
  CC1x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y1E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y13abcEv");}
void  ccc::CC1x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y13pqrEv");}
void  ccc::CC1x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y13efgEv");}
ccc::CC1x5y1 ::~CC1x5y1(){ note_dtor("_ZN3ccc7CC1x5y1E", this);} // tgen
ccc::CC1x5y1 ::CC1x5y1(){ note_ctor("_ZN3ccc7CC1x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y1E, buf);
    ::ccc::CC1x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y1E);
    dp->::ccc::CC1x5y1::~CC1x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y1E(Test__ZN3ccc7CC1x5y1E, "_ZN3ccc7CC1x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y1C1Ev();
extern void _ZN3ccc7CC1x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y1E[] = {
  NSPAIR(_ZN3ccc7CC1x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y1E[];
extern void _ZN3ccc7CC1x5y13pqrEv();
extern void _ZN3ccc7CC1x5y13efgEv();
extern void _ZN3ccc7CC1x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y13abcEv,_ZTv0_n12_N3ccc7CC1x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13abcEv,_ZThn4_N3ccc7CC1x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y13pqrEv,_ZTv0_n16_N3ccc7CC1x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13pqrEv,_ZThn4_N3ccc7CC1x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y13efgEv,_ZTv0_n20_N3ccc7CC1x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13efgEv,_ZThn4_N3ccc7CC1x5y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y13abcEv,_ZTv0_n12_N3ccc7CC1x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y13pqrEv,_ZTv0_n16_N3ccc7CC1x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y13efgEv,_ZTv0_n20_N3ccc7CC1x5y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y1E[] = {
  {&(_ZTVN3ccc7CC1x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y1E[];
static VTBL_ENTRY alt_thunk_names585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y13efgEv,_ZTv0_n20_N3ccc7CC1x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y13efgEv,_ZThn4_N3ccc7CC1x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y13pqrEv,_ZTv0_n16_N3ccc7CC1x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y13pqrEv,_ZThn4_N3ccc7CC1x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y13abcEv,_ZTv0_n12_N3ccc7CC1x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y13abcEv,_ZThn4_N3ccc7CC1x5y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y1E = {  "_ZN3ccc7CC1x5y1E", // class name
  bases__ZN3ccc7CC1x5y1E, 2,
  &(vtc__ZN3ccc7CC1x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y1E),2, //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  DD1x5y1  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD1x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x5y13efgEv
  ~DD1x5y1(); // tgen
  DD1x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y13abcEv");}
void  ccc::DD1x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y13pqrEv");}
void  ccc::DD1x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y13efgEv");}
ccc::DD1x5y1 ::~DD1x5y1(){ note_dtor("_ZN3ccc7DD1x5y1E", this);} // tgen
ccc::DD1x5y1 ::DD1x5y1(){ note_ctor("_ZN3ccc7DD1x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y1E, buf);
    ::ccc::DD1x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y1E);
    dp->::ccc::DD1x5y1::~DD1x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y1E(Test__ZN3ccc7DD1x5y1E, "_ZN3ccc7DD1x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y1C1Ev();
extern void _ZN3ccc7DD1x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y1E[] = {
  NSPAIR(_ZN3ccc7DD1x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y1E[];
extern void _ZN3ccc7DD1x5y13abcEv();
extern void _ZN3ccc7DD1x5y13pqrEv();
extern void _ZN3ccc7DD1x5y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y13pqrEv,_ZTv0_n12_N3ccc7DD1x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y13pqrEv,_ZThn4_N3ccc7DD1x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y13efgEv,_ZTv0_n16_N3ccc7DD1x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y13efgEv,_ZThn4_N3ccc7DD1x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y13abcEv,_ZTv0_n20_N3ccc7DD1x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y13abcEv,_ZThn4_N3ccc7DD1x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y13pqrEv,_ZTv0_n12_N3ccc7DD1x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y13efgEv,_ZTv0_n16_N3ccc7DD1x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y13abcEv,_ZTv0_n20_N3ccc7DD1x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y1E[] = {
  {&(_ZTVN3ccc7DD1x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y1E[];
static VTBL_ENTRY alt_thunk_names586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y13abcEv,_ZTv0_n20_N3ccc7DD1x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y13abcEv,_ZThn4_N3ccc7DD1x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y13efgEv,_ZTv0_n16_N3ccc7DD1x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y13efgEv,_ZThn4_N3ccc7DD1x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y13pqrEv,_ZTv0_n12_N3ccc7DD1x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y13pqrEv,_ZThn4_N3ccc7DD1x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y1E = {  "_ZN3ccc7DD1x5y1E", // class name
  bases__ZN3ccc7DD1x5y1E, 2,
  &(vtc__ZN3ccc7DD1x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y1E),3, //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  CC1x5y2  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y23pqrEv
  ~CC1x5y2(); // tgen
  CC1x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y2E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y23efgEv");}
void  ccc::CC1x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y23abcEv");}
void  ccc::CC1x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y23pqrEv");}
ccc::CC1x5y2 ::~CC1x5y2(){ note_dtor("_ZN3ccc7CC1x5y2E", this);} // tgen
ccc::CC1x5y2 ::CC1x5y2(){ note_ctor("_ZN3ccc7CC1x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y2E, buf);
    ::ccc::CC1x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y2E);
    dp->::ccc::CC1x5y2::~CC1x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y2E(Test__ZN3ccc7CC1x5y2E, "_ZN3ccc7CC1x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y2C1Ev();
extern void _ZN3ccc7CC1x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y2E[] = {
  NSPAIR(_ZN3ccc7CC1x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y2E[];
extern void _ZN3ccc7CC1x5y23pqrEv();
extern void _ZN3ccc7CC1x5y23efgEv();
extern void _ZN3ccc7CC1x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y23abcEv,_ZTv0_n12_N3ccc7CC1x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23abcEv,_ZThn4_N3ccc7CC1x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y23pqrEv,_ZTv0_n16_N3ccc7CC1x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23pqrEv,_ZThn4_N3ccc7CC1x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y23efgEv,_ZTv0_n20_N3ccc7CC1x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23efgEv,_ZThn4_N3ccc7CC1x5y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y23abcEv,_ZTv0_n12_N3ccc7CC1x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y23pqrEv,_ZTv0_n16_N3ccc7CC1x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y23efgEv,_ZTv0_n20_N3ccc7CC1x5y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y2E[] = {
  {&(_ZTVN3ccc7CC1x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y2E[];
static VTBL_ENTRY alt_thunk_names587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y23efgEv,_ZTv0_n20_N3ccc7CC1x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y23efgEv,_ZThn4_N3ccc7CC1x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y23pqrEv,_ZTv0_n16_N3ccc7CC1x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y23pqrEv,_ZThn4_N3ccc7CC1x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y23abcEv,_ZTv0_n12_N3ccc7CC1x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y23abcEv,_ZThn4_N3ccc7CC1x5y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y2E = {  "_ZN3ccc7CC1x5y2E", // class name
  bases__ZN3ccc7CC1x5y2E, 2,
  &(vtc__ZN3ccc7CC1x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y2E),2, //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  DD1x5y2  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD1x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y23pqrEv
  ~DD1x5y2(); // tgen
  DD1x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y23efgEv");}
void  ccc::DD1x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y23abcEv");}
void  ccc::DD1x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y23pqrEv");}
ccc::DD1x5y2 ::~DD1x5y2(){ note_dtor("_ZN3ccc7DD1x5y2E", this);} // tgen
ccc::DD1x5y2 ::DD1x5y2(){ note_ctor("_ZN3ccc7DD1x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y2E, buf);
    ::ccc::DD1x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y2E);
    dp->::ccc::DD1x5y2::~DD1x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y2E(Test__ZN3ccc7DD1x5y2E, "_ZN3ccc7DD1x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y2C1Ev();
extern void _ZN3ccc7DD1x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y2E[] = {
  NSPAIR(_ZN3ccc7DD1x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y2E[];
extern void _ZN3ccc7DD1x5y23abcEv();
extern void _ZN3ccc7DD1x5y23pqrEv();
extern void _ZN3ccc7DD1x5y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y23pqrEv,_ZTv0_n12_N3ccc7DD1x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y23pqrEv,_ZThn4_N3ccc7DD1x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y23efgEv,_ZTv0_n16_N3ccc7DD1x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y23efgEv,_ZThn4_N3ccc7DD1x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y23abcEv,_ZTv0_n20_N3ccc7DD1x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y23abcEv,_ZThn4_N3ccc7DD1x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y23pqrEv,_ZTv0_n12_N3ccc7DD1x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y23efgEv,_ZTv0_n16_N3ccc7DD1x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y23abcEv,_ZTv0_n20_N3ccc7DD1x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y2E[] = {
  {&(_ZTVN3ccc7DD1x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y2E[];
static VTBL_ENTRY alt_thunk_names588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y23abcEv,_ZTv0_n20_N3ccc7DD1x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y23abcEv,_ZThn4_N3ccc7DD1x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y23efgEv,_ZTv0_n16_N3ccc7DD1x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y23efgEv,_ZThn4_N3ccc7DD1x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y23pqrEv,_ZTv0_n12_N3ccc7DD1x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y23pqrEv,_ZThn4_N3ccc7DD1x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y2E = {  "_ZN3ccc7DD1x5y2E", // class name
  bases__ZN3ccc7DD1x5y2E, 2,
  &(vtc__ZN3ccc7DD1x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y2E),3, //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  CC1x5y3  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x5y33abcEv
  ~CC1x5y3(); // tgen
  CC1x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y3E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y33efgEv");}
void  ccc::CC1x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y33pqrEv");}
void  ccc::CC1x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y33abcEv");}
ccc::CC1x5y3 ::~CC1x5y3(){ note_dtor("_ZN3ccc7CC1x5y3E", this);} // tgen
ccc::CC1x5y3 ::CC1x5y3(){ note_ctor("_ZN3ccc7CC1x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y3E, buf);
    ::ccc::CC1x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y3E);
    dp->::ccc::CC1x5y3::~CC1x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y3E(Test__ZN3ccc7CC1x5y3E, "_ZN3ccc7CC1x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y3C1Ev();
extern void _ZN3ccc7CC1x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y3E[] = {
  NSPAIR(_ZN3ccc7CC1x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y3E[];
extern void _ZN3ccc7CC1x5y33pqrEv();
extern void _ZN3ccc7CC1x5y33efgEv();
extern void _ZN3ccc7CC1x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y33abcEv,_ZTv0_n12_N3ccc7CC1x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33abcEv,_ZThn4_N3ccc7CC1x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y33pqrEv,_ZTv0_n16_N3ccc7CC1x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33pqrEv,_ZThn4_N3ccc7CC1x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y33efgEv,_ZTv0_n20_N3ccc7CC1x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33efgEv,_ZThn4_N3ccc7CC1x5y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y33abcEv,_ZTv0_n12_N3ccc7CC1x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y33pqrEv,_ZTv0_n16_N3ccc7CC1x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y33efgEv,_ZTv0_n20_N3ccc7CC1x5y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y3E[] = {
  {&(_ZTVN3ccc7CC1x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y3E[];
static VTBL_ENTRY alt_thunk_names589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y33efgEv,_ZTv0_n20_N3ccc7CC1x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y33efgEv,_ZThn4_N3ccc7CC1x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y33pqrEv,_ZTv0_n16_N3ccc7CC1x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y33pqrEv,_ZThn4_N3ccc7CC1x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y33abcEv,_ZTv0_n12_N3ccc7CC1x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y33abcEv,_ZThn4_N3ccc7CC1x5y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y3E = {  "_ZN3ccc7CC1x5y3E", // class name
  bases__ZN3ccc7CC1x5y3E, 2,
  &(vtc__ZN3ccc7CC1x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y3E),2, //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  DD1x5y3  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD1x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x5y33abcEv
  ~DD1x5y3(); // tgen
  DD1x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y33efgEv");}
void  ccc::DD1x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y33pqrEv");}
void  ccc::DD1x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y33abcEv");}
ccc::DD1x5y3 ::~DD1x5y3(){ note_dtor("_ZN3ccc7DD1x5y3E", this);} // tgen
ccc::DD1x5y3 ::DD1x5y3(){ note_ctor("_ZN3ccc7DD1x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y3E, buf);
    ::ccc::DD1x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y3E);
    dp->::ccc::DD1x5y3::~DD1x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y3E(Test__ZN3ccc7DD1x5y3E, "_ZN3ccc7DD1x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y3C1Ev();
extern void _ZN3ccc7DD1x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y3E[] = {
  NSPAIR(_ZN3ccc7DD1x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y3E[];
extern void _ZN3ccc7DD1x5y33abcEv();
extern void _ZN3ccc7DD1x5y33pqrEv();
extern void _ZN3ccc7DD1x5y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y33pqrEv,_ZTv0_n12_N3ccc7DD1x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y33pqrEv,_ZThn4_N3ccc7DD1x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y33efgEv,_ZTv0_n16_N3ccc7DD1x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y33efgEv,_ZThn4_N3ccc7DD1x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y33abcEv,_ZTv0_n20_N3ccc7DD1x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y33abcEv,_ZThn4_N3ccc7DD1x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y33pqrEv,_ZTv0_n12_N3ccc7DD1x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y33efgEv,_ZTv0_n16_N3ccc7DD1x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y33abcEv,_ZTv0_n20_N3ccc7DD1x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y3E[] = {
  {&(_ZTVN3ccc7DD1x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y3E[];
static VTBL_ENTRY alt_thunk_names590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y33abcEv,_ZTv0_n20_N3ccc7DD1x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y33abcEv,_ZThn4_N3ccc7DD1x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y33efgEv,_ZTv0_n16_N3ccc7DD1x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y33efgEv,_ZThn4_N3ccc7DD1x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y33pqrEv,_ZTv0_n12_N3ccc7DD1x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y33pqrEv,_ZThn4_N3ccc7DD1x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y3E = {  "_ZN3ccc7DD1x5y3E", // class name
  bases__ZN3ccc7DD1x5y3E, 2,
  &(vtc__ZN3ccc7DD1x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y3E),3, //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  CC1x5y4  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC1x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y43efgEv
  ~CC1x5y4(); // tgen
  CC1x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y4E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y43pqrEv");}
void  ccc::CC1x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y43abcEv");}
void  ccc::CC1x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y43efgEv");}
ccc::CC1x5y4 ::~CC1x5y4(){ note_dtor("_ZN3ccc7CC1x5y4E", this);} // tgen
ccc::CC1x5y4 ::CC1x5y4(){ note_ctor("_ZN3ccc7CC1x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y4E, buf);
    ::ccc::CC1x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y4E);
    dp->::ccc::CC1x5y4::~CC1x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y4E(Test__ZN3ccc7CC1x5y4E, "_ZN3ccc7CC1x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y4C1Ev();
extern void _ZN3ccc7CC1x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y4E[] = {
  NSPAIR(_ZN3ccc7CC1x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y4E[];
extern void _ZN3ccc7CC1x5y43pqrEv();
extern void _ZN3ccc7CC1x5y43efgEv();
extern void _ZN3ccc7CC1x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y43abcEv,_ZTv0_n12_N3ccc7CC1x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43abcEv,_ZThn4_N3ccc7CC1x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y43pqrEv,_ZTv0_n16_N3ccc7CC1x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43pqrEv,_ZThn4_N3ccc7CC1x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y43efgEv,_ZTv0_n20_N3ccc7CC1x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43efgEv,_ZThn4_N3ccc7CC1x5y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y43abcEv,_ZTv0_n12_N3ccc7CC1x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y43pqrEv,_ZTv0_n16_N3ccc7CC1x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y43efgEv,_ZTv0_n20_N3ccc7CC1x5y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y4E[] = {
  {&(_ZTVN3ccc7CC1x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y4E[];
static VTBL_ENTRY alt_thunk_names591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y43efgEv,_ZTv0_n20_N3ccc7CC1x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y43efgEv,_ZThn4_N3ccc7CC1x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y43pqrEv,_ZTv0_n16_N3ccc7CC1x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y43pqrEv,_ZThn4_N3ccc7CC1x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y43abcEv,_ZTv0_n12_N3ccc7CC1x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y43abcEv,_ZThn4_N3ccc7CC1x5y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y4E = {  "_ZN3ccc7CC1x5y4E", // class name
  bases__ZN3ccc7CC1x5y4E, 2,
  &(vtc__ZN3ccc7CC1x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y4E),2, //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  DD1x5y4  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD1x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x5y43efgEv
  ~DD1x5y4(); // tgen
  DD1x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y43pqrEv");}
void  ccc::DD1x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y43abcEv");}
void  ccc::DD1x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y43efgEv");}
ccc::DD1x5y4 ::~DD1x5y4(){ note_dtor("_ZN3ccc7DD1x5y4E", this);} // tgen
ccc::DD1x5y4 ::DD1x5y4(){ note_ctor("_ZN3ccc7DD1x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y4E, buf);
    ::ccc::DD1x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y4E);
    dp->::ccc::DD1x5y4::~DD1x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y4E(Test__ZN3ccc7DD1x5y4E, "_ZN3ccc7DD1x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y4C1Ev();
extern void _ZN3ccc7DD1x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y4E[] = {
  NSPAIR(_ZN3ccc7DD1x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y4E[];
extern void _ZN3ccc7DD1x5y43abcEv();
extern void _ZN3ccc7DD1x5y43pqrEv();
extern void _ZN3ccc7DD1x5y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y43pqrEv,_ZTv0_n12_N3ccc7DD1x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y43pqrEv,_ZThn4_N3ccc7DD1x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y43efgEv,_ZTv0_n16_N3ccc7DD1x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y43efgEv,_ZThn4_N3ccc7DD1x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y43abcEv,_ZTv0_n20_N3ccc7DD1x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y43abcEv,_ZThn4_N3ccc7DD1x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y43pqrEv,_ZTv0_n12_N3ccc7DD1x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y43efgEv,_ZTv0_n16_N3ccc7DD1x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y43abcEv,_ZTv0_n20_N3ccc7DD1x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y4E[] = {
  {&(_ZTVN3ccc7DD1x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y4E[];
static VTBL_ENTRY alt_thunk_names592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y43abcEv,_ZTv0_n20_N3ccc7DD1x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y43abcEv,_ZThn4_N3ccc7DD1x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y43efgEv,_ZTv0_n16_N3ccc7DD1x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y43efgEv,_ZThn4_N3ccc7DD1x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y43pqrEv,_ZTv0_n12_N3ccc7DD1x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y43pqrEv,_ZThn4_N3ccc7DD1x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y4E = {  "_ZN3ccc7DD1x5y4E", // class name
  bases__ZN3ccc7DD1x5y4E, 2,
  &(vtc__ZN3ccc7DD1x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y4E),3, //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  CC1x5y5  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC1x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y53abcEv
  ~CC1x5y5(); // tgen
  CC1x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y5E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y53pqrEv");}
void  ccc::CC1x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y53efgEv");}
void  ccc::CC1x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y53abcEv");}
ccc::CC1x5y5 ::~CC1x5y5(){ note_dtor("_ZN3ccc7CC1x5y5E", this);} // tgen
ccc::CC1x5y5 ::CC1x5y5(){ note_ctor("_ZN3ccc7CC1x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y5E, buf);
    ::ccc::CC1x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y5E);
    dp->::ccc::CC1x5y5::~CC1x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y5E(Test__ZN3ccc7CC1x5y5E, "_ZN3ccc7CC1x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y5C1Ev();
extern void _ZN3ccc7CC1x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y5E[] = {
  NSPAIR(_ZN3ccc7CC1x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y5E[];
extern void _ZN3ccc7CC1x5y53pqrEv();
extern void _ZN3ccc7CC1x5y53efgEv();
extern void _ZN3ccc7CC1x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y53abcEv,_ZTv0_n12_N3ccc7CC1x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53abcEv,_ZThn4_N3ccc7CC1x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y53pqrEv,_ZTv0_n16_N3ccc7CC1x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53pqrEv,_ZThn4_N3ccc7CC1x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y53efgEv,_ZTv0_n20_N3ccc7CC1x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53efgEv,_ZThn4_N3ccc7CC1x5y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y53abcEv,_ZTv0_n12_N3ccc7CC1x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y53pqrEv,_ZTv0_n16_N3ccc7CC1x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y53efgEv,_ZTv0_n20_N3ccc7CC1x5y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y5E[] = {
  {&(_ZTVN3ccc7CC1x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y5E[];
static VTBL_ENTRY alt_thunk_names593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y53efgEv,_ZTv0_n20_N3ccc7CC1x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y53efgEv,_ZThn4_N3ccc7CC1x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y53pqrEv,_ZTv0_n16_N3ccc7CC1x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y53pqrEv,_ZThn4_N3ccc7CC1x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y53abcEv,_ZTv0_n12_N3ccc7CC1x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y53abcEv,_ZThn4_N3ccc7CC1x5y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y5E = {  "_ZN3ccc7CC1x5y5E", // class name
  bases__ZN3ccc7CC1x5y5E, 2,
  &(vtc__ZN3ccc7CC1x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y5E),2, //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  DD1x5y5  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD1x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x5y53abcEv
  ~DD1x5y5(); // tgen
  DD1x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y53pqrEv");}
void  ccc::DD1x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y53efgEv");}
void  ccc::DD1x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y53abcEv");}
ccc::DD1x5y5 ::~DD1x5y5(){ note_dtor("_ZN3ccc7DD1x5y5E", this);} // tgen
ccc::DD1x5y5 ::DD1x5y5(){ note_ctor("_ZN3ccc7DD1x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y5E, buf);
    ::ccc::DD1x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y5E);
    dp->::ccc::DD1x5y5::~DD1x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y5E(Test__ZN3ccc7DD1x5y5E, "_ZN3ccc7DD1x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y5C1Ev();
extern void _ZN3ccc7DD1x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y5E[] = {
  NSPAIR(_ZN3ccc7DD1x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y5E[];
extern void _ZN3ccc7DD1x5y53abcEv();
extern void _ZN3ccc7DD1x5y53pqrEv();
extern void _ZN3ccc7DD1x5y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y53pqrEv,_ZTv0_n12_N3ccc7DD1x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y53pqrEv,_ZThn4_N3ccc7DD1x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y53efgEv,_ZTv0_n16_N3ccc7DD1x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y53efgEv,_ZThn4_N3ccc7DD1x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y53abcEv,_ZTv0_n20_N3ccc7DD1x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y53abcEv,_ZThn4_N3ccc7DD1x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y53pqrEv,_ZTv0_n12_N3ccc7DD1x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y53efgEv,_ZTv0_n16_N3ccc7DD1x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y53abcEv,_ZTv0_n20_N3ccc7DD1x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y5E[] = {
  {&(_ZTVN3ccc7DD1x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y5E[];
static VTBL_ENTRY alt_thunk_names594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y53abcEv,_ZTv0_n20_N3ccc7DD1x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y53abcEv,_ZThn4_N3ccc7DD1x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y53efgEv,_ZTv0_n16_N3ccc7DD1x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y53efgEv,_ZThn4_N3ccc7DD1x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y53pqrEv,_ZTv0_n12_N3ccc7DD1x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y53pqrEv,_ZThn4_N3ccc7DD1x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y5E = {  "_ZN3ccc7DD1x5y5E", // class name
  bases__ZN3ccc7DD1x5y5E, 2,
  &(vtc__ZN3ccc7DD1x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y5E),3, //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  CC1x5y6  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y63efgEv
  ~CC1x5y6(); // tgen
  CC1x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y6E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y63abcEv");}
void  ccc::CC1x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y63efgEv");}
ccc::CC1x5y6 ::~CC1x5y6(){ note_dtor("_ZN3ccc7CC1x5y6E", this);} // tgen
ccc::CC1x5y6 ::CC1x5y6(){ note_ctor("_ZN3ccc7CC1x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y6E, buf);
    ::ccc::CC1x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y6E);
    dp->::ccc::CC1x5y6::~CC1x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y6E(Test__ZN3ccc7CC1x5y6E, "_ZN3ccc7CC1x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y6C1Ev();
extern void _ZN3ccc7CC1x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y6E[] = {
  NSPAIR(_ZN3ccc7CC1x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC1x5y63efgEv();
extern void _ZN3ccc7CC1x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y63abcEv,_ZTv0_n12_N3ccc7CC1x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y63abcEv,_ZThn4_N3ccc7CC1x5y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y63efgEv,_ZTv0_n20_N3ccc7CC1x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y63efgEv,_ZThn4_N3ccc7CC1x5y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y63abcEv,_ZTv0_n12_N3ccc7CC1x5y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y63efgEv,_ZTv0_n20_N3ccc7CC1x5y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y6E[] = {
  {&(_ZTVN3ccc7CC1x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y6E[];
static VTBL_ENTRY alt_thunk_names595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y63efgEv,_ZTv0_n20_N3ccc7CC1x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y63efgEv,_ZThn4_N3ccc7CC1x5y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y63abcEv,_ZTv0_n12_N3ccc7CC1x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y63abcEv,_ZThn4_N3ccc7CC1x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y6E = {  "_ZN3ccc7CC1x5y6E", // class name
  bases__ZN3ccc7CC1x5y6E, 2,
  &(vtc__ZN3ccc7CC1x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y6E),2, //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  DD1x5y6  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD1x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x5y63efgEv
  ~DD1x5y6(); // tgen
  DD1x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y63abcEv");}
void  ccc::DD1x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y63efgEv");}
ccc::DD1x5y6 ::~DD1x5y6(){ note_dtor("_ZN3ccc7DD1x5y6E", this);} // tgen
ccc::DD1x5y6 ::DD1x5y6(){ note_ctor("_ZN3ccc7DD1x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y6E, buf);
    ::ccc::DD1x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y6E);
    dp->::ccc::DD1x5y6::~DD1x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y6E(Test__ZN3ccc7DD1x5y6E, "_ZN3ccc7DD1x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y6C1Ev();
extern void _ZN3ccc7DD1x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y6E[] = {
  NSPAIR(_ZN3ccc7DD1x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y6E[];
extern void _ZN3ccc7DD1x5y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y63efgEv,_ZTv0_n16_N3ccc7DD1x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y63efgEv,_ZThn4_N3ccc7DD1x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y63abcEv,_ZTv0_n20_N3ccc7DD1x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y63abcEv,_ZThn4_N3ccc7DD1x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y63efgEv,_ZTv0_n16_N3ccc7DD1x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y63abcEv,_ZTv0_n20_N3ccc7DD1x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y6E[] = {
  {&(_ZTVN3ccc7DD1x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y6E[];
static VTBL_ENTRY alt_thunk_names596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y63abcEv,_ZTv0_n20_N3ccc7DD1x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y63abcEv,_ZThn4_N3ccc7DD1x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y63efgEv,_ZTv0_n16_N3ccc7DD1x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y63efgEv,_ZThn4_N3ccc7DD1x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y6E = {  "_ZN3ccc7DD1x5y6E", // class name
  bases__ZN3ccc7DD1x5y6E, 2,
  &(vtc__ZN3ccc7DD1x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y6E),3, //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  CC1x5y7  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y73pqrEv
  ~CC1x5y7(); // tgen
  CC1x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y7E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y73abcEv");}
void  ccc::CC1x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y73pqrEv");}
ccc::CC1x5y7 ::~CC1x5y7(){ note_dtor("_ZN3ccc7CC1x5y7E", this);} // tgen
ccc::CC1x5y7 ::CC1x5y7(){ note_ctor("_ZN3ccc7CC1x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y7E, buf);
    ::ccc::CC1x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y7E);
    dp->::ccc::CC1x5y7::~CC1x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y7E(Test__ZN3ccc7CC1x5y7E, "_ZN3ccc7CC1x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y7C1Ev();
extern void _ZN3ccc7CC1x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y7E[] = {
  NSPAIR(_ZN3ccc7CC1x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y7E[];
extern void _ZN3ccc7CC1x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC1x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y73abcEv,_ZTv0_n12_N3ccc7CC1x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y73abcEv,_ZThn4_N3ccc7CC1x5y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y73pqrEv,_ZTv0_n16_N3ccc7CC1x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y73pqrEv,_ZThn4_N3ccc7CC1x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y73abcEv,_ZTv0_n12_N3ccc7CC1x5y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y73pqrEv,_ZTv0_n16_N3ccc7CC1x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y7E[] = {
  {&(_ZTVN3ccc7CC1x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y7E[];
static VTBL_ENTRY alt_thunk_names597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y73pqrEv,_ZTv0_n16_N3ccc7CC1x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y73pqrEv,_ZThn4_N3ccc7CC1x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y73abcEv,_ZTv0_n12_N3ccc7CC1x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y73abcEv,_ZThn4_N3ccc7CC1x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y7E = {  "_ZN3ccc7CC1x5y7E", // class name
  bases__ZN3ccc7CC1x5y7E, 2,
  &(vtc__ZN3ccc7CC1x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y7E),2, //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  DD1x5y7  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD1x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y73pqrEv
  ~DD1x5y7(); // tgen
  DD1x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y73abcEv");}
void  ccc::DD1x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y73pqrEv");}
ccc::DD1x5y7 ::~DD1x5y7(){ note_dtor("_ZN3ccc7DD1x5y7E", this);} // tgen
ccc::DD1x5y7 ::DD1x5y7(){ note_ctor("_ZN3ccc7DD1x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y7E, buf);
    ::ccc::DD1x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y7E);
    dp->::ccc::DD1x5y7::~DD1x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y7E(Test__ZN3ccc7DD1x5y7E, "_ZN3ccc7DD1x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y7C1Ev();
extern void _ZN3ccc7DD1x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y7E[] = {
  NSPAIR(_ZN3ccc7DD1x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y7E[];
extern void _ZN3ccc7DD1x5y73abcEv();
extern void _ZN3ccc7DD1x5y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y73pqrEv,_ZTv0_n12_N3ccc7DD1x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y73pqrEv,_ZThn4_N3ccc7DD1x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y73abcEv,_ZTv0_n20_N3ccc7DD1x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y73abcEv,_ZThn4_N3ccc7DD1x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y73pqrEv,_ZTv0_n12_N3ccc7DD1x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y73abcEv,_ZTv0_n20_N3ccc7DD1x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y7E[] = {
  {&(_ZTVN3ccc7DD1x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y7E[];
static VTBL_ENTRY alt_thunk_names598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y73abcEv,_ZTv0_n20_N3ccc7DD1x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y73abcEv,_ZThn4_N3ccc7DD1x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y73pqrEv,_ZTv0_n12_N3ccc7DD1x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y73pqrEv,_ZThn4_N3ccc7DD1x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y7E = {  "_ZN3ccc7DD1x5y7E", // class name
  bases__ZN3ccc7DD1x5y7E, 2,
  &(vtc__ZN3ccc7DD1x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y7E),3, //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  CC1x5y8  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y83abcEv
  ~CC1x5y8(); // tgen
  CC1x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y8E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y83efgEv");}
void  ccc::CC1x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y83abcEv");}
ccc::CC1x5y8 ::~CC1x5y8(){ note_dtor("_ZN3ccc7CC1x5y8E", this);} // tgen
ccc::CC1x5y8 ::CC1x5y8(){ note_ctor("_ZN3ccc7CC1x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y8E, buf);
    ::ccc::CC1x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y8E);
    dp->::ccc::CC1x5y8::~CC1x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y8E(Test__ZN3ccc7CC1x5y8E, "_ZN3ccc7CC1x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y8C1Ev();
extern void _ZN3ccc7CC1x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y8E[] = {
  NSPAIR(_ZN3ccc7CC1x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC1x5y83efgEv();
extern void _ZN3ccc7CC1x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x5y83abcEv,_ZTv0_n12_N3ccc7CC1x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y83abcEv,_ZThn4_N3ccc7CC1x5y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y83efgEv,_ZTv0_n20_N3ccc7CC1x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y83efgEv,_ZThn4_N3ccc7CC1x5y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x5y83abcEv,_ZTv0_n12_N3ccc7CC1x5y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y83efgEv,_ZTv0_n20_N3ccc7CC1x5y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y8E[] = {
  {&(_ZTVN3ccc7CC1x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y8E[];
static VTBL_ENTRY alt_thunk_names599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y83efgEv,_ZTv0_n20_N3ccc7CC1x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y83efgEv,_ZThn4_N3ccc7CC1x5y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x5y83abcEv,_ZTv0_n12_N3ccc7CC1x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y83abcEv,_ZThn4_N3ccc7CC1x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y8E = {  "_ZN3ccc7CC1x5y8E", // class name
  bases__ZN3ccc7CC1x5y8E, 2,
  &(vtc__ZN3ccc7CC1x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y8E),2, //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  DD1x5y8  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD1x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x5y83abcEv
  ~DD1x5y8(); // tgen
  DD1x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y83efgEv");}
void  ccc::DD1x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x5y83abcEv");}
ccc::DD1x5y8 ::~DD1x5y8(){ note_dtor("_ZN3ccc7DD1x5y8E", this);} // tgen
ccc::DD1x5y8 ::DD1x5y8(){ note_ctor("_ZN3ccc7DD1x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y8E, buf);
    ::ccc::DD1x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y8E);
    dp->::ccc::DD1x5y8::~DD1x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y8E(Test__ZN3ccc7DD1x5y8E, "_ZN3ccc7DD1x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y8C1Ev();
extern void _ZN3ccc7DD1x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y8E[] = {
  NSPAIR(_ZN3ccc7DD1x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y8E[];
extern void _ZN3ccc7DD1x5y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y83efgEv,_ZTv0_n16_N3ccc7DD1x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y83efgEv,_ZThn4_N3ccc7DD1x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD1x5y83abcEv,_ZTv0_n20_N3ccc7DD1x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y83abcEv,_ZThn4_N3ccc7DD1x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y83efgEv,_ZTv0_n16_N3ccc7DD1x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD1x5y83abcEv,_ZTv0_n20_N3ccc7DD1x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y8E[] = {
  {&(_ZTVN3ccc7DD1x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y8E[];
static VTBL_ENTRY alt_thunk_names600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD1x5y83abcEv,_ZTv0_n20_N3ccc7DD1x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y83abcEv,_ZThn4_N3ccc7DD1x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y83efgEv,_ZTv0_n16_N3ccc7DD1x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y83efgEv,_ZThn4_N3ccc7DD1x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y8E = {  "_ZN3ccc7DD1x5y8E", // class name
  bases__ZN3ccc7DD1x5y8E, 2,
  &(vtc__ZN3ccc7DD1x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y8E),3, //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  CC1x5y9  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y93pqrEv
  ~CC1x5y9(); // tgen
  CC1x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y9E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y93efgEv");}
void  ccc::CC1x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y93pqrEv");}
ccc::CC1x5y9 ::~CC1x5y9(){ note_dtor("_ZN3ccc7CC1x5y9E", this);} // tgen
ccc::CC1x5y9 ::CC1x5y9(){ note_ctor("_ZN3ccc7CC1x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y9E, buf);
    ::ccc::CC1x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC1x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y9E);
    dp->::ccc::CC1x5y9::~CC1x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y9E(Test__ZN3ccc7CC1x5y9E, "_ZN3ccc7CC1x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y9C1Ev();
extern void _ZN3ccc7CC1x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y9E[] = {
  NSPAIR(_ZN3ccc7CC1x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y9E[];
extern void _ZN3ccc7CC1x5y93pqrEv();
extern void _ZN3ccc7CC1x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x5y93pqrEv,_ZTv0_n16_N3ccc7CC1x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y93pqrEv,_ZThn4_N3ccc7CC1x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x5y93efgEv,_ZTv0_n20_N3ccc7CC1x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y93efgEv,_ZThn4_N3ccc7CC1x5y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x5y93pqrEv,_ZTv0_n16_N3ccc7CC1x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x5y93efgEv,_ZTv0_n20_N3ccc7CC1x5y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x5y9E[] = {
  {&(_ZTVN3ccc7CC1x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x5y9E[];
static VTBL_ENTRY alt_thunk_names601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x5y93efgEv,_ZTv0_n20_N3ccc7CC1x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y93efgEv,_ZThn4_N3ccc7CC1x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x5y93pqrEv,_ZTv0_n16_N3ccc7CC1x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x5y93pqrEv,_ZThn4_N3ccc7CC1x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x5y9E = {  "_ZN3ccc7CC1x5y9E", // class name
  bases__ZN3ccc7CC1x5y9E, 2,
  &(vtc__ZN3ccc7CC1x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x5y9E),2, //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  DD1x5y9  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD1x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x5y93pqrEv
  ~DD1x5y9(); // tgen
  DD1x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x5y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x5y93efgEv");}
void  ccc::DD1x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x5y93pqrEv");}
ccc::DD1x5y9 ::~DD1x5y9(){ note_dtor("_ZN3ccc7DD1x5y9E", this);} // tgen
ccc::DD1x5y9 ::DD1x5y9(){ note_ctor("_ZN3ccc7DD1x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x5y9E, buf);
    ::ccc::DD1x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x5y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD1x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x5y9E);
    dp->::ccc::DD1x5y9::~DD1x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x5y9E(Test__ZN3ccc7DD1x5y9E, "_ZN3ccc7DD1x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x5y9C1Ev();
extern void _ZN3ccc7DD1x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x5y9E[] = {
  NSPAIR(_ZN3ccc7DD1x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD1x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x5y93pqrEv();
extern void _ZN3ccc7DD1x5y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x5y93pqrEv,_ZTv0_n12_N3ccc7DD1x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y93pqrEv,_ZThn4_N3ccc7DD1x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x5y93efgEv,_ZTv0_n16_N3ccc7DD1x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x5y93efgEv,_ZThn4_N3ccc7DD1x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x5y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x5y93pqrEv,_ZTv0_n12_N3ccc7DD1x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x5y93efgEv,_ZTv0_n16_N3ccc7DD1x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x5y9E[] = {
  {&(_ZTVN3ccc7DD1x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD1x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x5y9E[];
static VTBL_ENTRY alt_thunk_names602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x5y93efgEv,_ZTv0_n16_N3ccc7DD1x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y93efgEv,_ZThn4_N3ccc7DD1x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x5y93pqrEv,_ZTv0_n12_N3ccc7DD1x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x5y93pqrEv,_ZThn4_N3ccc7DD1x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x5y9E = {  "_ZN3ccc7DD1x5y9E", // class name
  bases__ZN3ccc7DD1x5y9E, 2,
  &(vtc__ZN3ccc7DD1x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x5y9E),3, //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  CC1x5y10  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x5y103abcEv
  ~CC1x5y10(); // tgen
  CC1x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y10E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y103pqrEv");}
void  ccc::CC1x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x5y103abcEv");}
ccc::CC1x5y10 ::~CC1x5y10(){ note_dtor("_ZN3ccc8CC1x5y10E", this);} // tgen
ccc::CC1x5y10 ::CC1x5y10(){ note_ctor("_ZN3ccc8CC1x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y10E, buf);
    ::ccc::CC1x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y10E);
    dp->::ccc::CC1x5y10::~CC1x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y10E(Test__ZN3ccc8CC1x5y10E, "_ZN3ccc8CC1x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y10C1Ev();
extern void _ZN3ccc8CC1x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y10E[] = {
  NSPAIR(_ZN3ccc8CC1x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y10E[];
extern void _ZN3ccc8CC1x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC1x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x5y103abcEv,_ZTv0_n12_N3ccc8CC1x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y103abcEv,_ZThn4_N3ccc8CC1x5y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x5y103pqrEv,_ZTv0_n16_N3ccc8CC1x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y103pqrEv,_ZThn4_N3ccc8CC1x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x5y103abcEv,_ZTv0_n12_N3ccc8CC1x5y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x5y103pqrEv,_ZTv0_n16_N3ccc8CC1x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y10E[] = {
  {&(_ZTVN3ccc8CC1x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y10E[];
static VTBL_ENTRY alt_thunk_names603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x5y103pqrEv,_ZTv0_n16_N3ccc8CC1x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y103pqrEv,_ZThn4_N3ccc8CC1x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x5y103abcEv,_ZTv0_n12_N3ccc8CC1x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y103abcEv,_ZThn4_N3ccc8CC1x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x5y10E = {  "_ZN3ccc8CC1x5y10E", // class name
  bases__ZN3ccc8CC1x5y10E, 2,
  &(vtc__ZN3ccc8CC1x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y10E),2, //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  DD1x5y10  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD1x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x5y103abcEv
  ~DD1x5y10(); // tgen
  DD1x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x5y103pqrEv");}
void  ccc::DD1x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x5y103abcEv");}
ccc::DD1x5y10 ::~DD1x5y10(){ note_dtor("_ZN3ccc8DD1x5y10E", this);} // tgen
ccc::DD1x5y10 ::DD1x5y10(){ note_ctor("_ZN3ccc8DD1x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y10E, buf);
    ::ccc::DD1x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y10E);
    dp->::ccc::DD1x5y10::~DD1x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y10E(Test__ZN3ccc8DD1x5y10E, "_ZN3ccc8DD1x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y10C1Ev();
extern void _ZN3ccc8DD1x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y10E[] = {
  NSPAIR(_ZN3ccc8DD1x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y10E[];
extern void _ZN3ccc8DD1x5y103abcEv();
extern void _ZN3ccc8DD1x5y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x5y103pqrEv,_ZTv0_n12_N3ccc8DD1x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y103pqrEv,_ZThn4_N3ccc8DD1x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x5y103abcEv,_ZTv0_n20_N3ccc8DD1x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y103abcEv,_ZThn4_N3ccc8DD1x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x5y103pqrEv,_ZTv0_n12_N3ccc8DD1x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x5y103abcEv,_ZTv0_n20_N3ccc8DD1x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y10E[] = {
  {&(_ZTVN3ccc8DD1x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y10E[];
static VTBL_ENTRY alt_thunk_names604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x5y103abcEv,_ZTv0_n20_N3ccc8DD1x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y103abcEv,_ZThn4_N3ccc8DD1x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x5y103pqrEv,_ZTv0_n12_N3ccc8DD1x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y103pqrEv,_ZThn4_N3ccc8DD1x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x5y10E = {  "_ZN3ccc8DD1x5y10E", // class name
  bases__ZN3ccc8DD1x5y10E, 2,
  &(vtc__ZN3ccc8DD1x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y10E),3, //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  CC1x5y11  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x5y113efgEv
  ~CC1x5y11(); // tgen
  CC1x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y11E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y113pqrEv");}
void  ccc::CC1x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x5y113efgEv");}
ccc::CC1x5y11 ::~CC1x5y11(){ note_dtor("_ZN3ccc8CC1x5y11E", this);} // tgen
ccc::CC1x5y11 ::CC1x5y11(){ note_ctor("_ZN3ccc8CC1x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y11E, buf);
    ::ccc::CC1x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y11E);
    dp->::ccc::CC1x5y11::~CC1x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y11E(Test__ZN3ccc8CC1x5y11E, "_ZN3ccc8CC1x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y11C1Ev();
extern void _ZN3ccc8CC1x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y11E[] = {
  NSPAIR(_ZN3ccc8CC1x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y11E[];
extern void _ZN3ccc8CC1x5y113pqrEv();
extern void _ZN3ccc8CC1x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x5y113pqrEv,_ZTv0_n16_N3ccc8CC1x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y113pqrEv,_ZThn4_N3ccc8CC1x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x5y113efgEv,_ZTv0_n20_N3ccc8CC1x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y113efgEv,_ZThn4_N3ccc8CC1x5y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x5y113pqrEv,_ZTv0_n16_N3ccc8CC1x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x5y113efgEv,_ZTv0_n20_N3ccc8CC1x5y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y11E[] = {
  {&(_ZTVN3ccc8CC1x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y11E[];
static VTBL_ENTRY alt_thunk_names605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x5y113efgEv,_ZTv0_n20_N3ccc8CC1x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y113efgEv,_ZThn4_N3ccc8CC1x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x5y113pqrEv,_ZTv0_n16_N3ccc8CC1x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y113pqrEv,_ZThn4_N3ccc8CC1x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x5y11E = {  "_ZN3ccc8CC1x5y11E", // class name
  bases__ZN3ccc8CC1x5y11E, 2,
  &(vtc__ZN3ccc8CC1x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y11E),2, //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  DD1x5y11  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD1x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x5y113efgEv
  ~DD1x5y11(); // tgen
  DD1x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x5y113pqrEv");}
void  ccc::DD1x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x5y113efgEv");}
ccc::DD1x5y11 ::~DD1x5y11(){ note_dtor("_ZN3ccc8DD1x5y11E", this);} // tgen
ccc::DD1x5y11 ::DD1x5y11(){ note_ctor("_ZN3ccc8DD1x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y11E, buf);
    ::ccc::DD1x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y11E);
    dp->::ccc::DD1x5y11::~DD1x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y11E(Test__ZN3ccc8DD1x5y11E, "_ZN3ccc8DD1x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y11C1Ev();
extern void _ZN3ccc8DD1x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y11E[] = {
  NSPAIR(_ZN3ccc8DD1x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x5y113pqrEv();
extern void _ZN3ccc8DD1x5y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x5y113pqrEv,_ZTv0_n12_N3ccc8DD1x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y113pqrEv,_ZThn4_N3ccc8DD1x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x5y113efgEv,_ZTv0_n16_N3ccc8DD1x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y113efgEv,_ZThn4_N3ccc8DD1x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x5y113pqrEv,_ZTv0_n12_N3ccc8DD1x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x5y113efgEv,_ZTv0_n16_N3ccc8DD1x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y11E[] = {
  {&(_ZTVN3ccc8DD1x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y11E[];
static VTBL_ENTRY alt_thunk_names606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x5y113efgEv,_ZTv0_n16_N3ccc8DD1x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y113efgEv,_ZThn4_N3ccc8DD1x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x5y113pqrEv,_ZTv0_n12_N3ccc8DD1x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y113pqrEv,_ZThn4_N3ccc8DD1x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x5y11E = {  "_ZN3ccc8DD1x5y11E", // class name
  bases__ZN3ccc8DD1x5y11E, 2,
  &(vtc__ZN3ccc8DD1x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y11E),3, //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  CC1x5y12  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC1x5y123abcEv
  ~CC1x5y12(); // tgen
  CC1x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x5y123abcEv");}
ccc::CC1x5y12 ::~CC1x5y12(){ note_dtor("_ZN3ccc8CC1x5y12E", this);} // tgen
ccc::CC1x5y12 ::CC1x5y12(){ note_ctor("_ZN3ccc8CC1x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y12E, buf);
    ::ccc::CC1x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y12E);
    dp->::ccc::CC1x5y12::~CC1x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y12E(Test__ZN3ccc8CC1x5y12E, "_ZN3ccc8CC1x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y12C1Ev();
extern void _ZN3ccc8CC1x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y12E[] = {
  NSPAIR(_ZN3ccc8CC1x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC1x5y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x5y123abcEv,_ZTv0_n12_N3ccc8CC1x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y123abcEv,_ZThn4_N3ccc8CC1x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x5y123abcEv,_ZTv0_n12_N3ccc8CC1x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y12E[] = {
  {&(_ZTVN3ccc8CC1x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y12E[];
static VTBL_ENTRY alt_thunk_names607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x5y123abcEv,_ZTv0_n12_N3ccc8CC1x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y123abcEv,_ZThn4_N3ccc8CC1x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x5y12E = {  "_ZN3ccc8CC1x5y12E", // class name
  bases__ZN3ccc8CC1x5y12E, 2,
  &(vtc__ZN3ccc8CC1x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y12E),2, //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  DD1x5y12  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD1x5y123abcEv
  ~DD1x5y12(); // tgen
  DD1x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD1x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x5y123abcEv");}
ccc::DD1x5y12 ::~DD1x5y12(){ note_dtor("_ZN3ccc8DD1x5y12E", this);} // tgen
ccc::DD1x5y12 ::DD1x5y12(){ note_ctor("_ZN3ccc8DD1x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y12E, buf);
    ::ccc::DD1x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y12E);
    dp->::ccc::DD1x5y12::~DD1x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y12E(Test__ZN3ccc8DD1x5y12E, "_ZN3ccc8DD1x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y12C1Ev();
extern void _ZN3ccc8DD1x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y12E[] = {
  NSPAIR(_ZN3ccc8DD1x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y12E[];
extern void _ZN3ccc8DD1x5y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD1x5y123abcEv,_ZTv0_n20_N3ccc8DD1x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y123abcEv,_ZThn4_N3ccc8DD1x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD1x5y123abcEv,_ZTv0_n20_N3ccc8DD1x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y12E[] = {
  {&(_ZTVN3ccc8DD1x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y12E[];
static VTBL_ENTRY alt_thunk_names608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD1x5y123abcEv,_ZTv0_n20_N3ccc8DD1x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y123abcEv,_ZThn4_N3ccc8DD1x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x5y12E = {  "_ZN3ccc8DD1x5y12E", // class name
  bases__ZN3ccc8DD1x5y12E, 2,
  &(vtc__ZN3ccc8DD1x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y12E),3, //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  CC1x5y13  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC1x5y133efgEv
  ~CC1x5y13(); // tgen
  CC1x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x5y133efgEv");}
ccc::CC1x5y13 ::~CC1x5y13(){ note_dtor("_ZN3ccc8CC1x5y13E", this);} // tgen
ccc::CC1x5y13 ::CC1x5y13(){ note_ctor("_ZN3ccc8CC1x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y13E, buf);
    ::ccc::CC1x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y13E);
    dp->::ccc::CC1x5y13::~CC1x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y13E(Test__ZN3ccc8CC1x5y13E, "_ZN3ccc8CC1x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y13C1Ev();
extern void _ZN3ccc8CC1x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y13E[] = {
  NSPAIR(_ZN3ccc8CC1x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC1x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x5y133efgEv,_ZTv0_n20_N3ccc8CC1x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y133efgEv,_ZThn4_N3ccc8CC1x5y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x5y133efgEv,_ZTv0_n20_N3ccc8CC1x5y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y13E[] = {
  {&(_ZTVN3ccc8CC1x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y13E[];
static VTBL_ENTRY alt_thunk_names609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x5y133efgEv,_ZTv0_n20_N3ccc8CC1x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y133efgEv,_ZThn4_N3ccc8CC1x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x5y13E = {  "_ZN3ccc8CC1x5y13E", // class name
  bases__ZN3ccc8CC1x5y13E, 2,
  &(vtc__ZN3ccc8CC1x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y13E),2, //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  DD1x5y13  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD1x5y133efgEv
  ~DD1x5y13(); // tgen
  DD1x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD1x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x5y133efgEv");}
ccc::DD1x5y13 ::~DD1x5y13(){ note_dtor("_ZN3ccc8DD1x5y13E", this);} // tgen
ccc::DD1x5y13 ::DD1x5y13(){ note_ctor("_ZN3ccc8DD1x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y13E, buf);
    ::ccc::DD1x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y13E);
    dp->::ccc::DD1x5y13::~DD1x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y13E(Test__ZN3ccc8DD1x5y13E, "_ZN3ccc8DD1x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y13C1Ev();
extern void _ZN3ccc8DD1x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y13E[] = {
  NSPAIR(_ZN3ccc8DD1x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x5y133efgEv,_ZTv0_n16_N3ccc8DD1x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y133efgEv,_ZThn4_N3ccc8DD1x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x5y133efgEv,_ZTv0_n16_N3ccc8DD1x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y13E[] = {
  {&(_ZTVN3ccc8DD1x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y13E[];
static VTBL_ENTRY alt_thunk_names610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x5y133efgEv,_ZTv0_n16_N3ccc8DD1x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y133efgEv,_ZThn4_N3ccc8DD1x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x5y13E = {  "_ZN3ccc8DD1x5y13E", // class name
  bases__ZN3ccc8DD1x5y13E, 2,
  &(vtc__ZN3ccc8DD1x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y13E),3, //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  CC1x5y14  : virtual ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y143pqrEv
  ~CC1x5y14(); // tgen
  CC1x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y143pqrEv");}
ccc::CC1x5y14 ::~CC1x5y14(){ note_dtor("_ZN3ccc8CC1x5y14E", this);} // tgen
ccc::CC1x5y14 ::CC1x5y14(){ note_ctor("_ZN3ccc8CC1x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y14E, buf);
    ::ccc::CC1x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y14E);
    dp->::ccc::CC1x5y14::~CC1x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y14E(Test__ZN3ccc8CC1x5y14E, "_ZN3ccc8CC1x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y14C1Ev();
extern void _ZN3ccc8CC1x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y14E[] = {
  NSPAIR(_ZN3ccc8CC1x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y14E[];
extern void _ZN3ccc8CC1x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x5y143pqrEv,_ZTv0_n16_N3ccc8CC1x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y143pqrEv,_ZThn4_N3ccc8CC1x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x5y143pqrEv,_ZTv0_n16_N3ccc8CC1x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y14E[] = {
  {&(_ZTVN3ccc8CC1x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y14E[];
static VTBL_ENTRY alt_thunk_names611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x5y143pqrEv,_ZTv0_n16_N3ccc8CC1x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x5y143pqrEv,_ZThn4_N3ccc8CC1x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x5y14E = {  "_ZN3ccc8CC1x5y14E", // class name
  bases__ZN3ccc8CC1x5y14E, 2,
  &(vtc__ZN3ccc8CC1x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y14E),2, //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  DD1x5y14  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD1x5y143pqrEv
  ~DD1x5y14(); // tgen
  DD1x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x5y143pqrEv");}
ccc::DD1x5y14 ::~DD1x5y14(){ note_dtor("_ZN3ccc8DD1x5y14E", this);} // tgen
ccc::DD1x5y14 ::DD1x5y14(){ note_ctor("_ZN3ccc8DD1x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y14E, buf);
    ::ccc::DD1x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y14E);
    dp->::ccc::DD1x5y14::~DD1x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y14E(Test__ZN3ccc8DD1x5y14E, "_ZN3ccc8DD1x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y14C1Ev();
extern void _ZN3ccc8DD1x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y14E[] = {
  NSPAIR(_ZN3ccc8DD1x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x5y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x5y143pqrEv,_ZTv0_n12_N3ccc8DD1x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x5y143pqrEv,_ZThn4_N3ccc8DD1x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x5y143pqrEv,_ZTv0_n12_N3ccc8DD1x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y14E[] = {
  {&(_ZTVN3ccc8DD1x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y14E[];
static VTBL_ENTRY alt_thunk_names612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x5y143pqrEv,_ZTv0_n12_N3ccc8DD1x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x5y143pqrEv,_ZThn4_N3ccc8DD1x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x5y14E = {  "_ZN3ccc8DD1x5y14E", // class name
  bases__ZN3ccc8DD1x5y14E, 2,
  &(vtc__ZN3ccc8DD1x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y14E),3, //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  CC1x5y15  : virtual ::ccc::AA1 , ::ccc::BB5 {
  ~CC1x5y15(); // tgen
  CC1x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x5y15 ::~CC1x5y15(){ note_dtor("_ZN3ccc8CC1x5y15E", this);} // tgen
ccc::CC1x5y15 ::CC1x5y15(){ note_ctor("_ZN3ccc8CC1x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y15E, buf);
    ::ccc::CC1x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC1x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y15E);
    dp->::ccc::CC1x5y15::~CC1x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y15E(Test__ZN3ccc8CC1x5y15E, "_ZN3ccc8CC1x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y15C1Ev();
extern void _ZN3ccc8CC1x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y15E[] = {
  NSPAIR(_ZN3ccc8CC1x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x5y15E[] = {
  {&(_ZTVN3ccc8CC1x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x5y15E[];
Class_Descriptor cd__ZN3ccc8CC1x5y15E = {  "_ZN3ccc8CC1x5y15E", // class name
  bases__ZN3ccc8CC1x5y15E, 2,
  &(vtc__ZN3ccc8CC1x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x5y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x5y15  : virtual ::ccc::AA1 , virtual ::ccc::BB5 {
  ~DD1x5y15(); // tgen
  DD1x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD1x5y15 ::~DD1x5y15(){ note_dtor("_ZN3ccc8DD1x5y15E", this);} // tgen
ccc::DD1x5y15 ::DD1x5y15(){ note_ctor("_ZN3ccc8DD1x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x5y15E, buf);
    ::ccc::DD1x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x5y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD1x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x5y15E);
    dp->::ccc::DD1x5y15::~DD1x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x5y15E(Test__ZN3ccc8DD1x5y15E, "_ZN3ccc8DD1x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x5y15C1Ev();
extern void _ZN3ccc8DD1x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x5y15E[] = {
  NSPAIR(_ZN3ccc8DD1x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD1x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x5y15E[] = {
  {&(_ZTVN3ccc8DD1x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD1x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x5y15E[];
Class_Descriptor cd__ZN3ccc8DD1x5y15E = {  "_ZN3ccc8DD1x5y15E", // class name
  bases__ZN3ccc8DD1x5y15E, 2,
  &(vtc__ZN3ccc8DD1x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x5y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y0  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y03pqrEv
  ~CC1x6y0(); // tgen
  CC1x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y0E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y03abcEv");}
void  ccc::CC1x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y03efgEv");}
void  ccc::CC1x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y03pqrEv");}
ccc::CC1x6y0 ::~CC1x6y0(){ note_dtor("_ZN3ccc7CC1x6y0E", this);} // tgen
ccc::CC1x6y0 ::CC1x6y0(){ note_ctor("_ZN3ccc7CC1x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y0E, buf);
    ::ccc::CC1x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y0E);
    dp->::ccc::CC1x6y0::~CC1x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y0E(Test__ZN3ccc7CC1x6y0E, "_ZN3ccc7CC1x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y0C1Ev();
extern void _ZN3ccc7CC1x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y0E[] = {
  NSPAIR(_ZN3ccc7CC1x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y0E[];
extern void _ZN3ccc7CC1x6y03abcEv();
extern void _ZN3ccc7CC1x6y03efgEv();
extern void _ZN3ccc7CC1x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y03abcEv,_ZTv0_n12_N3ccc7CC1x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y03abcEv,_ZThn4_N3ccc7CC1x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y03pqrEv,_ZTv0_n16_N3ccc7CC1x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y03pqrEv,_ZThn4_N3ccc7CC1x6y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y03efgEv,_ZTv0_n20_N3ccc7CC1x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y03efgEv,_ZThn4_N3ccc7CC1x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y03abcEv,_ZTv0_n12_N3ccc7CC1x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y03pqrEv,_ZTv0_n16_N3ccc7CC1x6y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y03efgEv,_ZTv0_n20_N3ccc7CC1x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y0E[] = {
  {&(_ZTVN3ccc7CC1x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y0E[];
static VTBL_ENTRY alt_thunk_names613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y03efgEv,_ZTv0_n20_N3ccc7CC1x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y03efgEv,_ZThn4_N3ccc7CC1x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y03pqrEv,_ZTv0_n16_N3ccc7CC1x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y03pqrEv,_ZThn4_N3ccc7CC1x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y03abcEv,_ZTv0_n12_N3ccc7CC1x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y03abcEv,_ZThn4_N3ccc7CC1x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y0E = {  "_ZN3ccc7CC1x6y0E", // class name
  bases__ZN3ccc7CC1x6y0E, 2,
  &(vtc__ZN3ccc7CC1x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y0E),2, //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  DD1x6y0  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD1x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y03pqrEv
  ~DD1x6y0(); // tgen
  DD1x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y03abcEv");}
void  ccc::DD1x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y03efgEv");}
void  ccc::DD1x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y03pqrEv");}
ccc::DD1x6y0 ::~DD1x6y0(){ note_dtor("_ZN3ccc7DD1x6y0E", this);} // tgen
ccc::DD1x6y0 ::DD1x6y0(){ note_ctor("_ZN3ccc7DD1x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y0E, buf);
    ::ccc::DD1x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y0E);
    dp->::ccc::DD1x6y0::~DD1x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y0E(Test__ZN3ccc7DD1x6y0E, "_ZN3ccc7DD1x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y0C1Ev();
extern void _ZN3ccc7DD1x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y0E[] = {
  NSPAIR(_ZN3ccc7DD1x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y0E[];
extern void _ZN3ccc7DD1x6y03abcEv();
extern void _ZN3ccc7DD1x6y03pqrEv();
extern void _ZN3ccc7DD1x6y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y03abcEv,_ZTv0_n12_N3ccc7DD1x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y03abcEv,_ZThn4_N3ccc7DD1x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y03efgEv,_ZTv0_n16_N3ccc7DD1x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y03efgEv,_ZThn4_N3ccc7DD1x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y03abcEv,_ZTv0_n12_N3ccc7DD1x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y03efgEv,_ZTv0_n16_N3ccc7DD1x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y0E[] = {
  {&(_ZTVN3ccc7DD1x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y0E[];
static VTBL_ENTRY alt_thunk_names614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y03efgEv,_ZTv0_n16_N3ccc7DD1x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y03efgEv,_ZThn4_N3ccc7DD1x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y03abcEv,_ZTv0_n12_N3ccc7DD1x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y03abcEv,_ZThn4_N3ccc7DD1x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y0E = {  "_ZN3ccc7DD1x6y0E", // class name
  bases__ZN3ccc7DD1x6y0E, 2,
  &(vtc__ZN3ccc7DD1x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y0E),3, //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  CC1x6y1  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x6y13efgEv
  ~CC1x6y1(); // tgen
  CC1x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y1E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y13abcEv");}
void  ccc::CC1x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y13pqrEv");}
void  ccc::CC1x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y13efgEv");}
ccc::CC1x6y1 ::~CC1x6y1(){ note_dtor("_ZN3ccc7CC1x6y1E", this);} // tgen
ccc::CC1x6y1 ::CC1x6y1(){ note_ctor("_ZN3ccc7CC1x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y1E, buf);
    ::ccc::CC1x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y1E);
    dp->::ccc::CC1x6y1::~CC1x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y1E(Test__ZN3ccc7CC1x6y1E, "_ZN3ccc7CC1x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y1C1Ev();
extern void _ZN3ccc7CC1x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y1E[] = {
  NSPAIR(_ZN3ccc7CC1x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y1E[];
extern void _ZN3ccc7CC1x6y13abcEv();
extern void _ZN3ccc7CC1x6y13efgEv();
extern void _ZN3ccc7CC1x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y13abcEv,_ZTv0_n12_N3ccc7CC1x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y13abcEv,_ZThn4_N3ccc7CC1x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y13pqrEv,_ZTv0_n16_N3ccc7CC1x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y13pqrEv,_ZThn4_N3ccc7CC1x6y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y13efgEv,_ZTv0_n20_N3ccc7CC1x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y13efgEv,_ZThn4_N3ccc7CC1x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y13abcEv,_ZTv0_n12_N3ccc7CC1x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y13pqrEv,_ZTv0_n16_N3ccc7CC1x6y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y13efgEv,_ZTv0_n20_N3ccc7CC1x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y1E[] = {
  {&(_ZTVN3ccc7CC1x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y1E[];
static VTBL_ENTRY alt_thunk_names615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y13efgEv,_ZTv0_n20_N3ccc7CC1x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y13efgEv,_ZThn4_N3ccc7CC1x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y13pqrEv,_ZTv0_n16_N3ccc7CC1x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y13pqrEv,_ZThn4_N3ccc7CC1x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y13abcEv,_ZTv0_n12_N3ccc7CC1x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y13abcEv,_ZThn4_N3ccc7CC1x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y1E = {  "_ZN3ccc7CC1x6y1E", // class name
  bases__ZN3ccc7CC1x6y1E, 2,
  &(vtc__ZN3ccc7CC1x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y1E),2, //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  DD1x6y1  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD1x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x6y13efgEv
  ~DD1x6y1(); // tgen
  DD1x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y13abcEv");}
void  ccc::DD1x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y13pqrEv");}
void  ccc::DD1x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y13efgEv");}
ccc::DD1x6y1 ::~DD1x6y1(){ note_dtor("_ZN3ccc7DD1x6y1E", this);} // tgen
ccc::DD1x6y1 ::DD1x6y1(){ note_ctor("_ZN3ccc7DD1x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y1E, buf);
    ::ccc::DD1x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y1E);
    dp->::ccc::DD1x6y1::~DD1x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y1E(Test__ZN3ccc7DD1x6y1E, "_ZN3ccc7DD1x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y1C1Ev();
extern void _ZN3ccc7DD1x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y1E[] = {
  NSPAIR(_ZN3ccc7DD1x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y1E[];
extern void _ZN3ccc7DD1x6y13abcEv();
extern void _ZN3ccc7DD1x6y13pqrEv();
extern void _ZN3ccc7DD1x6y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y13abcEv,_ZTv0_n12_N3ccc7DD1x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y13abcEv,_ZThn4_N3ccc7DD1x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y13efgEv,_ZTv0_n16_N3ccc7DD1x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y13efgEv,_ZThn4_N3ccc7DD1x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y13abcEv,_ZTv0_n12_N3ccc7DD1x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y13efgEv,_ZTv0_n16_N3ccc7DD1x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y1E[] = {
  {&(_ZTVN3ccc7DD1x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y1E[];
static VTBL_ENTRY alt_thunk_names616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y13efgEv,_ZTv0_n16_N3ccc7DD1x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y13efgEv,_ZThn4_N3ccc7DD1x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y13abcEv,_ZTv0_n12_N3ccc7DD1x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y13abcEv,_ZThn4_N3ccc7DD1x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y1E = {  "_ZN3ccc7DD1x6y1E", // class name
  bases__ZN3ccc7DD1x6y1E, 2,
  &(vtc__ZN3ccc7DD1x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y1E),3, //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  CC1x6y2  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y23pqrEv
  ~CC1x6y2(); // tgen
  CC1x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y2E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y23efgEv");}
void  ccc::CC1x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y23abcEv");}
void  ccc::CC1x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y23pqrEv");}
ccc::CC1x6y2 ::~CC1x6y2(){ note_dtor("_ZN3ccc7CC1x6y2E", this);} // tgen
ccc::CC1x6y2 ::CC1x6y2(){ note_ctor("_ZN3ccc7CC1x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y2E, buf);
    ::ccc::CC1x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y2E);
    dp->::ccc::CC1x6y2::~CC1x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y2E(Test__ZN3ccc7CC1x6y2E, "_ZN3ccc7CC1x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y2C1Ev();
extern void _ZN3ccc7CC1x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y2E[] = {
  NSPAIR(_ZN3ccc7CC1x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y2E[];
extern void _ZN3ccc7CC1x6y23abcEv();
extern void _ZN3ccc7CC1x6y23efgEv();
extern void _ZN3ccc7CC1x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y23abcEv,_ZTv0_n12_N3ccc7CC1x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y23abcEv,_ZThn4_N3ccc7CC1x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y23pqrEv,_ZTv0_n16_N3ccc7CC1x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y23pqrEv,_ZThn4_N3ccc7CC1x6y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y23efgEv,_ZTv0_n20_N3ccc7CC1x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y23efgEv,_ZThn4_N3ccc7CC1x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y23abcEv,_ZTv0_n12_N3ccc7CC1x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y23pqrEv,_ZTv0_n16_N3ccc7CC1x6y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y23efgEv,_ZTv0_n20_N3ccc7CC1x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y2E[] = {
  {&(_ZTVN3ccc7CC1x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y2E[];
static VTBL_ENTRY alt_thunk_names617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y23efgEv,_ZTv0_n20_N3ccc7CC1x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y23efgEv,_ZThn4_N3ccc7CC1x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y23pqrEv,_ZTv0_n16_N3ccc7CC1x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y23pqrEv,_ZThn4_N3ccc7CC1x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y23abcEv,_ZTv0_n12_N3ccc7CC1x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y23abcEv,_ZThn4_N3ccc7CC1x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y2E = {  "_ZN3ccc7CC1x6y2E", // class name
  bases__ZN3ccc7CC1x6y2E, 2,
  &(vtc__ZN3ccc7CC1x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y2E),2, //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  DD1x6y2  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD1x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y23pqrEv
  ~DD1x6y2(); // tgen
  DD1x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y23efgEv");}
void  ccc::DD1x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y23abcEv");}
void  ccc::DD1x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y23pqrEv");}
ccc::DD1x6y2 ::~DD1x6y2(){ note_dtor("_ZN3ccc7DD1x6y2E", this);} // tgen
ccc::DD1x6y2 ::DD1x6y2(){ note_ctor("_ZN3ccc7DD1x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y2E, buf);
    ::ccc::DD1x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y2E);
    dp->::ccc::DD1x6y2::~DD1x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y2E(Test__ZN3ccc7DD1x6y2E, "_ZN3ccc7DD1x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y2C1Ev();
extern void _ZN3ccc7DD1x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y2E[] = {
  NSPAIR(_ZN3ccc7DD1x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y2E[];
extern void _ZN3ccc7DD1x6y23abcEv();
extern void _ZN3ccc7DD1x6y23pqrEv();
extern void _ZN3ccc7DD1x6y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y23abcEv,_ZTv0_n12_N3ccc7DD1x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y23abcEv,_ZThn4_N3ccc7DD1x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y23efgEv,_ZTv0_n16_N3ccc7DD1x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y23efgEv,_ZThn4_N3ccc7DD1x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y23abcEv,_ZTv0_n12_N3ccc7DD1x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y23efgEv,_ZTv0_n16_N3ccc7DD1x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y2E[] = {
  {&(_ZTVN3ccc7DD1x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y2E[];
static VTBL_ENTRY alt_thunk_names618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y23efgEv,_ZTv0_n16_N3ccc7DD1x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y23efgEv,_ZThn4_N3ccc7DD1x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y23abcEv,_ZTv0_n12_N3ccc7DD1x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y23abcEv,_ZThn4_N3ccc7DD1x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y2E = {  "_ZN3ccc7DD1x6y2E", // class name
  bases__ZN3ccc7DD1x6y2E, 2,
  &(vtc__ZN3ccc7DD1x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y2E),3, //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  CC1x6y3  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x6y33abcEv
  ~CC1x6y3(); // tgen
  CC1x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y3E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y33efgEv");}
void  ccc::CC1x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y33pqrEv");}
void  ccc::CC1x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y33abcEv");}
ccc::CC1x6y3 ::~CC1x6y3(){ note_dtor("_ZN3ccc7CC1x6y3E", this);} // tgen
ccc::CC1x6y3 ::CC1x6y3(){ note_ctor("_ZN3ccc7CC1x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y3E, buf);
    ::ccc::CC1x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y3E);
    dp->::ccc::CC1x6y3::~CC1x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y3E(Test__ZN3ccc7CC1x6y3E, "_ZN3ccc7CC1x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y3C1Ev();
extern void _ZN3ccc7CC1x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y3E[] = {
  NSPAIR(_ZN3ccc7CC1x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y3E[];
extern void _ZN3ccc7CC1x6y33abcEv();
extern void _ZN3ccc7CC1x6y33efgEv();
extern void _ZN3ccc7CC1x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y33abcEv,_ZTv0_n12_N3ccc7CC1x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y33abcEv,_ZThn4_N3ccc7CC1x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y33pqrEv,_ZTv0_n16_N3ccc7CC1x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y33pqrEv,_ZThn4_N3ccc7CC1x6y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y33efgEv,_ZTv0_n20_N3ccc7CC1x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y33efgEv,_ZThn4_N3ccc7CC1x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y33abcEv,_ZTv0_n12_N3ccc7CC1x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y33pqrEv,_ZTv0_n16_N3ccc7CC1x6y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y33efgEv,_ZTv0_n20_N3ccc7CC1x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y3E[] = {
  {&(_ZTVN3ccc7CC1x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y3E[];
static VTBL_ENTRY alt_thunk_names619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y33efgEv,_ZTv0_n20_N3ccc7CC1x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y33efgEv,_ZThn4_N3ccc7CC1x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y33pqrEv,_ZTv0_n16_N3ccc7CC1x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y33pqrEv,_ZThn4_N3ccc7CC1x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y33abcEv,_ZTv0_n12_N3ccc7CC1x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y33abcEv,_ZThn4_N3ccc7CC1x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y3E = {  "_ZN3ccc7CC1x6y3E", // class name
  bases__ZN3ccc7CC1x6y3E, 2,
  &(vtc__ZN3ccc7CC1x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y3E),2, //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  DD1x6y3  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD1x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x6y33abcEv
  ~DD1x6y3(); // tgen
  DD1x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y33efgEv");}
void  ccc::DD1x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y33pqrEv");}
void  ccc::DD1x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y33abcEv");}
ccc::DD1x6y3 ::~DD1x6y3(){ note_dtor("_ZN3ccc7DD1x6y3E", this);} // tgen
ccc::DD1x6y3 ::DD1x6y3(){ note_ctor("_ZN3ccc7DD1x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y3E, buf);
    ::ccc::DD1x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y3E);
    dp->::ccc::DD1x6y3::~DD1x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y3E(Test__ZN3ccc7DD1x6y3E, "_ZN3ccc7DD1x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y3C1Ev();
extern void _ZN3ccc7DD1x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y3E[] = {
  NSPAIR(_ZN3ccc7DD1x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y3E[];
extern void _ZN3ccc7DD1x6y33abcEv();
extern void _ZN3ccc7DD1x6y33pqrEv();
extern void _ZN3ccc7DD1x6y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y33abcEv,_ZTv0_n12_N3ccc7DD1x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y33abcEv,_ZThn4_N3ccc7DD1x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y33efgEv,_ZTv0_n16_N3ccc7DD1x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y33efgEv,_ZThn4_N3ccc7DD1x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y33abcEv,_ZTv0_n12_N3ccc7DD1x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y33efgEv,_ZTv0_n16_N3ccc7DD1x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y3E[] = {
  {&(_ZTVN3ccc7DD1x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y3E[];
static VTBL_ENTRY alt_thunk_names620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y33efgEv,_ZTv0_n16_N3ccc7DD1x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y33efgEv,_ZThn4_N3ccc7DD1x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y33abcEv,_ZTv0_n12_N3ccc7DD1x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y33abcEv,_ZThn4_N3ccc7DD1x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y3E = {  "_ZN3ccc7DD1x6y3E", // class name
  bases__ZN3ccc7DD1x6y3E, 2,
  &(vtc__ZN3ccc7DD1x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y3E),3, //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  CC1x6y4  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC1x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y43efgEv
  ~CC1x6y4(); // tgen
  CC1x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y4E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y43pqrEv");}
void  ccc::CC1x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y43abcEv");}
void  ccc::CC1x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y43efgEv");}
ccc::CC1x6y4 ::~CC1x6y4(){ note_dtor("_ZN3ccc7CC1x6y4E", this);} // tgen
ccc::CC1x6y4 ::CC1x6y4(){ note_ctor("_ZN3ccc7CC1x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y4E, buf);
    ::ccc::CC1x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y4E);
    dp->::ccc::CC1x6y4::~CC1x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y4E(Test__ZN3ccc7CC1x6y4E, "_ZN3ccc7CC1x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y4C1Ev();
extern void _ZN3ccc7CC1x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y4E[] = {
  NSPAIR(_ZN3ccc7CC1x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y4E[];
extern void _ZN3ccc7CC1x6y43abcEv();
extern void _ZN3ccc7CC1x6y43efgEv();
extern void _ZN3ccc7CC1x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y43abcEv,_ZTv0_n12_N3ccc7CC1x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y43abcEv,_ZThn4_N3ccc7CC1x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y43pqrEv,_ZTv0_n16_N3ccc7CC1x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y43pqrEv,_ZThn4_N3ccc7CC1x6y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y43efgEv,_ZTv0_n20_N3ccc7CC1x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y43efgEv,_ZThn4_N3ccc7CC1x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y43abcEv,_ZTv0_n12_N3ccc7CC1x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y43pqrEv,_ZTv0_n16_N3ccc7CC1x6y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y43efgEv,_ZTv0_n20_N3ccc7CC1x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y4E[] = {
  {&(_ZTVN3ccc7CC1x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y4E[];
static VTBL_ENTRY alt_thunk_names621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y43efgEv,_ZTv0_n20_N3ccc7CC1x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y43efgEv,_ZThn4_N3ccc7CC1x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y43pqrEv,_ZTv0_n16_N3ccc7CC1x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y43pqrEv,_ZThn4_N3ccc7CC1x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y43abcEv,_ZTv0_n12_N3ccc7CC1x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y43abcEv,_ZThn4_N3ccc7CC1x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y4E = {  "_ZN3ccc7CC1x6y4E", // class name
  bases__ZN3ccc7CC1x6y4E, 2,
  &(vtc__ZN3ccc7CC1x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y4E),2, //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  DD1x6y4  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD1x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x6y43efgEv
  ~DD1x6y4(); // tgen
  DD1x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y43pqrEv");}
void  ccc::DD1x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y43abcEv");}
void  ccc::DD1x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y43efgEv");}
ccc::DD1x6y4 ::~DD1x6y4(){ note_dtor("_ZN3ccc7DD1x6y4E", this);} // tgen
ccc::DD1x6y4 ::DD1x6y4(){ note_ctor("_ZN3ccc7DD1x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y4E, buf);
    ::ccc::DD1x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y4E);
    dp->::ccc::DD1x6y4::~DD1x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y4E(Test__ZN3ccc7DD1x6y4E, "_ZN3ccc7DD1x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y4C1Ev();
extern void _ZN3ccc7DD1x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y4E[] = {
  NSPAIR(_ZN3ccc7DD1x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y4E[];
extern void _ZN3ccc7DD1x6y43abcEv();
extern void _ZN3ccc7DD1x6y43pqrEv();
extern void _ZN3ccc7DD1x6y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y43abcEv,_ZTv0_n12_N3ccc7DD1x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y43abcEv,_ZThn4_N3ccc7DD1x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y43efgEv,_ZTv0_n16_N3ccc7DD1x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y43efgEv,_ZThn4_N3ccc7DD1x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y43abcEv,_ZTv0_n12_N3ccc7DD1x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y43efgEv,_ZTv0_n16_N3ccc7DD1x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y4E[] = {
  {&(_ZTVN3ccc7DD1x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y4E[];
static VTBL_ENTRY alt_thunk_names622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y43efgEv,_ZTv0_n16_N3ccc7DD1x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y43efgEv,_ZThn4_N3ccc7DD1x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y43abcEv,_ZTv0_n12_N3ccc7DD1x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y43abcEv,_ZThn4_N3ccc7DD1x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y4E = {  "_ZN3ccc7DD1x6y4E", // class name
  bases__ZN3ccc7DD1x6y4E, 2,
  &(vtc__ZN3ccc7DD1x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y4E),3, //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  CC1x6y5  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC1x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y53abcEv
  ~CC1x6y5(); // tgen
  CC1x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y5E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y53pqrEv");}
void  ccc::CC1x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y53efgEv");}
void  ccc::CC1x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y53abcEv");}
ccc::CC1x6y5 ::~CC1x6y5(){ note_dtor("_ZN3ccc7CC1x6y5E", this);} // tgen
ccc::CC1x6y5 ::CC1x6y5(){ note_ctor("_ZN3ccc7CC1x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y5E, buf);
    ::ccc::CC1x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y5E);
    dp->::ccc::CC1x6y5::~CC1x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y5E(Test__ZN3ccc7CC1x6y5E, "_ZN3ccc7CC1x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y5C1Ev();
extern void _ZN3ccc7CC1x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y5E[] = {
  NSPAIR(_ZN3ccc7CC1x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y5E[];
extern void _ZN3ccc7CC1x6y53abcEv();
extern void _ZN3ccc7CC1x6y53efgEv();
extern void _ZN3ccc7CC1x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y53abcEv,_ZTv0_n12_N3ccc7CC1x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y53abcEv,_ZThn4_N3ccc7CC1x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y53pqrEv,_ZTv0_n16_N3ccc7CC1x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y53pqrEv,_ZThn4_N3ccc7CC1x6y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y53efgEv,_ZTv0_n20_N3ccc7CC1x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y53efgEv,_ZThn4_N3ccc7CC1x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y53abcEv,_ZTv0_n12_N3ccc7CC1x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y53pqrEv,_ZTv0_n16_N3ccc7CC1x6y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y53efgEv,_ZTv0_n20_N3ccc7CC1x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y5E[] = {
  {&(_ZTVN3ccc7CC1x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y5E[];
static VTBL_ENTRY alt_thunk_names623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y53efgEv,_ZTv0_n20_N3ccc7CC1x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y53efgEv,_ZThn4_N3ccc7CC1x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y53pqrEv,_ZTv0_n16_N3ccc7CC1x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y53pqrEv,_ZThn4_N3ccc7CC1x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y53abcEv,_ZTv0_n12_N3ccc7CC1x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y53abcEv,_ZThn4_N3ccc7CC1x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y5E = {  "_ZN3ccc7CC1x6y5E", // class name
  bases__ZN3ccc7CC1x6y5E, 2,
  &(vtc__ZN3ccc7CC1x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y5E),2, //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  DD1x6y5  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD1x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x6y53abcEv
  ~DD1x6y5(); // tgen
  DD1x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y53pqrEv");}
void  ccc::DD1x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y53efgEv");}
void  ccc::DD1x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y53abcEv");}
ccc::DD1x6y5 ::~DD1x6y5(){ note_dtor("_ZN3ccc7DD1x6y5E", this);} // tgen
ccc::DD1x6y5 ::DD1x6y5(){ note_ctor("_ZN3ccc7DD1x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y5E, buf);
    ::ccc::DD1x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y5E);
    dp->::ccc::DD1x6y5::~DD1x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y5E(Test__ZN3ccc7DD1x6y5E, "_ZN3ccc7DD1x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y5C1Ev();
extern void _ZN3ccc7DD1x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y5E[] = {
  NSPAIR(_ZN3ccc7DD1x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y5E[];
extern void _ZN3ccc7DD1x6y53abcEv();
extern void _ZN3ccc7DD1x6y53pqrEv();
extern void _ZN3ccc7DD1x6y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y53abcEv,_ZTv0_n12_N3ccc7DD1x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y53abcEv,_ZThn4_N3ccc7DD1x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y53efgEv,_ZTv0_n16_N3ccc7DD1x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y53efgEv,_ZThn4_N3ccc7DD1x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y53abcEv,_ZTv0_n12_N3ccc7DD1x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y53efgEv,_ZTv0_n16_N3ccc7DD1x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y5E[] = {
  {&(_ZTVN3ccc7DD1x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y5E[];
static VTBL_ENTRY alt_thunk_names624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y53efgEv,_ZTv0_n16_N3ccc7DD1x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y53efgEv,_ZThn4_N3ccc7DD1x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y53abcEv,_ZTv0_n12_N3ccc7DD1x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y53abcEv,_ZThn4_N3ccc7DD1x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y5E = {  "_ZN3ccc7DD1x6y5E", // class name
  bases__ZN3ccc7DD1x6y5E, 2,
  &(vtc__ZN3ccc7DD1x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y5E),3, //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  CC1x6y6  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y63efgEv
  ~CC1x6y6(); // tgen
  CC1x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y6E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y63abcEv");}
void  ccc::CC1x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y63efgEv");}
ccc::CC1x6y6 ::~CC1x6y6(){ note_dtor("_ZN3ccc7CC1x6y6E", this);} // tgen
ccc::CC1x6y6 ::CC1x6y6(){ note_ctor("_ZN3ccc7CC1x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y6E, buf);
    ::ccc::CC1x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y6E);
    dp->::ccc::CC1x6y6::~CC1x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y6E(Test__ZN3ccc7CC1x6y6E, "_ZN3ccc7CC1x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y6C1Ev();
extern void _ZN3ccc7CC1x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y6E[] = {
  NSPAIR(_ZN3ccc7CC1x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y6E[];
extern void _ZN3ccc7CC1x6y63abcEv();
extern void _ZN3ccc7CC1x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y63abcEv,_ZTv0_n12_N3ccc7CC1x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y63abcEv,_ZThn4_N3ccc7CC1x6y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y63efgEv,_ZTv0_n20_N3ccc7CC1x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y63efgEv,_ZThn4_N3ccc7CC1x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y63abcEv,_ZTv0_n12_N3ccc7CC1x6y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y63efgEv,_ZTv0_n20_N3ccc7CC1x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y6E[] = {
  {&(_ZTVN3ccc7CC1x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y6E[];
static VTBL_ENTRY alt_thunk_names625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y63efgEv,_ZTv0_n20_N3ccc7CC1x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y63efgEv,_ZThn4_N3ccc7CC1x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y63abcEv,_ZTv0_n12_N3ccc7CC1x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y63abcEv,_ZThn4_N3ccc7CC1x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y6E = {  "_ZN3ccc7CC1x6y6E", // class name
  bases__ZN3ccc7CC1x6y6E, 2,
  &(vtc__ZN3ccc7CC1x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y6E),2, //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  DD1x6y6  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD1x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x6y63efgEv
  ~DD1x6y6(); // tgen
  DD1x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y63abcEv");}
void  ccc::DD1x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y63efgEv");}
ccc::DD1x6y6 ::~DD1x6y6(){ note_dtor("_ZN3ccc7DD1x6y6E", this);} // tgen
ccc::DD1x6y6 ::DD1x6y6(){ note_ctor("_ZN3ccc7DD1x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y6E, buf);
    ::ccc::DD1x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y6E);
    dp->::ccc::DD1x6y6::~DD1x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y6E(Test__ZN3ccc7DD1x6y6E, "_ZN3ccc7DD1x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y6C1Ev();
extern void _ZN3ccc7DD1x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y6E[] = {
  NSPAIR(_ZN3ccc7DD1x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y6E[];
extern void _ZN3ccc7DD1x6y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y63abcEv,_ZTv0_n12_N3ccc7DD1x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y63abcEv,_ZThn4_N3ccc7DD1x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y63efgEv,_ZTv0_n16_N3ccc7DD1x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y63efgEv,_ZThn4_N3ccc7DD1x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y63abcEv,_ZTv0_n12_N3ccc7DD1x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y63efgEv,_ZTv0_n16_N3ccc7DD1x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y6E[] = {
  {&(_ZTVN3ccc7DD1x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y6E[];
static VTBL_ENTRY alt_thunk_names626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y63efgEv,_ZTv0_n16_N3ccc7DD1x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y63efgEv,_ZThn4_N3ccc7DD1x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y63abcEv,_ZTv0_n12_N3ccc7DD1x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y63abcEv,_ZThn4_N3ccc7DD1x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y6E = {  "_ZN3ccc7DD1x6y6E", // class name
  bases__ZN3ccc7DD1x6y6E, 2,
  &(vtc__ZN3ccc7DD1x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y6E),3, //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  CC1x6y7  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y73pqrEv
  ~CC1x6y7(); // tgen
  CC1x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y7E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y73abcEv");}
void  ccc::CC1x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y73pqrEv");}
ccc::CC1x6y7 ::~CC1x6y7(){ note_dtor("_ZN3ccc7CC1x6y7E", this);} // tgen
ccc::CC1x6y7 ::CC1x6y7(){ note_ctor("_ZN3ccc7CC1x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y7E, buf);
    ::ccc::CC1x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y7E);
    dp->::ccc::CC1x6y7::~CC1x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y7E(Test__ZN3ccc7CC1x6y7E, "_ZN3ccc7CC1x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y7C1Ev();
extern void _ZN3ccc7CC1x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y7E[] = {
  NSPAIR(_ZN3ccc7CC1x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y7E[];
extern void _ZN3ccc7CC1x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC1x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y73abcEv,_ZTv0_n12_N3ccc7CC1x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y73abcEv,_ZThn4_N3ccc7CC1x6y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y73pqrEv,_ZTv0_n16_N3ccc7CC1x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y73pqrEv,_ZThn4_N3ccc7CC1x6y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y73abcEv,_ZTv0_n12_N3ccc7CC1x6y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y73pqrEv,_ZTv0_n16_N3ccc7CC1x6y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y7E[] = {
  {&(_ZTVN3ccc7CC1x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y7E[];
static VTBL_ENTRY alt_thunk_names627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y73pqrEv,_ZTv0_n16_N3ccc7CC1x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y73pqrEv,_ZThn4_N3ccc7CC1x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y73abcEv,_ZTv0_n12_N3ccc7CC1x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y73abcEv,_ZThn4_N3ccc7CC1x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y7E = {  "_ZN3ccc7CC1x6y7E", // class name
  bases__ZN3ccc7CC1x6y7E, 2,
  &(vtc__ZN3ccc7CC1x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y7E),2, //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  DD1x6y7  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD1x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y73pqrEv
  ~DD1x6y7(); // tgen
  DD1x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y73abcEv");}
void  ccc::DD1x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y73pqrEv");}
ccc::DD1x6y7 ::~DD1x6y7(){ note_dtor("_ZN3ccc7DD1x6y7E", this);} // tgen
ccc::DD1x6y7 ::DD1x6y7(){ note_ctor("_ZN3ccc7DD1x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y7E, buf);
    ::ccc::DD1x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y7E);
    dp->::ccc::DD1x6y7::~DD1x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y7E(Test__ZN3ccc7DD1x6y7E, "_ZN3ccc7DD1x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y7C1Ev();
extern void _ZN3ccc7DD1x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y7E[] = {
  NSPAIR(_ZN3ccc7DD1x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y7E[];
extern void _ZN3ccc7DD1x6y73abcEv();
extern void _ZN3ccc7DD1x6y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y73abcEv,_ZTv0_n12_N3ccc7DD1x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y73abcEv,_ZThn4_N3ccc7DD1x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y73abcEv,_ZTv0_n12_N3ccc7DD1x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y7E[] = {
  {&(_ZTVN3ccc7DD1x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y7E[];
static VTBL_ENTRY alt_thunk_names628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y73abcEv,_ZTv0_n12_N3ccc7DD1x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y73abcEv,_ZThn4_N3ccc7DD1x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y7E = {  "_ZN3ccc7DD1x6y7E", // class name
  bases__ZN3ccc7DD1x6y7E, 2,
  &(vtc__ZN3ccc7DD1x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y7E),3, //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  CC1x6y8  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y83abcEv
  ~CC1x6y8(); // tgen
  CC1x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y8E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y83efgEv");}
void  ccc::CC1x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y83abcEv");}
ccc::CC1x6y8 ::~CC1x6y8(){ note_dtor("_ZN3ccc7CC1x6y8E", this);} // tgen
ccc::CC1x6y8 ::CC1x6y8(){ note_ctor("_ZN3ccc7CC1x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y8E, buf);
    ::ccc::CC1x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y8E);
    dp->::ccc::CC1x6y8::~CC1x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y8E(Test__ZN3ccc7CC1x6y8E, "_ZN3ccc7CC1x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y8C1Ev();
extern void _ZN3ccc7CC1x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y8E[] = {
  NSPAIR(_ZN3ccc7CC1x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y8E[];
extern void _ZN3ccc7CC1x6y83abcEv();
extern void _ZN3ccc7CC1x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x6y83abcEv,_ZTv0_n12_N3ccc7CC1x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y83abcEv,_ZThn4_N3ccc7CC1x6y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y83efgEv,_ZTv0_n20_N3ccc7CC1x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y83efgEv,_ZThn4_N3ccc7CC1x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x6y83abcEv,_ZTv0_n12_N3ccc7CC1x6y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y83efgEv,_ZTv0_n20_N3ccc7CC1x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y8E[] = {
  {&(_ZTVN3ccc7CC1x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y8E[];
static VTBL_ENTRY alt_thunk_names629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y83efgEv,_ZTv0_n20_N3ccc7CC1x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y83efgEv,_ZThn4_N3ccc7CC1x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x6y83abcEv,_ZTv0_n12_N3ccc7CC1x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y83abcEv,_ZThn4_N3ccc7CC1x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y8E = {  "_ZN3ccc7CC1x6y8E", // class name
  bases__ZN3ccc7CC1x6y8E, 2,
  &(vtc__ZN3ccc7CC1x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names629,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x6y8  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD1x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x6y83abcEv
  ~DD1x6y8(); // tgen
  DD1x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y83efgEv");}
void  ccc::DD1x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x6y83abcEv");}
ccc::DD1x6y8 ::~DD1x6y8(){ note_dtor("_ZN3ccc7DD1x6y8E", this);} // tgen
ccc::DD1x6y8 ::DD1x6y8(){ note_ctor("_ZN3ccc7DD1x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y8E, buf);
    ::ccc::DD1x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y8E);
    dp->::ccc::DD1x6y8::~DD1x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y8E(Test__ZN3ccc7DD1x6y8E, "_ZN3ccc7DD1x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y8C1Ev();
extern void _ZN3ccc7DD1x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y8E[] = {
  NSPAIR(_ZN3ccc7DD1x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y8E[];
extern void _ZN3ccc7DD1x6y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x6y83abcEv,_ZTv0_n12_N3ccc7DD1x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y83abcEv,_ZThn4_N3ccc7DD1x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y83efgEv,_ZTv0_n16_N3ccc7DD1x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y83efgEv,_ZThn4_N3ccc7DD1x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x6y83abcEv,_ZTv0_n12_N3ccc7DD1x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y83efgEv,_ZTv0_n16_N3ccc7DD1x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y8E[] = {
  {&(_ZTVN3ccc7DD1x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y8E[];
static VTBL_ENTRY alt_thunk_names630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y83efgEv,_ZTv0_n16_N3ccc7DD1x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y83efgEv,_ZThn4_N3ccc7DD1x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x6y83abcEv,_ZTv0_n12_N3ccc7DD1x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y83abcEv,_ZThn4_N3ccc7DD1x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y8E = {  "_ZN3ccc7DD1x6y8E", // class name
  bases__ZN3ccc7DD1x6y8E, 2,
  &(vtc__ZN3ccc7DD1x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y8E),3, //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  CC1x6y9  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y93pqrEv
  ~CC1x6y9(); // tgen
  CC1x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y9E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y93efgEv");}
void  ccc::CC1x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y93pqrEv");}
ccc::CC1x6y9 ::~CC1x6y9(){ note_dtor("_ZN3ccc7CC1x6y9E", this);} // tgen
ccc::CC1x6y9 ::CC1x6y9(){ note_ctor("_ZN3ccc7CC1x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y9E, buf);
    ::ccc::CC1x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC1x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y9E);
    dp->::ccc::CC1x6y9::~CC1x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y9E(Test__ZN3ccc7CC1x6y9E, "_ZN3ccc7CC1x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y9C1Ev();
extern void _ZN3ccc7CC1x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y9E[] = {
  NSPAIR(_ZN3ccc7CC1x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC1x6y93efgEv();
extern void _ZN3ccc7CC1x6y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x6y93pqrEv,_ZTv0_n16_N3ccc7CC1x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y93pqrEv,_ZThn4_N3ccc7CC1x6y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x6y93efgEv,_ZTv0_n20_N3ccc7CC1x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y93efgEv,_ZThn4_N3ccc7CC1x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x6y93pqrEv,_ZTv0_n16_N3ccc7CC1x6y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x6y93efgEv,_ZTv0_n20_N3ccc7CC1x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x6y9E[] = {
  {&(_ZTVN3ccc7CC1x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x6y9E[];
static VTBL_ENTRY alt_thunk_names631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x6y93efgEv,_ZTv0_n20_N3ccc7CC1x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y93efgEv,_ZThn4_N3ccc7CC1x6y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x6y93pqrEv,_ZTv0_n16_N3ccc7CC1x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x6y93pqrEv,_ZThn4_N3ccc7CC1x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x6y9E = {  "_ZN3ccc7CC1x6y9E", // class name
  bases__ZN3ccc7CC1x6y9E, 2,
  &(vtc__ZN3ccc7CC1x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x6y9E),2, //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  DD1x6y9  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD1x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x6y93pqrEv
  ~DD1x6y9(); // tgen
  DD1x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x6y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x6y93efgEv");}
void  ccc::DD1x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x6y93pqrEv");}
ccc::DD1x6y9 ::~DD1x6y9(){ note_dtor("_ZN3ccc7DD1x6y9E", this);} // tgen
ccc::DD1x6y9 ::DD1x6y9(){ note_ctor("_ZN3ccc7DD1x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x6y9E, buf);
    ::ccc::DD1x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x6y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD1x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x6y9E);
    dp->::ccc::DD1x6y9::~DD1x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x6y9E(Test__ZN3ccc7DD1x6y9E, "_ZN3ccc7DD1x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x6y9C1Ev();
extern void _ZN3ccc7DD1x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x6y9E[] = {
  NSPAIR(_ZN3ccc7DD1x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD1x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x6y93pqrEv();
extern void _ZN3ccc7DD1x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x6y93efgEv,_ZTv0_n16_N3ccc7DD1x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x6y93efgEv,_ZThn4_N3ccc7DD1x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x6y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x6y93efgEv,_ZTv0_n16_N3ccc7DD1x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x6y9E[] = {
  {&(_ZTVN3ccc7DD1x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x6y9E[];
static VTBL_ENTRY alt_thunk_names632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x6y93efgEv,_ZTv0_n16_N3ccc7DD1x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x6y93efgEv,_ZThn4_N3ccc7DD1x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x6y9E = {  "_ZN3ccc7DD1x6y9E", // class name
  bases__ZN3ccc7DD1x6y9E, 2,
  &(vtc__ZN3ccc7DD1x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x6y9E),3, //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  CC1x6y10  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x6y103abcEv
  ~CC1x6y10(); // tgen
  CC1x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y10E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y103pqrEv");}
void  ccc::CC1x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x6y103abcEv");}
ccc::CC1x6y10 ::~CC1x6y10(){ note_dtor("_ZN3ccc8CC1x6y10E", this);} // tgen
ccc::CC1x6y10 ::CC1x6y10(){ note_ctor("_ZN3ccc8CC1x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y10E, buf);
    ::ccc::CC1x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y10E);
    dp->::ccc::CC1x6y10::~CC1x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y10E(Test__ZN3ccc8CC1x6y10E, "_ZN3ccc8CC1x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y10C1Ev();
extern void _ZN3ccc8CC1x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y10E[] = {
  NSPAIR(_ZN3ccc8CC1x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y10E[];
extern void _ZN3ccc8CC1x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC1x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x6y103abcEv,_ZTv0_n12_N3ccc8CC1x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y103abcEv,_ZThn4_N3ccc8CC1x6y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x6y103pqrEv,_ZTv0_n16_N3ccc8CC1x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y103pqrEv,_ZThn4_N3ccc8CC1x6y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x6y103abcEv,_ZTv0_n12_N3ccc8CC1x6y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x6y103pqrEv,_ZTv0_n16_N3ccc8CC1x6y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y10E[] = {
  {&(_ZTVN3ccc8CC1x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y10E[];
static VTBL_ENTRY alt_thunk_names633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x6y103pqrEv,_ZTv0_n16_N3ccc8CC1x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y103pqrEv,_ZThn4_N3ccc8CC1x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x6y103abcEv,_ZTv0_n12_N3ccc8CC1x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y103abcEv,_ZThn4_N3ccc8CC1x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x6y10E = {  "_ZN3ccc8CC1x6y10E", // class name
  bases__ZN3ccc8CC1x6y10E, 2,
  &(vtc__ZN3ccc8CC1x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y10E),2, //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  DD1x6y10  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD1x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x6y103abcEv
  ~DD1x6y10(); // tgen
  DD1x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x6y103pqrEv");}
void  ccc::DD1x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x6y103abcEv");}
ccc::DD1x6y10 ::~DD1x6y10(){ note_dtor("_ZN3ccc8DD1x6y10E", this);} // tgen
ccc::DD1x6y10 ::DD1x6y10(){ note_ctor("_ZN3ccc8DD1x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y10E, buf);
    ::ccc::DD1x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y10E);
    dp->::ccc::DD1x6y10::~DD1x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y10E(Test__ZN3ccc8DD1x6y10E, "_ZN3ccc8DD1x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y10C1Ev();
extern void _ZN3ccc8DD1x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y10E[] = {
  NSPAIR(_ZN3ccc8DD1x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y10E[];
extern void _ZN3ccc8DD1x6y103abcEv();
extern void _ZN3ccc8DD1x6y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x6y103abcEv,_ZTv0_n12_N3ccc8DD1x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x6y103abcEv,_ZThn4_N3ccc8DD1x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x6y103abcEv,_ZTv0_n12_N3ccc8DD1x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y10E[] = {
  {&(_ZTVN3ccc8DD1x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y10E[];
static VTBL_ENTRY alt_thunk_names634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x6y103abcEv,_ZTv0_n12_N3ccc8DD1x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x6y103abcEv,_ZThn4_N3ccc8DD1x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x6y10E = {  "_ZN3ccc8DD1x6y10E", // class name
  bases__ZN3ccc8DD1x6y10E, 2,
  &(vtc__ZN3ccc8DD1x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y10E),3, //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  CC1x6y11  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x6y113efgEv
  ~CC1x6y11(); // tgen
  CC1x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y11E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y113pqrEv");}
void  ccc::CC1x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x6y113efgEv");}
ccc::CC1x6y11 ::~CC1x6y11(){ note_dtor("_ZN3ccc8CC1x6y11E", this);} // tgen
ccc::CC1x6y11 ::CC1x6y11(){ note_ctor("_ZN3ccc8CC1x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y11E, buf);
    ::ccc::CC1x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y11E);
    dp->::ccc::CC1x6y11::~CC1x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y11E(Test__ZN3ccc8CC1x6y11E, "_ZN3ccc8CC1x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y11C1Ev();
extern void _ZN3ccc8CC1x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y11E[] = {
  NSPAIR(_ZN3ccc8CC1x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC1x6y113efgEv();
extern void _ZN3ccc8CC1x6y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x6y113pqrEv,_ZTv0_n16_N3ccc8CC1x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y113pqrEv,_ZThn4_N3ccc8CC1x6y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x6y113efgEv,_ZTv0_n20_N3ccc8CC1x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y113efgEv,_ZThn4_N3ccc8CC1x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x6y113pqrEv,_ZTv0_n16_N3ccc8CC1x6y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x6y113efgEv,_ZTv0_n20_N3ccc8CC1x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y11E[] = {
  {&(_ZTVN3ccc8CC1x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y11E[];
static VTBL_ENTRY alt_thunk_names635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x6y113efgEv,_ZTv0_n20_N3ccc8CC1x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y113efgEv,_ZThn4_N3ccc8CC1x6y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x6y113pqrEv,_ZTv0_n16_N3ccc8CC1x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y113pqrEv,_ZThn4_N3ccc8CC1x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x6y11E = {  "_ZN3ccc8CC1x6y11E", // class name
  bases__ZN3ccc8CC1x6y11E, 2,
  &(vtc__ZN3ccc8CC1x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y11E),2, //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  DD1x6y11  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD1x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x6y113efgEv
  ~DD1x6y11(); // tgen
  DD1x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x6y113pqrEv");}
void  ccc::DD1x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x6y113efgEv");}
ccc::DD1x6y11 ::~DD1x6y11(){ note_dtor("_ZN3ccc8DD1x6y11E", this);} // tgen
ccc::DD1x6y11 ::DD1x6y11(){ note_ctor("_ZN3ccc8DD1x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y11E, buf);
    ::ccc::DD1x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y11E);
    dp->::ccc::DD1x6y11::~DD1x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y11E(Test__ZN3ccc8DD1x6y11E, "_ZN3ccc8DD1x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y11C1Ev();
extern void _ZN3ccc8DD1x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y11E[] = {
  NSPAIR(_ZN3ccc8DD1x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x6y113pqrEv();
extern void _ZN3ccc8DD1x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x6y113efgEv,_ZTv0_n16_N3ccc8DD1x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x6y113efgEv,_ZThn4_N3ccc8DD1x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x6y113efgEv,_ZTv0_n16_N3ccc8DD1x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y11E[] = {
  {&(_ZTVN3ccc8DD1x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y11E[];
static VTBL_ENTRY alt_thunk_names636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x6y113efgEv,_ZTv0_n16_N3ccc8DD1x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x6y113efgEv,_ZThn4_N3ccc8DD1x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x6y11E = {  "_ZN3ccc8DD1x6y11E", // class name
  bases__ZN3ccc8DD1x6y11E, 2,
  &(vtc__ZN3ccc8DD1x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y11E),3, //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  CC1x6y12  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC1x6y123abcEv
  ~CC1x6y12(); // tgen
  CC1x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x6y123abcEv");}
ccc::CC1x6y12 ::~CC1x6y12(){ note_dtor("_ZN3ccc8CC1x6y12E", this);} // tgen
ccc::CC1x6y12 ::CC1x6y12(){ note_ctor("_ZN3ccc8CC1x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y12E, buf);
    ::ccc::CC1x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y12E);
    dp->::ccc::CC1x6y12::~CC1x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y12E(Test__ZN3ccc8CC1x6y12E, "_ZN3ccc8CC1x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y12C1Ev();
extern void _ZN3ccc8CC1x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y12E[] = {
  NSPAIR(_ZN3ccc8CC1x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y12E[];
extern void _ZN3ccc8CC1x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x6y123abcEv,_ZTv0_n12_N3ccc8CC1x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y123abcEv,_ZThn4_N3ccc8CC1x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x6y123abcEv,_ZTv0_n12_N3ccc8CC1x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y12E[] = {
  {&(_ZTVN3ccc8CC1x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y12E[];
static VTBL_ENTRY alt_thunk_names637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x6y123abcEv,_ZTv0_n12_N3ccc8CC1x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y123abcEv,_ZThn4_N3ccc8CC1x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x6y12E = {  "_ZN3ccc8CC1x6y12E", // class name
  bases__ZN3ccc8CC1x6y12E, 2,
  &(vtc__ZN3ccc8CC1x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y12E),2, //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  DD1x6y12  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD1x6y123abcEv
  ~DD1x6y12(); // tgen
  DD1x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x6y123abcEv");}
ccc::DD1x6y12 ::~DD1x6y12(){ note_dtor("_ZN3ccc8DD1x6y12E", this);} // tgen
ccc::DD1x6y12 ::DD1x6y12(){ note_ctor("_ZN3ccc8DD1x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y12E, buf);
    ::ccc::DD1x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y12E);
    dp->::ccc::DD1x6y12::~DD1x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y12E(Test__ZN3ccc8DD1x6y12E, "_ZN3ccc8DD1x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y12C1Ev();
extern void _ZN3ccc8DD1x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y12E[] = {
  NSPAIR(_ZN3ccc8DD1x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y12E[];
extern void _ZN3ccc8DD1x6y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x6y123abcEv,_ZTv0_n12_N3ccc8DD1x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x6y123abcEv,_ZThn4_N3ccc8DD1x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x6y123abcEv,_ZTv0_n12_N3ccc8DD1x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y12E[] = {
  {&(_ZTVN3ccc8DD1x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y12E[];
static VTBL_ENTRY alt_thunk_names638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x6y123abcEv,_ZTv0_n12_N3ccc8DD1x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x6y123abcEv,_ZThn4_N3ccc8DD1x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x6y12E = {  "_ZN3ccc8DD1x6y12E", // class name
  bases__ZN3ccc8DD1x6y12E, 2,
  &(vtc__ZN3ccc8DD1x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y12E),3, //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  CC1x6y13  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC1x6y133efgEv
  ~CC1x6y13(); // tgen
  CC1x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x6y133efgEv");}
ccc::CC1x6y13 ::~CC1x6y13(){ note_dtor("_ZN3ccc8CC1x6y13E", this);} // tgen
ccc::CC1x6y13 ::CC1x6y13(){ note_ctor("_ZN3ccc8CC1x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y13E, buf);
    ::ccc::CC1x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y13E);
    dp->::ccc::CC1x6y13::~CC1x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y13E(Test__ZN3ccc8CC1x6y13E, "_ZN3ccc8CC1x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y13C1Ev();
extern void _ZN3ccc8CC1x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y13E[] = {
  NSPAIR(_ZN3ccc8CC1x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC1x6y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x6y133efgEv,_ZTv0_n20_N3ccc8CC1x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y133efgEv,_ZThn4_N3ccc8CC1x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x6y133efgEv,_ZTv0_n20_N3ccc8CC1x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y13E[] = {
  {&(_ZTVN3ccc8CC1x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y13E[];
static VTBL_ENTRY alt_thunk_names639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x6y133efgEv,_ZTv0_n20_N3ccc8CC1x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y133efgEv,_ZThn4_N3ccc8CC1x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x6y13E = {  "_ZN3ccc8CC1x6y13E", // class name
  bases__ZN3ccc8CC1x6y13E, 2,
  &(vtc__ZN3ccc8CC1x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y13E),2, //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  DD1x6y13  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD1x6y133efgEv
  ~DD1x6y13(); // tgen
  DD1x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x6y133efgEv");}
ccc::DD1x6y13 ::~DD1x6y13(){ note_dtor("_ZN3ccc8DD1x6y13E", this);} // tgen
ccc::DD1x6y13 ::DD1x6y13(){ note_ctor("_ZN3ccc8DD1x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y13E, buf);
    ::ccc::DD1x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y13E);
    dp->::ccc::DD1x6y13::~DD1x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y13E(Test__ZN3ccc8DD1x6y13E, "_ZN3ccc8DD1x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y13C1Ev();
extern void _ZN3ccc8DD1x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y13E[] = {
  NSPAIR(_ZN3ccc8DD1x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x6y133efgEv,_ZTv0_n16_N3ccc8DD1x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x6y133efgEv,_ZThn4_N3ccc8DD1x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x6y133efgEv,_ZTv0_n16_N3ccc8DD1x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y13E[] = {
  {&(_ZTVN3ccc8DD1x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y13E[];
static VTBL_ENTRY alt_thunk_names640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x6y133efgEv,_ZTv0_n16_N3ccc8DD1x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x6y133efgEv,_ZThn4_N3ccc8DD1x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x6y13E = {  "_ZN3ccc8DD1x6y13E", // class name
  bases__ZN3ccc8DD1x6y13E, 2,
  &(vtc__ZN3ccc8DD1x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y13E),3, //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  CC1x6y14  : virtual ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y143pqrEv
  ~CC1x6y14(); // tgen
  CC1x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y143pqrEv");}
ccc::CC1x6y14 ::~CC1x6y14(){ note_dtor("_ZN3ccc8CC1x6y14E", this);} // tgen
ccc::CC1x6y14 ::CC1x6y14(){ note_ctor("_ZN3ccc8CC1x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y14E, buf);
    ::ccc::CC1x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y14E);
    dp->::ccc::CC1x6y14::~CC1x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y14E(Test__ZN3ccc8CC1x6y14E, "_ZN3ccc8CC1x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y14C1Ev();
extern void _ZN3ccc8CC1x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y14E[] = {
  NSPAIR(_ZN3ccc8CC1x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC1x6y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x6y143pqrEv,_ZTv0_n16_N3ccc8CC1x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y143pqrEv,_ZThn4_N3ccc8CC1x6y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x6y143pqrEv,_ZTv0_n16_N3ccc8CC1x6y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y14E[] = {
  {&(_ZTVN3ccc8CC1x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y14E[];
static VTBL_ENTRY alt_thunk_names641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x6y143pqrEv,_ZTv0_n16_N3ccc8CC1x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x6y143pqrEv,_ZThn4_N3ccc8CC1x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x6y14E = {  "_ZN3ccc8CC1x6y14E", // class name
  bases__ZN3ccc8CC1x6y14E, 2,
  &(vtc__ZN3ccc8CC1x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y14E),2, //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  DD1x6y14  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD1x6y143pqrEv
  ~DD1x6y14(); // tgen
  DD1x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x6y143pqrEv");}
ccc::DD1x6y14 ::~DD1x6y14(){ note_dtor("_ZN3ccc8DD1x6y14E", this);} // tgen
ccc::DD1x6y14 ::DD1x6y14(){ note_ctor("_ZN3ccc8DD1x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y14E, buf);
    ::ccc::DD1x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y14E);
    dp->::ccc::DD1x6y14::~DD1x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y14E(Test__ZN3ccc8DD1x6y14E, "_ZN3ccc8DD1x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y14C1Ev();
extern void _ZN3ccc8DD1x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y14E[] = {
  NSPAIR(_ZN3ccc8DD1x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x6y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y14E[] = {
  {&(_ZTVN3ccc8DD1x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y14E[];
Class_Descriptor cd__ZN3ccc8DD1x6y14E = {  "_ZN3ccc8DD1x6y14E", // class name
  bases__ZN3ccc8DD1x6y14E, 2,
  &(vtc__ZN3ccc8DD1x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y15  : virtual ::ccc::AA1 , ::ccc::BB6 {
  ~CC1x6y15(); // tgen
  CC1x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x6y15 ::~CC1x6y15(){ note_dtor("_ZN3ccc8CC1x6y15E", this);} // tgen
ccc::CC1x6y15 ::CC1x6y15(){ note_ctor("_ZN3ccc8CC1x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y15E, buf);
    ::ccc::CC1x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC1x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y15E);
    dp->::ccc::CC1x6y15::~CC1x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y15E(Test__ZN3ccc8CC1x6y15E, "_ZN3ccc8CC1x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y15C1Ev();
extern void _ZN3ccc8CC1x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y15E[] = {
  NSPAIR(_ZN3ccc8CC1x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x6y15E[] = {
  {&(_ZTVN3ccc8CC1x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x6y15E[];
Class_Descriptor cd__ZN3ccc8CC1x6y15E = {  "_ZN3ccc8CC1x6y15E", // class name
  bases__ZN3ccc8CC1x6y15E, 2,
  &(vtc__ZN3ccc8CC1x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x6y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x6y15  : virtual ::ccc::AA1 , virtual ::ccc::BB6 {
  ~DD1x6y15(); // tgen
  DD1x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x6y15 ::~DD1x6y15(){ note_dtor("_ZN3ccc8DD1x6y15E", this);} // tgen
ccc::DD1x6y15 ::DD1x6y15(){ note_ctor("_ZN3ccc8DD1x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x6y15E, buf);
    ::ccc::DD1x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x6y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD1x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x6y15E);
    dp->::ccc::DD1x6y15::~DD1x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x6y15E(Test__ZN3ccc8DD1x6y15E, "_ZN3ccc8DD1x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x6y15C1Ev();
extern void _ZN3ccc8DD1x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x6y15E[] = {
  NSPAIR(_ZN3ccc8DD1x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD1x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x6y15E[] = {
  {&(_ZTVN3ccc8DD1x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x6y15E[];
Class_Descriptor cd__ZN3ccc8DD1x6y15E = {  "_ZN3ccc8DD1x6y15E", // class name
  bases__ZN3ccc8DD1x6y15E, 2,
  &(vtc__ZN3ccc8DD1x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x6y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y0  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y03pqrEv
  ~CC1x7y0(); // tgen
  CC1x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y0E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y03abcEv");}
void  ccc::CC1x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y03efgEv");}
void  ccc::CC1x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y03pqrEv");}
ccc::CC1x7y0 ::~CC1x7y0(){ note_dtor("_ZN3ccc7CC1x7y0E", this);} // tgen
ccc::CC1x7y0 ::CC1x7y0(){ note_ctor("_ZN3ccc7CC1x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y0E, buf);
    ::ccc::CC1x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y0E);
    dp->::ccc::CC1x7y0::~CC1x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y0E(Test__ZN3ccc7CC1x7y0E, "_ZN3ccc7CC1x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y0C1Ev();
extern void _ZN3ccc7CC1x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y0E[] = {
  NSPAIR(_ZN3ccc7CC1x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y0E[];
extern void _ZN3ccc7CC1x7y03abcEv();
extern void _ZN3ccc7CC1x7y03pqrEv();
extern void _ZN3ccc7CC1x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y03abcEv,_ZTv0_n12_N3ccc7CC1x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y03abcEv,_ZThn4_N3ccc7CC1x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y03pqrEv,_ZTv0_n16_N3ccc7CC1x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y03pqrEv,_ZThn4_N3ccc7CC1x7y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y03efgEv,_ZTv0_n20_N3ccc7CC1x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y03efgEv,_ZThn4_N3ccc7CC1x7y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y03abcEv,_ZTv0_n12_N3ccc7CC1x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y03pqrEv,_ZTv0_n16_N3ccc7CC1x7y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y03efgEv,_ZTv0_n20_N3ccc7CC1x7y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y0E[] = {
  {&(_ZTVN3ccc7CC1x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y0E[];
static VTBL_ENTRY alt_thunk_names642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y03efgEv,_ZTv0_n20_N3ccc7CC1x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y03efgEv,_ZThn4_N3ccc7CC1x7y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y03pqrEv,_ZTv0_n16_N3ccc7CC1x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y03pqrEv,_ZThn4_N3ccc7CC1x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y03abcEv,_ZTv0_n12_N3ccc7CC1x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y03abcEv,_ZThn4_N3ccc7CC1x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y0E = {  "_ZN3ccc7CC1x7y0E", // class name
  bases__ZN3ccc7CC1x7y0E, 2,
  &(vtc__ZN3ccc7CC1x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y0E),2, //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  DD1x7y0  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD1x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y03pqrEv
  ~DD1x7y0(); // tgen
  DD1x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y03abcEv");}
void  ccc::DD1x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y03efgEv");}
void  ccc::DD1x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y03pqrEv");}
ccc::DD1x7y0 ::~DD1x7y0(){ note_dtor("_ZN3ccc7DD1x7y0E", this);} // tgen
ccc::DD1x7y0 ::DD1x7y0(){ note_ctor("_ZN3ccc7DD1x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y0E, buf);
    ::ccc::DD1x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y0E);
    dp->::ccc::DD1x7y0::~DD1x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y0E(Test__ZN3ccc7DD1x7y0E, "_ZN3ccc7DD1x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y0C1Ev();
extern void _ZN3ccc7DD1x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y0E[] = {
  NSPAIR(_ZN3ccc7DD1x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y0E[];
extern void _ZN3ccc7DD1x7y03abcEv();
extern void _ZN3ccc7DD1x7y03pqrEv();
extern void _ZN3ccc7DD1x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y03abcEv,_ZTv0_n12_N3ccc7DD1x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y03abcEv,_ZThn4_N3ccc7DD1x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y03pqrEv,_ZTv0_n16_N3ccc7DD1x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y03pqrEv,_ZThn4_N3ccc7DD1x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y03abcEv,_ZTv0_n12_N3ccc7DD1x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y03pqrEv,_ZTv0_n16_N3ccc7DD1x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y0E[] = {
  {&(_ZTVN3ccc7DD1x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y0E[];
static VTBL_ENTRY alt_thunk_names643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y03pqrEv,_ZTv0_n16_N3ccc7DD1x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y03pqrEv,_ZThn4_N3ccc7DD1x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y03abcEv,_ZTv0_n12_N3ccc7DD1x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y03abcEv,_ZThn4_N3ccc7DD1x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y0E = {  "_ZN3ccc7DD1x7y0E", // class name
  bases__ZN3ccc7DD1x7y0E, 2,
  &(vtc__ZN3ccc7DD1x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y0E),3, //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  CC1x7y1  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x7y13efgEv
  ~CC1x7y1(); // tgen
  CC1x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y1E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y13abcEv");}
void  ccc::CC1x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y13pqrEv");}
void  ccc::CC1x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y13efgEv");}
ccc::CC1x7y1 ::~CC1x7y1(){ note_dtor("_ZN3ccc7CC1x7y1E", this);} // tgen
ccc::CC1x7y1 ::CC1x7y1(){ note_ctor("_ZN3ccc7CC1x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y1E, buf);
    ::ccc::CC1x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y1E);
    dp->::ccc::CC1x7y1::~CC1x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y1E(Test__ZN3ccc7CC1x7y1E, "_ZN3ccc7CC1x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y1C1Ev();
extern void _ZN3ccc7CC1x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y1E[] = {
  NSPAIR(_ZN3ccc7CC1x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y1E[];
extern void _ZN3ccc7CC1x7y13abcEv();
extern void _ZN3ccc7CC1x7y13pqrEv();
extern void _ZN3ccc7CC1x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y13abcEv,_ZTv0_n12_N3ccc7CC1x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y13abcEv,_ZThn4_N3ccc7CC1x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y13pqrEv,_ZTv0_n16_N3ccc7CC1x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y13pqrEv,_ZThn4_N3ccc7CC1x7y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y13efgEv,_ZTv0_n20_N3ccc7CC1x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y13efgEv,_ZThn4_N3ccc7CC1x7y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y13abcEv,_ZTv0_n12_N3ccc7CC1x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y13pqrEv,_ZTv0_n16_N3ccc7CC1x7y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y13efgEv,_ZTv0_n20_N3ccc7CC1x7y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y1E[] = {
  {&(_ZTVN3ccc7CC1x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y1E[];
static VTBL_ENTRY alt_thunk_names644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y13efgEv,_ZTv0_n20_N3ccc7CC1x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y13efgEv,_ZThn4_N3ccc7CC1x7y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y13pqrEv,_ZTv0_n16_N3ccc7CC1x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y13pqrEv,_ZThn4_N3ccc7CC1x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y13abcEv,_ZTv0_n12_N3ccc7CC1x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y13abcEv,_ZThn4_N3ccc7CC1x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y1E = {  "_ZN3ccc7CC1x7y1E", // class name
  bases__ZN3ccc7CC1x7y1E, 2,
  &(vtc__ZN3ccc7CC1x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y1E),2, //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  DD1x7y1  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD1x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x7y13efgEv
  ~DD1x7y1(); // tgen
  DD1x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y13abcEv");}
void  ccc::DD1x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y13pqrEv");}
void  ccc::DD1x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y13efgEv");}
ccc::DD1x7y1 ::~DD1x7y1(){ note_dtor("_ZN3ccc7DD1x7y1E", this);} // tgen
ccc::DD1x7y1 ::DD1x7y1(){ note_ctor("_ZN3ccc7DD1x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y1E, buf);
    ::ccc::DD1x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y1E);
    dp->::ccc::DD1x7y1::~DD1x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y1E(Test__ZN3ccc7DD1x7y1E, "_ZN3ccc7DD1x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y1C1Ev();
extern void _ZN3ccc7DD1x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y1E[] = {
  NSPAIR(_ZN3ccc7DD1x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y1E[];
extern void _ZN3ccc7DD1x7y13abcEv();
extern void _ZN3ccc7DD1x7y13pqrEv();
extern void _ZN3ccc7DD1x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y13abcEv,_ZTv0_n12_N3ccc7DD1x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y13abcEv,_ZThn4_N3ccc7DD1x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y13pqrEv,_ZTv0_n16_N3ccc7DD1x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y13pqrEv,_ZThn4_N3ccc7DD1x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y13abcEv,_ZTv0_n12_N3ccc7DD1x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y13pqrEv,_ZTv0_n16_N3ccc7DD1x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y1E[] = {
  {&(_ZTVN3ccc7DD1x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y1E[];
static VTBL_ENTRY alt_thunk_names645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y13pqrEv,_ZTv0_n16_N3ccc7DD1x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y13pqrEv,_ZThn4_N3ccc7DD1x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y13abcEv,_ZTv0_n12_N3ccc7DD1x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y13abcEv,_ZThn4_N3ccc7DD1x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y1E = {  "_ZN3ccc7DD1x7y1E", // class name
  bases__ZN3ccc7DD1x7y1E, 2,
  &(vtc__ZN3ccc7DD1x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y1E),3, //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  CC1x7y2  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y23pqrEv
  ~CC1x7y2(); // tgen
  CC1x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y2E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y23efgEv");}
void  ccc::CC1x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y23abcEv");}
void  ccc::CC1x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y23pqrEv");}
ccc::CC1x7y2 ::~CC1x7y2(){ note_dtor("_ZN3ccc7CC1x7y2E", this);} // tgen
ccc::CC1x7y2 ::CC1x7y2(){ note_ctor("_ZN3ccc7CC1x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y2E, buf);
    ::ccc::CC1x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y2E);
    dp->::ccc::CC1x7y2::~CC1x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y2E(Test__ZN3ccc7CC1x7y2E, "_ZN3ccc7CC1x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y2C1Ev();
extern void _ZN3ccc7CC1x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y2E[] = {
  NSPAIR(_ZN3ccc7CC1x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y2E[];
extern void _ZN3ccc7CC1x7y23abcEv();
extern void _ZN3ccc7CC1x7y23pqrEv();
extern void _ZN3ccc7CC1x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y23abcEv,_ZTv0_n12_N3ccc7CC1x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y23abcEv,_ZThn4_N3ccc7CC1x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y23pqrEv,_ZTv0_n16_N3ccc7CC1x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y23pqrEv,_ZThn4_N3ccc7CC1x7y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y23efgEv,_ZTv0_n20_N3ccc7CC1x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y23efgEv,_ZThn4_N3ccc7CC1x7y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y23abcEv,_ZTv0_n12_N3ccc7CC1x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y23pqrEv,_ZTv0_n16_N3ccc7CC1x7y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y23efgEv,_ZTv0_n20_N3ccc7CC1x7y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y2E[] = {
  {&(_ZTVN3ccc7CC1x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y2E[];
static VTBL_ENTRY alt_thunk_names646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y23efgEv,_ZTv0_n20_N3ccc7CC1x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y23efgEv,_ZThn4_N3ccc7CC1x7y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y23pqrEv,_ZTv0_n16_N3ccc7CC1x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y23pqrEv,_ZThn4_N3ccc7CC1x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y23abcEv,_ZTv0_n12_N3ccc7CC1x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y23abcEv,_ZThn4_N3ccc7CC1x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y2E = {  "_ZN3ccc7CC1x7y2E", // class name
  bases__ZN3ccc7CC1x7y2E, 2,
  &(vtc__ZN3ccc7CC1x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y2E),2, //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  DD1x7y2  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD1x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y23pqrEv
  ~DD1x7y2(); // tgen
  DD1x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y23efgEv");}
void  ccc::DD1x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y23abcEv");}
void  ccc::DD1x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y23pqrEv");}
ccc::DD1x7y2 ::~DD1x7y2(){ note_dtor("_ZN3ccc7DD1x7y2E", this);} // tgen
ccc::DD1x7y2 ::DD1x7y2(){ note_ctor("_ZN3ccc7DD1x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y2E, buf);
    ::ccc::DD1x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y2E);
    dp->::ccc::DD1x7y2::~DD1x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y2E(Test__ZN3ccc7DD1x7y2E, "_ZN3ccc7DD1x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y2C1Ev();
extern void _ZN3ccc7DD1x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y2E[] = {
  NSPAIR(_ZN3ccc7DD1x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y2E[];
extern void _ZN3ccc7DD1x7y23abcEv();
extern void _ZN3ccc7DD1x7y23pqrEv();
extern void _ZN3ccc7DD1x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y23abcEv,_ZTv0_n12_N3ccc7DD1x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y23abcEv,_ZThn4_N3ccc7DD1x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y23pqrEv,_ZTv0_n16_N3ccc7DD1x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y23pqrEv,_ZThn4_N3ccc7DD1x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y23abcEv,_ZTv0_n12_N3ccc7DD1x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y23pqrEv,_ZTv0_n16_N3ccc7DD1x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y2E[] = {
  {&(_ZTVN3ccc7DD1x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y2E[];
static VTBL_ENTRY alt_thunk_names647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y23pqrEv,_ZTv0_n16_N3ccc7DD1x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y23pqrEv,_ZThn4_N3ccc7DD1x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y23abcEv,_ZTv0_n12_N3ccc7DD1x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y23abcEv,_ZThn4_N3ccc7DD1x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y2E = {  "_ZN3ccc7DD1x7y2E", // class name
  bases__ZN3ccc7DD1x7y2E, 2,
  &(vtc__ZN3ccc7DD1x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y2E),3, //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  CC1x7y3  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x7y33abcEv
  ~CC1x7y3(); // tgen
  CC1x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y3E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y33efgEv");}
void  ccc::CC1x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y33pqrEv");}
void  ccc::CC1x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y33abcEv");}
ccc::CC1x7y3 ::~CC1x7y3(){ note_dtor("_ZN3ccc7CC1x7y3E", this);} // tgen
ccc::CC1x7y3 ::CC1x7y3(){ note_ctor("_ZN3ccc7CC1x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y3E, buf);
    ::ccc::CC1x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y3E);
    dp->::ccc::CC1x7y3::~CC1x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y3E(Test__ZN3ccc7CC1x7y3E, "_ZN3ccc7CC1x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y3C1Ev();
extern void _ZN3ccc7CC1x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y3E[] = {
  NSPAIR(_ZN3ccc7CC1x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y3E[];
extern void _ZN3ccc7CC1x7y33abcEv();
extern void _ZN3ccc7CC1x7y33pqrEv();
extern void _ZN3ccc7CC1x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y33abcEv,_ZTv0_n12_N3ccc7CC1x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y33abcEv,_ZThn4_N3ccc7CC1x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y33pqrEv,_ZTv0_n16_N3ccc7CC1x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y33pqrEv,_ZThn4_N3ccc7CC1x7y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y33efgEv,_ZTv0_n20_N3ccc7CC1x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y33efgEv,_ZThn4_N3ccc7CC1x7y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y33abcEv,_ZTv0_n12_N3ccc7CC1x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y33pqrEv,_ZTv0_n16_N3ccc7CC1x7y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y33efgEv,_ZTv0_n20_N3ccc7CC1x7y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y3E[] = {
  {&(_ZTVN3ccc7CC1x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y3E[];
static VTBL_ENTRY alt_thunk_names648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y33efgEv,_ZTv0_n20_N3ccc7CC1x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y33efgEv,_ZThn4_N3ccc7CC1x7y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y33pqrEv,_ZTv0_n16_N3ccc7CC1x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y33pqrEv,_ZThn4_N3ccc7CC1x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y33abcEv,_ZTv0_n12_N3ccc7CC1x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y33abcEv,_ZThn4_N3ccc7CC1x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y3E = {  "_ZN3ccc7CC1x7y3E", // class name
  bases__ZN3ccc7CC1x7y3E, 2,
  &(vtc__ZN3ccc7CC1x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y3E),2, //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  DD1x7y3  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD1x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x7y33abcEv
  ~DD1x7y3(); // tgen
  DD1x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y33efgEv");}
void  ccc::DD1x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y33pqrEv");}
void  ccc::DD1x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y33abcEv");}
ccc::DD1x7y3 ::~DD1x7y3(){ note_dtor("_ZN3ccc7DD1x7y3E", this);} // tgen
ccc::DD1x7y3 ::DD1x7y3(){ note_ctor("_ZN3ccc7DD1x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y3E, buf);
    ::ccc::DD1x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y3E);
    dp->::ccc::DD1x7y3::~DD1x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y3E(Test__ZN3ccc7DD1x7y3E, "_ZN3ccc7DD1x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y3C1Ev();
extern void _ZN3ccc7DD1x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y3E[] = {
  NSPAIR(_ZN3ccc7DD1x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y3E[];
extern void _ZN3ccc7DD1x7y33abcEv();
extern void _ZN3ccc7DD1x7y33pqrEv();
extern void _ZN3ccc7DD1x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y33abcEv,_ZTv0_n12_N3ccc7DD1x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y33abcEv,_ZThn4_N3ccc7DD1x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y33pqrEv,_ZTv0_n16_N3ccc7DD1x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y33pqrEv,_ZThn4_N3ccc7DD1x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y33abcEv,_ZTv0_n12_N3ccc7DD1x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y33pqrEv,_ZTv0_n16_N3ccc7DD1x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y3E[] = {
  {&(_ZTVN3ccc7DD1x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y3E[];
static VTBL_ENTRY alt_thunk_names649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y33pqrEv,_ZTv0_n16_N3ccc7DD1x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y33pqrEv,_ZThn4_N3ccc7DD1x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y33abcEv,_ZTv0_n12_N3ccc7DD1x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y33abcEv,_ZThn4_N3ccc7DD1x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y3E = {  "_ZN3ccc7DD1x7y3E", // class name
  bases__ZN3ccc7DD1x7y3E, 2,
  &(vtc__ZN3ccc7DD1x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y3E),3, //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  CC1x7y4  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC1x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y43efgEv
  ~CC1x7y4(); // tgen
  CC1x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y4E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y43pqrEv");}
void  ccc::CC1x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y43abcEv");}
void  ccc::CC1x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y43efgEv");}
ccc::CC1x7y4 ::~CC1x7y4(){ note_dtor("_ZN3ccc7CC1x7y4E", this);} // tgen
ccc::CC1x7y4 ::CC1x7y4(){ note_ctor("_ZN3ccc7CC1x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y4E, buf);
    ::ccc::CC1x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y4E);
    dp->::ccc::CC1x7y4::~CC1x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y4E(Test__ZN3ccc7CC1x7y4E, "_ZN3ccc7CC1x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y4C1Ev();
extern void _ZN3ccc7CC1x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y4E[] = {
  NSPAIR(_ZN3ccc7CC1x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y4E[];
extern void _ZN3ccc7CC1x7y43abcEv();
extern void _ZN3ccc7CC1x7y43pqrEv();
extern void _ZN3ccc7CC1x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y43abcEv,_ZTv0_n12_N3ccc7CC1x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y43abcEv,_ZThn4_N3ccc7CC1x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y43pqrEv,_ZTv0_n16_N3ccc7CC1x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y43pqrEv,_ZThn4_N3ccc7CC1x7y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y43efgEv,_ZTv0_n20_N3ccc7CC1x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y43efgEv,_ZThn4_N3ccc7CC1x7y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y43abcEv,_ZTv0_n12_N3ccc7CC1x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y43pqrEv,_ZTv0_n16_N3ccc7CC1x7y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y43efgEv,_ZTv0_n20_N3ccc7CC1x7y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y4E[] = {
  {&(_ZTVN3ccc7CC1x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y4E[];
static VTBL_ENTRY alt_thunk_names650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y43efgEv,_ZTv0_n20_N3ccc7CC1x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y43efgEv,_ZThn4_N3ccc7CC1x7y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y43pqrEv,_ZTv0_n16_N3ccc7CC1x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y43pqrEv,_ZThn4_N3ccc7CC1x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y43abcEv,_ZTv0_n12_N3ccc7CC1x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y43abcEv,_ZThn4_N3ccc7CC1x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y4E = {  "_ZN3ccc7CC1x7y4E", // class name
  bases__ZN3ccc7CC1x7y4E, 2,
  &(vtc__ZN3ccc7CC1x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y4E),2, //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  DD1x7y4  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD1x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x7y43efgEv
  ~DD1x7y4(); // tgen
  DD1x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y43pqrEv");}
void  ccc::DD1x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y43abcEv");}
void  ccc::DD1x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y43efgEv");}
ccc::DD1x7y4 ::~DD1x7y4(){ note_dtor("_ZN3ccc7DD1x7y4E", this);} // tgen
ccc::DD1x7y4 ::DD1x7y4(){ note_ctor("_ZN3ccc7DD1x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y4E, buf);
    ::ccc::DD1x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y4E);
    dp->::ccc::DD1x7y4::~DD1x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y4E(Test__ZN3ccc7DD1x7y4E, "_ZN3ccc7DD1x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y4C1Ev();
extern void _ZN3ccc7DD1x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y4E[] = {
  NSPAIR(_ZN3ccc7DD1x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y4E[];
extern void _ZN3ccc7DD1x7y43abcEv();
extern void _ZN3ccc7DD1x7y43pqrEv();
extern void _ZN3ccc7DD1x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y43abcEv,_ZTv0_n12_N3ccc7DD1x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y43abcEv,_ZThn4_N3ccc7DD1x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y43pqrEv,_ZTv0_n16_N3ccc7DD1x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y43pqrEv,_ZThn4_N3ccc7DD1x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y43abcEv,_ZTv0_n12_N3ccc7DD1x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y43pqrEv,_ZTv0_n16_N3ccc7DD1x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y4E[] = {
  {&(_ZTVN3ccc7DD1x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y4E[];
static VTBL_ENTRY alt_thunk_names651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y43pqrEv,_ZTv0_n16_N3ccc7DD1x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y43pqrEv,_ZThn4_N3ccc7DD1x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y43abcEv,_ZTv0_n12_N3ccc7DD1x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y43abcEv,_ZThn4_N3ccc7DD1x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y4E = {  "_ZN3ccc7DD1x7y4E", // class name
  bases__ZN3ccc7DD1x7y4E, 2,
  &(vtc__ZN3ccc7DD1x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y4E),3, //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  CC1x7y5  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC1x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y53abcEv
  ~CC1x7y5(); // tgen
  CC1x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y5E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y53pqrEv");}
void  ccc::CC1x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y53efgEv");}
void  ccc::CC1x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y53abcEv");}
ccc::CC1x7y5 ::~CC1x7y5(){ note_dtor("_ZN3ccc7CC1x7y5E", this);} // tgen
ccc::CC1x7y5 ::CC1x7y5(){ note_ctor("_ZN3ccc7CC1x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y5E, buf);
    ::ccc::CC1x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y5E);
    dp->::ccc::CC1x7y5::~CC1x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y5E(Test__ZN3ccc7CC1x7y5E, "_ZN3ccc7CC1x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y5C1Ev();
extern void _ZN3ccc7CC1x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y5E[] = {
  NSPAIR(_ZN3ccc7CC1x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y5E[];
extern void _ZN3ccc7CC1x7y53abcEv();
extern void _ZN3ccc7CC1x7y53pqrEv();
extern void _ZN3ccc7CC1x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y53abcEv,_ZTv0_n12_N3ccc7CC1x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y53abcEv,_ZThn4_N3ccc7CC1x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y53pqrEv,_ZTv0_n16_N3ccc7CC1x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y53pqrEv,_ZThn4_N3ccc7CC1x7y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y53efgEv,_ZTv0_n20_N3ccc7CC1x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y53efgEv,_ZThn4_N3ccc7CC1x7y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y53abcEv,_ZTv0_n12_N3ccc7CC1x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y53pqrEv,_ZTv0_n16_N3ccc7CC1x7y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y53efgEv,_ZTv0_n20_N3ccc7CC1x7y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y5E[] = {
  {&(_ZTVN3ccc7CC1x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y5E[];
static VTBL_ENTRY alt_thunk_names652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y53efgEv,_ZTv0_n20_N3ccc7CC1x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y53efgEv,_ZThn4_N3ccc7CC1x7y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y53pqrEv,_ZTv0_n16_N3ccc7CC1x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y53pqrEv,_ZThn4_N3ccc7CC1x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y53abcEv,_ZTv0_n12_N3ccc7CC1x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y53abcEv,_ZThn4_N3ccc7CC1x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y5E = {  "_ZN3ccc7CC1x7y5E", // class name
  bases__ZN3ccc7CC1x7y5E, 2,
  &(vtc__ZN3ccc7CC1x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y5E),2, //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  DD1x7y5  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD1x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x7y53abcEv
  ~DD1x7y5(); // tgen
  DD1x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y53pqrEv");}
void  ccc::DD1x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y53efgEv");}
void  ccc::DD1x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y53abcEv");}
ccc::DD1x7y5 ::~DD1x7y5(){ note_dtor("_ZN3ccc7DD1x7y5E", this);} // tgen
ccc::DD1x7y5 ::DD1x7y5(){ note_ctor("_ZN3ccc7DD1x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y5E, buf);
    ::ccc::DD1x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y5E);
    dp->::ccc::DD1x7y5::~DD1x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y5E(Test__ZN3ccc7DD1x7y5E, "_ZN3ccc7DD1x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y5C1Ev();
extern void _ZN3ccc7DD1x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y5E[] = {
  NSPAIR(_ZN3ccc7DD1x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y5E[];
extern void _ZN3ccc7DD1x7y53abcEv();
extern void _ZN3ccc7DD1x7y53pqrEv();
extern void _ZN3ccc7DD1x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y53abcEv,_ZTv0_n12_N3ccc7DD1x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y53abcEv,_ZThn4_N3ccc7DD1x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y53pqrEv,_ZTv0_n16_N3ccc7DD1x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y53pqrEv,_ZThn4_N3ccc7DD1x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y53abcEv,_ZTv0_n12_N3ccc7DD1x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y53pqrEv,_ZTv0_n16_N3ccc7DD1x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y5E[] = {
  {&(_ZTVN3ccc7DD1x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y5E[];
static VTBL_ENTRY alt_thunk_names653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y53pqrEv,_ZTv0_n16_N3ccc7DD1x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y53pqrEv,_ZThn4_N3ccc7DD1x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y53abcEv,_ZTv0_n12_N3ccc7DD1x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y53abcEv,_ZThn4_N3ccc7DD1x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y5E = {  "_ZN3ccc7DD1x7y5E", // class name
  bases__ZN3ccc7DD1x7y5E, 2,
  &(vtc__ZN3ccc7DD1x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y5E),3, //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  CC1x7y6  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y63efgEv
  ~CC1x7y6(); // tgen
  CC1x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y6E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y63abcEv");}
void  ccc::CC1x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y63efgEv");}
ccc::CC1x7y6 ::~CC1x7y6(){ note_dtor("_ZN3ccc7CC1x7y6E", this);} // tgen
ccc::CC1x7y6 ::CC1x7y6(){ note_ctor("_ZN3ccc7CC1x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y6E, buf);
    ::ccc::CC1x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y6E);
    dp->::ccc::CC1x7y6::~CC1x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y6E(Test__ZN3ccc7CC1x7y6E, "_ZN3ccc7CC1x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y6C1Ev();
extern void _ZN3ccc7CC1x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y6E[] = {
  NSPAIR(_ZN3ccc7CC1x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y6E[];
extern void _ZN3ccc7CC1x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC1x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y63abcEv,_ZTv0_n12_N3ccc7CC1x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y63abcEv,_ZThn4_N3ccc7CC1x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y63efgEv,_ZTv0_n20_N3ccc7CC1x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y63efgEv,_ZThn4_N3ccc7CC1x7y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y63abcEv,_ZTv0_n12_N3ccc7CC1x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y63efgEv,_ZTv0_n20_N3ccc7CC1x7y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y6E[] = {
  {&(_ZTVN3ccc7CC1x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y6E[];
static VTBL_ENTRY alt_thunk_names654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y63efgEv,_ZTv0_n20_N3ccc7CC1x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y63efgEv,_ZThn4_N3ccc7CC1x7y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y63abcEv,_ZTv0_n12_N3ccc7CC1x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y63abcEv,_ZThn4_N3ccc7CC1x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y6E = {  "_ZN3ccc7CC1x7y6E", // class name
  bases__ZN3ccc7CC1x7y6E, 2,
  &(vtc__ZN3ccc7CC1x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y6E),2, //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  DD1x7y6  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD1x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x7y63efgEv
  ~DD1x7y6(); // tgen
  DD1x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y63abcEv");}
void  ccc::DD1x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y63efgEv");}
ccc::DD1x7y6 ::~DD1x7y6(){ note_dtor("_ZN3ccc7DD1x7y6E", this);} // tgen
ccc::DD1x7y6 ::DD1x7y6(){ note_ctor("_ZN3ccc7DD1x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y6E, buf);
    ::ccc::DD1x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y6E);
    dp->::ccc::DD1x7y6::~DD1x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y6E(Test__ZN3ccc7DD1x7y6E, "_ZN3ccc7DD1x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y6C1Ev();
extern void _ZN3ccc7DD1x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y6E[] = {
  NSPAIR(_ZN3ccc7DD1x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y6E[];
extern void _ZN3ccc7DD1x7y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y63abcEv,_ZTv0_n12_N3ccc7DD1x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y63abcEv,_ZThn4_N3ccc7DD1x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y63abcEv,_ZTv0_n12_N3ccc7DD1x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y6E[] = {
  {&(_ZTVN3ccc7DD1x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y6E[];
static VTBL_ENTRY alt_thunk_names655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y63abcEv,_ZTv0_n12_N3ccc7DD1x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y63abcEv,_ZThn4_N3ccc7DD1x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y6E = {  "_ZN3ccc7DD1x7y6E", // class name
  bases__ZN3ccc7DD1x7y6E, 2,
  &(vtc__ZN3ccc7DD1x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y6E),3, //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  CC1x7y7  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y73pqrEv
  ~CC1x7y7(); // tgen
  CC1x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y7E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y73abcEv");}
void  ccc::CC1x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y73pqrEv");}
ccc::CC1x7y7 ::~CC1x7y7(){ note_dtor("_ZN3ccc7CC1x7y7E", this);} // tgen
ccc::CC1x7y7 ::CC1x7y7(){ note_ctor("_ZN3ccc7CC1x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y7E, buf);
    ::ccc::CC1x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y7E);
    dp->::ccc::CC1x7y7::~CC1x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y7E(Test__ZN3ccc7CC1x7y7E, "_ZN3ccc7CC1x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y7C1Ev();
extern void _ZN3ccc7CC1x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y7E[] = {
  NSPAIR(_ZN3ccc7CC1x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y7E[];
extern void _ZN3ccc7CC1x7y73abcEv();
extern void _ZN3ccc7CC1x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y73abcEv,_ZTv0_n12_N3ccc7CC1x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y73abcEv,_ZThn4_N3ccc7CC1x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y73pqrEv,_ZTv0_n16_N3ccc7CC1x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y73pqrEv,_ZThn4_N3ccc7CC1x7y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y73abcEv,_ZTv0_n12_N3ccc7CC1x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y73pqrEv,_ZTv0_n16_N3ccc7CC1x7y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y7E[] = {
  {&(_ZTVN3ccc7CC1x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y7E[];
static VTBL_ENTRY alt_thunk_names656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y73pqrEv,_ZTv0_n16_N3ccc7CC1x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y73pqrEv,_ZThn4_N3ccc7CC1x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y73abcEv,_ZTv0_n12_N3ccc7CC1x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y73abcEv,_ZThn4_N3ccc7CC1x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y7E = {  "_ZN3ccc7CC1x7y7E", // class name
  bases__ZN3ccc7CC1x7y7E, 2,
  &(vtc__ZN3ccc7CC1x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names656,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x7y7  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD1x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y73pqrEv
  ~DD1x7y7(); // tgen
  DD1x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y73abcEv");}
void  ccc::DD1x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y73pqrEv");}
ccc::DD1x7y7 ::~DD1x7y7(){ note_dtor("_ZN3ccc7DD1x7y7E", this);} // tgen
ccc::DD1x7y7 ::DD1x7y7(){ note_ctor("_ZN3ccc7DD1x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y7E, buf);
    ::ccc::DD1x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y7E);
    dp->::ccc::DD1x7y7::~DD1x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y7E(Test__ZN3ccc7DD1x7y7E, "_ZN3ccc7DD1x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y7C1Ev();
extern void _ZN3ccc7DD1x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y7E[] = {
  NSPAIR(_ZN3ccc7DD1x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y7E[];
extern void _ZN3ccc7DD1x7y73abcEv();
extern void _ZN3ccc7DD1x7y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y73abcEv,_ZTv0_n12_N3ccc7DD1x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y73abcEv,_ZThn4_N3ccc7DD1x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y73pqrEv,_ZTv0_n16_N3ccc7DD1x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y73pqrEv,_ZThn4_N3ccc7DD1x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y73abcEv,_ZTv0_n12_N3ccc7DD1x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y73pqrEv,_ZTv0_n16_N3ccc7DD1x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y7E[] = {
  {&(_ZTVN3ccc7DD1x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y7E[];
static VTBL_ENTRY alt_thunk_names657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y73pqrEv,_ZTv0_n16_N3ccc7DD1x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y73pqrEv,_ZThn4_N3ccc7DD1x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y73abcEv,_ZTv0_n12_N3ccc7DD1x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y73abcEv,_ZThn4_N3ccc7DD1x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y7E = {  "_ZN3ccc7DD1x7y7E", // class name
  bases__ZN3ccc7DD1x7y7E, 2,
  &(vtc__ZN3ccc7DD1x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y7E),3, //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  CC1x7y8  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y83abcEv
  ~CC1x7y8(); // tgen
  CC1x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y8E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y83efgEv");}
void  ccc::CC1x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y83abcEv");}
ccc::CC1x7y8 ::~CC1x7y8(){ note_dtor("_ZN3ccc7CC1x7y8E", this);} // tgen
ccc::CC1x7y8 ::CC1x7y8(){ note_ctor("_ZN3ccc7CC1x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y8E, buf);
    ::ccc::CC1x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y8E);
    dp->::ccc::CC1x7y8::~CC1x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y8E(Test__ZN3ccc7CC1x7y8E, "_ZN3ccc7CC1x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y8C1Ev();
extern void _ZN3ccc7CC1x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y8E[] = {
  NSPAIR(_ZN3ccc7CC1x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y8E[];
extern void _ZN3ccc7CC1x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC1x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x7y83abcEv,_ZTv0_n12_N3ccc7CC1x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y83abcEv,_ZThn4_N3ccc7CC1x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y83efgEv,_ZTv0_n20_N3ccc7CC1x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y83efgEv,_ZThn4_N3ccc7CC1x7y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x7y83abcEv,_ZTv0_n12_N3ccc7CC1x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y83efgEv,_ZTv0_n20_N3ccc7CC1x7y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y8E[] = {
  {&(_ZTVN3ccc7CC1x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y8E[];
static VTBL_ENTRY alt_thunk_names658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y83efgEv,_ZTv0_n20_N3ccc7CC1x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y83efgEv,_ZThn4_N3ccc7CC1x7y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x7y83abcEv,_ZTv0_n12_N3ccc7CC1x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y83abcEv,_ZThn4_N3ccc7CC1x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y8E = {  "_ZN3ccc7CC1x7y8E", // class name
  bases__ZN3ccc7CC1x7y8E, 2,
  &(vtc__ZN3ccc7CC1x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y8E),2, //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  DD1x7y8  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD1x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x7y83abcEv
  ~DD1x7y8(); // tgen
  DD1x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y83efgEv");}
void  ccc::DD1x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x7y83abcEv");}
ccc::DD1x7y8 ::~DD1x7y8(){ note_dtor("_ZN3ccc7DD1x7y8E", this);} // tgen
ccc::DD1x7y8 ::DD1x7y8(){ note_ctor("_ZN3ccc7DD1x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y8E, buf);
    ::ccc::DD1x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y8E);
    dp->::ccc::DD1x7y8::~DD1x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y8E(Test__ZN3ccc7DD1x7y8E, "_ZN3ccc7DD1x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y8C1Ev();
extern void _ZN3ccc7DD1x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y8E[] = {
  NSPAIR(_ZN3ccc7DD1x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y8E[];
extern void _ZN3ccc7DD1x7y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x7y83abcEv,_ZTv0_n12_N3ccc7DD1x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y83abcEv,_ZThn4_N3ccc7DD1x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x7y83abcEv,_ZTv0_n12_N3ccc7DD1x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y8E[] = {
  {&(_ZTVN3ccc7DD1x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y8E[];
static VTBL_ENTRY alt_thunk_names659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x7y83abcEv,_ZTv0_n12_N3ccc7DD1x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y83abcEv,_ZThn4_N3ccc7DD1x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y8E = {  "_ZN3ccc7DD1x7y8E", // class name
  bases__ZN3ccc7DD1x7y8E, 2,
  &(vtc__ZN3ccc7DD1x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y8E),3, //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  CC1x7y9  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y93pqrEv
  ~CC1x7y9(); // tgen
  CC1x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y9E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y93efgEv");}
void  ccc::CC1x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y93pqrEv");}
ccc::CC1x7y9 ::~CC1x7y9(){ note_dtor("_ZN3ccc7CC1x7y9E", this);} // tgen
ccc::CC1x7y9 ::CC1x7y9(){ note_ctor("_ZN3ccc7CC1x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y9E, buf);
    ::ccc::CC1x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC1x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y9E);
    dp->::ccc::CC1x7y9::~CC1x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y9E(Test__ZN3ccc7CC1x7y9E, "_ZN3ccc7CC1x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y9C1Ev();
extern void _ZN3ccc7CC1x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y9E[] = {
  NSPAIR(_ZN3ccc7CC1x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC1x7y93pqrEv();
extern void _ZN3ccc7CC1x7y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x7y93pqrEv,_ZTv0_n16_N3ccc7CC1x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y93pqrEv,_ZThn4_N3ccc7CC1x7y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x7y93efgEv,_ZTv0_n20_N3ccc7CC1x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y93efgEv,_ZThn4_N3ccc7CC1x7y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x7y93pqrEv,_ZTv0_n16_N3ccc7CC1x7y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x7y93efgEv,_ZTv0_n20_N3ccc7CC1x7y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x7y9E[] = {
  {&(_ZTVN3ccc7CC1x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x7y9E[];
static VTBL_ENTRY alt_thunk_names660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x7y93efgEv,_ZTv0_n20_N3ccc7CC1x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y93efgEv,_ZThn4_N3ccc7CC1x7y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x7y93pqrEv,_ZTv0_n16_N3ccc7CC1x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x7y93pqrEv,_ZThn4_N3ccc7CC1x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x7y9E = {  "_ZN3ccc7CC1x7y9E", // class name
  bases__ZN3ccc7CC1x7y9E, 2,
  &(vtc__ZN3ccc7CC1x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x7y9E),2, //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  DD1x7y9  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD1x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x7y93pqrEv
  ~DD1x7y9(); // tgen
  DD1x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x7y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x7y93efgEv");}
void  ccc::DD1x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x7y93pqrEv");}
ccc::DD1x7y9 ::~DD1x7y9(){ note_dtor("_ZN3ccc7DD1x7y9E", this);} // tgen
ccc::DD1x7y9 ::DD1x7y9(){ note_ctor("_ZN3ccc7DD1x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x7y9E, buf);
    ::ccc::DD1x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x7y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD1x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x7y9E);
    dp->::ccc::DD1x7y9::~DD1x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x7y9E(Test__ZN3ccc7DD1x7y9E, "_ZN3ccc7DD1x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x7y9C1Ev();
extern void _ZN3ccc7DD1x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x7y9E[] = {
  NSPAIR(_ZN3ccc7DD1x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD1x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x7y93pqrEv();
extern void _ZN3ccc7DD1x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x7y93pqrEv,_ZTv0_n16_N3ccc7DD1x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x7y93pqrEv,_ZThn4_N3ccc7DD1x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x7y93pqrEv,_ZTv0_n16_N3ccc7DD1x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x7y9E[] = {
  {&(_ZTVN3ccc7DD1x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x7y9E[];
static VTBL_ENTRY alt_thunk_names661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x7y93pqrEv,_ZTv0_n16_N3ccc7DD1x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x7y93pqrEv,_ZThn4_N3ccc7DD1x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x7y9E = {  "_ZN3ccc7DD1x7y9E", // class name
  bases__ZN3ccc7DD1x7y9E, 2,
  &(vtc__ZN3ccc7DD1x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x7y9E),3, //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  CC1x7y10  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x7y103abcEv
  ~CC1x7y10(); // tgen
  CC1x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y10E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y103pqrEv");}
void  ccc::CC1x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x7y103abcEv");}
ccc::CC1x7y10 ::~CC1x7y10(){ note_dtor("_ZN3ccc8CC1x7y10E", this);} // tgen
ccc::CC1x7y10 ::CC1x7y10(){ note_ctor("_ZN3ccc8CC1x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y10E, buf);
    ::ccc::CC1x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y10E);
    dp->::ccc::CC1x7y10::~CC1x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y10E(Test__ZN3ccc8CC1x7y10E, "_ZN3ccc8CC1x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y10C1Ev();
extern void _ZN3ccc8CC1x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y10E[] = {
  NSPAIR(_ZN3ccc8CC1x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y10E[];
extern void _ZN3ccc8CC1x7y103abcEv();
extern void _ZN3ccc8CC1x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x7y103abcEv,_ZTv0_n12_N3ccc8CC1x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y103abcEv,_ZThn4_N3ccc8CC1x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x7y103pqrEv,_ZTv0_n16_N3ccc8CC1x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y103pqrEv,_ZThn4_N3ccc8CC1x7y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x7y103abcEv,_ZTv0_n12_N3ccc8CC1x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x7y103pqrEv,_ZTv0_n16_N3ccc8CC1x7y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y10E[] = {
  {&(_ZTVN3ccc8CC1x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y10E[];
static VTBL_ENTRY alt_thunk_names662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x7y103pqrEv,_ZTv0_n16_N3ccc8CC1x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y103pqrEv,_ZThn4_N3ccc8CC1x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x7y103abcEv,_ZTv0_n12_N3ccc8CC1x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y103abcEv,_ZThn4_N3ccc8CC1x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x7y10E = {  "_ZN3ccc8CC1x7y10E", // class name
  bases__ZN3ccc8CC1x7y10E, 2,
  &(vtc__ZN3ccc8CC1x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y10E),2, //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  DD1x7y10  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD1x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x7y103abcEv
  ~DD1x7y10(); // tgen
  DD1x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x7y103pqrEv");}
void  ccc::DD1x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x7y103abcEv");}
ccc::DD1x7y10 ::~DD1x7y10(){ note_dtor("_ZN3ccc8DD1x7y10E", this);} // tgen
ccc::DD1x7y10 ::DD1x7y10(){ note_ctor("_ZN3ccc8DD1x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y10E, buf);
    ::ccc::DD1x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y10E);
    dp->::ccc::DD1x7y10::~DD1x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y10E(Test__ZN3ccc8DD1x7y10E, "_ZN3ccc8DD1x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y10C1Ev();
extern void _ZN3ccc8DD1x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y10E[] = {
  NSPAIR(_ZN3ccc8DD1x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y10E[];
extern void _ZN3ccc8DD1x7y103abcEv();
extern void _ZN3ccc8DD1x7y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x7y103abcEv,_ZTv0_n12_N3ccc8DD1x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x7y103abcEv,_ZThn4_N3ccc8DD1x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x7y103pqrEv,_ZTv0_n16_N3ccc8DD1x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x7y103pqrEv,_ZThn4_N3ccc8DD1x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x7y103abcEv,_ZTv0_n12_N3ccc8DD1x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x7y103pqrEv,_ZTv0_n16_N3ccc8DD1x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y10E[] = {
  {&(_ZTVN3ccc8DD1x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y10E[];
static VTBL_ENTRY alt_thunk_names663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x7y103pqrEv,_ZTv0_n16_N3ccc8DD1x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x7y103pqrEv,_ZThn4_N3ccc8DD1x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x7y103abcEv,_ZTv0_n12_N3ccc8DD1x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x7y103abcEv,_ZThn4_N3ccc8DD1x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x7y10E = {  "_ZN3ccc8DD1x7y10E", // class name
  bases__ZN3ccc8DD1x7y10E, 2,
  &(vtc__ZN3ccc8DD1x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y10E),3, //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  CC1x7y11  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x7y113efgEv
  ~CC1x7y11(); // tgen
  CC1x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y11E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y113pqrEv");}
void  ccc::CC1x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x7y113efgEv");}
ccc::CC1x7y11 ::~CC1x7y11(){ note_dtor("_ZN3ccc8CC1x7y11E", this);} // tgen
ccc::CC1x7y11 ::CC1x7y11(){ note_ctor("_ZN3ccc8CC1x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y11E, buf);
    ::ccc::CC1x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y11E);
    dp->::ccc::CC1x7y11::~CC1x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y11E(Test__ZN3ccc8CC1x7y11E, "_ZN3ccc8CC1x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y11C1Ev();
extern void _ZN3ccc8CC1x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y11E[] = {
  NSPAIR(_ZN3ccc8CC1x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC1x7y113pqrEv();
extern void _ZN3ccc8CC1x7y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x7y113pqrEv,_ZTv0_n16_N3ccc8CC1x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y113pqrEv,_ZThn4_N3ccc8CC1x7y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x7y113efgEv,_ZTv0_n20_N3ccc8CC1x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y113efgEv,_ZThn4_N3ccc8CC1x7y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x7y113pqrEv,_ZTv0_n16_N3ccc8CC1x7y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x7y113efgEv,_ZTv0_n20_N3ccc8CC1x7y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y11E[] = {
  {&(_ZTVN3ccc8CC1x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y11E[];
static VTBL_ENTRY alt_thunk_names664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x7y113efgEv,_ZTv0_n20_N3ccc8CC1x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y113efgEv,_ZThn4_N3ccc8CC1x7y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x7y113pqrEv,_ZTv0_n16_N3ccc8CC1x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y113pqrEv,_ZThn4_N3ccc8CC1x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x7y11E = {  "_ZN3ccc8CC1x7y11E", // class name
  bases__ZN3ccc8CC1x7y11E, 2,
  &(vtc__ZN3ccc8CC1x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y11E),2, //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  DD1x7y11  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD1x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x7y113efgEv
  ~DD1x7y11(); // tgen
  DD1x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x7y113pqrEv");}
void  ccc::DD1x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x7y113efgEv");}
ccc::DD1x7y11 ::~DD1x7y11(){ note_dtor("_ZN3ccc8DD1x7y11E", this);} // tgen
ccc::DD1x7y11 ::DD1x7y11(){ note_ctor("_ZN3ccc8DD1x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y11E, buf);
    ::ccc::DD1x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y11E);
    dp->::ccc::DD1x7y11::~DD1x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y11E(Test__ZN3ccc8DD1x7y11E, "_ZN3ccc8DD1x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y11C1Ev();
extern void _ZN3ccc8DD1x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y11E[] = {
  NSPAIR(_ZN3ccc8DD1x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x7y113pqrEv();
extern void _ZN3ccc8DD1x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x7y113pqrEv,_ZTv0_n16_N3ccc8DD1x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x7y113pqrEv,_ZThn4_N3ccc8DD1x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x7y113pqrEv,_ZTv0_n16_N3ccc8DD1x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y11E[] = {
  {&(_ZTVN3ccc8DD1x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y11E[];
static VTBL_ENTRY alt_thunk_names665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x7y113pqrEv,_ZTv0_n16_N3ccc8DD1x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x7y113pqrEv,_ZThn4_N3ccc8DD1x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x7y11E = {  "_ZN3ccc8DD1x7y11E", // class name
  bases__ZN3ccc8DD1x7y11E, 2,
  &(vtc__ZN3ccc8DD1x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y11E),3, //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  CC1x7y12  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC1x7y123abcEv
  ~CC1x7y12(); // tgen
  CC1x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x7y123abcEv");}
ccc::CC1x7y12 ::~CC1x7y12(){ note_dtor("_ZN3ccc8CC1x7y12E", this);} // tgen
ccc::CC1x7y12 ::CC1x7y12(){ note_ctor("_ZN3ccc8CC1x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y12E, buf);
    ::ccc::CC1x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y12E);
    dp->::ccc::CC1x7y12::~CC1x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y12E(Test__ZN3ccc8CC1x7y12E, "_ZN3ccc8CC1x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y12C1Ev();
extern void _ZN3ccc8CC1x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y12E[] = {
  NSPAIR(_ZN3ccc8CC1x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y12E[];
extern void _ZN3ccc8CC1x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x7y123abcEv,_ZTv0_n12_N3ccc8CC1x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y123abcEv,_ZThn4_N3ccc8CC1x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x7y123abcEv,_ZTv0_n12_N3ccc8CC1x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y12E[] = {
  {&(_ZTVN3ccc8CC1x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y12E[];
static VTBL_ENTRY alt_thunk_names666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x7y123abcEv,_ZTv0_n12_N3ccc8CC1x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y123abcEv,_ZThn4_N3ccc8CC1x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x7y12E = {  "_ZN3ccc8CC1x7y12E", // class name
  bases__ZN3ccc8CC1x7y12E, 2,
  &(vtc__ZN3ccc8CC1x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y12E),2, //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  DD1x7y12  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD1x7y123abcEv
  ~DD1x7y12(); // tgen
  DD1x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x7y123abcEv");}
ccc::DD1x7y12 ::~DD1x7y12(){ note_dtor("_ZN3ccc8DD1x7y12E", this);} // tgen
ccc::DD1x7y12 ::DD1x7y12(){ note_ctor("_ZN3ccc8DD1x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y12E, buf);
    ::ccc::DD1x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y12E);
    dp->::ccc::DD1x7y12::~DD1x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y12E(Test__ZN3ccc8DD1x7y12E, "_ZN3ccc8DD1x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y12C1Ev();
extern void _ZN3ccc8DD1x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y12E[] = {
  NSPAIR(_ZN3ccc8DD1x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y12E[];
extern void _ZN3ccc8DD1x7y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x7y123abcEv,_ZTv0_n12_N3ccc8DD1x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x7y123abcEv,_ZThn4_N3ccc8DD1x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x7y123abcEv,_ZTv0_n12_N3ccc8DD1x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y12E[] = {
  {&(_ZTVN3ccc8DD1x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y12E[];
static VTBL_ENTRY alt_thunk_names667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x7y123abcEv,_ZTv0_n12_N3ccc8DD1x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x7y123abcEv,_ZThn4_N3ccc8DD1x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x7y12E = {  "_ZN3ccc8DD1x7y12E", // class name
  bases__ZN3ccc8DD1x7y12E, 2,
  &(vtc__ZN3ccc8DD1x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y12E),3, //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  CC1x7y13  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC1x7y133efgEv
  ~CC1x7y13(); // tgen
  CC1x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x7y133efgEv");}
ccc::CC1x7y13 ::~CC1x7y13(){ note_dtor("_ZN3ccc8CC1x7y13E", this);} // tgen
ccc::CC1x7y13 ::CC1x7y13(){ note_ctor("_ZN3ccc8CC1x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y13E, buf);
    ::ccc::CC1x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y13E);
    dp->::ccc::CC1x7y13::~CC1x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y13E(Test__ZN3ccc8CC1x7y13E, "_ZN3ccc8CC1x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y13C1Ev();
extern void _ZN3ccc8CC1x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y13E[] = {
  NSPAIR(_ZN3ccc8CC1x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC1x7y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x7y133efgEv,_ZTv0_n20_N3ccc8CC1x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y133efgEv,_ZThn4_N3ccc8CC1x7y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x7y133efgEv,_ZTv0_n20_N3ccc8CC1x7y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y13E[] = {
  {&(_ZTVN3ccc8CC1x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y13E[];
static VTBL_ENTRY alt_thunk_names668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x7y133efgEv,_ZTv0_n20_N3ccc8CC1x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y133efgEv,_ZThn4_N3ccc8CC1x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x7y13E = {  "_ZN3ccc8CC1x7y13E", // class name
  bases__ZN3ccc8CC1x7y13E, 2,
  &(vtc__ZN3ccc8CC1x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y13E),2, //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  DD1x7y13  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD1x7y133efgEv
  ~DD1x7y13(); // tgen
  DD1x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x7y133efgEv");}
ccc::DD1x7y13 ::~DD1x7y13(){ note_dtor("_ZN3ccc8DD1x7y13E", this);} // tgen
ccc::DD1x7y13 ::DD1x7y13(){ note_ctor("_ZN3ccc8DD1x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y13E, buf);
    ::ccc::DD1x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y13E);
    dp->::ccc::DD1x7y13::~DD1x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y13E(Test__ZN3ccc8DD1x7y13E, "_ZN3ccc8DD1x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y13C1Ev();
extern void _ZN3ccc8DD1x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y13E[] = {
  NSPAIR(_ZN3ccc8DD1x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y13E[] = {
  {&(_ZTVN3ccc8DD1x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y13E[];
Class_Descriptor cd__ZN3ccc8DD1x7y13E = {  "_ZN3ccc8DD1x7y13E", // class name
  bases__ZN3ccc8DD1x7y13E, 2,
  &(vtc__ZN3ccc8DD1x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y14  : virtual ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y143pqrEv
  ~CC1x7y14(); // tgen
  CC1x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y143pqrEv");}
ccc::CC1x7y14 ::~CC1x7y14(){ note_dtor("_ZN3ccc8CC1x7y14E", this);} // tgen
ccc::CC1x7y14 ::CC1x7y14(){ note_ctor("_ZN3ccc8CC1x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y14E, buf);
    ::ccc::CC1x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y14E);
    dp->::ccc::CC1x7y14::~CC1x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y14E(Test__ZN3ccc8CC1x7y14E, "_ZN3ccc8CC1x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y14C1Ev();
extern void _ZN3ccc8CC1x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y14E[] = {
  NSPAIR(_ZN3ccc8CC1x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC1x7y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x7y143pqrEv,_ZTv0_n16_N3ccc8CC1x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y143pqrEv,_ZThn4_N3ccc8CC1x7y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x7y143pqrEv,_ZTv0_n16_N3ccc8CC1x7y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y14E[] = {
  {&(_ZTVN3ccc8CC1x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y14E[];
static VTBL_ENTRY alt_thunk_names669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x7y143pqrEv,_ZTv0_n16_N3ccc8CC1x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x7y143pqrEv,_ZThn4_N3ccc8CC1x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x7y14E = {  "_ZN3ccc8CC1x7y14E", // class name
  bases__ZN3ccc8CC1x7y14E, 2,
  &(vtc__ZN3ccc8CC1x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y14E),2, //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  DD1x7y14  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD1x7y143pqrEv
  ~DD1x7y14(); // tgen
  DD1x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x7y143pqrEv");}
ccc::DD1x7y14 ::~DD1x7y14(){ note_dtor("_ZN3ccc8DD1x7y14E", this);} // tgen
ccc::DD1x7y14 ::DD1x7y14(){ note_ctor("_ZN3ccc8DD1x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y14E, buf);
    ::ccc::DD1x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y14E);
    dp->::ccc::DD1x7y14::~DD1x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y14E(Test__ZN3ccc8DD1x7y14E, "_ZN3ccc8DD1x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y14C1Ev();
extern void _ZN3ccc8DD1x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y14E[] = {
  NSPAIR(_ZN3ccc8DD1x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x7y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x7y143pqrEv,_ZTv0_n16_N3ccc8DD1x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x7y143pqrEv,_ZThn4_N3ccc8DD1x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x7y143pqrEv,_ZTv0_n16_N3ccc8DD1x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y14E[] = {
  {&(_ZTVN3ccc8DD1x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y14E[];
static VTBL_ENTRY alt_thunk_names670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x7y143pqrEv,_ZTv0_n16_N3ccc8DD1x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x7y143pqrEv,_ZThn4_N3ccc8DD1x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x7y14E = {  "_ZN3ccc8DD1x7y14E", // class name
  bases__ZN3ccc8DD1x7y14E, 2,
  &(vtc__ZN3ccc8DD1x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y14E),3, //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  CC1x7y15  : virtual ::ccc::AA1 , ::ccc::BB7 {
  ~CC1x7y15(); // tgen
  CC1x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x7y15 ::~CC1x7y15(){ note_dtor("_ZN3ccc8CC1x7y15E", this);} // tgen
ccc::CC1x7y15 ::CC1x7y15(){ note_ctor("_ZN3ccc8CC1x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y15E, buf);
    ::ccc::CC1x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC1x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y15E);
    dp->::ccc::CC1x7y15::~CC1x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y15E(Test__ZN3ccc8CC1x7y15E, "_ZN3ccc8CC1x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y15C1Ev();
extern void _ZN3ccc8CC1x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y15E[] = {
  NSPAIR(_ZN3ccc8CC1x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x7y15E[] = {
  {&(_ZTVN3ccc8CC1x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x7y15E[];
Class_Descriptor cd__ZN3ccc8CC1x7y15E = {  "_ZN3ccc8CC1x7y15E", // class name
  bases__ZN3ccc8CC1x7y15E, 2,
  &(vtc__ZN3ccc8CC1x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x7y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x7y15  : virtual ::ccc::AA1 , virtual ::ccc::BB7 {
  ~DD1x7y15(); // tgen
  DD1x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x7y15 ::~DD1x7y15(){ note_dtor("_ZN3ccc8DD1x7y15E", this);} // tgen
ccc::DD1x7y15 ::DD1x7y15(){ note_ctor("_ZN3ccc8DD1x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x7y15E, buf);
    ::ccc::DD1x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x7y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD1x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x7y15E);
    dp->::ccc::DD1x7y15::~DD1x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x7y15E(Test__ZN3ccc8DD1x7y15E, "_ZN3ccc8DD1x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x7y15C1Ev();
extern void _ZN3ccc8DD1x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x7y15E[] = {
  NSPAIR(_ZN3ccc8DD1x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD1x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x7y15E[] = {
  {&(_ZTVN3ccc8DD1x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x7y15E[];
Class_Descriptor cd__ZN3ccc8DD1x7y15E = {  "_ZN3ccc8DD1x7y15E", // class name
  bases__ZN3ccc8DD1x7y15E, 2,
  &(vtc__ZN3ccc8DD1x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x7y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y0  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y03pqrEv
  ~CC1x8y0(); // tgen
  CC1x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y0E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y03abcEv");}
void  ccc::CC1x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y03efgEv");}
void  ccc::CC1x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y03pqrEv");}
ccc::CC1x8y0 ::~CC1x8y0(){ note_dtor("_ZN3ccc7CC1x8y0E", this);} // tgen
ccc::CC1x8y0 ::CC1x8y0(){ note_ctor("_ZN3ccc7CC1x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y0E, buf);
    ::ccc::CC1x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y0E);
    dp->::ccc::CC1x8y0::~CC1x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y0E(Test__ZN3ccc7CC1x8y0E, "_ZN3ccc7CC1x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y0C1Ev();
extern void _ZN3ccc7CC1x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y0E[] = {
  NSPAIR(_ZN3ccc7CC1x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y0E[];
extern void _ZN3ccc7CC1x8y03efgEv();
extern void _ZN3ccc7CC1x8y03abcEv();
extern void _ZN3ccc7CC1x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y03abcEv,_ZTv0_n12_N3ccc7CC1x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y03abcEv,_ZThn4_N3ccc7CC1x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y03pqrEv,_ZTv0_n16_N3ccc7CC1x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y03pqrEv,_ZThn4_N3ccc7CC1x8y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y03efgEv,_ZTv0_n20_N3ccc7CC1x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y03efgEv,_ZThn4_N3ccc7CC1x8y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y03abcEv,_ZTv0_n12_N3ccc7CC1x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y03pqrEv,_ZTv0_n16_N3ccc7CC1x8y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y03efgEv,_ZTv0_n20_N3ccc7CC1x8y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y0E[] = {
  {&(_ZTVN3ccc7CC1x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y0E[];
static VTBL_ENTRY alt_thunk_names671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y03efgEv,_ZTv0_n20_N3ccc7CC1x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y03efgEv,_ZThn4_N3ccc7CC1x8y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y03pqrEv,_ZTv0_n16_N3ccc7CC1x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y03pqrEv,_ZThn4_N3ccc7CC1x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y03abcEv,_ZTv0_n12_N3ccc7CC1x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y03abcEv,_ZThn4_N3ccc7CC1x8y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y0E = {  "_ZN3ccc7CC1x8y0E", // class name
  bases__ZN3ccc7CC1x8y0E, 2,
  &(vtc__ZN3ccc7CC1x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y0E),2, //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  DD1x8y0  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD1x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y03pqrEv
  ~DD1x8y0(); // tgen
  DD1x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y03abcEv");}
void  ccc::DD1x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y03efgEv");}
void  ccc::DD1x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y03pqrEv");}
ccc::DD1x8y0 ::~DD1x8y0(){ note_dtor("_ZN3ccc7DD1x8y0E", this);} // tgen
ccc::DD1x8y0 ::DD1x8y0(){ note_ctor("_ZN3ccc7DD1x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y0E, buf);
    ::ccc::DD1x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y0E);
    dp->::ccc::DD1x8y0::~DD1x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y0E(Test__ZN3ccc7DD1x8y0E, "_ZN3ccc7DD1x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y0C1Ev();
extern void _ZN3ccc7DD1x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y0E[] = {
  NSPAIR(_ZN3ccc7DD1x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y0E[];
extern void _ZN3ccc7DD1x8y03abcEv();
extern void _ZN3ccc7DD1x8y03pqrEv();
extern void _ZN3ccc7DD1x8y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y03efgEv,_ZTv0_n12_N3ccc7DD1x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y03efgEv,_ZThn4_N3ccc7DD1x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y03abcEv,_ZTv0_n16_N3ccc7DD1x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y03abcEv,_ZThn4_N3ccc7DD1x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y03efgEv,_ZTv0_n12_N3ccc7DD1x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y03abcEv,_ZTv0_n16_N3ccc7DD1x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y0E[] = {
  {&(_ZTVN3ccc7DD1x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y0E[];
static VTBL_ENTRY alt_thunk_names672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y03abcEv,_ZTv0_n16_N3ccc7DD1x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y03abcEv,_ZThn4_N3ccc7DD1x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y03efgEv,_ZTv0_n12_N3ccc7DD1x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y03efgEv,_ZThn4_N3ccc7DD1x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y0E = {  "_ZN3ccc7DD1x8y0E", // class name
  bases__ZN3ccc7DD1x8y0E, 2,
  &(vtc__ZN3ccc7DD1x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y0E),3, //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  CC1x8y1  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x8y13efgEv
  ~CC1x8y1(); // tgen
  CC1x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y1E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y13abcEv");}
void  ccc::CC1x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y13pqrEv");}
void  ccc::CC1x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y13efgEv");}
ccc::CC1x8y1 ::~CC1x8y1(){ note_dtor("_ZN3ccc7CC1x8y1E", this);} // tgen
ccc::CC1x8y1 ::CC1x8y1(){ note_ctor("_ZN3ccc7CC1x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y1E, buf);
    ::ccc::CC1x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y1E);
    dp->::ccc::CC1x8y1::~CC1x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y1E(Test__ZN3ccc7CC1x8y1E, "_ZN3ccc7CC1x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y1C1Ev();
extern void _ZN3ccc7CC1x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y1E[] = {
  NSPAIR(_ZN3ccc7CC1x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y1E[];
extern void _ZN3ccc7CC1x8y13efgEv();
extern void _ZN3ccc7CC1x8y13abcEv();
extern void _ZN3ccc7CC1x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y13abcEv,_ZTv0_n12_N3ccc7CC1x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y13abcEv,_ZThn4_N3ccc7CC1x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y13pqrEv,_ZTv0_n16_N3ccc7CC1x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y13pqrEv,_ZThn4_N3ccc7CC1x8y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y13efgEv,_ZTv0_n20_N3ccc7CC1x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y13efgEv,_ZThn4_N3ccc7CC1x8y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y13abcEv,_ZTv0_n12_N3ccc7CC1x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y13pqrEv,_ZTv0_n16_N3ccc7CC1x8y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y13efgEv,_ZTv0_n20_N3ccc7CC1x8y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y1E[] = {
  {&(_ZTVN3ccc7CC1x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y1E[];
static VTBL_ENTRY alt_thunk_names673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y13efgEv,_ZTv0_n20_N3ccc7CC1x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y13efgEv,_ZThn4_N3ccc7CC1x8y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y13pqrEv,_ZTv0_n16_N3ccc7CC1x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y13pqrEv,_ZThn4_N3ccc7CC1x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y13abcEv,_ZTv0_n12_N3ccc7CC1x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y13abcEv,_ZThn4_N3ccc7CC1x8y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y1E = {  "_ZN3ccc7CC1x8y1E", // class name
  bases__ZN3ccc7CC1x8y1E, 2,
  &(vtc__ZN3ccc7CC1x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y1E),2, //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  DD1x8y1  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD1x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x8y13efgEv
  ~DD1x8y1(); // tgen
  DD1x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y13abcEv");}
void  ccc::DD1x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y13pqrEv");}
void  ccc::DD1x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y13efgEv");}
ccc::DD1x8y1 ::~DD1x8y1(){ note_dtor("_ZN3ccc7DD1x8y1E", this);} // tgen
ccc::DD1x8y1 ::DD1x8y1(){ note_ctor("_ZN3ccc7DD1x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y1E, buf);
    ::ccc::DD1x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y1E);
    dp->::ccc::DD1x8y1::~DD1x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y1E(Test__ZN3ccc7DD1x8y1E, "_ZN3ccc7DD1x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y1C1Ev();
extern void _ZN3ccc7DD1x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y1E[] = {
  NSPAIR(_ZN3ccc7DD1x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y1E[];
extern void _ZN3ccc7DD1x8y13abcEv();
extern void _ZN3ccc7DD1x8y13pqrEv();
extern void _ZN3ccc7DD1x8y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y13efgEv,_ZTv0_n12_N3ccc7DD1x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y13efgEv,_ZThn4_N3ccc7DD1x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y13abcEv,_ZTv0_n16_N3ccc7DD1x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y13abcEv,_ZThn4_N3ccc7DD1x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y13efgEv,_ZTv0_n12_N3ccc7DD1x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y13abcEv,_ZTv0_n16_N3ccc7DD1x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y1E[] = {
  {&(_ZTVN3ccc7DD1x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y1E[];
static VTBL_ENTRY alt_thunk_names674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y13abcEv,_ZTv0_n16_N3ccc7DD1x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y13abcEv,_ZThn4_N3ccc7DD1x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y13efgEv,_ZTv0_n12_N3ccc7DD1x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y13efgEv,_ZThn4_N3ccc7DD1x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y1E = {  "_ZN3ccc7DD1x8y1E", // class name
  bases__ZN3ccc7DD1x8y1E, 2,
  &(vtc__ZN3ccc7DD1x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names674,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y2  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y23pqrEv
  ~CC1x8y2(); // tgen
  CC1x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y2E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y23efgEv");}
void  ccc::CC1x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y23abcEv");}
void  ccc::CC1x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y23pqrEv");}
ccc::CC1x8y2 ::~CC1x8y2(){ note_dtor("_ZN3ccc7CC1x8y2E", this);} // tgen
ccc::CC1x8y2 ::CC1x8y2(){ note_ctor("_ZN3ccc7CC1x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y2E, buf);
    ::ccc::CC1x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y2E);
    dp->::ccc::CC1x8y2::~CC1x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y2E(Test__ZN3ccc7CC1x8y2E, "_ZN3ccc7CC1x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y2C1Ev();
extern void _ZN3ccc7CC1x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y2E[] = {
  NSPAIR(_ZN3ccc7CC1x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y2E[];
extern void _ZN3ccc7CC1x8y23efgEv();
extern void _ZN3ccc7CC1x8y23abcEv();
extern void _ZN3ccc7CC1x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y23abcEv,_ZTv0_n12_N3ccc7CC1x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y23abcEv,_ZThn4_N3ccc7CC1x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y23pqrEv,_ZTv0_n16_N3ccc7CC1x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y23pqrEv,_ZThn4_N3ccc7CC1x8y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y23efgEv,_ZTv0_n20_N3ccc7CC1x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y23efgEv,_ZThn4_N3ccc7CC1x8y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y23abcEv,_ZTv0_n12_N3ccc7CC1x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y23pqrEv,_ZTv0_n16_N3ccc7CC1x8y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y23efgEv,_ZTv0_n20_N3ccc7CC1x8y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y2E[] = {
  {&(_ZTVN3ccc7CC1x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y2E[];
static VTBL_ENTRY alt_thunk_names675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y23efgEv,_ZTv0_n20_N3ccc7CC1x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y23efgEv,_ZThn4_N3ccc7CC1x8y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y23pqrEv,_ZTv0_n16_N3ccc7CC1x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y23pqrEv,_ZThn4_N3ccc7CC1x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y23abcEv,_ZTv0_n12_N3ccc7CC1x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y23abcEv,_ZThn4_N3ccc7CC1x8y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y2E = {  "_ZN3ccc7CC1x8y2E", // class name
  bases__ZN3ccc7CC1x8y2E, 2,
  &(vtc__ZN3ccc7CC1x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y2E),2, //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  DD1x8y2  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD1x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y23pqrEv
  ~DD1x8y2(); // tgen
  DD1x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y23efgEv");}
void  ccc::DD1x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y23abcEv");}
void  ccc::DD1x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y23pqrEv");}
ccc::DD1x8y2 ::~DD1x8y2(){ note_dtor("_ZN3ccc7DD1x8y2E", this);} // tgen
ccc::DD1x8y2 ::DD1x8y2(){ note_ctor("_ZN3ccc7DD1x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y2E, buf);
    ::ccc::DD1x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y2E);
    dp->::ccc::DD1x8y2::~DD1x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y2E(Test__ZN3ccc7DD1x8y2E, "_ZN3ccc7DD1x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y2C1Ev();
extern void _ZN3ccc7DD1x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y2E[] = {
  NSPAIR(_ZN3ccc7DD1x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y2E[];
extern void _ZN3ccc7DD1x8y23abcEv();
extern void _ZN3ccc7DD1x8y23pqrEv();
extern void _ZN3ccc7DD1x8y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y23efgEv,_ZTv0_n12_N3ccc7DD1x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y23efgEv,_ZThn4_N3ccc7DD1x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y23abcEv,_ZTv0_n16_N3ccc7DD1x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y23abcEv,_ZThn4_N3ccc7DD1x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y23efgEv,_ZTv0_n12_N3ccc7DD1x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y23abcEv,_ZTv0_n16_N3ccc7DD1x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y2E[] = {
  {&(_ZTVN3ccc7DD1x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y2E[];
static VTBL_ENTRY alt_thunk_names676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y23abcEv,_ZTv0_n16_N3ccc7DD1x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y23abcEv,_ZThn4_N3ccc7DD1x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y23efgEv,_ZTv0_n12_N3ccc7DD1x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y23efgEv,_ZThn4_N3ccc7DD1x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y2E = {  "_ZN3ccc7DD1x8y2E", // class name
  bases__ZN3ccc7DD1x8y2E, 2,
  &(vtc__ZN3ccc7DD1x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y2E),3, //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  CC1x8y3  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x8y33abcEv
  ~CC1x8y3(); // tgen
  CC1x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y3E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y33efgEv");}
void  ccc::CC1x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y33pqrEv");}
void  ccc::CC1x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y33abcEv");}
ccc::CC1x8y3 ::~CC1x8y3(){ note_dtor("_ZN3ccc7CC1x8y3E", this);} // tgen
ccc::CC1x8y3 ::CC1x8y3(){ note_ctor("_ZN3ccc7CC1x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y3E, buf);
    ::ccc::CC1x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y3E);
    dp->::ccc::CC1x8y3::~CC1x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y3E(Test__ZN3ccc7CC1x8y3E, "_ZN3ccc7CC1x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y3C1Ev();
extern void _ZN3ccc7CC1x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y3E[] = {
  NSPAIR(_ZN3ccc7CC1x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y3E[];
extern void _ZN3ccc7CC1x8y33efgEv();
extern void _ZN3ccc7CC1x8y33abcEv();
extern void _ZN3ccc7CC1x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y33abcEv,_ZTv0_n12_N3ccc7CC1x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y33abcEv,_ZThn4_N3ccc7CC1x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y33pqrEv,_ZTv0_n16_N3ccc7CC1x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y33pqrEv,_ZThn4_N3ccc7CC1x8y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y33efgEv,_ZTv0_n20_N3ccc7CC1x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y33efgEv,_ZThn4_N3ccc7CC1x8y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y33abcEv,_ZTv0_n12_N3ccc7CC1x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y33pqrEv,_ZTv0_n16_N3ccc7CC1x8y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y33efgEv,_ZTv0_n20_N3ccc7CC1x8y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y3E[] = {
  {&(_ZTVN3ccc7CC1x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y3E[];
static VTBL_ENTRY alt_thunk_names677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y33efgEv,_ZTv0_n20_N3ccc7CC1x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y33efgEv,_ZThn4_N3ccc7CC1x8y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y33pqrEv,_ZTv0_n16_N3ccc7CC1x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y33pqrEv,_ZThn4_N3ccc7CC1x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y33abcEv,_ZTv0_n12_N3ccc7CC1x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y33abcEv,_ZThn4_N3ccc7CC1x8y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y3E = {  "_ZN3ccc7CC1x8y3E", // class name
  bases__ZN3ccc7CC1x8y3E, 2,
  &(vtc__ZN3ccc7CC1x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y3E),2, //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  DD1x8y3  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD1x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x8y33abcEv
  ~DD1x8y3(); // tgen
  DD1x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y33efgEv");}
void  ccc::DD1x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y33pqrEv");}
void  ccc::DD1x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y33abcEv");}
ccc::DD1x8y3 ::~DD1x8y3(){ note_dtor("_ZN3ccc7DD1x8y3E", this);} // tgen
ccc::DD1x8y3 ::DD1x8y3(){ note_ctor("_ZN3ccc7DD1x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y3E, buf);
    ::ccc::DD1x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y3E);
    dp->::ccc::DD1x8y3::~DD1x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y3E(Test__ZN3ccc7DD1x8y3E, "_ZN3ccc7DD1x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y3C1Ev();
extern void _ZN3ccc7DD1x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y3E[] = {
  NSPAIR(_ZN3ccc7DD1x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y3E[];
extern void _ZN3ccc7DD1x8y33abcEv();
extern void _ZN3ccc7DD1x8y33pqrEv();
extern void _ZN3ccc7DD1x8y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y33efgEv,_ZTv0_n12_N3ccc7DD1x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y33efgEv,_ZThn4_N3ccc7DD1x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y33abcEv,_ZTv0_n16_N3ccc7DD1x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y33abcEv,_ZThn4_N3ccc7DD1x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y33efgEv,_ZTv0_n12_N3ccc7DD1x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y33abcEv,_ZTv0_n16_N3ccc7DD1x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y3E[] = {
  {&(_ZTVN3ccc7DD1x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y3E[];
static VTBL_ENTRY alt_thunk_names678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y33abcEv,_ZTv0_n16_N3ccc7DD1x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y33abcEv,_ZThn4_N3ccc7DD1x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y33efgEv,_ZTv0_n12_N3ccc7DD1x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y33efgEv,_ZThn4_N3ccc7DD1x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y3E = {  "_ZN3ccc7DD1x8y3E", // class name
  bases__ZN3ccc7DD1x8y3E, 2,
  &(vtc__ZN3ccc7DD1x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y3E),3, //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  CC1x8y4  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC1x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y43efgEv
  ~CC1x8y4(); // tgen
  CC1x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y4E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y43pqrEv");}
void  ccc::CC1x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y43abcEv");}
void  ccc::CC1x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y43efgEv");}
ccc::CC1x8y4 ::~CC1x8y4(){ note_dtor("_ZN3ccc7CC1x8y4E", this);} // tgen
ccc::CC1x8y4 ::CC1x8y4(){ note_ctor("_ZN3ccc7CC1x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y4E, buf);
    ::ccc::CC1x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y4E);
    dp->::ccc::CC1x8y4::~CC1x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y4E(Test__ZN3ccc7CC1x8y4E, "_ZN3ccc7CC1x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y4C1Ev();
extern void _ZN3ccc7CC1x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y4E[] = {
  NSPAIR(_ZN3ccc7CC1x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y4E[];
extern void _ZN3ccc7CC1x8y43efgEv();
extern void _ZN3ccc7CC1x8y43abcEv();
extern void _ZN3ccc7CC1x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y43abcEv,_ZTv0_n12_N3ccc7CC1x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y43abcEv,_ZThn4_N3ccc7CC1x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y43pqrEv,_ZTv0_n16_N3ccc7CC1x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y43pqrEv,_ZThn4_N3ccc7CC1x8y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y43efgEv,_ZTv0_n20_N3ccc7CC1x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y43efgEv,_ZThn4_N3ccc7CC1x8y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y43abcEv,_ZTv0_n12_N3ccc7CC1x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y43pqrEv,_ZTv0_n16_N3ccc7CC1x8y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y43efgEv,_ZTv0_n20_N3ccc7CC1x8y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y4E[] = {
  {&(_ZTVN3ccc7CC1x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y4E[];
static VTBL_ENTRY alt_thunk_names679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y43efgEv,_ZTv0_n20_N3ccc7CC1x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y43efgEv,_ZThn4_N3ccc7CC1x8y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y43pqrEv,_ZTv0_n16_N3ccc7CC1x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y43pqrEv,_ZThn4_N3ccc7CC1x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y43abcEv,_ZTv0_n12_N3ccc7CC1x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y43abcEv,_ZThn4_N3ccc7CC1x8y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y4E = {  "_ZN3ccc7CC1x8y4E", // class name
  bases__ZN3ccc7CC1x8y4E, 2,
  &(vtc__ZN3ccc7CC1x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y4E),2, //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  DD1x8y4  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD1x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x8y43efgEv
  ~DD1x8y4(); // tgen
  DD1x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y43pqrEv");}
void  ccc::DD1x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y43abcEv");}
void  ccc::DD1x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y43efgEv");}
ccc::DD1x8y4 ::~DD1x8y4(){ note_dtor("_ZN3ccc7DD1x8y4E", this);} // tgen
ccc::DD1x8y4 ::DD1x8y4(){ note_ctor("_ZN3ccc7DD1x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y4E, buf);
    ::ccc::DD1x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y4E);
    dp->::ccc::DD1x8y4::~DD1x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y4E(Test__ZN3ccc7DD1x8y4E, "_ZN3ccc7DD1x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y4C1Ev();
extern void _ZN3ccc7DD1x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y4E[] = {
  NSPAIR(_ZN3ccc7DD1x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y4E[];
extern void _ZN3ccc7DD1x8y43abcEv();
extern void _ZN3ccc7DD1x8y43pqrEv();
extern void _ZN3ccc7DD1x8y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y43efgEv,_ZTv0_n12_N3ccc7DD1x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y43efgEv,_ZThn4_N3ccc7DD1x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y43abcEv,_ZTv0_n16_N3ccc7DD1x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y43abcEv,_ZThn4_N3ccc7DD1x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y43efgEv,_ZTv0_n12_N3ccc7DD1x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y43abcEv,_ZTv0_n16_N3ccc7DD1x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y4E[] = {
  {&(_ZTVN3ccc7DD1x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y4E[];
static VTBL_ENTRY alt_thunk_names680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y43abcEv,_ZTv0_n16_N3ccc7DD1x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y43abcEv,_ZThn4_N3ccc7DD1x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y43efgEv,_ZTv0_n12_N3ccc7DD1x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y43efgEv,_ZThn4_N3ccc7DD1x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y4E = {  "_ZN3ccc7DD1x8y4E", // class name
  bases__ZN3ccc7DD1x8y4E, 2,
  &(vtc__ZN3ccc7DD1x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y4E),3, //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  CC1x8y5  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC1x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y53abcEv
  ~CC1x8y5(); // tgen
  CC1x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y5E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y53pqrEv");}
void  ccc::CC1x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y53efgEv");}
void  ccc::CC1x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y53abcEv");}
ccc::CC1x8y5 ::~CC1x8y5(){ note_dtor("_ZN3ccc7CC1x8y5E", this);} // tgen
ccc::CC1x8y5 ::CC1x8y5(){ note_ctor("_ZN3ccc7CC1x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y5E, buf);
    ::ccc::CC1x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y5E);
    dp->::ccc::CC1x8y5::~CC1x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y5E(Test__ZN3ccc7CC1x8y5E, "_ZN3ccc7CC1x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y5C1Ev();
extern void _ZN3ccc7CC1x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y5E[] = {
  NSPAIR(_ZN3ccc7CC1x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y5E[];
extern void _ZN3ccc7CC1x8y53efgEv();
extern void _ZN3ccc7CC1x8y53abcEv();
extern void _ZN3ccc7CC1x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y53abcEv,_ZTv0_n12_N3ccc7CC1x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y53abcEv,_ZThn4_N3ccc7CC1x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y53pqrEv,_ZTv0_n16_N3ccc7CC1x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y53pqrEv,_ZThn4_N3ccc7CC1x8y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y53efgEv,_ZTv0_n20_N3ccc7CC1x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y53efgEv,_ZThn4_N3ccc7CC1x8y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y53abcEv,_ZTv0_n12_N3ccc7CC1x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y53pqrEv,_ZTv0_n16_N3ccc7CC1x8y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y53efgEv,_ZTv0_n20_N3ccc7CC1x8y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y5E[] = {
  {&(_ZTVN3ccc7CC1x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y5E[];
static VTBL_ENTRY alt_thunk_names681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y53efgEv,_ZTv0_n20_N3ccc7CC1x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y53efgEv,_ZThn4_N3ccc7CC1x8y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y53pqrEv,_ZTv0_n16_N3ccc7CC1x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y53pqrEv,_ZThn4_N3ccc7CC1x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y53abcEv,_ZTv0_n12_N3ccc7CC1x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y53abcEv,_ZThn4_N3ccc7CC1x8y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y5E = {  "_ZN3ccc7CC1x8y5E", // class name
  bases__ZN3ccc7CC1x8y5E, 2,
  &(vtc__ZN3ccc7CC1x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y5E),2, //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  DD1x8y5  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD1x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x8y53abcEv
  ~DD1x8y5(); // tgen
  DD1x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y53pqrEv");}
void  ccc::DD1x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y53efgEv");}
void  ccc::DD1x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y53abcEv");}
ccc::DD1x8y5 ::~DD1x8y5(){ note_dtor("_ZN3ccc7DD1x8y5E", this);} // tgen
ccc::DD1x8y5 ::DD1x8y5(){ note_ctor("_ZN3ccc7DD1x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y5E, buf);
    ::ccc::DD1x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y5E);
    dp->::ccc::DD1x8y5::~DD1x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y5E(Test__ZN3ccc7DD1x8y5E, "_ZN3ccc7DD1x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y5C1Ev();
extern void _ZN3ccc7DD1x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y5E[] = {
  NSPAIR(_ZN3ccc7DD1x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y5E[];
extern void _ZN3ccc7DD1x8y53abcEv();
extern void _ZN3ccc7DD1x8y53pqrEv();
extern void _ZN3ccc7DD1x8y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y53efgEv,_ZTv0_n12_N3ccc7DD1x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y53efgEv,_ZThn4_N3ccc7DD1x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y53abcEv,_ZTv0_n16_N3ccc7DD1x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y53abcEv,_ZThn4_N3ccc7DD1x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y53efgEv,_ZTv0_n12_N3ccc7DD1x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y53abcEv,_ZTv0_n16_N3ccc7DD1x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y5E[] = {
  {&(_ZTVN3ccc7DD1x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y5E[];
static VTBL_ENTRY alt_thunk_names682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y53abcEv,_ZTv0_n16_N3ccc7DD1x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y53abcEv,_ZThn4_N3ccc7DD1x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y53efgEv,_ZTv0_n12_N3ccc7DD1x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y53efgEv,_ZThn4_N3ccc7DD1x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y5E = {  "_ZN3ccc7DD1x8y5E", // class name
  bases__ZN3ccc7DD1x8y5E, 2,
  &(vtc__ZN3ccc7DD1x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y5E),3, //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  CC1x8y6  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y63efgEv
  ~CC1x8y6(); // tgen
  CC1x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y6E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y63abcEv");}
void  ccc::CC1x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y63efgEv");}
ccc::CC1x8y6 ::~CC1x8y6(){ note_dtor("_ZN3ccc7CC1x8y6E", this);} // tgen
ccc::CC1x8y6 ::CC1x8y6(){ note_ctor("_ZN3ccc7CC1x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y6E, buf);
    ::ccc::CC1x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y6E);
    dp->::ccc::CC1x8y6::~CC1x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y6E(Test__ZN3ccc7CC1x8y6E, "_ZN3ccc7CC1x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y6C1Ev();
extern void _ZN3ccc7CC1x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y6E[] = {
  NSPAIR(_ZN3ccc7CC1x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y6E[];
extern void _ZN3ccc7CC1x8y63efgEv();
extern void _ZN3ccc7CC1x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y63abcEv,_ZTv0_n12_N3ccc7CC1x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y63abcEv,_ZThn4_N3ccc7CC1x8y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y63efgEv,_ZTv0_n20_N3ccc7CC1x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y63efgEv,_ZThn4_N3ccc7CC1x8y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y63abcEv,_ZTv0_n12_N3ccc7CC1x8y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y63efgEv,_ZTv0_n20_N3ccc7CC1x8y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y6E[] = {
  {&(_ZTVN3ccc7CC1x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y6E[];
static VTBL_ENTRY alt_thunk_names683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y63efgEv,_ZTv0_n20_N3ccc7CC1x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y63efgEv,_ZThn4_N3ccc7CC1x8y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y63abcEv,_ZTv0_n12_N3ccc7CC1x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y63abcEv,_ZThn4_N3ccc7CC1x8y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y6E = {  "_ZN3ccc7CC1x8y6E", // class name
  bases__ZN3ccc7CC1x8y6E, 2,
  &(vtc__ZN3ccc7CC1x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y6E),2, //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  DD1x8y6  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD1x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x8y63efgEv
  ~DD1x8y6(); // tgen
  DD1x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y63abcEv");}
void  ccc::DD1x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y63efgEv");}
ccc::DD1x8y6 ::~DD1x8y6(){ note_dtor("_ZN3ccc7DD1x8y6E", this);} // tgen
ccc::DD1x8y6 ::DD1x8y6(){ note_ctor("_ZN3ccc7DD1x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y6E, buf);
    ::ccc::DD1x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y6E);
    dp->::ccc::DD1x8y6::~DD1x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y6E(Test__ZN3ccc7DD1x8y6E, "_ZN3ccc7DD1x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y6C1Ev();
extern void _ZN3ccc7DD1x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y6E[] = {
  NSPAIR(_ZN3ccc7DD1x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y6E[];
extern void _ZN3ccc7DD1x8y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x8y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y63efgEv,_ZTv0_n12_N3ccc7DD1x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y63efgEv,_ZThn4_N3ccc7DD1x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y63abcEv,_ZTv0_n16_N3ccc7DD1x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y63abcEv,_ZThn4_N3ccc7DD1x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y63efgEv,_ZTv0_n12_N3ccc7DD1x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y63abcEv,_ZTv0_n16_N3ccc7DD1x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y6E[] = {
  {&(_ZTVN3ccc7DD1x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y6E[];
static VTBL_ENTRY alt_thunk_names684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y63abcEv,_ZTv0_n16_N3ccc7DD1x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y63abcEv,_ZThn4_N3ccc7DD1x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y63efgEv,_ZTv0_n12_N3ccc7DD1x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y63efgEv,_ZThn4_N3ccc7DD1x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y6E = {  "_ZN3ccc7DD1x8y6E", // class name
  bases__ZN3ccc7DD1x8y6E, 2,
  &(vtc__ZN3ccc7DD1x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y6E),3, //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  CC1x8y7  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y73pqrEv
  ~CC1x8y7(); // tgen
  CC1x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y7E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y73abcEv");}
void  ccc::CC1x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y73pqrEv");}
ccc::CC1x8y7 ::~CC1x8y7(){ note_dtor("_ZN3ccc7CC1x8y7E", this);} // tgen
ccc::CC1x8y7 ::CC1x8y7(){ note_ctor("_ZN3ccc7CC1x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y7E, buf);
    ::ccc::CC1x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y7E);
    dp->::ccc::CC1x8y7::~CC1x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y7E(Test__ZN3ccc7CC1x8y7E, "_ZN3ccc7CC1x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y7C1Ev();
extern void _ZN3ccc7CC1x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y7E[] = {
  NSPAIR(_ZN3ccc7CC1x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC1x8y73abcEv();
extern void _ZN3ccc7CC1x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y73abcEv,_ZTv0_n12_N3ccc7CC1x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y73abcEv,_ZThn4_N3ccc7CC1x8y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y73pqrEv,_ZTv0_n16_N3ccc7CC1x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y73pqrEv,_ZThn4_N3ccc7CC1x8y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y73abcEv,_ZTv0_n12_N3ccc7CC1x8y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y73pqrEv,_ZTv0_n16_N3ccc7CC1x8y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y7E[] = {
  {&(_ZTVN3ccc7CC1x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y7E[];
static VTBL_ENTRY alt_thunk_names685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y73pqrEv,_ZTv0_n16_N3ccc7CC1x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y73pqrEv,_ZThn4_N3ccc7CC1x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y73abcEv,_ZTv0_n12_N3ccc7CC1x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y73abcEv,_ZThn4_N3ccc7CC1x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y7E = {  "_ZN3ccc7CC1x8y7E", // class name
  bases__ZN3ccc7CC1x8y7E, 2,
  &(vtc__ZN3ccc7CC1x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y7E),2, //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  DD1x8y7  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD1x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y73pqrEv
  ~DD1x8y7(); // tgen
  DD1x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y73abcEv");}
void  ccc::DD1x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y73pqrEv");}
ccc::DD1x8y7 ::~DD1x8y7(){ note_dtor("_ZN3ccc7DD1x8y7E", this);} // tgen
ccc::DD1x8y7 ::DD1x8y7(){ note_ctor("_ZN3ccc7DD1x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y7E, buf);
    ::ccc::DD1x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y7E);
    dp->::ccc::DD1x8y7::~DD1x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y7E(Test__ZN3ccc7DD1x8y7E, "_ZN3ccc7DD1x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y7C1Ev();
extern void _ZN3ccc7DD1x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y7E[] = {
  NSPAIR(_ZN3ccc7DD1x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y7E[];
extern void _ZN3ccc7DD1x8y73abcEv();
extern void _ZN3ccc7DD1x8y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y73abcEv,_ZTv0_n16_N3ccc7DD1x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y73abcEv,_ZThn4_N3ccc7DD1x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y73abcEv,_ZTv0_n16_N3ccc7DD1x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y7E[] = {
  {&(_ZTVN3ccc7DD1x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y7E[];
static VTBL_ENTRY alt_thunk_names686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y73abcEv,_ZTv0_n16_N3ccc7DD1x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y73abcEv,_ZThn4_N3ccc7DD1x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y7E = {  "_ZN3ccc7DD1x8y7E", // class name
  bases__ZN3ccc7DD1x8y7E, 2,
  &(vtc__ZN3ccc7DD1x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y7E),3, //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  CC1x8y8  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y83abcEv
  ~CC1x8y8(); // tgen
  CC1x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y8E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y83efgEv");}
void  ccc::CC1x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y83abcEv");}
ccc::CC1x8y8 ::~CC1x8y8(){ note_dtor("_ZN3ccc7CC1x8y8E", this);} // tgen
ccc::CC1x8y8 ::CC1x8y8(){ note_ctor("_ZN3ccc7CC1x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y8E, buf);
    ::ccc::CC1x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y8E);
    dp->::ccc::CC1x8y8::~CC1x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y8E(Test__ZN3ccc7CC1x8y8E, "_ZN3ccc7CC1x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y8C1Ev();
extern void _ZN3ccc7CC1x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y8E[] = {
  NSPAIR(_ZN3ccc7CC1x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y8E[];
extern void _ZN3ccc7CC1x8y83efgEv();
extern void _ZN3ccc7CC1x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x8y83abcEv,_ZTv0_n12_N3ccc7CC1x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y83abcEv,_ZThn4_N3ccc7CC1x8y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y83efgEv,_ZTv0_n20_N3ccc7CC1x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y83efgEv,_ZThn4_N3ccc7CC1x8y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x8y83abcEv,_ZTv0_n12_N3ccc7CC1x8y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y83efgEv,_ZTv0_n20_N3ccc7CC1x8y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y8E[] = {
  {&(_ZTVN3ccc7CC1x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y8E[];
static VTBL_ENTRY alt_thunk_names687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y83efgEv,_ZTv0_n20_N3ccc7CC1x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y83efgEv,_ZThn4_N3ccc7CC1x8y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x8y83abcEv,_ZTv0_n12_N3ccc7CC1x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y83abcEv,_ZThn4_N3ccc7CC1x8y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y8E = {  "_ZN3ccc7CC1x8y8E", // class name
  bases__ZN3ccc7CC1x8y8E, 2,
  &(vtc__ZN3ccc7CC1x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y8E),2, //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  DD1x8y8  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD1x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x8y83abcEv
  ~DD1x8y8(); // tgen
  DD1x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y83efgEv");}
void  ccc::DD1x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x8y83abcEv");}
ccc::DD1x8y8 ::~DD1x8y8(){ note_dtor("_ZN3ccc7DD1x8y8E", this);} // tgen
ccc::DD1x8y8 ::DD1x8y8(){ note_ctor("_ZN3ccc7DD1x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y8E, buf);
    ::ccc::DD1x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y8E);
    dp->::ccc::DD1x8y8::~DD1x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y8E(Test__ZN3ccc7DD1x8y8E, "_ZN3ccc7DD1x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y8C1Ev();
extern void _ZN3ccc7DD1x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y8E[] = {
  NSPAIR(_ZN3ccc7DD1x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y8E[];
extern void _ZN3ccc7DD1x8y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x8y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y83efgEv,_ZTv0_n12_N3ccc7DD1x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y83efgEv,_ZThn4_N3ccc7DD1x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x8y83abcEv,_ZTv0_n16_N3ccc7DD1x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y83abcEv,_ZThn4_N3ccc7DD1x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y83efgEv,_ZTv0_n12_N3ccc7DD1x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x8y83abcEv,_ZTv0_n16_N3ccc7DD1x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y8E[] = {
  {&(_ZTVN3ccc7DD1x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y8E[];
static VTBL_ENTRY alt_thunk_names688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x8y83abcEv,_ZTv0_n16_N3ccc7DD1x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y83abcEv,_ZThn4_N3ccc7DD1x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y83efgEv,_ZTv0_n12_N3ccc7DD1x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y83efgEv,_ZThn4_N3ccc7DD1x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y8E = {  "_ZN3ccc7DD1x8y8E", // class name
  bases__ZN3ccc7DD1x8y8E, 2,
  &(vtc__ZN3ccc7DD1x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y8E),3, //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  CC1x8y9  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y93pqrEv
  ~CC1x8y9(); // tgen
  CC1x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y9E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y93efgEv");}
void  ccc::CC1x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y93pqrEv");}
ccc::CC1x8y9 ::~CC1x8y9(){ note_dtor("_ZN3ccc7CC1x8y9E", this);} // tgen
ccc::CC1x8y9 ::CC1x8y9(){ note_ctor("_ZN3ccc7CC1x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y9E, buf);
    ::ccc::CC1x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC1x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y9E);
    dp->::ccc::CC1x8y9::~CC1x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y9E(Test__ZN3ccc7CC1x8y9E, "_ZN3ccc7CC1x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y9C1Ev();
extern void _ZN3ccc7CC1x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y9E[] = {
  NSPAIR(_ZN3ccc7CC1x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y9E[];
extern void _ZN3ccc7CC1x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC1x8y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x8y93pqrEv,_ZTv0_n16_N3ccc7CC1x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y93pqrEv,_ZThn4_N3ccc7CC1x8y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x8y93efgEv,_ZTv0_n20_N3ccc7CC1x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y93efgEv,_ZThn4_N3ccc7CC1x8y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x8y93pqrEv,_ZTv0_n16_N3ccc7CC1x8y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x8y93efgEv,_ZTv0_n20_N3ccc7CC1x8y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x8y9E[] = {
  {&(_ZTVN3ccc7CC1x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x8y9E[];
static VTBL_ENTRY alt_thunk_names689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x8y93efgEv,_ZTv0_n20_N3ccc7CC1x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y93efgEv,_ZThn4_N3ccc7CC1x8y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x8y93pqrEv,_ZTv0_n16_N3ccc7CC1x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x8y93pqrEv,_ZThn4_N3ccc7CC1x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x8y9E = {  "_ZN3ccc7CC1x8y9E", // class name
  bases__ZN3ccc7CC1x8y9E, 2,
  &(vtc__ZN3ccc7CC1x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x8y9E),2, //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  DD1x8y9  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD1x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x8y93pqrEv
  ~DD1x8y9(); // tgen
  DD1x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x8y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x8y93efgEv");}
void  ccc::DD1x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x8y93pqrEv");}
ccc::DD1x8y9 ::~DD1x8y9(){ note_dtor("_ZN3ccc7DD1x8y9E", this);} // tgen
ccc::DD1x8y9 ::DD1x8y9(){ note_ctor("_ZN3ccc7DD1x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x8y9E, buf);
    ::ccc::DD1x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x8y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD1x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x8y9E);
    dp->::ccc::DD1x8y9::~DD1x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x8y9E(Test__ZN3ccc7DD1x8y9E, "_ZN3ccc7DD1x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x8y9C1Ev();
extern void _ZN3ccc7DD1x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x8y9E[] = {
  NSPAIR(_ZN3ccc7DD1x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD1x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x8y93pqrEv();
extern void _ZN3ccc7DD1x8y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x8y93efgEv,_ZTv0_n12_N3ccc7DD1x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x8y93efgEv,_ZThn4_N3ccc7DD1x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x8y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x8y93efgEv,_ZTv0_n12_N3ccc7DD1x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x8y9E[] = {
  {&(_ZTVN3ccc7DD1x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x8y9E[];
static VTBL_ENTRY alt_thunk_names690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x8y93efgEv,_ZTv0_n12_N3ccc7DD1x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x8y93efgEv,_ZThn4_N3ccc7DD1x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x8y9E = {  "_ZN3ccc7DD1x8y9E", // class name
  bases__ZN3ccc7DD1x8y9E, 2,
  &(vtc__ZN3ccc7DD1x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x8y9E),3, //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  CC1x8y10  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x8y103abcEv
  ~CC1x8y10(); // tgen
  CC1x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y10E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y103pqrEv");}
void  ccc::CC1x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x8y103abcEv");}
ccc::CC1x8y10 ::~CC1x8y10(){ note_dtor("_ZN3ccc8CC1x8y10E", this);} // tgen
ccc::CC1x8y10 ::CC1x8y10(){ note_ctor("_ZN3ccc8CC1x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y10E, buf);
    ::ccc::CC1x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y10E);
    dp->::ccc::CC1x8y10::~CC1x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y10E(Test__ZN3ccc8CC1x8y10E, "_ZN3ccc8CC1x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y10C1Ev();
extern void _ZN3ccc8CC1x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y10E[] = {
  NSPAIR(_ZN3ccc8CC1x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC1x8y103abcEv();
extern void _ZN3ccc8CC1x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x8y103abcEv,_ZTv0_n12_N3ccc8CC1x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y103abcEv,_ZThn4_N3ccc8CC1x8y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x8y103pqrEv,_ZTv0_n16_N3ccc8CC1x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y103pqrEv,_ZThn4_N3ccc8CC1x8y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x8y103abcEv,_ZTv0_n12_N3ccc8CC1x8y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x8y103pqrEv,_ZTv0_n16_N3ccc8CC1x8y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y10E[] = {
  {&(_ZTVN3ccc8CC1x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y10E[];
static VTBL_ENTRY alt_thunk_names691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x8y103pqrEv,_ZTv0_n16_N3ccc8CC1x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y103pqrEv,_ZThn4_N3ccc8CC1x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x8y103abcEv,_ZTv0_n12_N3ccc8CC1x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y103abcEv,_ZThn4_N3ccc8CC1x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x8y10E = {  "_ZN3ccc8CC1x8y10E", // class name
  bases__ZN3ccc8CC1x8y10E, 2,
  &(vtc__ZN3ccc8CC1x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y10E),2, //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  DD1x8y10  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD1x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x8y103abcEv
  ~DD1x8y10(); // tgen
  DD1x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x8y103pqrEv");}
void  ccc::DD1x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x8y103abcEv");}
ccc::DD1x8y10 ::~DD1x8y10(){ note_dtor("_ZN3ccc8DD1x8y10E", this);} // tgen
ccc::DD1x8y10 ::DD1x8y10(){ note_ctor("_ZN3ccc8DD1x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y10E, buf);
    ::ccc::DD1x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y10E);
    dp->::ccc::DD1x8y10::~DD1x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y10E(Test__ZN3ccc8DD1x8y10E, "_ZN3ccc8DD1x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y10C1Ev();
extern void _ZN3ccc8DD1x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y10E[] = {
  NSPAIR(_ZN3ccc8DD1x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y10E[];
extern void _ZN3ccc8DD1x8y103abcEv();
extern void _ZN3ccc8DD1x8y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x8y103abcEv,_ZTv0_n16_N3ccc8DD1x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x8y103abcEv,_ZThn4_N3ccc8DD1x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x8y103abcEv,_ZTv0_n16_N3ccc8DD1x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y10E[] = {
  {&(_ZTVN3ccc8DD1x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y10E[];
static VTBL_ENTRY alt_thunk_names692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x8y103abcEv,_ZTv0_n16_N3ccc8DD1x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x8y103abcEv,_ZThn4_N3ccc8DD1x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x8y10E = {  "_ZN3ccc8DD1x8y10E", // class name
  bases__ZN3ccc8DD1x8y10E, 2,
  &(vtc__ZN3ccc8DD1x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y10E),3, //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  CC1x8y11  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x8y113efgEv
  ~CC1x8y11(); // tgen
  CC1x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y11E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y113pqrEv");}
void  ccc::CC1x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x8y113efgEv");}
ccc::CC1x8y11 ::~CC1x8y11(){ note_dtor("_ZN3ccc8CC1x8y11E", this);} // tgen
ccc::CC1x8y11 ::CC1x8y11(){ note_ctor("_ZN3ccc8CC1x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y11E, buf);
    ::ccc::CC1x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y11E);
    dp->::ccc::CC1x8y11::~CC1x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y11E(Test__ZN3ccc8CC1x8y11E, "_ZN3ccc8CC1x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y11C1Ev();
extern void _ZN3ccc8CC1x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y11E[] = {
  NSPAIR(_ZN3ccc8CC1x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y11E[];
extern void _ZN3ccc8CC1x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC1x8y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x8y113pqrEv,_ZTv0_n16_N3ccc8CC1x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y113pqrEv,_ZThn4_N3ccc8CC1x8y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x8y113efgEv,_ZTv0_n20_N3ccc8CC1x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y113efgEv,_ZThn4_N3ccc8CC1x8y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x8y113pqrEv,_ZTv0_n16_N3ccc8CC1x8y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x8y113efgEv,_ZTv0_n20_N3ccc8CC1x8y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y11E[] = {
  {&(_ZTVN3ccc8CC1x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y11E[];
static VTBL_ENTRY alt_thunk_names693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x8y113efgEv,_ZTv0_n20_N3ccc8CC1x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y113efgEv,_ZThn4_N3ccc8CC1x8y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x8y113pqrEv,_ZTv0_n16_N3ccc8CC1x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y113pqrEv,_ZThn4_N3ccc8CC1x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x8y11E = {  "_ZN3ccc8CC1x8y11E", // class name
  bases__ZN3ccc8CC1x8y11E, 2,
  &(vtc__ZN3ccc8CC1x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y11E),2, //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  DD1x8y11  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD1x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x8y113efgEv
  ~DD1x8y11(); // tgen
  DD1x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x8y113pqrEv");}
void  ccc::DD1x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x8y113efgEv");}
ccc::DD1x8y11 ::~DD1x8y11(){ note_dtor("_ZN3ccc8DD1x8y11E", this);} // tgen
ccc::DD1x8y11 ::DD1x8y11(){ note_ctor("_ZN3ccc8DD1x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y11E, buf);
    ::ccc::DD1x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y11E);
    dp->::ccc::DD1x8y11::~DD1x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y11E(Test__ZN3ccc8DD1x8y11E, "_ZN3ccc8DD1x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y11C1Ev();
extern void _ZN3ccc8DD1x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y11E[] = {
  NSPAIR(_ZN3ccc8DD1x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x8y113pqrEv();
extern void _ZN3ccc8DD1x8y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x8y113efgEv,_ZTv0_n12_N3ccc8DD1x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x8y113efgEv,_ZThn4_N3ccc8DD1x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x8y113efgEv,_ZTv0_n12_N3ccc8DD1x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y11E[] = {
  {&(_ZTVN3ccc8DD1x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y11E[];
static VTBL_ENTRY alt_thunk_names694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x8y113efgEv,_ZTv0_n12_N3ccc8DD1x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x8y113efgEv,_ZThn4_N3ccc8DD1x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x8y11E = {  "_ZN3ccc8DD1x8y11E", // class name
  bases__ZN3ccc8DD1x8y11E, 2,
  &(vtc__ZN3ccc8DD1x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y11E),3, //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  CC1x8y12  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC1x8y123abcEv
  ~CC1x8y12(); // tgen
  CC1x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x8y123abcEv");}
ccc::CC1x8y12 ::~CC1x8y12(){ note_dtor("_ZN3ccc8CC1x8y12E", this);} // tgen
ccc::CC1x8y12 ::CC1x8y12(){ note_ctor("_ZN3ccc8CC1x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y12E, buf);
    ::ccc::CC1x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y12E);
    dp->::ccc::CC1x8y12::~CC1x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y12E(Test__ZN3ccc8CC1x8y12E, "_ZN3ccc8CC1x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y12C1Ev();
extern void _ZN3ccc8CC1x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y12E[] = {
  NSPAIR(_ZN3ccc8CC1x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC1x8y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x8y123abcEv,_ZTv0_n12_N3ccc8CC1x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y123abcEv,_ZThn4_N3ccc8CC1x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x8y123abcEv,_ZTv0_n12_N3ccc8CC1x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y12E[] = {
  {&(_ZTVN3ccc8CC1x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y12E[];
static VTBL_ENTRY alt_thunk_names695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x8y123abcEv,_ZTv0_n12_N3ccc8CC1x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y123abcEv,_ZThn4_N3ccc8CC1x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x8y12E = {  "_ZN3ccc8CC1x8y12E", // class name
  bases__ZN3ccc8CC1x8y12E, 2,
  &(vtc__ZN3ccc8CC1x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y12E),2, //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  DD1x8y12  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD1x8y123abcEv
  ~DD1x8y12(); // tgen
  DD1x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x8y123abcEv");}
ccc::DD1x8y12 ::~DD1x8y12(){ note_dtor("_ZN3ccc8DD1x8y12E", this);} // tgen
ccc::DD1x8y12 ::DD1x8y12(){ note_ctor("_ZN3ccc8DD1x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y12E, buf);
    ::ccc::DD1x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y12E);
    dp->::ccc::DD1x8y12::~DD1x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y12E(Test__ZN3ccc8DD1x8y12E, "_ZN3ccc8DD1x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y12C1Ev();
extern void _ZN3ccc8DD1x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y12E[] = {
  NSPAIR(_ZN3ccc8DD1x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y12E[];
extern void _ZN3ccc8DD1x8y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x8y123abcEv,_ZTv0_n16_N3ccc8DD1x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x8y123abcEv,_ZThn4_N3ccc8DD1x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x8y123abcEv,_ZTv0_n16_N3ccc8DD1x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y12E[] = {
  {&(_ZTVN3ccc8DD1x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y12E[];
static VTBL_ENTRY alt_thunk_names696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x8y123abcEv,_ZTv0_n16_N3ccc8DD1x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x8y123abcEv,_ZThn4_N3ccc8DD1x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x8y12E = {  "_ZN3ccc8DD1x8y12E", // class name
  bases__ZN3ccc8DD1x8y12E, 2,
  &(vtc__ZN3ccc8DD1x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y12E),3, //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  CC1x8y13  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC1x8y133efgEv
  ~CC1x8y13(); // tgen
  CC1x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x8y133efgEv");}
ccc::CC1x8y13 ::~CC1x8y13(){ note_dtor("_ZN3ccc8CC1x8y13E", this);} // tgen
ccc::CC1x8y13 ::CC1x8y13(){ note_ctor("_ZN3ccc8CC1x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y13E, buf);
    ::ccc::CC1x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y13E);
    dp->::ccc::CC1x8y13::~CC1x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y13E(Test__ZN3ccc8CC1x8y13E, "_ZN3ccc8CC1x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y13C1Ev();
extern void _ZN3ccc8CC1x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y13E[] = {
  NSPAIR(_ZN3ccc8CC1x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y13E[];
extern void _ZN3ccc8CC1x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x8y133efgEv,_ZTv0_n20_N3ccc8CC1x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y133efgEv,_ZThn4_N3ccc8CC1x8y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x8y133efgEv,_ZTv0_n20_N3ccc8CC1x8y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y13E[] = {
  {&(_ZTVN3ccc8CC1x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y13E[];
static VTBL_ENTRY alt_thunk_names697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x8y133efgEv,_ZTv0_n20_N3ccc8CC1x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y133efgEv,_ZThn4_N3ccc8CC1x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x8y13E = {  "_ZN3ccc8CC1x8y13E", // class name
  bases__ZN3ccc8CC1x8y13E, 2,
  &(vtc__ZN3ccc8CC1x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y13E),2, //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  DD1x8y13  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD1x8y133efgEv
  ~DD1x8y13(); // tgen
  DD1x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x8y133efgEv");}
ccc::DD1x8y13 ::~DD1x8y13(){ note_dtor("_ZN3ccc8DD1x8y13E", this);} // tgen
ccc::DD1x8y13 ::DD1x8y13(){ note_ctor("_ZN3ccc8DD1x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y13E, buf);
    ::ccc::DD1x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y13E);
    dp->::ccc::DD1x8y13::~DD1x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y13E(Test__ZN3ccc8DD1x8y13E, "_ZN3ccc8DD1x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y13C1Ev();
extern void _ZN3ccc8DD1x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y13E[] = {
  NSPAIR(_ZN3ccc8DD1x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x8y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x8y133efgEv,_ZTv0_n12_N3ccc8DD1x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x8y133efgEv,_ZThn4_N3ccc8DD1x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x8y133efgEv,_ZTv0_n12_N3ccc8DD1x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y13E[] = {
  {&(_ZTVN3ccc8DD1x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y13E[];
static VTBL_ENTRY alt_thunk_names698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x8y133efgEv,_ZTv0_n12_N3ccc8DD1x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x8y133efgEv,_ZThn4_N3ccc8DD1x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x8y13E = {  "_ZN3ccc8DD1x8y13E", // class name
  bases__ZN3ccc8DD1x8y13E, 2,
  &(vtc__ZN3ccc8DD1x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y13E),3, //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  CC1x8y14  : virtual ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y143pqrEv
  ~CC1x8y14(); // tgen
  CC1x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y143pqrEv");}
ccc::CC1x8y14 ::~CC1x8y14(){ note_dtor("_ZN3ccc8CC1x8y14E", this);} // tgen
ccc::CC1x8y14 ::CC1x8y14(){ note_ctor("_ZN3ccc8CC1x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y14E, buf);
    ::ccc::CC1x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y14E);
    dp->::ccc::CC1x8y14::~CC1x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y14E(Test__ZN3ccc8CC1x8y14E, "_ZN3ccc8CC1x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y14C1Ev();
extern void _ZN3ccc8CC1x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y14E[] = {
  NSPAIR(_ZN3ccc8CC1x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC1x8y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x8y143pqrEv,_ZTv0_n16_N3ccc8CC1x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y143pqrEv,_ZThn4_N3ccc8CC1x8y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x8y143pqrEv,_ZTv0_n16_N3ccc8CC1x8y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y14E[] = {
  {&(_ZTVN3ccc8CC1x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y14E[];
static VTBL_ENTRY alt_thunk_names699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x8y143pqrEv,_ZTv0_n16_N3ccc8CC1x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x8y143pqrEv,_ZThn4_N3ccc8CC1x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x8y14E = {  "_ZN3ccc8CC1x8y14E", // class name
  bases__ZN3ccc8CC1x8y14E, 2,
  &(vtc__ZN3ccc8CC1x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y14E),2, //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  DD1x8y14  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD1x8y143pqrEv
  ~DD1x8y14(); // tgen
  DD1x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x8y143pqrEv");}
ccc::DD1x8y14 ::~DD1x8y14(){ note_dtor("_ZN3ccc8DD1x8y14E", this);} // tgen
ccc::DD1x8y14 ::DD1x8y14(){ note_ctor("_ZN3ccc8DD1x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y14E, buf);
    ::ccc::DD1x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y14E);
    dp->::ccc::DD1x8y14::~DD1x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y14E(Test__ZN3ccc8DD1x8y14E, "_ZN3ccc8DD1x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y14C1Ev();
extern void _ZN3ccc8DD1x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y14E[] = {
  NSPAIR(_ZN3ccc8DD1x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x8y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y14E[] = {
  {&(_ZTVN3ccc8DD1x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y14E[];
Class_Descriptor cd__ZN3ccc8DD1x8y14E = {  "_ZN3ccc8DD1x8y14E", // class name
  bases__ZN3ccc8DD1x8y14E, 2,
  &(vtc__ZN3ccc8DD1x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y15  : virtual ::ccc::AA1 , ::ccc::BB8 {
  ~CC1x8y15(); // tgen
  CC1x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x8y15 ::~CC1x8y15(){ note_dtor("_ZN3ccc8CC1x8y15E", this);} // tgen
ccc::CC1x8y15 ::CC1x8y15(){ note_ctor("_ZN3ccc8CC1x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y15E, buf);
    ::ccc::CC1x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC1x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y15E);
    dp->::ccc::CC1x8y15::~CC1x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y15E(Test__ZN3ccc8CC1x8y15E, "_ZN3ccc8CC1x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y15C1Ev();
extern void _ZN3ccc8CC1x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y15E[] = {
  NSPAIR(_ZN3ccc8CC1x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x8y15E[] = {
  {&(_ZTVN3ccc8CC1x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x8y15E[];
Class_Descriptor cd__ZN3ccc8CC1x8y15E = {  "_ZN3ccc8CC1x8y15E", // class name
  bases__ZN3ccc8CC1x8y15E, 2,
  &(vtc__ZN3ccc8CC1x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x8y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x8y15  : virtual ::ccc::AA1 , virtual ::ccc::BB8 {
  ~DD1x8y15(); // tgen
  DD1x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x8y15 ::~DD1x8y15(){ note_dtor("_ZN3ccc8DD1x8y15E", this);} // tgen
ccc::DD1x8y15 ::DD1x8y15(){ note_ctor("_ZN3ccc8DD1x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x8y15E, buf);
    ::ccc::DD1x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x8y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD1x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x8y15E);
    dp->::ccc::DD1x8y15::~DD1x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x8y15E(Test__ZN3ccc8DD1x8y15E, "_ZN3ccc8DD1x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x8y15C1Ev();
extern void _ZN3ccc8DD1x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x8y15E[] = {
  NSPAIR(_ZN3ccc8DD1x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD1x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x8y15E[] = {
  {&(_ZTVN3ccc8DD1x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x8y15E[];
Class_Descriptor cd__ZN3ccc8DD1x8y15E = {  "_ZN3ccc8DD1x8y15E", // class name
  bases__ZN3ccc8DD1x8y15E, 2,
  &(vtc__ZN3ccc8DD1x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x8y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y0  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y03pqrEv
  ~CC1x9y0(); // tgen
  CC1x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y0E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y03abcEv");}
void  ccc::CC1x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y03efgEv");}
void  ccc::CC1x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y03pqrEv");}
ccc::CC1x9y0 ::~CC1x9y0(){ note_dtor("_ZN3ccc7CC1x9y0E", this);} // tgen
ccc::CC1x9y0 ::CC1x9y0(){ note_ctor("_ZN3ccc7CC1x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y0E, buf);
    ::ccc::CC1x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y0E);
    dp->::ccc::CC1x9y0::~CC1x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y0E(Test__ZN3ccc7CC1x9y0E, "_ZN3ccc7CC1x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y0C1Ev();
extern void _ZN3ccc7CC1x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y0E[] = {
  NSPAIR(_ZN3ccc7CC1x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y0E[];
extern void _ZN3ccc7CC1x9y03efgEv();
extern void _ZN3ccc7CC1x9y03pqrEv();
extern void _ZN3ccc7CC1x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y03abcEv,_ZTv0_n12_N3ccc7CC1x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y03abcEv,_ZThn4_N3ccc7CC1x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y03pqrEv,_ZTv0_n16_N3ccc7CC1x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y03pqrEv,_ZThn4_N3ccc7CC1x9y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y03efgEv,_ZTv0_n20_N3ccc7CC1x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y03efgEv,_ZThn4_N3ccc7CC1x9y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y03abcEv,_ZTv0_n12_N3ccc7CC1x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y03pqrEv,_ZTv0_n16_N3ccc7CC1x9y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y03efgEv,_ZTv0_n20_N3ccc7CC1x9y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y0E[] = {
  {&(_ZTVN3ccc7CC1x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y0E[];
static VTBL_ENTRY alt_thunk_names700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y03efgEv,_ZTv0_n20_N3ccc7CC1x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y03efgEv,_ZThn4_N3ccc7CC1x9y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y03pqrEv,_ZTv0_n16_N3ccc7CC1x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y03pqrEv,_ZThn4_N3ccc7CC1x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y03abcEv,_ZTv0_n12_N3ccc7CC1x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y03abcEv,_ZThn4_N3ccc7CC1x9y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y0E = {  "_ZN3ccc7CC1x9y0E", // class name
  bases__ZN3ccc7CC1x9y0E, 2,
  &(vtc__ZN3ccc7CC1x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y0E),2, //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  DD1x9y0  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD1x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD1x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y03pqrEv
  ~DD1x9y0(); // tgen
  DD1x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y03abcEv");}
void  ccc::DD1x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y03efgEv");}
void  ccc::DD1x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y03pqrEv");}
ccc::DD1x9y0 ::~DD1x9y0(){ note_dtor("_ZN3ccc7DD1x9y0E", this);} // tgen
ccc::DD1x9y0 ::DD1x9y0(){ note_ctor("_ZN3ccc7DD1x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y0E, buf);
    ::ccc::DD1x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y0E);
    dp->::ccc::DD1x9y0::~DD1x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y0E(Test__ZN3ccc7DD1x9y0E, "_ZN3ccc7DD1x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y0C1Ev();
extern void _ZN3ccc7DD1x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y0E[] = {
  NSPAIR(_ZN3ccc7DD1x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y0E[];
extern void _ZN3ccc7DD1x9y03abcEv();
extern void _ZN3ccc7DD1x9y03pqrEv();
extern void _ZN3ccc7DD1x9y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y03efgEv,_ZTv0_n12_N3ccc7DD1x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y03efgEv,_ZThn4_N3ccc7DD1x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y03pqrEv,_ZTv0_n16_N3ccc7DD1x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y03pqrEv,_ZThn4_N3ccc7DD1x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y03efgEv,_ZTv0_n12_N3ccc7DD1x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y03pqrEv,_ZTv0_n16_N3ccc7DD1x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y0E[] = {
  {&(_ZTVN3ccc7DD1x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y0E[];
static VTBL_ENTRY alt_thunk_names701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y03pqrEv,_ZTv0_n16_N3ccc7DD1x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y03pqrEv,_ZThn4_N3ccc7DD1x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y03efgEv,_ZTv0_n12_N3ccc7DD1x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y03efgEv,_ZThn4_N3ccc7DD1x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y0E = {  "_ZN3ccc7DD1x9y0E", // class name
  bases__ZN3ccc7DD1x9y0E, 2,
  &(vtc__ZN3ccc7DD1x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names701,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y1  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x9y13efgEv
  ~CC1x9y1(); // tgen
  CC1x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y1E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y13abcEv");}
void  ccc::CC1x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y13pqrEv");}
void  ccc::CC1x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y13efgEv");}
ccc::CC1x9y1 ::~CC1x9y1(){ note_dtor("_ZN3ccc7CC1x9y1E", this);} // tgen
ccc::CC1x9y1 ::CC1x9y1(){ note_ctor("_ZN3ccc7CC1x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y1E, buf);
    ::ccc::CC1x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y1E);
    dp->::ccc::CC1x9y1::~CC1x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y1E(Test__ZN3ccc7CC1x9y1E, "_ZN3ccc7CC1x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y1C1Ev();
extern void _ZN3ccc7CC1x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y1E[] = {
  NSPAIR(_ZN3ccc7CC1x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y1E[];
extern void _ZN3ccc7CC1x9y13efgEv();
extern void _ZN3ccc7CC1x9y13pqrEv();
extern void _ZN3ccc7CC1x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y13abcEv,_ZTv0_n12_N3ccc7CC1x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y13abcEv,_ZThn4_N3ccc7CC1x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y13pqrEv,_ZTv0_n16_N3ccc7CC1x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y13pqrEv,_ZThn4_N3ccc7CC1x9y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y13efgEv,_ZTv0_n20_N3ccc7CC1x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y13efgEv,_ZThn4_N3ccc7CC1x9y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y13abcEv,_ZTv0_n12_N3ccc7CC1x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y13pqrEv,_ZTv0_n16_N3ccc7CC1x9y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y13efgEv,_ZTv0_n20_N3ccc7CC1x9y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y1E[] = {
  {&(_ZTVN3ccc7CC1x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y1E[];
static VTBL_ENTRY alt_thunk_names702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y13efgEv,_ZTv0_n20_N3ccc7CC1x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y13efgEv,_ZThn4_N3ccc7CC1x9y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y13pqrEv,_ZTv0_n16_N3ccc7CC1x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y13pqrEv,_ZThn4_N3ccc7CC1x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y13abcEv,_ZTv0_n12_N3ccc7CC1x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y13abcEv,_ZThn4_N3ccc7CC1x9y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y1E = {  "_ZN3ccc7CC1x9y1E", // class name
  bases__ZN3ccc7CC1x9y1E, 2,
  &(vtc__ZN3ccc7CC1x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y1E),2, //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  DD1x9y1  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD1x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x9y13efgEv
  ~DD1x9y1(); // tgen
  DD1x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y13abcEv");}
void  ccc::DD1x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y13pqrEv");}
void  ccc::DD1x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y13efgEv");}
ccc::DD1x9y1 ::~DD1x9y1(){ note_dtor("_ZN3ccc7DD1x9y1E", this);} // tgen
ccc::DD1x9y1 ::DD1x9y1(){ note_ctor("_ZN3ccc7DD1x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y1E, buf);
    ::ccc::DD1x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y1E);
    dp->::ccc::DD1x9y1::~DD1x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y1E(Test__ZN3ccc7DD1x9y1E, "_ZN3ccc7DD1x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y1C1Ev();
extern void _ZN3ccc7DD1x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y1E[] = {
  NSPAIR(_ZN3ccc7DD1x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y1E[];
extern void _ZN3ccc7DD1x9y13abcEv();
extern void _ZN3ccc7DD1x9y13pqrEv();
extern void _ZN3ccc7DD1x9y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y13efgEv,_ZTv0_n12_N3ccc7DD1x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y13efgEv,_ZThn4_N3ccc7DD1x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y13pqrEv,_ZTv0_n16_N3ccc7DD1x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y13pqrEv,_ZThn4_N3ccc7DD1x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y13efgEv,_ZTv0_n12_N3ccc7DD1x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y13pqrEv,_ZTv0_n16_N3ccc7DD1x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y1E[] = {
  {&(_ZTVN3ccc7DD1x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y1E[];
static VTBL_ENTRY alt_thunk_names703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y13pqrEv,_ZTv0_n16_N3ccc7DD1x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y13pqrEv,_ZThn4_N3ccc7DD1x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y13efgEv,_ZTv0_n12_N3ccc7DD1x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y13efgEv,_ZThn4_N3ccc7DD1x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y1E = {  "_ZN3ccc7DD1x9y1E", // class name
  bases__ZN3ccc7DD1x9y1E, 2,
  &(vtc__ZN3ccc7DD1x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y1E),3, //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  CC1x9y2  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y23pqrEv
  ~CC1x9y2(); // tgen
  CC1x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y2E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y23efgEv");}
void  ccc::CC1x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y23abcEv");}
void  ccc::CC1x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y23pqrEv");}
ccc::CC1x9y2 ::~CC1x9y2(){ note_dtor("_ZN3ccc7CC1x9y2E", this);} // tgen
ccc::CC1x9y2 ::CC1x9y2(){ note_ctor("_ZN3ccc7CC1x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y2E, buf);
    ::ccc::CC1x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y2E);
    dp->::ccc::CC1x9y2::~CC1x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y2E(Test__ZN3ccc7CC1x9y2E, "_ZN3ccc7CC1x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y2C1Ev();
extern void _ZN3ccc7CC1x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y2E[] = {
  NSPAIR(_ZN3ccc7CC1x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y2E[];
extern void _ZN3ccc7CC1x9y23efgEv();
extern void _ZN3ccc7CC1x9y23pqrEv();
extern void _ZN3ccc7CC1x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y23abcEv,_ZTv0_n12_N3ccc7CC1x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y23abcEv,_ZThn4_N3ccc7CC1x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y23pqrEv,_ZTv0_n16_N3ccc7CC1x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y23pqrEv,_ZThn4_N3ccc7CC1x9y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y23efgEv,_ZTv0_n20_N3ccc7CC1x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y23efgEv,_ZThn4_N3ccc7CC1x9y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y23abcEv,_ZTv0_n12_N3ccc7CC1x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y23pqrEv,_ZTv0_n16_N3ccc7CC1x9y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y23efgEv,_ZTv0_n20_N3ccc7CC1x9y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y2E[] = {
  {&(_ZTVN3ccc7CC1x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y2E[];
static VTBL_ENTRY alt_thunk_names704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y23efgEv,_ZTv0_n20_N3ccc7CC1x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y23efgEv,_ZThn4_N3ccc7CC1x9y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y23pqrEv,_ZTv0_n16_N3ccc7CC1x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y23pqrEv,_ZThn4_N3ccc7CC1x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y23abcEv,_ZTv0_n12_N3ccc7CC1x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y23abcEv,_ZThn4_N3ccc7CC1x9y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y2E = {  "_ZN3ccc7CC1x9y2E", // class name
  bases__ZN3ccc7CC1x9y2E, 2,
  &(vtc__ZN3ccc7CC1x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y2E),2, //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  DD1x9y2  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD1x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD1x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y23pqrEv
  ~DD1x9y2(); // tgen
  DD1x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y23efgEv");}
void  ccc::DD1x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y23abcEv");}
void  ccc::DD1x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y23pqrEv");}
ccc::DD1x9y2 ::~DD1x9y2(){ note_dtor("_ZN3ccc7DD1x9y2E", this);} // tgen
ccc::DD1x9y2 ::DD1x9y2(){ note_ctor("_ZN3ccc7DD1x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y2E, buf);
    ::ccc::DD1x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y2E);
    dp->::ccc::DD1x9y2::~DD1x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y2E(Test__ZN3ccc7DD1x9y2E, "_ZN3ccc7DD1x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y2C1Ev();
extern void _ZN3ccc7DD1x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y2E[] = {
  NSPAIR(_ZN3ccc7DD1x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y2E[];
extern void _ZN3ccc7DD1x9y23abcEv();
extern void _ZN3ccc7DD1x9y23pqrEv();
extern void _ZN3ccc7DD1x9y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y23efgEv,_ZTv0_n12_N3ccc7DD1x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y23efgEv,_ZThn4_N3ccc7DD1x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y23pqrEv,_ZTv0_n16_N3ccc7DD1x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y23pqrEv,_ZThn4_N3ccc7DD1x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y23efgEv,_ZTv0_n12_N3ccc7DD1x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y23pqrEv,_ZTv0_n16_N3ccc7DD1x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y2E[] = {
  {&(_ZTVN3ccc7DD1x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y2E[];
static VTBL_ENTRY alt_thunk_names705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y23pqrEv,_ZTv0_n16_N3ccc7DD1x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y23pqrEv,_ZThn4_N3ccc7DD1x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y23efgEv,_ZTv0_n12_N3ccc7DD1x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y23efgEv,_ZThn4_N3ccc7DD1x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y2E = {  "_ZN3ccc7DD1x9y2E", // class name
  bases__ZN3ccc7DD1x9y2E, 2,
  &(vtc__ZN3ccc7DD1x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y2E),3, //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  CC1x9y3  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x9y33abcEv
  ~CC1x9y3(); // tgen
  CC1x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y3E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y33efgEv");}
void  ccc::CC1x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y33pqrEv");}
void  ccc::CC1x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y33abcEv");}
ccc::CC1x9y3 ::~CC1x9y3(){ note_dtor("_ZN3ccc7CC1x9y3E", this);} // tgen
ccc::CC1x9y3 ::CC1x9y3(){ note_ctor("_ZN3ccc7CC1x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y3E, buf);
    ::ccc::CC1x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y3E);
    dp->::ccc::CC1x9y3::~CC1x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y3E(Test__ZN3ccc7CC1x9y3E, "_ZN3ccc7CC1x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y3C1Ev();
extern void _ZN3ccc7CC1x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y3E[] = {
  NSPAIR(_ZN3ccc7CC1x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y3E[];
extern void _ZN3ccc7CC1x9y33efgEv();
extern void _ZN3ccc7CC1x9y33pqrEv();
extern void _ZN3ccc7CC1x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y33abcEv,_ZTv0_n12_N3ccc7CC1x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y33abcEv,_ZThn4_N3ccc7CC1x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y33pqrEv,_ZTv0_n16_N3ccc7CC1x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y33pqrEv,_ZThn4_N3ccc7CC1x9y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y33efgEv,_ZTv0_n20_N3ccc7CC1x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y33efgEv,_ZThn4_N3ccc7CC1x9y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y33abcEv,_ZTv0_n12_N3ccc7CC1x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y33pqrEv,_ZTv0_n16_N3ccc7CC1x9y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y33efgEv,_ZTv0_n20_N3ccc7CC1x9y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y3E[] = {
  {&(_ZTVN3ccc7CC1x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y3E[];
static VTBL_ENTRY alt_thunk_names706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y33efgEv,_ZTv0_n20_N3ccc7CC1x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y33efgEv,_ZThn4_N3ccc7CC1x9y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y33pqrEv,_ZTv0_n16_N3ccc7CC1x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y33pqrEv,_ZThn4_N3ccc7CC1x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y33abcEv,_ZTv0_n12_N3ccc7CC1x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y33abcEv,_ZThn4_N3ccc7CC1x9y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y3E = {  "_ZN3ccc7CC1x9y3E", // class name
  bases__ZN3ccc7CC1x9y3E, 2,
  &(vtc__ZN3ccc7CC1x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y3E),2, //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  DD1x9y3  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD1x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x9y33abcEv
  ~DD1x9y3(); // tgen
  DD1x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y33efgEv");}
void  ccc::DD1x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y33pqrEv");}
void  ccc::DD1x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y33abcEv");}
ccc::DD1x9y3 ::~DD1x9y3(){ note_dtor("_ZN3ccc7DD1x9y3E", this);} // tgen
ccc::DD1x9y3 ::DD1x9y3(){ note_ctor("_ZN3ccc7DD1x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y3E, buf);
    ::ccc::DD1x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y3E);
    dp->::ccc::DD1x9y3::~DD1x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y3E(Test__ZN3ccc7DD1x9y3E, "_ZN3ccc7DD1x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y3C1Ev();
extern void _ZN3ccc7DD1x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y3E[] = {
  NSPAIR(_ZN3ccc7DD1x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y3E[];
extern void _ZN3ccc7DD1x9y33abcEv();
extern void _ZN3ccc7DD1x9y33pqrEv();
extern void _ZN3ccc7DD1x9y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y33efgEv,_ZTv0_n12_N3ccc7DD1x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y33efgEv,_ZThn4_N3ccc7DD1x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y33pqrEv,_ZTv0_n16_N3ccc7DD1x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y33pqrEv,_ZThn4_N3ccc7DD1x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y33efgEv,_ZTv0_n12_N3ccc7DD1x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y33pqrEv,_ZTv0_n16_N3ccc7DD1x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y3E[] = {
  {&(_ZTVN3ccc7DD1x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y3E[];
static VTBL_ENTRY alt_thunk_names707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y33pqrEv,_ZTv0_n16_N3ccc7DD1x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y33pqrEv,_ZThn4_N3ccc7DD1x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y33efgEv,_ZTv0_n12_N3ccc7DD1x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y33efgEv,_ZThn4_N3ccc7DD1x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y3E = {  "_ZN3ccc7DD1x9y3E", // class name
  bases__ZN3ccc7DD1x9y3E, 2,
  &(vtc__ZN3ccc7DD1x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y3E),3, //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  CC1x9y4  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC1x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y43efgEv
  ~CC1x9y4(); // tgen
  CC1x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y4E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y43pqrEv");}
void  ccc::CC1x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y43abcEv");}
void  ccc::CC1x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y43efgEv");}
ccc::CC1x9y4 ::~CC1x9y4(){ note_dtor("_ZN3ccc7CC1x9y4E", this);} // tgen
ccc::CC1x9y4 ::CC1x9y4(){ note_ctor("_ZN3ccc7CC1x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y4E, buf);
    ::ccc::CC1x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y4E);
    dp->::ccc::CC1x9y4::~CC1x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y4E(Test__ZN3ccc7CC1x9y4E, "_ZN3ccc7CC1x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y4C1Ev();
extern void _ZN3ccc7CC1x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y4E[] = {
  NSPAIR(_ZN3ccc7CC1x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y4E[];
extern void _ZN3ccc7CC1x9y43efgEv();
extern void _ZN3ccc7CC1x9y43pqrEv();
extern void _ZN3ccc7CC1x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y43abcEv,_ZTv0_n12_N3ccc7CC1x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y43abcEv,_ZThn4_N3ccc7CC1x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y43pqrEv,_ZTv0_n16_N3ccc7CC1x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y43pqrEv,_ZThn4_N3ccc7CC1x9y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y43efgEv,_ZTv0_n20_N3ccc7CC1x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y43efgEv,_ZThn4_N3ccc7CC1x9y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y43abcEv,_ZTv0_n12_N3ccc7CC1x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y43pqrEv,_ZTv0_n16_N3ccc7CC1x9y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y43efgEv,_ZTv0_n20_N3ccc7CC1x9y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y4E[] = {
  {&(_ZTVN3ccc7CC1x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y4E[];
static VTBL_ENTRY alt_thunk_names708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y43efgEv,_ZTv0_n20_N3ccc7CC1x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y43efgEv,_ZThn4_N3ccc7CC1x9y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y43pqrEv,_ZTv0_n16_N3ccc7CC1x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y43pqrEv,_ZThn4_N3ccc7CC1x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y43abcEv,_ZTv0_n12_N3ccc7CC1x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y43abcEv,_ZThn4_N3ccc7CC1x9y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y4E = {  "_ZN3ccc7CC1x9y4E", // class name
  bases__ZN3ccc7CC1x9y4E, 2,
  &(vtc__ZN3ccc7CC1x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y4E),2, //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  DD1x9y4  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD1x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD1x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD1x9y43efgEv
  ~DD1x9y4(); // tgen
  DD1x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y43pqrEv");}
void  ccc::DD1x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y43abcEv");}
void  ccc::DD1x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y43efgEv");}
ccc::DD1x9y4 ::~DD1x9y4(){ note_dtor("_ZN3ccc7DD1x9y4E", this);} // tgen
ccc::DD1x9y4 ::DD1x9y4(){ note_ctor("_ZN3ccc7DD1x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y4E, buf);
    ::ccc::DD1x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y4E);
    dp->::ccc::DD1x9y4::~DD1x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y4E(Test__ZN3ccc7DD1x9y4E, "_ZN3ccc7DD1x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y4C1Ev();
extern void _ZN3ccc7DD1x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y4E[] = {
  NSPAIR(_ZN3ccc7DD1x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y4E[];
extern void _ZN3ccc7DD1x9y43abcEv();
extern void _ZN3ccc7DD1x9y43pqrEv();
extern void _ZN3ccc7DD1x9y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y43efgEv,_ZTv0_n12_N3ccc7DD1x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y43efgEv,_ZThn4_N3ccc7DD1x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y43pqrEv,_ZTv0_n16_N3ccc7DD1x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y43pqrEv,_ZThn4_N3ccc7DD1x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y43efgEv,_ZTv0_n12_N3ccc7DD1x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y43pqrEv,_ZTv0_n16_N3ccc7DD1x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y4E[] = {
  {&(_ZTVN3ccc7DD1x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y4E[];
static VTBL_ENTRY alt_thunk_names709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y43pqrEv,_ZTv0_n16_N3ccc7DD1x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y43pqrEv,_ZThn4_N3ccc7DD1x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y43efgEv,_ZTv0_n12_N3ccc7DD1x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y43efgEv,_ZThn4_N3ccc7DD1x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y4E = {  "_ZN3ccc7DD1x9y4E", // class name
  bases__ZN3ccc7DD1x9y4E, 2,
  &(vtc__ZN3ccc7DD1x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y4E),3, //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  CC1x9y5  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC1x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y53abcEv
  ~CC1x9y5(); // tgen
  CC1x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y5E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y53pqrEv");}
void  ccc::CC1x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y53efgEv");}
void  ccc::CC1x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y53abcEv");}
ccc::CC1x9y5 ::~CC1x9y5(){ note_dtor("_ZN3ccc7CC1x9y5E", this);} // tgen
ccc::CC1x9y5 ::CC1x9y5(){ note_ctor("_ZN3ccc7CC1x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y5E, buf);
    ::ccc::CC1x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y5E);
    dp->::ccc::CC1x9y5::~CC1x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y5E(Test__ZN3ccc7CC1x9y5E, "_ZN3ccc7CC1x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y5C1Ev();
extern void _ZN3ccc7CC1x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y5E[] = {
  NSPAIR(_ZN3ccc7CC1x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y5E[];
extern void _ZN3ccc7CC1x9y53efgEv();
extern void _ZN3ccc7CC1x9y53pqrEv();
extern void _ZN3ccc7CC1x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y53abcEv,_ZTv0_n12_N3ccc7CC1x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y53abcEv,_ZThn4_N3ccc7CC1x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y53pqrEv,_ZTv0_n16_N3ccc7CC1x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y53pqrEv,_ZThn4_N3ccc7CC1x9y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y53efgEv,_ZTv0_n20_N3ccc7CC1x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y53efgEv,_ZThn4_N3ccc7CC1x9y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y53abcEv,_ZTv0_n12_N3ccc7CC1x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y53pqrEv,_ZTv0_n16_N3ccc7CC1x9y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y53efgEv,_ZTv0_n20_N3ccc7CC1x9y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y5E[] = {
  {&(_ZTVN3ccc7CC1x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y5E[];
static VTBL_ENTRY alt_thunk_names710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y53efgEv,_ZTv0_n20_N3ccc7CC1x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y53efgEv,_ZThn4_N3ccc7CC1x9y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y53pqrEv,_ZTv0_n16_N3ccc7CC1x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y53pqrEv,_ZThn4_N3ccc7CC1x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y53abcEv,_ZTv0_n12_N3ccc7CC1x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y53abcEv,_ZThn4_N3ccc7CC1x9y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y5E = {  "_ZN3ccc7CC1x9y5E", // class name
  bases__ZN3ccc7CC1x9y5E, 2,
  &(vtc__ZN3ccc7CC1x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y5E),2, //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  DD1x9y5  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD1x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD1x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD1x9y53abcEv
  ~DD1x9y5(); // tgen
  DD1x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y53pqrEv");}
void  ccc::DD1x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y53efgEv");}
void  ccc::DD1x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y53abcEv");}
ccc::DD1x9y5 ::~DD1x9y5(){ note_dtor("_ZN3ccc7DD1x9y5E", this);} // tgen
ccc::DD1x9y5 ::DD1x9y5(){ note_ctor("_ZN3ccc7DD1x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y5E, buf);
    ::ccc::DD1x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y5E);
    dp->::ccc::DD1x9y5::~DD1x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y5E(Test__ZN3ccc7DD1x9y5E, "_ZN3ccc7DD1x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y5C1Ev();
extern void _ZN3ccc7DD1x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y5E[] = {
  NSPAIR(_ZN3ccc7DD1x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y5E[];
extern void _ZN3ccc7DD1x9y53abcEv();
extern void _ZN3ccc7DD1x9y53pqrEv();
extern void _ZN3ccc7DD1x9y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y53efgEv,_ZTv0_n12_N3ccc7DD1x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y53efgEv,_ZThn4_N3ccc7DD1x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y53pqrEv,_ZTv0_n16_N3ccc7DD1x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y53pqrEv,_ZThn4_N3ccc7DD1x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y53efgEv,_ZTv0_n12_N3ccc7DD1x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y53pqrEv,_ZTv0_n16_N3ccc7DD1x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y5E[] = {
  {&(_ZTVN3ccc7DD1x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y5E[];
static VTBL_ENTRY alt_thunk_names711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y53pqrEv,_ZTv0_n16_N3ccc7DD1x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y53pqrEv,_ZThn4_N3ccc7DD1x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y53efgEv,_ZTv0_n12_N3ccc7DD1x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y53efgEv,_ZThn4_N3ccc7DD1x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y5E = {  "_ZN3ccc7DD1x9y5E", // class name
  bases__ZN3ccc7DD1x9y5E, 2,
  &(vtc__ZN3ccc7DD1x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y5E),3, //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  CC1x9y6  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y63efgEv
  ~CC1x9y6(); // tgen
  CC1x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y6E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y63abcEv");}
void  ccc::CC1x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y63efgEv");}
ccc::CC1x9y6 ::~CC1x9y6(){ note_dtor("_ZN3ccc7CC1x9y6E", this);} // tgen
ccc::CC1x9y6 ::CC1x9y6(){ note_ctor("_ZN3ccc7CC1x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y6E, buf);
    ::ccc::CC1x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y6E);
    dp->::ccc::CC1x9y6::~CC1x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y6E(Test__ZN3ccc7CC1x9y6E, "_ZN3ccc7CC1x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y6C1Ev();
extern void _ZN3ccc7CC1x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y6E[] = {
  NSPAIR(_ZN3ccc7CC1x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y6E[];
extern void _ZN3ccc7CC1x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC1x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y63abcEv,_ZTv0_n12_N3ccc7CC1x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y63abcEv,_ZThn4_N3ccc7CC1x9y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y63efgEv,_ZTv0_n20_N3ccc7CC1x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y63efgEv,_ZThn4_N3ccc7CC1x9y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y63abcEv,_ZTv0_n12_N3ccc7CC1x9y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y63efgEv,_ZTv0_n20_N3ccc7CC1x9y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y6E[] = {
  {&(_ZTVN3ccc7CC1x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y6E[];
static VTBL_ENTRY alt_thunk_names712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y63efgEv,_ZTv0_n20_N3ccc7CC1x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y63efgEv,_ZThn4_N3ccc7CC1x9y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y63abcEv,_ZTv0_n12_N3ccc7CC1x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y63abcEv,_ZThn4_N3ccc7CC1x9y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y6E = {  "_ZN3ccc7CC1x9y6E", // class name
  bases__ZN3ccc7CC1x9y6E, 2,
  &(vtc__ZN3ccc7CC1x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y6E),2, //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  DD1x9y6  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD1x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD1x9y63efgEv
  ~DD1x9y6(); // tgen
  DD1x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y63abcEv");}
void  ccc::DD1x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y63efgEv");}
ccc::DD1x9y6 ::~DD1x9y6(){ note_dtor("_ZN3ccc7DD1x9y6E", this);} // tgen
ccc::DD1x9y6 ::DD1x9y6(){ note_ctor("_ZN3ccc7DD1x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y6E, buf);
    ::ccc::DD1x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y6E);
    dp->::ccc::DD1x9y6::~DD1x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y6E(Test__ZN3ccc7DD1x9y6E, "_ZN3ccc7DD1x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y6C1Ev();
extern void _ZN3ccc7DD1x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y6E[] = {
  NSPAIR(_ZN3ccc7DD1x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y6E[];
extern void _ZN3ccc7DD1x9y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x9y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y63efgEv,_ZTv0_n12_N3ccc7DD1x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y63efgEv,_ZThn4_N3ccc7DD1x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y63efgEv,_ZTv0_n12_N3ccc7DD1x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y6E[] = {
  {&(_ZTVN3ccc7DD1x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y6E[];
static VTBL_ENTRY alt_thunk_names713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y63efgEv,_ZTv0_n12_N3ccc7DD1x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y63efgEv,_ZThn4_N3ccc7DD1x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y6E = {  "_ZN3ccc7DD1x9y6E", // class name
  bases__ZN3ccc7DD1x9y6E, 2,
  &(vtc__ZN3ccc7DD1x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y6E),3, //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  CC1x9y7  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y73pqrEv
  ~CC1x9y7(); // tgen
  CC1x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y7E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y73abcEv");}
void  ccc::CC1x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y73pqrEv");}
ccc::CC1x9y7 ::~CC1x9y7(){ note_dtor("_ZN3ccc7CC1x9y7E", this);} // tgen
ccc::CC1x9y7 ::CC1x9y7(){ note_ctor("_ZN3ccc7CC1x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y7E, buf);
    ::ccc::CC1x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y7E);
    dp->::ccc::CC1x9y7::~CC1x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y7E(Test__ZN3ccc7CC1x9y7E, "_ZN3ccc7CC1x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y7C1Ev();
extern void _ZN3ccc7CC1x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y7E[] = {
  NSPAIR(_ZN3ccc7CC1x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC1x9y73pqrEv();
extern void _ZN3ccc7CC1x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y73abcEv,_ZTv0_n12_N3ccc7CC1x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y73abcEv,_ZThn4_N3ccc7CC1x9y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y73pqrEv,_ZTv0_n16_N3ccc7CC1x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y73pqrEv,_ZThn4_N3ccc7CC1x9y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y73abcEv,_ZTv0_n12_N3ccc7CC1x9y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y73pqrEv,_ZTv0_n16_N3ccc7CC1x9y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y7E[] = {
  {&(_ZTVN3ccc7CC1x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y7E[];
static VTBL_ENTRY alt_thunk_names714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y73pqrEv,_ZTv0_n16_N3ccc7CC1x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y73pqrEv,_ZThn4_N3ccc7CC1x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y73abcEv,_ZTv0_n12_N3ccc7CC1x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y73abcEv,_ZThn4_N3ccc7CC1x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y7E = {  "_ZN3ccc7CC1x9y7E", // class name
  bases__ZN3ccc7CC1x9y7E, 2,
  &(vtc__ZN3ccc7CC1x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y7E),2, //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  DD1x9y7  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD1x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y73pqrEv
  ~DD1x9y7(); // tgen
  DD1x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y73abcEv");}
void  ccc::DD1x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y73pqrEv");}
ccc::DD1x9y7 ::~DD1x9y7(){ note_dtor("_ZN3ccc7DD1x9y7E", this);} // tgen
ccc::DD1x9y7 ::DD1x9y7(){ note_ctor("_ZN3ccc7DD1x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y7E, buf);
    ::ccc::DD1x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y7E);
    dp->::ccc::DD1x9y7::~DD1x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y7E(Test__ZN3ccc7DD1x9y7E, "_ZN3ccc7DD1x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y7C1Ev();
extern void _ZN3ccc7DD1x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y7E[] = {
  NSPAIR(_ZN3ccc7DD1x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y7E[];
extern void _ZN3ccc7DD1x9y73abcEv();
extern void _ZN3ccc7DD1x9y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y73pqrEv,_ZTv0_n16_N3ccc7DD1x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y73pqrEv,_ZThn4_N3ccc7DD1x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y73pqrEv,_ZTv0_n16_N3ccc7DD1x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y7E[] = {
  {&(_ZTVN3ccc7DD1x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y7E[];
static VTBL_ENTRY alt_thunk_names715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y73pqrEv,_ZTv0_n16_N3ccc7DD1x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y73pqrEv,_ZThn4_N3ccc7DD1x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y7E = {  "_ZN3ccc7DD1x9y7E", // class name
  bases__ZN3ccc7DD1x9y7E, 2,
  &(vtc__ZN3ccc7DD1x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y7E),3, //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  CC1x9y8  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y83abcEv
  ~CC1x9y8(); // tgen
  CC1x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y8E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y83efgEv");}
void  ccc::CC1x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y83abcEv");}
ccc::CC1x9y8 ::~CC1x9y8(){ note_dtor("_ZN3ccc7CC1x9y8E", this);} // tgen
ccc::CC1x9y8 ::CC1x9y8(){ note_ctor("_ZN3ccc7CC1x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y8E, buf);
    ::ccc::CC1x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y8E);
    dp->::ccc::CC1x9y8::~CC1x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y8E(Test__ZN3ccc7CC1x9y8E, "_ZN3ccc7CC1x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y8C1Ev();
extern void _ZN3ccc7CC1x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y8E[] = {
  NSPAIR(_ZN3ccc7CC1x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y8E[];
extern void _ZN3ccc7CC1x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC1x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC1x9y83abcEv,_ZTv0_n12_N3ccc7CC1x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y83abcEv,_ZThn4_N3ccc7CC1x9y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y83efgEv,_ZTv0_n20_N3ccc7CC1x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y83efgEv,_ZThn4_N3ccc7CC1x9y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC1x9y83abcEv,_ZTv0_n12_N3ccc7CC1x9y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y83efgEv,_ZTv0_n20_N3ccc7CC1x9y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y8E[] = {
  {&(_ZTVN3ccc7CC1x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC1x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y8E[];
static VTBL_ENTRY alt_thunk_names716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y83efgEv,_ZTv0_n20_N3ccc7CC1x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y83efgEv,_ZThn4_N3ccc7CC1x9y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC1x9y83abcEv,_ZTv0_n12_N3ccc7CC1x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y83abcEv,_ZThn4_N3ccc7CC1x9y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y8E = {  "_ZN3ccc7CC1x9y8E", // class name
  bases__ZN3ccc7CC1x9y8E, 2,
  &(vtc__ZN3ccc7CC1x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y8E),2, //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  DD1x9y8  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD1x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD1x9y83abcEv
  ~DD1x9y8(); // tgen
  DD1x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y83efgEv");}
void  ccc::DD1x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD1x9y83abcEv");}
ccc::DD1x9y8 ::~DD1x9y8(){ note_dtor("_ZN3ccc7DD1x9y8E", this);} // tgen
ccc::DD1x9y8 ::DD1x9y8(){ note_ctor("_ZN3ccc7DD1x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y8E, buf);
    ::ccc::DD1x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y8E);
    dp->::ccc::DD1x9y8::~DD1x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y8E(Test__ZN3ccc7DD1x9y8E, "_ZN3ccc7DD1x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y8C1Ev();
extern void _ZN3ccc7DD1x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y8E[] = {
  NSPAIR(_ZN3ccc7DD1x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y8E[];
extern void _ZN3ccc7DD1x9y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7DD1x9y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y83efgEv,_ZTv0_n12_N3ccc7DD1x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y83efgEv,_ZThn4_N3ccc7DD1x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y83efgEv,_ZTv0_n12_N3ccc7DD1x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y8E[] = {
  {&(_ZTVN3ccc7DD1x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y8E[];
static VTBL_ENTRY alt_thunk_names717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y83efgEv,_ZTv0_n12_N3ccc7DD1x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y83efgEv,_ZThn4_N3ccc7DD1x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y8E = {  "_ZN3ccc7DD1x9y8E", // class name
  bases__ZN3ccc7DD1x9y8E, 2,
  &(vtc__ZN3ccc7DD1x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y8E),3, //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  CC1x9y9  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y93pqrEv
  ~CC1x9y9(); // tgen
  CC1x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y9E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y93efgEv");}
void  ccc::CC1x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y93pqrEv");}
ccc::CC1x9y9 ::~CC1x9y9(){ note_dtor("_ZN3ccc7CC1x9y9E", this);} // tgen
ccc::CC1x9y9 ::CC1x9y9(){ note_ctor("_ZN3ccc7CC1x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y9E, buf);
    ::ccc::CC1x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc7CC1x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC1x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y9E);
    dp->::ccc::CC1x9y9::~CC1x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y9E(Test__ZN3ccc7CC1x9y9E, "_ZN3ccc7CC1x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y9C1Ev();
extern void _ZN3ccc7CC1x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y9E[] = {
  NSPAIR(_ZN3ccc7CC1x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y9E[];
extern void _ZN3ccc7CC1x9y93efgEv();
extern void _ZN3ccc7CC1x9y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC1x9y93pqrEv,_ZTv0_n16_N3ccc7CC1x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y93pqrEv,_ZThn4_N3ccc7CC1x9y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC1x9y93efgEv,_ZTv0_n20_N3ccc7CC1x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y93efgEv,_ZThn4_N3ccc7CC1x9y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC1x9y93pqrEv,_ZTv0_n16_N3ccc7CC1x9y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC1x9y93efgEv,_ZTv0_n20_N3ccc7CC1x9y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC1x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC1x9y9E[] = {
  {&(_ZTVN3ccc7CC1x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC1x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC1x9y9E[];
static VTBL_ENTRY alt_thunk_names718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC1x9y93efgEv,_ZTv0_n20_N3ccc7CC1x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y93efgEv,_ZThn4_N3ccc7CC1x9y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC1x9y93pqrEv,_ZTv0_n16_N3ccc7CC1x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC1x9y93pqrEv,_ZThn4_N3ccc7CC1x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC1x9y9E = {  "_ZN3ccc7CC1x9y9E", // class name
  bases__ZN3ccc7CC1x9y9E, 2,
  &(vtc__ZN3ccc7CC1x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC1x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC1x9y9E),2, //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  DD1x9y9  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD1x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD1x9y93pqrEv
  ~DD1x9y9(); // tgen
  DD1x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD1x9y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD1x9y93efgEv");}
void  ccc::DD1x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD1x9y93pqrEv");}
ccc::DD1x9y9 ::~DD1x9y9(){ note_dtor("_ZN3ccc7DD1x9y9E", this);} // tgen
ccc::DD1x9y9 ::DD1x9y9(){ note_ctor("_ZN3ccc7DD1x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD1x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD1x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD1x9y9E, buf);
    ::ccc::DD1x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD1x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD1x9y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7DD1x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD1x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD1x9y9E);
    dp->::ccc::DD1x9y9::~DD1x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD1x9y9E(Test__ZN3ccc7DD1x9y9E, "_ZN3ccc7DD1x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD1x9y9C1Ev();
extern void _ZN3ccc7DD1x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD1x9y9E[] = {
  NSPAIR(_ZN3ccc7DD1x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD1x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD1x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7DD1x9y93pqrEv();
extern void _ZN3ccc7DD1x9y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD1x9y93efgEv,_ZTv0_n12_N3ccc7DD1x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y93efgEv,_ZThn4_N3ccc7DD1x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD1x9y93pqrEv,_ZTv0_n16_N3ccc7DD1x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD1x9y93pqrEv,_ZThn4_N3ccc7DD1x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD1x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD1x9y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD1x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD1x9y93efgEv,_ZTv0_n12_N3ccc7DD1x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD1x9y93pqrEv,_ZTv0_n16_N3ccc7DD1x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD1x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD1x9y9E[] = {
  {&(_ZTVN3ccc7DD1x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD1x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD1x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD1x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD1x9y9E[];
static VTBL_ENTRY alt_thunk_names719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD1x9y93pqrEv,_ZTv0_n16_N3ccc7DD1x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y93pqrEv,_ZThn4_N3ccc7DD1x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD1x9y93efgEv,_ZTv0_n12_N3ccc7DD1x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD1x9y93efgEv,_ZThn4_N3ccc7DD1x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD1x9y9E = {  "_ZN3ccc7DD1x9y9E", // class name
  bases__ZN3ccc7DD1x9y9E, 2,
  &(vtc__ZN3ccc7DD1x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD1x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD1x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD1x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD1x9y9E),3, //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  CC1x9y10  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x9y103abcEv
  ~CC1x9y10(); // tgen
  CC1x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y10E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y103pqrEv");}
void  ccc::CC1x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x9y103abcEv");}
ccc::CC1x9y10 ::~CC1x9y10(){ note_dtor("_ZN3ccc8CC1x9y10E", this);} // tgen
ccc::CC1x9y10 ::CC1x9y10(){ note_ctor("_ZN3ccc8CC1x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y10E, buf);
    ::ccc::CC1x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y10E);
    dp->::ccc::CC1x9y10::~CC1x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y10E(Test__ZN3ccc8CC1x9y10E, "_ZN3ccc8CC1x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y10C1Ev();
extern void _ZN3ccc8CC1x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y10E[] = {
  NSPAIR(_ZN3ccc8CC1x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC1x9y103pqrEv();
extern void _ZN3ccc8CC1x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x9y103abcEv,_ZTv0_n12_N3ccc8CC1x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y103abcEv,_ZThn4_N3ccc8CC1x9y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x9y103pqrEv,_ZTv0_n16_N3ccc8CC1x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y103pqrEv,_ZThn4_N3ccc8CC1x9y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x9y103abcEv,_ZTv0_n12_N3ccc8CC1x9y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x9y103pqrEv,_ZTv0_n16_N3ccc8CC1x9y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y10E[] = {
  {&(_ZTVN3ccc8CC1x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y10E[];
static VTBL_ENTRY alt_thunk_names720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x9y103pqrEv,_ZTv0_n16_N3ccc8CC1x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y103pqrEv,_ZThn4_N3ccc8CC1x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x9y103abcEv,_ZTv0_n12_N3ccc8CC1x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y103abcEv,_ZThn4_N3ccc8CC1x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x9y10E = {  "_ZN3ccc8CC1x9y10E", // class name
  bases__ZN3ccc8CC1x9y10E, 2,
  &(vtc__ZN3ccc8CC1x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y10E),2, //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  DD1x9y10  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD1x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x9y103abcEv
  ~DD1x9y10(); // tgen
  DD1x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x9y103pqrEv");}
void  ccc::DD1x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x9y103abcEv");}
ccc::DD1x9y10 ::~DD1x9y10(){ note_dtor("_ZN3ccc8DD1x9y10E", this);} // tgen
ccc::DD1x9y10 ::DD1x9y10(){ note_ctor("_ZN3ccc8DD1x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y10E, buf);
    ::ccc::DD1x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y10E);
    dp->::ccc::DD1x9y10::~DD1x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y10E(Test__ZN3ccc8DD1x9y10E, "_ZN3ccc8DD1x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y10C1Ev();
extern void _ZN3ccc8DD1x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y10E[] = {
  NSPAIR(_ZN3ccc8DD1x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y10E[];
extern void _ZN3ccc8DD1x9y103abcEv();
extern void _ZN3ccc8DD1x9y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x9y103pqrEv,_ZTv0_n16_N3ccc8DD1x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x9y103pqrEv,_ZThn4_N3ccc8DD1x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x9y103pqrEv,_ZTv0_n16_N3ccc8DD1x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y10E[] = {
  {&(_ZTVN3ccc8DD1x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y10E[];
static VTBL_ENTRY alt_thunk_names721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x9y103pqrEv,_ZTv0_n16_N3ccc8DD1x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x9y103pqrEv,_ZThn4_N3ccc8DD1x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x9y10E = {  "_ZN3ccc8DD1x9y10E", // class name
  bases__ZN3ccc8DD1x9y10E, 2,
  &(vtc__ZN3ccc8DD1x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y10E),3, //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  CC1x9y11  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x9y113efgEv
  ~CC1x9y11(); // tgen
  CC1x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y11E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y113pqrEv");}
void  ccc::CC1x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x9y113efgEv");}
ccc::CC1x9y11 ::~CC1x9y11(){ note_dtor("_ZN3ccc8CC1x9y11E", this);} // tgen
ccc::CC1x9y11 ::CC1x9y11(){ note_ctor("_ZN3ccc8CC1x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y11E, buf);
    ::ccc::CC1x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y11E);
    dp->::ccc::CC1x9y11::~CC1x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y11E(Test__ZN3ccc8CC1x9y11E, "_ZN3ccc8CC1x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y11C1Ev();
extern void _ZN3ccc8CC1x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y11E[] = {
  NSPAIR(_ZN3ccc8CC1x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y11E[];
extern void _ZN3ccc8CC1x9y113efgEv();
extern void _ZN3ccc8CC1x9y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x9y113pqrEv,_ZTv0_n16_N3ccc8CC1x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y113pqrEv,_ZThn4_N3ccc8CC1x9y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x9y113efgEv,_ZTv0_n20_N3ccc8CC1x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y113efgEv,_ZThn4_N3ccc8CC1x9y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x9y113pqrEv,_ZTv0_n16_N3ccc8CC1x9y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x9y113efgEv,_ZTv0_n20_N3ccc8CC1x9y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y11E[] = {
  {&(_ZTVN3ccc8CC1x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y11E[];
static VTBL_ENTRY alt_thunk_names722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x9y113efgEv,_ZTv0_n20_N3ccc8CC1x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y113efgEv,_ZThn4_N3ccc8CC1x9y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x9y113pqrEv,_ZTv0_n16_N3ccc8CC1x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y113pqrEv,_ZThn4_N3ccc8CC1x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x9y11E = {  "_ZN3ccc8CC1x9y11E", // class name
  bases__ZN3ccc8CC1x9y11E, 2,
  &(vtc__ZN3ccc8CC1x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y11E),2, //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  DD1x9y11  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD1x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x9y113efgEv
  ~DD1x9y11(); // tgen
  DD1x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x9y113pqrEv");}
void  ccc::DD1x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x9y113efgEv");}
ccc::DD1x9y11 ::~DD1x9y11(){ note_dtor("_ZN3ccc8DD1x9y11E", this);} // tgen
ccc::DD1x9y11 ::DD1x9y11(){ note_ctor("_ZN3ccc8DD1x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y11E, buf);
    ::ccc::DD1x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y11E);
    dp->::ccc::DD1x9y11::~DD1x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y11E(Test__ZN3ccc8DD1x9y11E, "_ZN3ccc8DD1x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y11C1Ev();
extern void _ZN3ccc8DD1x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y11E[] = {
  NSPAIR(_ZN3ccc8DD1x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x9y113pqrEv();
extern void _ZN3ccc8DD1x9y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x9y113efgEv,_ZTv0_n12_N3ccc8DD1x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x9y113efgEv,_ZThn4_N3ccc8DD1x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x9y113pqrEv,_ZTv0_n16_N3ccc8DD1x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x9y113pqrEv,_ZThn4_N3ccc8DD1x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x9y113efgEv,_ZTv0_n12_N3ccc8DD1x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x9y113pqrEv,_ZTv0_n16_N3ccc8DD1x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y11E[] = {
  {&(_ZTVN3ccc8DD1x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y11E[];
static VTBL_ENTRY alt_thunk_names723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x9y113pqrEv,_ZTv0_n16_N3ccc8DD1x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x9y113pqrEv,_ZThn4_N3ccc8DD1x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x9y113efgEv,_ZTv0_n12_N3ccc8DD1x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x9y113efgEv,_ZThn4_N3ccc8DD1x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x9y11E = {  "_ZN3ccc8DD1x9y11E", // class name
  bases__ZN3ccc8DD1x9y11E, 2,
  &(vtc__ZN3ccc8DD1x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y11E),3, //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  CC1x9y12  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC1x9y123abcEv
  ~CC1x9y12(); // tgen
  CC1x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x9y123abcEv");}
ccc::CC1x9y12 ::~CC1x9y12(){ note_dtor("_ZN3ccc8CC1x9y12E", this);} // tgen
ccc::CC1x9y12 ::CC1x9y12(){ note_ctor("_ZN3ccc8CC1x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y12E, buf);
    ::ccc::CC1x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y12E);
    dp->::ccc::CC1x9y12::~CC1x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y12E(Test__ZN3ccc8CC1x9y12E, "_ZN3ccc8CC1x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y12C1Ev();
extern void _ZN3ccc8CC1x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y12E[] = {
  NSPAIR(_ZN3ccc8CC1x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC1x9y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x9y123abcEv,_ZTv0_n12_N3ccc8CC1x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y123abcEv,_ZThn4_N3ccc8CC1x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x9y123abcEv,_ZTv0_n12_N3ccc8CC1x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y12E[] = {
  {&(_ZTVN3ccc8CC1x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y12E[];
static VTBL_ENTRY alt_thunk_names724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x9y123abcEv,_ZTv0_n12_N3ccc8CC1x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y123abcEv,_ZThn4_N3ccc8CC1x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x9y12E = {  "_ZN3ccc8CC1x9y12E", // class name
  bases__ZN3ccc8CC1x9y12E, 2,
  &(vtc__ZN3ccc8CC1x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y12E),2, //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  DD1x9y12  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD1x9y123abcEv
  ~DD1x9y12(); // tgen
  DD1x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x9y123abcEv");}
ccc::DD1x9y12 ::~DD1x9y12(){ note_dtor("_ZN3ccc8DD1x9y12E", this);} // tgen
ccc::DD1x9y12 ::DD1x9y12(){ note_ctor("_ZN3ccc8DD1x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y12E, buf);
    ::ccc::DD1x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y12E);
    dp->::ccc::DD1x9y12::~DD1x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y12E(Test__ZN3ccc8DD1x9y12E, "_ZN3ccc8DD1x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y12C1Ev();
extern void _ZN3ccc8DD1x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y12E[] = {
  NSPAIR(_ZN3ccc8DD1x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y12E[];
extern void _ZN3ccc8DD1x9y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y12E[] = {
  {&(_ZTVN3ccc8DD1x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y12E[];
Class_Descriptor cd__ZN3ccc8DD1x9y12E = {  "_ZN3ccc8DD1x9y12E", // class name
  bases__ZN3ccc8DD1x9y12E, 2,
  &(vtc__ZN3ccc8DD1x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y13  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC1x9y133efgEv
  ~CC1x9y13(); // tgen
  CC1x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x9y133efgEv");}
ccc::CC1x9y13 ::~CC1x9y13(){ note_dtor("_ZN3ccc8CC1x9y13E", this);} // tgen
ccc::CC1x9y13 ::CC1x9y13(){ note_ctor("_ZN3ccc8CC1x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y13E, buf);
    ::ccc::CC1x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y13E);
    dp->::ccc::CC1x9y13::~CC1x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y13E(Test__ZN3ccc8CC1x9y13E, "_ZN3ccc8CC1x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y13C1Ev();
extern void _ZN3ccc8CC1x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y13E[] = {
  NSPAIR(_ZN3ccc8CC1x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y13E[];
extern void _ZN3ccc8CC1x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x9y133efgEv,_ZTv0_n20_N3ccc8CC1x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y133efgEv,_ZThn4_N3ccc8CC1x9y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x9y133efgEv,_ZTv0_n20_N3ccc8CC1x9y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y13E[] = {
  {&(_ZTVN3ccc8CC1x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y13E[];
static VTBL_ENTRY alt_thunk_names725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x9y133efgEv,_ZTv0_n20_N3ccc8CC1x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y133efgEv,_ZThn4_N3ccc8CC1x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x9y13E = {  "_ZN3ccc8CC1x9y13E", // class name
  bases__ZN3ccc8CC1x9y13E, 2,
  &(vtc__ZN3ccc8CC1x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y13E),2, //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  DD1x9y13  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD1x9y133efgEv
  ~DD1x9y13(); // tgen
  DD1x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x9y133efgEv");}
ccc::DD1x9y13 ::~DD1x9y13(){ note_dtor("_ZN3ccc8DD1x9y13E", this);} // tgen
ccc::DD1x9y13 ::DD1x9y13(){ note_ctor("_ZN3ccc8DD1x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y13E, buf);
    ::ccc::DD1x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y13E);
    dp->::ccc::DD1x9y13::~DD1x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y13E(Test__ZN3ccc8DD1x9y13E, "_ZN3ccc8DD1x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y13C1Ev();
extern void _ZN3ccc8DD1x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y13E[] = {
  NSPAIR(_ZN3ccc8DD1x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x9y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x9y133efgEv,_ZTv0_n12_N3ccc8DD1x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x9y133efgEv,_ZThn4_N3ccc8DD1x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x9y133efgEv,_ZTv0_n12_N3ccc8DD1x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y13E[] = {
  {&(_ZTVN3ccc8DD1x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y13E[];
static VTBL_ENTRY alt_thunk_names726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x9y133efgEv,_ZTv0_n12_N3ccc8DD1x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x9y133efgEv,_ZThn4_N3ccc8DD1x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x9y13E = {  "_ZN3ccc8DD1x9y13E", // class name
  bases__ZN3ccc8DD1x9y13E, 2,
  &(vtc__ZN3ccc8DD1x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y13E),3, //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  CC1x9y14  : virtual ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y143pqrEv
  ~CC1x9y14(); // tgen
  CC1x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y143pqrEv");}
ccc::CC1x9y14 ::~CC1x9y14(){ note_dtor("_ZN3ccc8CC1x9y14E", this);} // tgen
ccc::CC1x9y14 ::CC1x9y14(){ note_ctor("_ZN3ccc8CC1x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y14E, buf);
    ::ccc::CC1x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y14E);
    dp->::ccc::CC1x9y14::~CC1x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y14E(Test__ZN3ccc8CC1x9y14E, "_ZN3ccc8CC1x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y14C1Ev();
extern void _ZN3ccc8CC1x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y14E[] = {
  NSPAIR(_ZN3ccc8CC1x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC1x9y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x9y143pqrEv,_ZTv0_n16_N3ccc8CC1x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y143pqrEv,_ZThn4_N3ccc8CC1x9y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x9y143pqrEv,_ZTv0_n16_N3ccc8CC1x9y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y14E[] = {
  {&(_ZTVN3ccc8CC1x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y14E[];
static VTBL_ENTRY alt_thunk_names727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x9y143pqrEv,_ZTv0_n16_N3ccc8CC1x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x9y143pqrEv,_ZThn4_N3ccc8CC1x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x9y14E = {  "_ZN3ccc8CC1x9y14E", // class name
  bases__ZN3ccc8CC1x9y14E, 2,
  &(vtc__ZN3ccc8CC1x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y14E),2, //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  DD1x9y14  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD1x9y143pqrEv
  ~DD1x9y14(); // tgen
  DD1x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x9y143pqrEv");}
ccc::DD1x9y14 ::~DD1x9y14(){ note_dtor("_ZN3ccc8DD1x9y14E", this);} // tgen
ccc::DD1x9y14 ::DD1x9y14(){ note_ctor("_ZN3ccc8DD1x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y14E, buf);
    ::ccc::DD1x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y14E);
    dp->::ccc::DD1x9y14::~DD1x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y14E(Test__ZN3ccc8DD1x9y14E, "_ZN3ccc8DD1x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y14C1Ev();
extern void _ZN3ccc8DD1x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y14E[] = {
  NSPAIR(_ZN3ccc8DD1x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x9y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x9y143pqrEv,_ZTv0_n16_N3ccc8DD1x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x9y143pqrEv,_ZThn4_N3ccc8DD1x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x9y143pqrEv,_ZTv0_n16_N3ccc8DD1x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y14E[] = {
  {&(_ZTVN3ccc8DD1x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y14E[];
static VTBL_ENTRY alt_thunk_names728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x9y143pqrEv,_ZTv0_n16_N3ccc8DD1x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x9y143pqrEv,_ZThn4_N3ccc8DD1x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x9y14E = {  "_ZN3ccc8DD1x9y14E", // class name
  bases__ZN3ccc8DD1x9y14E, 2,
  &(vtc__ZN3ccc8DD1x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y14E),3, //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  CC1x9y15  : virtual ::ccc::AA1 , ::ccc::BB9 {
  ~CC1x9y15(); // tgen
  CC1x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x9y15 ::~CC1x9y15(){ note_dtor("_ZN3ccc8CC1x9y15E", this);} // tgen
ccc::CC1x9y15 ::CC1x9y15(){ note_ctor("_ZN3ccc8CC1x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y15E, buf);
    ::ccc::CC1x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC1x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y15E);
    dp->::ccc::CC1x9y15::~CC1x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y15E(Test__ZN3ccc8CC1x9y15E, "_ZN3ccc8CC1x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y15C1Ev();
extern void _ZN3ccc8CC1x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y15E[] = {
  NSPAIR(_ZN3ccc8CC1x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x9y15E[] = {
  {&(_ZTVN3ccc8CC1x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x9y15E[];
Class_Descriptor cd__ZN3ccc8CC1x9y15E = {  "_ZN3ccc8CC1x9y15E", // class name
  bases__ZN3ccc8CC1x9y15E, 2,
  &(vtc__ZN3ccc8CC1x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x9y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x9y15  : virtual ::ccc::AA1 , virtual ::ccc::BB9 {
  ~DD1x9y15(); // tgen
  DD1x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD1x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x9y15 ::~DD1x9y15(){ note_dtor("_ZN3ccc8DD1x9y15E", this);} // tgen
ccc::DD1x9y15 ::DD1x9y15(){ note_ctor("_ZN3ccc8DD1x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD1x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x9y15E, buf);
    ::ccc::DD1x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x9y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD1x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x9y15E);
    dp->::ccc::DD1x9y15::~DD1x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x9y15E(Test__ZN3ccc8DD1x9y15E, "_ZN3ccc8DD1x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x9y15C1Ev();
extern void _ZN3ccc8DD1x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD1x9y15E[] = {
  NSPAIR(_ZN3ccc8DD1x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD1x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD1x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x9y15E[] = {
  {&(_ZTVN3ccc8DD1x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x9y15E[];
Class_Descriptor cd__ZN3ccc8DD1x9y15E = {  "_ZN3ccc8DD1x9y15E", // class name
  bases__ZN3ccc8DD1x9y15E, 2,
  &(vtc__ZN3ccc8DD1x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x9y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y0  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y03pqrEv
  ~CC1x10y0(); // tgen
  CC1x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y0E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y03abcEv");}
void  ccc::CC1x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y03efgEv");}
void  ccc::CC1x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y03pqrEv");}
ccc::CC1x10y0 ::~CC1x10y0(){ note_dtor("_ZN3ccc8CC1x10y0E", this);} // tgen
ccc::CC1x10y0 ::CC1x10y0(){ note_ctor("_ZN3ccc8CC1x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y0E, buf);
    ::ccc::CC1x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y0E);
    dp->::ccc::CC1x10y0::~CC1x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y0E(Test__ZN3ccc8CC1x10y0E, "_ZN3ccc8CC1x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y0C1Ev();
extern void _ZN3ccc8CC1x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y0E[] = {
  NSPAIR(_ZN3ccc8CC1x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y0E[];
extern void _ZN3ccc8CC1x10y03pqrEv();
extern void _ZN3ccc8CC1x10y03abcEv();
extern void _ZN3ccc8CC1x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y03abcEv,_ZTv0_n12_N3ccc8CC1x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y03abcEv,_ZThn4_N3ccc8CC1x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y03pqrEv,_ZTv0_n16_N3ccc8CC1x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y03pqrEv,_ZThn4_N3ccc8CC1x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y03efgEv,_ZTv0_n20_N3ccc8CC1x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y03efgEv,_ZThn4_N3ccc8CC1x10y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y03abcEv,_ZTv0_n12_N3ccc8CC1x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y03pqrEv,_ZTv0_n16_N3ccc8CC1x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y03efgEv,_ZTv0_n20_N3ccc8CC1x10y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y0E[] = {
  {&(_ZTVN3ccc8CC1x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y0E[];
static VTBL_ENTRY alt_thunk_names729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y03efgEv,_ZTv0_n20_N3ccc8CC1x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y03efgEv,_ZThn4_N3ccc8CC1x10y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y03pqrEv,_ZTv0_n16_N3ccc8CC1x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y03pqrEv,_ZThn4_N3ccc8CC1x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y03abcEv,_ZTv0_n12_N3ccc8CC1x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y03abcEv,_ZThn4_N3ccc8CC1x10y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y0E = {  "_ZN3ccc8CC1x10y0E", // class name
  bases__ZN3ccc8CC1x10y0E, 2,
  &(vtc__ZN3ccc8CC1x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y0E),2, //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  DD1x10y0  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD1x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y03pqrEv
  ~DD1x10y0(); // tgen
  DD1x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y03abcEv");}
void  ccc::DD1x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y03efgEv");}
void  ccc::DD1x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y03pqrEv");}
ccc::DD1x10y0 ::~DD1x10y0(){ note_dtor("_ZN3ccc8DD1x10y0E", this);} // tgen
ccc::DD1x10y0 ::DD1x10y0(){ note_ctor("_ZN3ccc8DD1x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y0E, buf);
    ::ccc::DD1x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y0E);
    dp->::ccc::DD1x10y0::~DD1x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y0E(Test__ZN3ccc8DD1x10y0E, "_ZN3ccc8DD1x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y0C1Ev();
extern void _ZN3ccc8DD1x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y0E[] = {
  NSPAIR(_ZN3ccc8DD1x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y0E[];
extern void _ZN3ccc8DD1x10y03abcEv();
extern void _ZN3ccc8DD1x10y03pqrEv();
extern void _ZN3ccc8DD1x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y03pqrEv,_ZTv0_n12_N3ccc8DD1x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y03pqrEv,_ZThn4_N3ccc8DD1x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y03abcEv,_ZTv0_n16_N3ccc8DD1x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y03abcEv,_ZThn4_N3ccc8DD1x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y03pqrEv,_ZTv0_n12_N3ccc8DD1x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y03abcEv,_ZTv0_n16_N3ccc8DD1x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y0E[] = {
  {&(_ZTVN3ccc8DD1x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y0E[];
static VTBL_ENTRY alt_thunk_names730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y03abcEv,_ZTv0_n16_N3ccc8DD1x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y03abcEv,_ZThn4_N3ccc8DD1x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y03pqrEv,_ZTv0_n12_N3ccc8DD1x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y03pqrEv,_ZThn4_N3ccc8DD1x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y0E = {  "_ZN3ccc8DD1x10y0E", // class name
  bases__ZN3ccc8DD1x10y0E, 2,
  &(vtc__ZN3ccc8DD1x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y0E),3, //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  CC1x10y1  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x10y13efgEv
  ~CC1x10y1(); // tgen
  CC1x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y1E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y13abcEv");}
void  ccc::CC1x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y13pqrEv");}
void  ccc::CC1x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y13efgEv");}
ccc::CC1x10y1 ::~CC1x10y1(){ note_dtor("_ZN3ccc8CC1x10y1E", this);} // tgen
ccc::CC1x10y1 ::CC1x10y1(){ note_ctor("_ZN3ccc8CC1x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y1E, buf);
    ::ccc::CC1x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y1E);
    dp->::ccc::CC1x10y1::~CC1x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y1E(Test__ZN3ccc8CC1x10y1E, "_ZN3ccc8CC1x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y1C1Ev();
extern void _ZN3ccc8CC1x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y1E[] = {
  NSPAIR(_ZN3ccc8CC1x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y1E[];
extern void _ZN3ccc8CC1x10y13pqrEv();
extern void _ZN3ccc8CC1x10y13abcEv();
extern void _ZN3ccc8CC1x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y13abcEv,_ZTv0_n12_N3ccc8CC1x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y13abcEv,_ZThn4_N3ccc8CC1x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y13pqrEv,_ZTv0_n16_N3ccc8CC1x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y13pqrEv,_ZThn4_N3ccc8CC1x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y13efgEv,_ZTv0_n20_N3ccc8CC1x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y13efgEv,_ZThn4_N3ccc8CC1x10y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y13abcEv,_ZTv0_n12_N3ccc8CC1x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y13pqrEv,_ZTv0_n16_N3ccc8CC1x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y13efgEv,_ZTv0_n20_N3ccc8CC1x10y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y1E[] = {
  {&(_ZTVN3ccc8CC1x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y1E[];
static VTBL_ENTRY alt_thunk_names731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y13efgEv,_ZTv0_n20_N3ccc8CC1x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y13efgEv,_ZThn4_N3ccc8CC1x10y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y13pqrEv,_ZTv0_n16_N3ccc8CC1x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y13pqrEv,_ZThn4_N3ccc8CC1x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y13abcEv,_ZTv0_n12_N3ccc8CC1x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y13abcEv,_ZThn4_N3ccc8CC1x10y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y1E = {  "_ZN3ccc8CC1x10y1E", // class name
  bases__ZN3ccc8CC1x10y1E, 2,
  &(vtc__ZN3ccc8CC1x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y1E),2, //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  DD1x10y1  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD1x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x10y13efgEv
  ~DD1x10y1(); // tgen
  DD1x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y13abcEv");}
void  ccc::DD1x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y13pqrEv");}
void  ccc::DD1x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y13efgEv");}
ccc::DD1x10y1 ::~DD1x10y1(){ note_dtor("_ZN3ccc8DD1x10y1E", this);} // tgen
ccc::DD1x10y1 ::DD1x10y1(){ note_ctor("_ZN3ccc8DD1x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y1E, buf);
    ::ccc::DD1x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y1E);
    dp->::ccc::DD1x10y1::~DD1x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y1E(Test__ZN3ccc8DD1x10y1E, "_ZN3ccc8DD1x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y1C1Ev();
extern void _ZN3ccc8DD1x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y1E[] = {
  NSPAIR(_ZN3ccc8DD1x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y1E[];
extern void _ZN3ccc8DD1x10y13abcEv();
extern void _ZN3ccc8DD1x10y13pqrEv();
extern void _ZN3ccc8DD1x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y13pqrEv,_ZTv0_n12_N3ccc8DD1x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y13pqrEv,_ZThn4_N3ccc8DD1x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y13abcEv,_ZTv0_n16_N3ccc8DD1x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y13abcEv,_ZThn4_N3ccc8DD1x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y13pqrEv,_ZTv0_n12_N3ccc8DD1x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y13abcEv,_ZTv0_n16_N3ccc8DD1x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y1E[] = {
  {&(_ZTVN3ccc8DD1x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y1E[];
static VTBL_ENTRY alt_thunk_names732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y13abcEv,_ZTv0_n16_N3ccc8DD1x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y13abcEv,_ZThn4_N3ccc8DD1x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y13pqrEv,_ZTv0_n12_N3ccc8DD1x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y13pqrEv,_ZThn4_N3ccc8DD1x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y1E = {  "_ZN3ccc8DD1x10y1E", // class name
  bases__ZN3ccc8DD1x10y1E, 2,
  &(vtc__ZN3ccc8DD1x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y1E),3, //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  CC1x10y2  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y23pqrEv
  ~CC1x10y2(); // tgen
  CC1x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y2E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y23efgEv");}
void  ccc::CC1x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y23abcEv");}
void  ccc::CC1x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y23pqrEv");}
ccc::CC1x10y2 ::~CC1x10y2(){ note_dtor("_ZN3ccc8CC1x10y2E", this);} // tgen
ccc::CC1x10y2 ::CC1x10y2(){ note_ctor("_ZN3ccc8CC1x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y2E, buf);
    ::ccc::CC1x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y2E);
    dp->::ccc::CC1x10y2::~CC1x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y2E(Test__ZN3ccc8CC1x10y2E, "_ZN3ccc8CC1x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y2C1Ev();
extern void _ZN3ccc8CC1x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y2E[] = {
  NSPAIR(_ZN3ccc8CC1x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y2E[];
extern void _ZN3ccc8CC1x10y23pqrEv();
extern void _ZN3ccc8CC1x10y23abcEv();
extern void _ZN3ccc8CC1x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y23abcEv,_ZTv0_n12_N3ccc8CC1x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y23abcEv,_ZThn4_N3ccc8CC1x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y23pqrEv,_ZTv0_n16_N3ccc8CC1x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y23pqrEv,_ZThn4_N3ccc8CC1x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y23efgEv,_ZTv0_n20_N3ccc8CC1x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y23efgEv,_ZThn4_N3ccc8CC1x10y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y23abcEv,_ZTv0_n12_N3ccc8CC1x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y23pqrEv,_ZTv0_n16_N3ccc8CC1x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y23efgEv,_ZTv0_n20_N3ccc8CC1x10y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y2E[] = {
  {&(_ZTVN3ccc8CC1x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y2E[];
static VTBL_ENTRY alt_thunk_names733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y23efgEv,_ZTv0_n20_N3ccc8CC1x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y23efgEv,_ZThn4_N3ccc8CC1x10y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y23pqrEv,_ZTv0_n16_N3ccc8CC1x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y23pqrEv,_ZThn4_N3ccc8CC1x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y23abcEv,_ZTv0_n12_N3ccc8CC1x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y23abcEv,_ZThn4_N3ccc8CC1x10y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y2E = {  "_ZN3ccc8CC1x10y2E", // class name
  bases__ZN3ccc8CC1x10y2E, 2,
  &(vtc__ZN3ccc8CC1x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y2E),2, //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  DD1x10y2  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD1x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y23pqrEv
  ~DD1x10y2(); // tgen
  DD1x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y23efgEv");}
void  ccc::DD1x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y23abcEv");}
void  ccc::DD1x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y23pqrEv");}
ccc::DD1x10y2 ::~DD1x10y2(){ note_dtor("_ZN3ccc8DD1x10y2E", this);} // tgen
ccc::DD1x10y2 ::DD1x10y2(){ note_ctor("_ZN3ccc8DD1x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y2E, buf);
    ::ccc::DD1x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y2E);
    dp->::ccc::DD1x10y2::~DD1x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y2E(Test__ZN3ccc8DD1x10y2E, "_ZN3ccc8DD1x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y2C1Ev();
extern void _ZN3ccc8DD1x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y2E[] = {
  NSPAIR(_ZN3ccc8DD1x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y2E[];
extern void _ZN3ccc8DD1x10y23abcEv();
extern void _ZN3ccc8DD1x10y23pqrEv();
extern void _ZN3ccc8DD1x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y23pqrEv,_ZTv0_n12_N3ccc8DD1x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y23pqrEv,_ZThn4_N3ccc8DD1x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y23abcEv,_ZTv0_n16_N3ccc8DD1x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y23abcEv,_ZThn4_N3ccc8DD1x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y23pqrEv,_ZTv0_n12_N3ccc8DD1x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y23abcEv,_ZTv0_n16_N3ccc8DD1x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y2E[] = {
  {&(_ZTVN3ccc8DD1x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y2E[];
static VTBL_ENTRY alt_thunk_names734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y23abcEv,_ZTv0_n16_N3ccc8DD1x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y23abcEv,_ZThn4_N3ccc8DD1x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y23pqrEv,_ZTv0_n12_N3ccc8DD1x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y23pqrEv,_ZThn4_N3ccc8DD1x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y2E = {  "_ZN3ccc8DD1x10y2E", // class name
  bases__ZN3ccc8DD1x10y2E, 2,
  &(vtc__ZN3ccc8DD1x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y2E),3, //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  CC1x10y3  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x10y33abcEv
  ~CC1x10y3(); // tgen
  CC1x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y3E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y33efgEv");}
void  ccc::CC1x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y33pqrEv");}
void  ccc::CC1x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y33abcEv");}
ccc::CC1x10y3 ::~CC1x10y3(){ note_dtor("_ZN3ccc8CC1x10y3E", this);} // tgen
ccc::CC1x10y3 ::CC1x10y3(){ note_ctor("_ZN3ccc8CC1x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y3E, buf);
    ::ccc::CC1x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y3E);
    dp->::ccc::CC1x10y3::~CC1x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y3E(Test__ZN3ccc8CC1x10y3E, "_ZN3ccc8CC1x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y3C1Ev();
extern void _ZN3ccc8CC1x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y3E[] = {
  NSPAIR(_ZN3ccc8CC1x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y3E[];
extern void _ZN3ccc8CC1x10y33pqrEv();
extern void _ZN3ccc8CC1x10y33abcEv();
extern void _ZN3ccc8CC1x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y33abcEv,_ZTv0_n12_N3ccc8CC1x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y33abcEv,_ZThn4_N3ccc8CC1x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y33pqrEv,_ZTv0_n16_N3ccc8CC1x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y33pqrEv,_ZThn4_N3ccc8CC1x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y33efgEv,_ZTv0_n20_N3ccc8CC1x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y33efgEv,_ZThn4_N3ccc8CC1x10y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y33abcEv,_ZTv0_n12_N3ccc8CC1x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y33pqrEv,_ZTv0_n16_N3ccc8CC1x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y33efgEv,_ZTv0_n20_N3ccc8CC1x10y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y3E[] = {
  {&(_ZTVN3ccc8CC1x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y3E[];
static VTBL_ENTRY alt_thunk_names735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y33efgEv,_ZTv0_n20_N3ccc8CC1x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y33efgEv,_ZThn4_N3ccc8CC1x10y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y33pqrEv,_ZTv0_n16_N3ccc8CC1x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y33pqrEv,_ZThn4_N3ccc8CC1x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y33abcEv,_ZTv0_n12_N3ccc8CC1x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y33abcEv,_ZThn4_N3ccc8CC1x10y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y3E = {  "_ZN3ccc8CC1x10y3E", // class name
  bases__ZN3ccc8CC1x10y3E, 2,
  &(vtc__ZN3ccc8CC1x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y3E),2, //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  DD1x10y3  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD1x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x10y33abcEv
  ~DD1x10y3(); // tgen
  DD1x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y33efgEv");}
void  ccc::DD1x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y33pqrEv");}
void  ccc::DD1x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y33abcEv");}
ccc::DD1x10y3 ::~DD1x10y3(){ note_dtor("_ZN3ccc8DD1x10y3E", this);} // tgen
ccc::DD1x10y3 ::DD1x10y3(){ note_ctor("_ZN3ccc8DD1x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y3E, buf);
    ::ccc::DD1x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y3E);
    dp->::ccc::DD1x10y3::~DD1x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y3E(Test__ZN3ccc8DD1x10y3E, "_ZN3ccc8DD1x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y3C1Ev();
extern void _ZN3ccc8DD1x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y3E[] = {
  NSPAIR(_ZN3ccc8DD1x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y3E[];
extern void _ZN3ccc8DD1x10y33abcEv();
extern void _ZN3ccc8DD1x10y33pqrEv();
extern void _ZN3ccc8DD1x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y33pqrEv,_ZTv0_n12_N3ccc8DD1x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y33pqrEv,_ZThn4_N3ccc8DD1x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y33abcEv,_ZTv0_n16_N3ccc8DD1x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y33abcEv,_ZThn4_N3ccc8DD1x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y33pqrEv,_ZTv0_n12_N3ccc8DD1x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y33abcEv,_ZTv0_n16_N3ccc8DD1x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y3E[] = {
  {&(_ZTVN3ccc8DD1x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y3E[];
static VTBL_ENTRY alt_thunk_names736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y33abcEv,_ZTv0_n16_N3ccc8DD1x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y33abcEv,_ZThn4_N3ccc8DD1x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y33pqrEv,_ZTv0_n12_N3ccc8DD1x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y33pqrEv,_ZThn4_N3ccc8DD1x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y3E = {  "_ZN3ccc8DD1x10y3E", // class name
  bases__ZN3ccc8DD1x10y3E, 2,
  &(vtc__ZN3ccc8DD1x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y3E),3, //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  CC1x10y4  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC1x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y43efgEv
  ~CC1x10y4(); // tgen
  CC1x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y4E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y43pqrEv");}
void  ccc::CC1x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y43abcEv");}
void  ccc::CC1x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y43efgEv");}
ccc::CC1x10y4 ::~CC1x10y4(){ note_dtor("_ZN3ccc8CC1x10y4E", this);} // tgen
ccc::CC1x10y4 ::CC1x10y4(){ note_ctor("_ZN3ccc8CC1x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y4E, buf);
    ::ccc::CC1x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y4E);
    dp->::ccc::CC1x10y4::~CC1x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y4E(Test__ZN3ccc8CC1x10y4E, "_ZN3ccc8CC1x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y4C1Ev();
extern void _ZN3ccc8CC1x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y4E[] = {
  NSPAIR(_ZN3ccc8CC1x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y4E[];
extern void _ZN3ccc8CC1x10y43pqrEv();
extern void _ZN3ccc8CC1x10y43abcEv();
extern void _ZN3ccc8CC1x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y43abcEv,_ZTv0_n12_N3ccc8CC1x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y43abcEv,_ZThn4_N3ccc8CC1x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y43pqrEv,_ZTv0_n16_N3ccc8CC1x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y43pqrEv,_ZThn4_N3ccc8CC1x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y43efgEv,_ZTv0_n20_N3ccc8CC1x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y43efgEv,_ZThn4_N3ccc8CC1x10y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y43abcEv,_ZTv0_n12_N3ccc8CC1x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y43pqrEv,_ZTv0_n16_N3ccc8CC1x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y43efgEv,_ZTv0_n20_N3ccc8CC1x10y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y4E[] = {
  {&(_ZTVN3ccc8CC1x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y4E[];
static VTBL_ENTRY alt_thunk_names737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y43efgEv,_ZTv0_n20_N3ccc8CC1x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y43efgEv,_ZThn4_N3ccc8CC1x10y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y43pqrEv,_ZTv0_n16_N3ccc8CC1x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y43pqrEv,_ZThn4_N3ccc8CC1x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y43abcEv,_ZTv0_n12_N3ccc8CC1x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y43abcEv,_ZThn4_N3ccc8CC1x10y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y4E = {  "_ZN3ccc8CC1x10y4E", // class name
  bases__ZN3ccc8CC1x10y4E, 2,
  &(vtc__ZN3ccc8CC1x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y4E),2, //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  DD1x10y4  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD1x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x10y43efgEv
  ~DD1x10y4(); // tgen
  DD1x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y43pqrEv");}
void  ccc::DD1x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y43abcEv");}
void  ccc::DD1x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y43efgEv");}
ccc::DD1x10y4 ::~DD1x10y4(){ note_dtor("_ZN3ccc8DD1x10y4E", this);} // tgen
ccc::DD1x10y4 ::DD1x10y4(){ note_ctor("_ZN3ccc8DD1x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y4E, buf);
    ::ccc::DD1x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y4E);
    dp->::ccc::DD1x10y4::~DD1x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y4E(Test__ZN3ccc8DD1x10y4E, "_ZN3ccc8DD1x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y4C1Ev();
extern void _ZN3ccc8DD1x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y4E[] = {
  NSPAIR(_ZN3ccc8DD1x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y4E[];
extern void _ZN3ccc8DD1x10y43abcEv();
extern void _ZN3ccc8DD1x10y43pqrEv();
extern void _ZN3ccc8DD1x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y43pqrEv,_ZTv0_n12_N3ccc8DD1x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y43pqrEv,_ZThn4_N3ccc8DD1x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y43abcEv,_ZTv0_n16_N3ccc8DD1x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y43abcEv,_ZThn4_N3ccc8DD1x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y43pqrEv,_ZTv0_n12_N3ccc8DD1x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y43abcEv,_ZTv0_n16_N3ccc8DD1x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y4E[] = {
  {&(_ZTVN3ccc8DD1x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y4E[];
static VTBL_ENTRY alt_thunk_names738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y43abcEv,_ZTv0_n16_N3ccc8DD1x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y43abcEv,_ZThn4_N3ccc8DD1x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y43pqrEv,_ZTv0_n12_N3ccc8DD1x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y43pqrEv,_ZThn4_N3ccc8DD1x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y4E = {  "_ZN3ccc8DD1x10y4E", // class name
  bases__ZN3ccc8DD1x10y4E, 2,
  &(vtc__ZN3ccc8DD1x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y4E),3, //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  CC1x10y5  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC1x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y53abcEv
  ~CC1x10y5(); // tgen
  CC1x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y5E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y53pqrEv");}
void  ccc::CC1x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y53efgEv");}
void  ccc::CC1x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y53abcEv");}
ccc::CC1x10y5 ::~CC1x10y5(){ note_dtor("_ZN3ccc8CC1x10y5E", this);} // tgen
ccc::CC1x10y5 ::CC1x10y5(){ note_ctor("_ZN3ccc8CC1x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y5E, buf);
    ::ccc::CC1x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y5E);
    dp->::ccc::CC1x10y5::~CC1x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y5E(Test__ZN3ccc8CC1x10y5E, "_ZN3ccc8CC1x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y5C1Ev();
extern void _ZN3ccc8CC1x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y5E[] = {
  NSPAIR(_ZN3ccc8CC1x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y5E[];
extern void _ZN3ccc8CC1x10y53pqrEv();
extern void _ZN3ccc8CC1x10y53abcEv();
extern void _ZN3ccc8CC1x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y53abcEv,_ZTv0_n12_N3ccc8CC1x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y53abcEv,_ZThn4_N3ccc8CC1x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y53pqrEv,_ZTv0_n16_N3ccc8CC1x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y53pqrEv,_ZThn4_N3ccc8CC1x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y53efgEv,_ZTv0_n20_N3ccc8CC1x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y53efgEv,_ZThn4_N3ccc8CC1x10y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y53abcEv,_ZTv0_n12_N3ccc8CC1x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y53pqrEv,_ZTv0_n16_N3ccc8CC1x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y53efgEv,_ZTv0_n20_N3ccc8CC1x10y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y5E[] = {
  {&(_ZTVN3ccc8CC1x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y5E[];
static VTBL_ENTRY alt_thunk_names739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y53efgEv,_ZTv0_n20_N3ccc8CC1x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y53efgEv,_ZThn4_N3ccc8CC1x10y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y53pqrEv,_ZTv0_n16_N3ccc8CC1x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y53pqrEv,_ZThn4_N3ccc8CC1x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y53abcEv,_ZTv0_n12_N3ccc8CC1x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y53abcEv,_ZThn4_N3ccc8CC1x10y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y5E = {  "_ZN3ccc8CC1x10y5E", // class name
  bases__ZN3ccc8CC1x10y5E, 2,
  &(vtc__ZN3ccc8CC1x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y5E),2, //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  DD1x10y5  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD1x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x10y53abcEv
  ~DD1x10y5(); // tgen
  DD1x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y53pqrEv");}
void  ccc::DD1x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y53efgEv");}
void  ccc::DD1x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y53abcEv");}
ccc::DD1x10y5 ::~DD1x10y5(){ note_dtor("_ZN3ccc8DD1x10y5E", this);} // tgen
ccc::DD1x10y5 ::DD1x10y5(){ note_ctor("_ZN3ccc8DD1x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y5E, buf);
    ::ccc::DD1x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y5E);
    dp->::ccc::DD1x10y5::~DD1x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y5E(Test__ZN3ccc8DD1x10y5E, "_ZN3ccc8DD1x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y5C1Ev();
extern void _ZN3ccc8DD1x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y5E[] = {
  NSPAIR(_ZN3ccc8DD1x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y5E[];
extern void _ZN3ccc8DD1x10y53abcEv();
extern void _ZN3ccc8DD1x10y53pqrEv();
extern void _ZN3ccc8DD1x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y53pqrEv,_ZTv0_n12_N3ccc8DD1x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y53pqrEv,_ZThn4_N3ccc8DD1x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y53abcEv,_ZTv0_n16_N3ccc8DD1x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y53abcEv,_ZThn4_N3ccc8DD1x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y53pqrEv,_ZTv0_n12_N3ccc8DD1x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y53abcEv,_ZTv0_n16_N3ccc8DD1x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y5E[] = {
  {&(_ZTVN3ccc8DD1x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y5E[];
static VTBL_ENTRY alt_thunk_names740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y53abcEv,_ZTv0_n16_N3ccc8DD1x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y53abcEv,_ZThn4_N3ccc8DD1x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y53pqrEv,_ZTv0_n12_N3ccc8DD1x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y53pqrEv,_ZThn4_N3ccc8DD1x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y5E = {  "_ZN3ccc8DD1x10y5E", // class name
  bases__ZN3ccc8DD1x10y5E, 2,
  &(vtc__ZN3ccc8DD1x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y5E),3, //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  CC1x10y6  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y63efgEv
  ~CC1x10y6(); // tgen
  CC1x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y6E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y63abcEv");}
void  ccc::CC1x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y63efgEv");}
ccc::CC1x10y6 ::~CC1x10y6(){ note_dtor("_ZN3ccc8CC1x10y6E", this);} // tgen
ccc::CC1x10y6 ::CC1x10y6(){ note_ctor("_ZN3ccc8CC1x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y6E, buf);
    ::ccc::CC1x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y6E);
    dp->::ccc::CC1x10y6::~CC1x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y6E(Test__ZN3ccc8CC1x10y6E, "_ZN3ccc8CC1x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y6C1Ev();
extern void _ZN3ccc8CC1x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y6E[] = {
  NSPAIR(_ZN3ccc8CC1x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC1x10y63abcEv();
extern void _ZN3ccc8CC1x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y63abcEv,_ZTv0_n12_N3ccc8CC1x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y63abcEv,_ZThn4_N3ccc8CC1x10y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y63efgEv,_ZTv0_n20_N3ccc8CC1x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y63efgEv,_ZThn4_N3ccc8CC1x10y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y63abcEv,_ZTv0_n12_N3ccc8CC1x10y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y63efgEv,_ZTv0_n20_N3ccc8CC1x10y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y6E[] = {
  {&(_ZTVN3ccc8CC1x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y6E[];
static VTBL_ENTRY alt_thunk_names741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y63efgEv,_ZTv0_n20_N3ccc8CC1x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y63efgEv,_ZThn4_N3ccc8CC1x10y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y63abcEv,_ZTv0_n12_N3ccc8CC1x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y63abcEv,_ZThn4_N3ccc8CC1x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y6E = {  "_ZN3ccc8CC1x10y6E", // class name
  bases__ZN3ccc8CC1x10y6E, 2,
  &(vtc__ZN3ccc8CC1x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y6E),2, //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  DD1x10y6  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD1x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x10y63efgEv
  ~DD1x10y6(); // tgen
  DD1x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y63abcEv");}
void  ccc::DD1x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y63efgEv");}
ccc::DD1x10y6 ::~DD1x10y6(){ note_dtor("_ZN3ccc8DD1x10y6E", this);} // tgen
ccc::DD1x10y6 ::DD1x10y6(){ note_ctor("_ZN3ccc8DD1x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y6E, buf);
    ::ccc::DD1x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y6E);
    dp->::ccc::DD1x10y6::~DD1x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y6E(Test__ZN3ccc8DD1x10y6E, "_ZN3ccc8DD1x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y6C1Ev();
extern void _ZN3ccc8DD1x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y6E[] = {
  NSPAIR(_ZN3ccc8DD1x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y6E[];
extern void _ZN3ccc8DD1x10y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y63abcEv,_ZTv0_n16_N3ccc8DD1x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y63abcEv,_ZThn4_N3ccc8DD1x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y63abcEv,_ZTv0_n16_N3ccc8DD1x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y6E[] = {
  {&(_ZTVN3ccc8DD1x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y6E[];
static VTBL_ENTRY alt_thunk_names742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y63abcEv,_ZTv0_n16_N3ccc8DD1x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y63abcEv,_ZThn4_N3ccc8DD1x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y6E = {  "_ZN3ccc8DD1x10y6E", // class name
  bases__ZN3ccc8DD1x10y6E, 2,
  &(vtc__ZN3ccc8DD1x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y6E),3, //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  CC1x10y7  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y73pqrEv
  ~CC1x10y7(); // tgen
  CC1x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y7E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y73abcEv");}
void  ccc::CC1x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y73pqrEv");}
ccc::CC1x10y7 ::~CC1x10y7(){ note_dtor("_ZN3ccc8CC1x10y7E", this);} // tgen
ccc::CC1x10y7 ::CC1x10y7(){ note_ctor("_ZN3ccc8CC1x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y7E, buf);
    ::ccc::CC1x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y7E);
    dp->::ccc::CC1x10y7::~CC1x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y7E(Test__ZN3ccc8CC1x10y7E, "_ZN3ccc8CC1x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y7C1Ev();
extern void _ZN3ccc8CC1x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y7E[] = {
  NSPAIR(_ZN3ccc8CC1x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y7E[];
extern void _ZN3ccc8CC1x10y73pqrEv();
extern void _ZN3ccc8CC1x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y73abcEv,_ZTv0_n12_N3ccc8CC1x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y73abcEv,_ZThn4_N3ccc8CC1x10y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y73pqrEv,_ZTv0_n16_N3ccc8CC1x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y73pqrEv,_ZThn4_N3ccc8CC1x10y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y73abcEv,_ZTv0_n12_N3ccc8CC1x10y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y73pqrEv,_ZTv0_n16_N3ccc8CC1x10y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y7E[] = {
  {&(_ZTVN3ccc8CC1x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y7E[];
static VTBL_ENTRY alt_thunk_names743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y73pqrEv,_ZTv0_n16_N3ccc8CC1x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y73pqrEv,_ZThn4_N3ccc8CC1x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y73abcEv,_ZTv0_n12_N3ccc8CC1x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y73abcEv,_ZThn4_N3ccc8CC1x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y7E = {  "_ZN3ccc8CC1x10y7E", // class name
  bases__ZN3ccc8CC1x10y7E, 2,
  &(vtc__ZN3ccc8CC1x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y7E),2, //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  DD1x10y7  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD1x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y73pqrEv
  ~DD1x10y7(); // tgen
  DD1x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y73abcEv");}
void  ccc::DD1x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y73pqrEv");}
ccc::DD1x10y7 ::~DD1x10y7(){ note_dtor("_ZN3ccc8DD1x10y7E", this);} // tgen
ccc::DD1x10y7 ::DD1x10y7(){ note_ctor("_ZN3ccc8DD1x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y7E, buf);
    ::ccc::DD1x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y7E);
    dp->::ccc::DD1x10y7::~DD1x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y7E(Test__ZN3ccc8DD1x10y7E, "_ZN3ccc8DD1x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y7C1Ev();
extern void _ZN3ccc8DD1x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y7E[] = {
  NSPAIR(_ZN3ccc8DD1x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y7E[];
extern void _ZN3ccc8DD1x10y73abcEv();
extern void _ZN3ccc8DD1x10y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y73pqrEv,_ZTv0_n12_N3ccc8DD1x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y73pqrEv,_ZThn4_N3ccc8DD1x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y73abcEv,_ZTv0_n16_N3ccc8DD1x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y73abcEv,_ZThn4_N3ccc8DD1x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y73pqrEv,_ZTv0_n12_N3ccc8DD1x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y73abcEv,_ZTv0_n16_N3ccc8DD1x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y7E[] = {
  {&(_ZTVN3ccc8DD1x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y7E[];
static VTBL_ENTRY alt_thunk_names744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y73abcEv,_ZTv0_n16_N3ccc8DD1x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y73abcEv,_ZThn4_N3ccc8DD1x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y73pqrEv,_ZTv0_n12_N3ccc8DD1x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y73pqrEv,_ZThn4_N3ccc8DD1x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y7E = {  "_ZN3ccc8DD1x10y7E", // class name
  bases__ZN3ccc8DD1x10y7E, 2,
  &(vtc__ZN3ccc8DD1x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y7E),3, //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  CC1x10y8  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y83abcEv
  ~CC1x10y8(); // tgen
  CC1x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y8E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y83efgEv");}
void  ccc::CC1x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y83abcEv");}
ccc::CC1x10y8 ::~CC1x10y8(){ note_dtor("_ZN3ccc8CC1x10y8E", this);} // tgen
ccc::CC1x10y8 ::CC1x10y8(){ note_ctor("_ZN3ccc8CC1x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y8E, buf);
    ::ccc::CC1x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y8E);
    dp->::ccc::CC1x10y8::~CC1x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y8E(Test__ZN3ccc8CC1x10y8E, "_ZN3ccc8CC1x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y8C1Ev();
extern void _ZN3ccc8CC1x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y8E[] = {
  NSPAIR(_ZN3ccc8CC1x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC1x10y83abcEv();
extern void _ZN3ccc8CC1x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x10y83abcEv,_ZTv0_n12_N3ccc8CC1x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y83abcEv,_ZThn4_N3ccc8CC1x10y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y83efgEv,_ZTv0_n20_N3ccc8CC1x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y83efgEv,_ZThn4_N3ccc8CC1x10y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x10y83abcEv,_ZTv0_n12_N3ccc8CC1x10y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y83efgEv,_ZTv0_n20_N3ccc8CC1x10y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y8E[] = {
  {&(_ZTVN3ccc8CC1x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y8E[];
static VTBL_ENTRY alt_thunk_names745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y83efgEv,_ZTv0_n20_N3ccc8CC1x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y83efgEv,_ZThn4_N3ccc8CC1x10y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x10y83abcEv,_ZTv0_n12_N3ccc8CC1x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y83abcEv,_ZThn4_N3ccc8CC1x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y8E = {  "_ZN3ccc8CC1x10y8E", // class name
  bases__ZN3ccc8CC1x10y8E, 2,
  &(vtc__ZN3ccc8CC1x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y8E),2, //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  DD1x10y8  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD1x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x10y83abcEv
  ~DD1x10y8(); // tgen
  DD1x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y83efgEv");}
void  ccc::DD1x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x10y83abcEv");}
ccc::DD1x10y8 ::~DD1x10y8(){ note_dtor("_ZN3ccc8DD1x10y8E", this);} // tgen
ccc::DD1x10y8 ::DD1x10y8(){ note_ctor("_ZN3ccc8DD1x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y8E, buf);
    ::ccc::DD1x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y8E);
    dp->::ccc::DD1x10y8::~DD1x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y8E(Test__ZN3ccc8DD1x10y8E, "_ZN3ccc8DD1x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y8C1Ev();
extern void _ZN3ccc8DD1x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y8E[] = {
  NSPAIR(_ZN3ccc8DD1x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y8E[];
extern void _ZN3ccc8DD1x10y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x10y83abcEv,_ZTv0_n16_N3ccc8DD1x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y83abcEv,_ZThn4_N3ccc8DD1x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x10y83abcEv,_ZTv0_n16_N3ccc8DD1x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y8E[] = {
  {&(_ZTVN3ccc8DD1x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y8E[];
static VTBL_ENTRY alt_thunk_names746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x10y83abcEv,_ZTv0_n16_N3ccc8DD1x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y83abcEv,_ZThn4_N3ccc8DD1x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y8E = {  "_ZN3ccc8DD1x10y8E", // class name
  bases__ZN3ccc8DD1x10y8E, 2,
  &(vtc__ZN3ccc8DD1x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y8E),3, //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  CC1x10y9  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y93pqrEv
  ~CC1x10y9(); // tgen
  CC1x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y9E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y93efgEv");}
void  ccc::CC1x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y93pqrEv");}
ccc::CC1x10y9 ::~CC1x10y9(){ note_dtor("_ZN3ccc8CC1x10y9E", this);} // tgen
ccc::CC1x10y9 ::CC1x10y9(){ note_ctor("_ZN3ccc8CC1x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y9E, buf);
    ::ccc::CC1x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC1x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y9E);
    dp->::ccc::CC1x10y9::~CC1x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y9E(Test__ZN3ccc8CC1x10y9E, "_ZN3ccc8CC1x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y9C1Ev();
extern void _ZN3ccc8CC1x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y9E[] = {
  NSPAIR(_ZN3ccc8CC1x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y9E[];
extern void _ZN3ccc8CC1x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC1x10y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x10y93pqrEv,_ZTv0_n16_N3ccc8CC1x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y93pqrEv,_ZThn4_N3ccc8CC1x10y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x10y93efgEv,_ZTv0_n20_N3ccc8CC1x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y93efgEv,_ZThn4_N3ccc8CC1x10y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x10y93pqrEv,_ZTv0_n16_N3ccc8CC1x10y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x10y93efgEv,_ZTv0_n20_N3ccc8CC1x10y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x10y9E[] = {
  {&(_ZTVN3ccc8CC1x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x10y9E[];
static VTBL_ENTRY alt_thunk_names747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x10y93efgEv,_ZTv0_n20_N3ccc8CC1x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y93efgEv,_ZThn4_N3ccc8CC1x10y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x10y93pqrEv,_ZTv0_n16_N3ccc8CC1x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x10y93pqrEv,_ZThn4_N3ccc8CC1x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x10y9E = {  "_ZN3ccc8CC1x10y9E", // class name
  bases__ZN3ccc8CC1x10y9E, 2,
  &(vtc__ZN3ccc8CC1x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x10y9E),2, //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  DD1x10y9  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD1x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x10y93pqrEv
  ~DD1x10y9(); // tgen
  DD1x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x10y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x10y93efgEv");}
void  ccc::DD1x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x10y93pqrEv");}
ccc::DD1x10y9 ::~DD1x10y9(){ note_dtor("_ZN3ccc8DD1x10y9E", this);} // tgen
ccc::DD1x10y9 ::DD1x10y9(){ note_ctor("_ZN3ccc8DD1x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x10y9E, buf);
    ::ccc::DD1x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x10y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD1x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x10y9E);
    dp->::ccc::DD1x10y9::~DD1x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x10y9E(Test__ZN3ccc8DD1x10y9E, "_ZN3ccc8DD1x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x10y9C1Ev();
extern void _ZN3ccc8DD1x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x10y9E[] = {
  NSPAIR(_ZN3ccc8DD1x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD1x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x10y93pqrEv();
extern void _ZN3ccc8DD1x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x10y93pqrEv,_ZTv0_n12_N3ccc8DD1x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x10y93pqrEv,_ZThn4_N3ccc8DD1x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x10y93pqrEv,_ZTv0_n12_N3ccc8DD1x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x10y9E[] = {
  {&(_ZTVN3ccc8DD1x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x10y9E[];
static VTBL_ENTRY alt_thunk_names748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x10y93pqrEv,_ZTv0_n12_N3ccc8DD1x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x10y93pqrEv,_ZThn4_N3ccc8DD1x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x10y9E = {  "_ZN3ccc8DD1x10y9E", // class name
  bases__ZN3ccc8DD1x10y9E, 2,
  &(vtc__ZN3ccc8DD1x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x10y9E),3, //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  CC1x10y10  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x10y103abcEv
  ~CC1x10y10(); // tgen
  CC1x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y10E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y103pqrEv");}
void  ccc::CC1x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x10y103abcEv");}
ccc::CC1x10y10 ::~CC1x10y10(){ note_dtor("_ZN3ccc9CC1x10y10E", this);} // tgen
ccc::CC1x10y10 ::CC1x10y10(){ note_ctor("_ZN3ccc9CC1x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y10E, buf);
    ::ccc::CC1x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y10E);
    dp->::ccc::CC1x10y10::~CC1x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y10E(Test__ZN3ccc9CC1x10y10E, "_ZN3ccc9CC1x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y10C1Ev();
extern void _ZN3ccc9CC1x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y10E[] = {
  NSPAIR(_ZN3ccc9CC1x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y10E[];
extern void _ZN3ccc9CC1x10y103pqrEv();
extern void _ZN3ccc9CC1x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x10y103abcEv,_ZTv0_n12_N3ccc9CC1x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y103abcEv,_ZThn4_N3ccc9CC1x10y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x10y103pqrEv,_ZTv0_n16_N3ccc9CC1x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y103pqrEv,_ZThn4_N3ccc9CC1x10y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x10y103abcEv,_ZTv0_n12_N3ccc9CC1x10y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x10y103pqrEv,_ZTv0_n16_N3ccc9CC1x10y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y10E[] = {
  {&(_ZTVN3ccc9CC1x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y10E[];
static VTBL_ENTRY alt_thunk_names749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x10y103pqrEv,_ZTv0_n16_N3ccc9CC1x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y103pqrEv,_ZThn4_N3ccc9CC1x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x10y103abcEv,_ZTv0_n12_N3ccc9CC1x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y103abcEv,_ZThn4_N3ccc9CC1x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x10y10E = {  "_ZN3ccc9CC1x10y10E", // class name
  bases__ZN3ccc9CC1x10y10E, 2,
  &(vtc__ZN3ccc9CC1x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y10E),2, //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  DD1x10y10  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD1x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x10y103abcEv
  ~DD1x10y10(); // tgen
  DD1x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x10y103pqrEv");}
void  ccc::DD1x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x10y103abcEv");}
ccc::DD1x10y10 ::~DD1x10y10(){ note_dtor("_ZN3ccc9DD1x10y10E", this);} // tgen
ccc::DD1x10y10 ::DD1x10y10(){ note_ctor("_ZN3ccc9DD1x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y10E, buf);
    ::ccc::DD1x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y10E);
    dp->::ccc::DD1x10y10::~DD1x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y10E(Test__ZN3ccc9DD1x10y10E, "_ZN3ccc9DD1x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y10C1Ev();
extern void _ZN3ccc9DD1x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y10E[] = {
  NSPAIR(_ZN3ccc9DD1x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y10E[];
extern void _ZN3ccc9DD1x10y103abcEv();
extern void _ZN3ccc9DD1x10y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x10y103pqrEv,_ZTv0_n12_N3ccc9DD1x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x10y103pqrEv,_ZThn4_N3ccc9DD1x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD1x10y103abcEv,_ZTv0_n16_N3ccc9DD1x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x10y103abcEv,_ZThn4_N3ccc9DD1x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x10y103pqrEv,_ZTv0_n12_N3ccc9DD1x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD1x10y103abcEv,_ZTv0_n16_N3ccc9DD1x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y10E[] = {
  {&(_ZTVN3ccc9DD1x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y10E[];
static VTBL_ENTRY alt_thunk_names750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD1x10y103abcEv,_ZTv0_n16_N3ccc9DD1x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x10y103abcEv,_ZThn4_N3ccc9DD1x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x10y103pqrEv,_ZTv0_n12_N3ccc9DD1x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x10y103pqrEv,_ZThn4_N3ccc9DD1x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x10y10E = {  "_ZN3ccc9DD1x10y10E", // class name
  bases__ZN3ccc9DD1x10y10E, 2,
  &(vtc__ZN3ccc9DD1x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y10E),3, //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  CC1x10y11  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x10y113efgEv
  ~CC1x10y11(); // tgen
  CC1x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y11E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y113pqrEv");}
void  ccc::CC1x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x10y113efgEv");}
ccc::CC1x10y11 ::~CC1x10y11(){ note_dtor("_ZN3ccc9CC1x10y11E", this);} // tgen
ccc::CC1x10y11 ::CC1x10y11(){ note_ctor("_ZN3ccc9CC1x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y11E, buf);
    ::ccc::CC1x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y11E);
    dp->::ccc::CC1x10y11::~CC1x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y11E(Test__ZN3ccc9CC1x10y11E, "_ZN3ccc9CC1x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y11C1Ev();
extern void _ZN3ccc9CC1x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y11E[] = {
  NSPAIR(_ZN3ccc9CC1x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y11E[];
extern void _ZN3ccc9CC1x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC1x10y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x10y113pqrEv,_ZTv0_n16_N3ccc9CC1x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y113pqrEv,_ZThn4_N3ccc9CC1x10y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x10y113efgEv,_ZTv0_n20_N3ccc9CC1x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y113efgEv,_ZThn4_N3ccc9CC1x10y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x10y113pqrEv,_ZTv0_n16_N3ccc9CC1x10y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x10y113efgEv,_ZTv0_n20_N3ccc9CC1x10y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y11E[] = {
  {&(_ZTVN3ccc9CC1x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y11E[];
static VTBL_ENTRY alt_thunk_names751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x10y113efgEv,_ZTv0_n20_N3ccc9CC1x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y113efgEv,_ZThn4_N3ccc9CC1x10y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x10y113pqrEv,_ZTv0_n16_N3ccc9CC1x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y113pqrEv,_ZThn4_N3ccc9CC1x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x10y11E = {  "_ZN3ccc9CC1x10y11E", // class name
  bases__ZN3ccc9CC1x10y11E, 2,
  &(vtc__ZN3ccc9CC1x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y11E),2, //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  DD1x10y11  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD1x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x10y113efgEv
  ~DD1x10y11(); // tgen
  DD1x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x10y113pqrEv");}
void  ccc::DD1x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x10y113efgEv");}
ccc::DD1x10y11 ::~DD1x10y11(){ note_dtor("_ZN3ccc9DD1x10y11E", this);} // tgen
ccc::DD1x10y11 ::DD1x10y11(){ note_ctor("_ZN3ccc9DD1x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y11E, buf);
    ::ccc::DD1x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y11E);
    dp->::ccc::DD1x10y11::~DD1x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y11E(Test__ZN3ccc9DD1x10y11E, "_ZN3ccc9DD1x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y11C1Ev();
extern void _ZN3ccc9DD1x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y11E[] = {
  NSPAIR(_ZN3ccc9DD1x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x10y113pqrEv();
extern void _ZN3ccc9DD1x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x10y113pqrEv,_ZTv0_n12_N3ccc9DD1x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x10y113pqrEv,_ZThn4_N3ccc9DD1x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x10y113pqrEv,_ZTv0_n12_N3ccc9DD1x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y11E[] = {
  {&(_ZTVN3ccc9DD1x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y11E[];
static VTBL_ENTRY alt_thunk_names752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x10y113pqrEv,_ZTv0_n12_N3ccc9DD1x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x10y113pqrEv,_ZThn4_N3ccc9DD1x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x10y11E = {  "_ZN3ccc9DD1x10y11E", // class name
  bases__ZN3ccc9DD1x10y11E, 2,
  &(vtc__ZN3ccc9DD1x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y11E),3, //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  CC1x10y12  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC1x10y123abcEv
  ~CC1x10y12(); // tgen
  CC1x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x10y123abcEv");}
ccc::CC1x10y12 ::~CC1x10y12(){ note_dtor("_ZN3ccc9CC1x10y12E", this);} // tgen
ccc::CC1x10y12 ::CC1x10y12(){ note_ctor("_ZN3ccc9CC1x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y12E, buf);
    ::ccc::CC1x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y12E);
    dp->::ccc::CC1x10y12::~CC1x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y12E(Test__ZN3ccc9CC1x10y12E, "_ZN3ccc9CC1x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y12C1Ev();
extern void _ZN3ccc9CC1x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y12E[] = {
  NSPAIR(_ZN3ccc9CC1x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC1x10y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x10y123abcEv,_ZTv0_n12_N3ccc9CC1x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y123abcEv,_ZThn4_N3ccc9CC1x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x10y123abcEv,_ZTv0_n12_N3ccc9CC1x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y12E[] = {
  {&(_ZTVN3ccc9CC1x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y12E[];
static VTBL_ENTRY alt_thunk_names753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x10y123abcEv,_ZTv0_n12_N3ccc9CC1x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y123abcEv,_ZThn4_N3ccc9CC1x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x10y12E = {  "_ZN3ccc9CC1x10y12E", // class name
  bases__ZN3ccc9CC1x10y12E, 2,
  &(vtc__ZN3ccc9CC1x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y12E),2, //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  DD1x10y12  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD1x10y123abcEv
  ~DD1x10y12(); // tgen
  DD1x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x10y123abcEv");}
ccc::DD1x10y12 ::~DD1x10y12(){ note_dtor("_ZN3ccc9DD1x10y12E", this);} // tgen
ccc::DD1x10y12 ::DD1x10y12(){ note_ctor("_ZN3ccc9DD1x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y12E, buf);
    ::ccc::DD1x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y12E);
    dp->::ccc::DD1x10y12::~DD1x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y12E(Test__ZN3ccc9DD1x10y12E, "_ZN3ccc9DD1x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y12C1Ev();
extern void _ZN3ccc9DD1x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y12E[] = {
  NSPAIR(_ZN3ccc9DD1x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y12E[];
extern void _ZN3ccc9DD1x10y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD1x10y123abcEv,_ZTv0_n16_N3ccc9DD1x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x10y123abcEv,_ZThn4_N3ccc9DD1x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD1x10y123abcEv,_ZTv0_n16_N3ccc9DD1x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y12E[] = {
  {&(_ZTVN3ccc9DD1x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y12E[];
static VTBL_ENTRY alt_thunk_names754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD1x10y123abcEv,_ZTv0_n16_N3ccc9DD1x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x10y123abcEv,_ZThn4_N3ccc9DD1x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x10y12E = {  "_ZN3ccc9DD1x10y12E", // class name
  bases__ZN3ccc9DD1x10y12E, 2,
  &(vtc__ZN3ccc9DD1x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y12E),3, //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  CC1x10y13  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC1x10y133efgEv
  ~CC1x10y13(); // tgen
  CC1x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x10y133efgEv");}
ccc::CC1x10y13 ::~CC1x10y13(){ note_dtor("_ZN3ccc9CC1x10y13E", this);} // tgen
ccc::CC1x10y13 ::CC1x10y13(){ note_ctor("_ZN3ccc9CC1x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y13E, buf);
    ::ccc::CC1x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y13E);
    dp->::ccc::CC1x10y13::~CC1x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y13E(Test__ZN3ccc9CC1x10y13E, "_ZN3ccc9CC1x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y13C1Ev();
extern void _ZN3ccc9CC1x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y13E[] = {
  NSPAIR(_ZN3ccc9CC1x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC1x10y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x10y133efgEv,_ZTv0_n20_N3ccc9CC1x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y133efgEv,_ZThn4_N3ccc9CC1x10y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x10y133efgEv,_ZTv0_n20_N3ccc9CC1x10y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y13E[] = {
  {&(_ZTVN3ccc9CC1x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y13E[];
static VTBL_ENTRY alt_thunk_names755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x10y133efgEv,_ZTv0_n20_N3ccc9CC1x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y133efgEv,_ZThn4_N3ccc9CC1x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x10y13E = {  "_ZN3ccc9CC1x10y13E", // class name
  bases__ZN3ccc9CC1x10y13E, 2,
  &(vtc__ZN3ccc9CC1x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y13E),2, //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  DD1x10y13  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD1x10y133efgEv
  ~DD1x10y13(); // tgen
  DD1x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x10y133efgEv");}
ccc::DD1x10y13 ::~DD1x10y13(){ note_dtor("_ZN3ccc9DD1x10y13E", this);} // tgen
ccc::DD1x10y13 ::DD1x10y13(){ note_ctor("_ZN3ccc9DD1x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y13E, buf);
    ::ccc::DD1x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y13E);
    dp->::ccc::DD1x10y13::~DD1x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y13E(Test__ZN3ccc9DD1x10y13E, "_ZN3ccc9DD1x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y13C1Ev();
extern void _ZN3ccc9DD1x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y13E[] = {
  NSPAIR(_ZN3ccc9DD1x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y13E[] = {
  {&(_ZTVN3ccc9DD1x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y13E[];
Class_Descriptor cd__ZN3ccc9DD1x10y13E = {  "_ZN3ccc9DD1x10y13E", // class name
  bases__ZN3ccc9DD1x10y13E, 2,
  &(vtc__ZN3ccc9DD1x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y14  : virtual ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y143pqrEv
  ~CC1x10y14(); // tgen
  CC1x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y143pqrEv");}
ccc::CC1x10y14 ::~CC1x10y14(){ note_dtor("_ZN3ccc9CC1x10y14E", this);} // tgen
ccc::CC1x10y14 ::CC1x10y14(){ note_ctor("_ZN3ccc9CC1x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y14E, buf);
    ::ccc::CC1x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y14E);
    dp->::ccc::CC1x10y14::~CC1x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y14E(Test__ZN3ccc9CC1x10y14E, "_ZN3ccc9CC1x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y14C1Ev();
extern void _ZN3ccc9CC1x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y14E[] = {
  NSPAIR(_ZN3ccc9CC1x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y14E[];
extern void _ZN3ccc9CC1x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x10y143pqrEv,_ZTv0_n16_N3ccc9CC1x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y143pqrEv,_ZThn4_N3ccc9CC1x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x10y143pqrEv,_ZTv0_n16_N3ccc9CC1x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y14E[] = {
  {&(_ZTVN3ccc9CC1x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y14E[];
static VTBL_ENTRY alt_thunk_names756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x10y143pqrEv,_ZTv0_n16_N3ccc9CC1x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x10y143pqrEv,_ZThn4_N3ccc9CC1x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x10y14E = {  "_ZN3ccc9CC1x10y14E", // class name
  bases__ZN3ccc9CC1x10y14E, 2,
  &(vtc__ZN3ccc9CC1x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y14E),2, //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  DD1x10y14  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD1x10y143pqrEv
  ~DD1x10y14(); // tgen
  DD1x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x10y143pqrEv");}
ccc::DD1x10y14 ::~DD1x10y14(){ note_dtor("_ZN3ccc9DD1x10y14E", this);} // tgen
ccc::DD1x10y14 ::DD1x10y14(){ note_ctor("_ZN3ccc9DD1x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y14E, buf);
    ::ccc::DD1x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y14E);
    dp->::ccc::DD1x10y14::~DD1x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y14E(Test__ZN3ccc9DD1x10y14E, "_ZN3ccc9DD1x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y14C1Ev();
extern void _ZN3ccc9DD1x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y14E[] = {
  NSPAIR(_ZN3ccc9DD1x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x10y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x10y143pqrEv,_ZTv0_n12_N3ccc9DD1x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x10y143pqrEv,_ZThn4_N3ccc9DD1x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x10y143pqrEv,_ZTv0_n12_N3ccc9DD1x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y14E[] = {
  {&(_ZTVN3ccc9DD1x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y14E[];
static VTBL_ENTRY alt_thunk_names757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x10y143pqrEv,_ZTv0_n12_N3ccc9DD1x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x10y143pqrEv,_ZThn4_N3ccc9DD1x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x10y14E = {  "_ZN3ccc9DD1x10y14E", // class name
  bases__ZN3ccc9DD1x10y14E, 2,
  &(vtc__ZN3ccc9DD1x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y14E),3, //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  CC1x10y15  : virtual ::ccc::AA1 , ::ccc::BB10 {
  ~CC1x10y15(); // tgen
  CC1x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x10y15 ::~CC1x10y15(){ note_dtor("_ZN3ccc9CC1x10y15E", this);} // tgen
ccc::CC1x10y15 ::CC1x10y15(){ note_ctor("_ZN3ccc9CC1x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y15E, buf);
    ::ccc::CC1x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC1x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y15E);
    dp->::ccc::CC1x10y15::~CC1x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y15E(Test__ZN3ccc9CC1x10y15E, "_ZN3ccc9CC1x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y15C1Ev();
extern void _ZN3ccc9CC1x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y15E[] = {
  NSPAIR(_ZN3ccc9CC1x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x10y15E[] = {
  {&(_ZTVN3ccc9CC1x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x10y15E[];
Class_Descriptor cd__ZN3ccc9CC1x10y15E = {  "_ZN3ccc9CC1x10y15E", // class name
  bases__ZN3ccc9CC1x10y15E, 2,
  &(vtc__ZN3ccc9CC1x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x10y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x10y15  : virtual ::ccc::AA1 , virtual ::ccc::BB10 {
  ~DD1x10y15(); // tgen
  DD1x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x10y15 ::~DD1x10y15(){ note_dtor("_ZN3ccc9DD1x10y15E", this);} // tgen
ccc::DD1x10y15 ::DD1x10y15(){ note_ctor("_ZN3ccc9DD1x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x10y15E, buf);
    ::ccc::DD1x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x10y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD1x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x10y15E);
    dp->::ccc::DD1x10y15::~DD1x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x10y15E(Test__ZN3ccc9DD1x10y15E, "_ZN3ccc9DD1x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x10y15C1Ev();
extern void _ZN3ccc9DD1x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x10y15E[] = {
  NSPAIR(_ZN3ccc9DD1x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD1x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x10y15E[] = {
  {&(_ZTVN3ccc9DD1x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x10y15E[];
Class_Descriptor cd__ZN3ccc9DD1x10y15E = {  "_ZN3ccc9DD1x10y15E", // class name
  bases__ZN3ccc9DD1x10y15E, 2,
  &(vtc__ZN3ccc9DD1x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x10y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y0  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y03pqrEv
  ~CC1x11y0(); // tgen
  CC1x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y0E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y03abcEv");}
void  ccc::CC1x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y03efgEv");}
void  ccc::CC1x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y03pqrEv");}
ccc::CC1x11y0 ::~CC1x11y0(){ note_dtor("_ZN3ccc8CC1x11y0E", this);} // tgen
ccc::CC1x11y0 ::CC1x11y0(){ note_ctor("_ZN3ccc8CC1x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y0E, buf);
    ::ccc::CC1x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y0E);
    dp->::ccc::CC1x11y0::~CC1x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y0E(Test__ZN3ccc8CC1x11y0E, "_ZN3ccc8CC1x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y0C1Ev();
extern void _ZN3ccc8CC1x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y0E[] = {
  NSPAIR(_ZN3ccc8CC1x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y0E[];
extern void _ZN3ccc8CC1x11y03pqrEv();
extern void _ZN3ccc8CC1x11y03efgEv();
extern void _ZN3ccc8CC1x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y03abcEv,_ZTv0_n12_N3ccc8CC1x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y03abcEv,_ZThn4_N3ccc8CC1x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y03pqrEv,_ZTv0_n16_N3ccc8CC1x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y03pqrEv,_ZThn4_N3ccc8CC1x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y03efgEv,_ZTv0_n20_N3ccc8CC1x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y03efgEv,_ZThn4_N3ccc8CC1x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y03abcEv,_ZTv0_n12_N3ccc8CC1x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y03pqrEv,_ZTv0_n16_N3ccc8CC1x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y03efgEv,_ZTv0_n20_N3ccc8CC1x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y0E[] = {
  {&(_ZTVN3ccc8CC1x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y0E[];
static VTBL_ENTRY alt_thunk_names758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y03efgEv,_ZTv0_n20_N3ccc8CC1x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y03efgEv,_ZThn4_N3ccc8CC1x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y03pqrEv,_ZTv0_n16_N3ccc8CC1x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y03pqrEv,_ZThn4_N3ccc8CC1x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y03abcEv,_ZTv0_n12_N3ccc8CC1x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y03abcEv,_ZThn4_N3ccc8CC1x11y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y0E = {  "_ZN3ccc8CC1x11y0E", // class name
  bases__ZN3ccc8CC1x11y0E, 2,
  &(vtc__ZN3ccc8CC1x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y0E),2, //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  DD1x11y0  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD1x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y03pqrEv
  ~DD1x11y0(); // tgen
  DD1x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y03abcEv");}
void  ccc::DD1x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y03efgEv");}
void  ccc::DD1x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y03pqrEv");}
ccc::DD1x11y0 ::~DD1x11y0(){ note_dtor("_ZN3ccc8DD1x11y0E", this);} // tgen
ccc::DD1x11y0 ::DD1x11y0(){ note_ctor("_ZN3ccc8DD1x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y0E, buf);
    ::ccc::DD1x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y0E);
    dp->::ccc::DD1x11y0::~DD1x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y0E(Test__ZN3ccc8DD1x11y0E, "_ZN3ccc8DD1x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y0C1Ev();
extern void _ZN3ccc8DD1x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y0E[] = {
  NSPAIR(_ZN3ccc8DD1x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y0E[];
extern void _ZN3ccc8DD1x11y03abcEv();
extern void _ZN3ccc8DD1x11y03pqrEv();
extern void _ZN3ccc8DD1x11y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y03pqrEv,_ZTv0_n12_N3ccc8DD1x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y03pqrEv,_ZThn4_N3ccc8DD1x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y03efgEv,_ZTv0_n16_N3ccc8DD1x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y03efgEv,_ZThn4_N3ccc8DD1x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y03pqrEv,_ZTv0_n12_N3ccc8DD1x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y03efgEv,_ZTv0_n16_N3ccc8DD1x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y0E[] = {
  {&(_ZTVN3ccc8DD1x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y0E[];
static VTBL_ENTRY alt_thunk_names759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y03efgEv,_ZTv0_n16_N3ccc8DD1x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y03efgEv,_ZThn4_N3ccc8DD1x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y03pqrEv,_ZTv0_n12_N3ccc8DD1x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y03pqrEv,_ZThn4_N3ccc8DD1x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y0E = {  "_ZN3ccc8DD1x11y0E", // class name
  bases__ZN3ccc8DD1x11y0E, 2,
  &(vtc__ZN3ccc8DD1x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y0E),3, //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  CC1x11y1  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x11y13efgEv
  ~CC1x11y1(); // tgen
  CC1x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y1E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y13abcEv");}
void  ccc::CC1x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y13pqrEv");}
void  ccc::CC1x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y13efgEv");}
ccc::CC1x11y1 ::~CC1x11y1(){ note_dtor("_ZN3ccc8CC1x11y1E", this);} // tgen
ccc::CC1x11y1 ::CC1x11y1(){ note_ctor("_ZN3ccc8CC1x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y1E, buf);
    ::ccc::CC1x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y1E);
    dp->::ccc::CC1x11y1::~CC1x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y1E(Test__ZN3ccc8CC1x11y1E, "_ZN3ccc8CC1x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y1C1Ev();
extern void _ZN3ccc8CC1x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y1E[] = {
  NSPAIR(_ZN3ccc8CC1x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y1E[];
extern void _ZN3ccc8CC1x11y13pqrEv();
extern void _ZN3ccc8CC1x11y13efgEv();
extern void _ZN3ccc8CC1x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y13abcEv,_ZTv0_n12_N3ccc8CC1x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y13abcEv,_ZThn4_N3ccc8CC1x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y13pqrEv,_ZTv0_n16_N3ccc8CC1x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y13pqrEv,_ZThn4_N3ccc8CC1x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y13efgEv,_ZTv0_n20_N3ccc8CC1x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y13efgEv,_ZThn4_N3ccc8CC1x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y13abcEv,_ZTv0_n12_N3ccc8CC1x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y13pqrEv,_ZTv0_n16_N3ccc8CC1x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y13efgEv,_ZTv0_n20_N3ccc8CC1x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y1E[] = {
  {&(_ZTVN3ccc8CC1x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y1E[];
static VTBL_ENTRY alt_thunk_names760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y13efgEv,_ZTv0_n20_N3ccc8CC1x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y13efgEv,_ZThn4_N3ccc8CC1x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y13pqrEv,_ZTv0_n16_N3ccc8CC1x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y13pqrEv,_ZThn4_N3ccc8CC1x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y13abcEv,_ZTv0_n12_N3ccc8CC1x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y13abcEv,_ZThn4_N3ccc8CC1x11y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y1E = {  "_ZN3ccc8CC1x11y1E", // class name
  bases__ZN3ccc8CC1x11y1E, 2,
  &(vtc__ZN3ccc8CC1x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y1E),2, //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  DD1x11y1  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD1x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x11y13efgEv
  ~DD1x11y1(); // tgen
  DD1x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y13abcEv");}
void  ccc::DD1x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y13pqrEv");}
void  ccc::DD1x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y13efgEv");}
ccc::DD1x11y1 ::~DD1x11y1(){ note_dtor("_ZN3ccc8DD1x11y1E", this);} // tgen
ccc::DD1x11y1 ::DD1x11y1(){ note_ctor("_ZN3ccc8DD1x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y1E, buf);
    ::ccc::DD1x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y1E);
    dp->::ccc::DD1x11y1::~DD1x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y1E(Test__ZN3ccc8DD1x11y1E, "_ZN3ccc8DD1x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y1C1Ev();
extern void _ZN3ccc8DD1x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y1E[] = {
  NSPAIR(_ZN3ccc8DD1x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y1E[];
extern void _ZN3ccc8DD1x11y13abcEv();
extern void _ZN3ccc8DD1x11y13pqrEv();
extern void _ZN3ccc8DD1x11y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y13pqrEv,_ZTv0_n12_N3ccc8DD1x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y13pqrEv,_ZThn4_N3ccc8DD1x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y13efgEv,_ZTv0_n16_N3ccc8DD1x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y13efgEv,_ZThn4_N3ccc8DD1x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y13pqrEv,_ZTv0_n12_N3ccc8DD1x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y13efgEv,_ZTv0_n16_N3ccc8DD1x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y1E[] = {
  {&(_ZTVN3ccc8DD1x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y1E[];
static VTBL_ENTRY alt_thunk_names761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y13efgEv,_ZTv0_n16_N3ccc8DD1x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y13efgEv,_ZThn4_N3ccc8DD1x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y13pqrEv,_ZTv0_n12_N3ccc8DD1x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y13pqrEv,_ZThn4_N3ccc8DD1x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y1E = {  "_ZN3ccc8DD1x11y1E", // class name
  bases__ZN3ccc8DD1x11y1E, 2,
  &(vtc__ZN3ccc8DD1x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y1E),3, //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  CC1x11y2  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y23pqrEv
  ~CC1x11y2(); // tgen
  CC1x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y2E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y23efgEv");}
void  ccc::CC1x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y23abcEv");}
void  ccc::CC1x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y23pqrEv");}
ccc::CC1x11y2 ::~CC1x11y2(){ note_dtor("_ZN3ccc8CC1x11y2E", this);} // tgen
ccc::CC1x11y2 ::CC1x11y2(){ note_ctor("_ZN3ccc8CC1x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y2E, buf);
    ::ccc::CC1x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y2E);
    dp->::ccc::CC1x11y2::~CC1x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y2E(Test__ZN3ccc8CC1x11y2E, "_ZN3ccc8CC1x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y2C1Ev();
extern void _ZN3ccc8CC1x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y2E[] = {
  NSPAIR(_ZN3ccc8CC1x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y2E[];
extern void _ZN3ccc8CC1x11y23pqrEv();
extern void _ZN3ccc8CC1x11y23efgEv();
extern void _ZN3ccc8CC1x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y23abcEv,_ZTv0_n12_N3ccc8CC1x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y23abcEv,_ZThn4_N3ccc8CC1x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y23pqrEv,_ZTv0_n16_N3ccc8CC1x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y23pqrEv,_ZThn4_N3ccc8CC1x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y23efgEv,_ZTv0_n20_N3ccc8CC1x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y23efgEv,_ZThn4_N3ccc8CC1x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y23abcEv,_ZTv0_n12_N3ccc8CC1x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y23pqrEv,_ZTv0_n16_N3ccc8CC1x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y23efgEv,_ZTv0_n20_N3ccc8CC1x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y2E[] = {
  {&(_ZTVN3ccc8CC1x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y2E[];
static VTBL_ENTRY alt_thunk_names762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y23efgEv,_ZTv0_n20_N3ccc8CC1x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y23efgEv,_ZThn4_N3ccc8CC1x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y23pqrEv,_ZTv0_n16_N3ccc8CC1x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y23pqrEv,_ZThn4_N3ccc8CC1x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y23abcEv,_ZTv0_n12_N3ccc8CC1x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y23abcEv,_ZThn4_N3ccc8CC1x11y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y2E = {  "_ZN3ccc8CC1x11y2E", // class name
  bases__ZN3ccc8CC1x11y2E, 2,
  &(vtc__ZN3ccc8CC1x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y2E),2, //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  DD1x11y2  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD1x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y23pqrEv
  ~DD1x11y2(); // tgen
  DD1x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y23efgEv");}
void  ccc::DD1x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y23abcEv");}
void  ccc::DD1x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y23pqrEv");}
ccc::DD1x11y2 ::~DD1x11y2(){ note_dtor("_ZN3ccc8DD1x11y2E", this);} // tgen
ccc::DD1x11y2 ::DD1x11y2(){ note_ctor("_ZN3ccc8DD1x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y2E, buf);
    ::ccc::DD1x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y2E);
    dp->::ccc::DD1x11y2::~DD1x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y2E(Test__ZN3ccc8DD1x11y2E, "_ZN3ccc8DD1x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y2C1Ev();
extern void _ZN3ccc8DD1x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y2E[] = {
  NSPAIR(_ZN3ccc8DD1x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y2E[];
extern void _ZN3ccc8DD1x11y23abcEv();
extern void _ZN3ccc8DD1x11y23pqrEv();
extern void _ZN3ccc8DD1x11y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y23pqrEv,_ZTv0_n12_N3ccc8DD1x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y23pqrEv,_ZThn4_N3ccc8DD1x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y23efgEv,_ZTv0_n16_N3ccc8DD1x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y23efgEv,_ZThn4_N3ccc8DD1x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y23pqrEv,_ZTv0_n12_N3ccc8DD1x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y23efgEv,_ZTv0_n16_N3ccc8DD1x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y2E[] = {
  {&(_ZTVN3ccc8DD1x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y2E[];
static VTBL_ENTRY alt_thunk_names763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y23efgEv,_ZTv0_n16_N3ccc8DD1x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y23efgEv,_ZThn4_N3ccc8DD1x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y23pqrEv,_ZTv0_n12_N3ccc8DD1x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y23pqrEv,_ZThn4_N3ccc8DD1x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y2E = {  "_ZN3ccc8DD1x11y2E", // class name
  bases__ZN3ccc8DD1x11y2E, 2,
  &(vtc__ZN3ccc8DD1x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y2E),3, //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  CC1x11y3  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x11y33abcEv
  ~CC1x11y3(); // tgen
  CC1x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y3E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y33efgEv");}
void  ccc::CC1x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y33pqrEv");}
void  ccc::CC1x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y33abcEv");}
ccc::CC1x11y3 ::~CC1x11y3(){ note_dtor("_ZN3ccc8CC1x11y3E", this);} // tgen
ccc::CC1x11y3 ::CC1x11y3(){ note_ctor("_ZN3ccc8CC1x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y3E, buf);
    ::ccc::CC1x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y3E);
    dp->::ccc::CC1x11y3::~CC1x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y3E(Test__ZN3ccc8CC1x11y3E, "_ZN3ccc8CC1x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y3C1Ev();
extern void _ZN3ccc8CC1x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y3E[] = {
  NSPAIR(_ZN3ccc8CC1x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y3E[];
extern void _ZN3ccc8CC1x11y33pqrEv();
extern void _ZN3ccc8CC1x11y33efgEv();
extern void _ZN3ccc8CC1x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y33abcEv,_ZTv0_n12_N3ccc8CC1x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y33abcEv,_ZThn4_N3ccc8CC1x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y33pqrEv,_ZTv0_n16_N3ccc8CC1x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y33pqrEv,_ZThn4_N3ccc8CC1x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y33efgEv,_ZTv0_n20_N3ccc8CC1x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y33efgEv,_ZThn4_N3ccc8CC1x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y33abcEv,_ZTv0_n12_N3ccc8CC1x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y33pqrEv,_ZTv0_n16_N3ccc8CC1x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y33efgEv,_ZTv0_n20_N3ccc8CC1x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y3E[] = {
  {&(_ZTVN3ccc8CC1x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y3E[];
static VTBL_ENTRY alt_thunk_names764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y33efgEv,_ZTv0_n20_N3ccc8CC1x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y33efgEv,_ZThn4_N3ccc8CC1x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y33pqrEv,_ZTv0_n16_N3ccc8CC1x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y33pqrEv,_ZThn4_N3ccc8CC1x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y33abcEv,_ZTv0_n12_N3ccc8CC1x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y33abcEv,_ZThn4_N3ccc8CC1x11y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y3E = {  "_ZN3ccc8CC1x11y3E", // class name
  bases__ZN3ccc8CC1x11y3E, 2,
  &(vtc__ZN3ccc8CC1x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y3E),2, //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  DD1x11y3  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD1x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x11y33abcEv
  ~DD1x11y3(); // tgen
  DD1x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y33efgEv");}
void  ccc::DD1x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y33pqrEv");}
void  ccc::DD1x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y33abcEv");}
ccc::DD1x11y3 ::~DD1x11y3(){ note_dtor("_ZN3ccc8DD1x11y3E", this);} // tgen
ccc::DD1x11y3 ::DD1x11y3(){ note_ctor("_ZN3ccc8DD1x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y3E, buf);
    ::ccc::DD1x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y3E);
    dp->::ccc::DD1x11y3::~DD1x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y3E(Test__ZN3ccc8DD1x11y3E, "_ZN3ccc8DD1x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y3C1Ev();
extern void _ZN3ccc8DD1x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y3E[] = {
  NSPAIR(_ZN3ccc8DD1x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y3E[];
extern void _ZN3ccc8DD1x11y33abcEv();
extern void _ZN3ccc8DD1x11y33pqrEv();
extern void _ZN3ccc8DD1x11y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y33pqrEv,_ZTv0_n12_N3ccc8DD1x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y33pqrEv,_ZThn4_N3ccc8DD1x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y33efgEv,_ZTv0_n16_N3ccc8DD1x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y33efgEv,_ZThn4_N3ccc8DD1x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y33pqrEv,_ZTv0_n12_N3ccc8DD1x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y33efgEv,_ZTv0_n16_N3ccc8DD1x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y3E[] = {
  {&(_ZTVN3ccc8DD1x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y3E[];
static VTBL_ENTRY alt_thunk_names765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y33efgEv,_ZTv0_n16_N3ccc8DD1x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y33efgEv,_ZThn4_N3ccc8DD1x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y33pqrEv,_ZTv0_n12_N3ccc8DD1x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y33pqrEv,_ZThn4_N3ccc8DD1x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y3E = {  "_ZN3ccc8DD1x11y3E", // class name
  bases__ZN3ccc8DD1x11y3E, 2,
  &(vtc__ZN3ccc8DD1x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y3E),3, //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  CC1x11y4  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC1x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y43efgEv
  ~CC1x11y4(); // tgen
  CC1x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y4E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y43pqrEv");}
void  ccc::CC1x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y43abcEv");}
void  ccc::CC1x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y43efgEv");}
ccc::CC1x11y4 ::~CC1x11y4(){ note_dtor("_ZN3ccc8CC1x11y4E", this);} // tgen
ccc::CC1x11y4 ::CC1x11y4(){ note_ctor("_ZN3ccc8CC1x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y4E, buf);
    ::ccc::CC1x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y4E);
    dp->::ccc::CC1x11y4::~CC1x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y4E(Test__ZN3ccc8CC1x11y4E, "_ZN3ccc8CC1x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y4C1Ev();
extern void _ZN3ccc8CC1x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y4E[] = {
  NSPAIR(_ZN3ccc8CC1x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y4E[];
extern void _ZN3ccc8CC1x11y43pqrEv();
extern void _ZN3ccc8CC1x11y43efgEv();
extern void _ZN3ccc8CC1x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y43abcEv,_ZTv0_n12_N3ccc8CC1x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y43abcEv,_ZThn4_N3ccc8CC1x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y43pqrEv,_ZTv0_n16_N3ccc8CC1x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y43pqrEv,_ZThn4_N3ccc8CC1x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y43efgEv,_ZTv0_n20_N3ccc8CC1x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y43efgEv,_ZThn4_N3ccc8CC1x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y43abcEv,_ZTv0_n12_N3ccc8CC1x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y43pqrEv,_ZTv0_n16_N3ccc8CC1x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y43efgEv,_ZTv0_n20_N3ccc8CC1x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y4E[] = {
  {&(_ZTVN3ccc8CC1x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y4E[];
static VTBL_ENTRY alt_thunk_names766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y43efgEv,_ZTv0_n20_N3ccc8CC1x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y43efgEv,_ZThn4_N3ccc8CC1x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y43pqrEv,_ZTv0_n16_N3ccc8CC1x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y43pqrEv,_ZThn4_N3ccc8CC1x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y43abcEv,_ZTv0_n12_N3ccc8CC1x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y43abcEv,_ZThn4_N3ccc8CC1x11y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y4E = {  "_ZN3ccc8CC1x11y4E", // class name
  bases__ZN3ccc8CC1x11y4E, 2,
  &(vtc__ZN3ccc8CC1x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y4E),2, //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  DD1x11y4  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD1x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x11y43efgEv
  ~DD1x11y4(); // tgen
  DD1x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y43pqrEv");}
void  ccc::DD1x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y43abcEv");}
void  ccc::DD1x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y43efgEv");}
ccc::DD1x11y4 ::~DD1x11y4(){ note_dtor("_ZN3ccc8DD1x11y4E", this);} // tgen
ccc::DD1x11y4 ::DD1x11y4(){ note_ctor("_ZN3ccc8DD1x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y4E, buf);
    ::ccc::DD1x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y4E);
    dp->::ccc::DD1x11y4::~DD1x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y4E(Test__ZN3ccc8DD1x11y4E, "_ZN3ccc8DD1x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y4C1Ev();
extern void _ZN3ccc8DD1x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y4E[] = {
  NSPAIR(_ZN3ccc8DD1x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y4E[];
extern void _ZN3ccc8DD1x11y43abcEv();
extern void _ZN3ccc8DD1x11y43pqrEv();
extern void _ZN3ccc8DD1x11y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y43pqrEv,_ZTv0_n12_N3ccc8DD1x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y43pqrEv,_ZThn4_N3ccc8DD1x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y43efgEv,_ZTv0_n16_N3ccc8DD1x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y43efgEv,_ZThn4_N3ccc8DD1x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y43pqrEv,_ZTv0_n12_N3ccc8DD1x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y43efgEv,_ZTv0_n16_N3ccc8DD1x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y4E[] = {
  {&(_ZTVN3ccc8DD1x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y4E[];
static VTBL_ENTRY alt_thunk_names767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y43efgEv,_ZTv0_n16_N3ccc8DD1x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y43efgEv,_ZThn4_N3ccc8DD1x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y43pqrEv,_ZTv0_n12_N3ccc8DD1x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y43pqrEv,_ZThn4_N3ccc8DD1x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y4E = {  "_ZN3ccc8DD1x11y4E", // class name
  bases__ZN3ccc8DD1x11y4E, 2,
  &(vtc__ZN3ccc8DD1x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y4E),3, //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  CC1x11y5  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC1x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y53abcEv
  ~CC1x11y5(); // tgen
  CC1x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y5E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y53pqrEv");}
void  ccc::CC1x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y53efgEv");}
void  ccc::CC1x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y53abcEv");}
ccc::CC1x11y5 ::~CC1x11y5(){ note_dtor("_ZN3ccc8CC1x11y5E", this);} // tgen
ccc::CC1x11y5 ::CC1x11y5(){ note_ctor("_ZN3ccc8CC1x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y5E, buf);
    ::ccc::CC1x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y5E);
    dp->::ccc::CC1x11y5::~CC1x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y5E(Test__ZN3ccc8CC1x11y5E, "_ZN3ccc8CC1x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y5C1Ev();
extern void _ZN3ccc8CC1x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y5E[] = {
  NSPAIR(_ZN3ccc8CC1x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y5E[];
extern void _ZN3ccc8CC1x11y53pqrEv();
extern void _ZN3ccc8CC1x11y53efgEv();
extern void _ZN3ccc8CC1x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y53abcEv,_ZTv0_n12_N3ccc8CC1x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y53abcEv,_ZThn4_N3ccc8CC1x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y53pqrEv,_ZTv0_n16_N3ccc8CC1x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y53pqrEv,_ZThn4_N3ccc8CC1x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y53efgEv,_ZTv0_n20_N3ccc8CC1x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y53efgEv,_ZThn4_N3ccc8CC1x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y53abcEv,_ZTv0_n12_N3ccc8CC1x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y53pqrEv,_ZTv0_n16_N3ccc8CC1x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y53efgEv,_ZTv0_n20_N3ccc8CC1x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y5E[] = {
  {&(_ZTVN3ccc8CC1x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y5E[];
static VTBL_ENTRY alt_thunk_names768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y53efgEv,_ZTv0_n20_N3ccc8CC1x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y53efgEv,_ZThn4_N3ccc8CC1x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y53pqrEv,_ZTv0_n16_N3ccc8CC1x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y53pqrEv,_ZThn4_N3ccc8CC1x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y53abcEv,_ZTv0_n12_N3ccc8CC1x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y53abcEv,_ZThn4_N3ccc8CC1x11y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y5E = {  "_ZN3ccc8CC1x11y5E", // class name
  bases__ZN3ccc8CC1x11y5E, 2,
  &(vtc__ZN3ccc8CC1x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y5E),2, //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  DD1x11y5  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD1x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x11y53abcEv
  ~DD1x11y5(); // tgen
  DD1x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y53pqrEv");}
void  ccc::DD1x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y53efgEv");}
void  ccc::DD1x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y53abcEv");}
ccc::DD1x11y5 ::~DD1x11y5(){ note_dtor("_ZN3ccc8DD1x11y5E", this);} // tgen
ccc::DD1x11y5 ::DD1x11y5(){ note_ctor("_ZN3ccc8DD1x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y5E, buf);
    ::ccc::DD1x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y5E);
    dp->::ccc::DD1x11y5::~DD1x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y5E(Test__ZN3ccc8DD1x11y5E, "_ZN3ccc8DD1x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y5C1Ev();
extern void _ZN3ccc8DD1x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y5E[] = {
  NSPAIR(_ZN3ccc8DD1x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y5E[];
extern void _ZN3ccc8DD1x11y53abcEv();
extern void _ZN3ccc8DD1x11y53pqrEv();
extern void _ZN3ccc8DD1x11y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y53pqrEv,_ZTv0_n12_N3ccc8DD1x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y53pqrEv,_ZThn4_N3ccc8DD1x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y53efgEv,_ZTv0_n16_N3ccc8DD1x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y53efgEv,_ZThn4_N3ccc8DD1x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y53pqrEv,_ZTv0_n12_N3ccc8DD1x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y53efgEv,_ZTv0_n16_N3ccc8DD1x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y5E[] = {
  {&(_ZTVN3ccc8DD1x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y5E[];
static VTBL_ENTRY alt_thunk_names769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y53efgEv,_ZTv0_n16_N3ccc8DD1x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y53efgEv,_ZThn4_N3ccc8DD1x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y53pqrEv,_ZTv0_n12_N3ccc8DD1x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y53pqrEv,_ZThn4_N3ccc8DD1x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y5E = {  "_ZN3ccc8DD1x11y5E", // class name
  bases__ZN3ccc8DD1x11y5E, 2,
  &(vtc__ZN3ccc8DD1x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y5E),3, //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  CC1x11y6  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y63efgEv
  ~CC1x11y6(); // tgen
  CC1x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y6E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y63abcEv");}
void  ccc::CC1x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y63efgEv");}
ccc::CC1x11y6 ::~CC1x11y6(){ note_dtor("_ZN3ccc8CC1x11y6E", this);} // tgen
ccc::CC1x11y6 ::CC1x11y6(){ note_ctor("_ZN3ccc8CC1x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y6E, buf);
    ::ccc::CC1x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y6E);
    dp->::ccc::CC1x11y6::~CC1x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y6E(Test__ZN3ccc8CC1x11y6E, "_ZN3ccc8CC1x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y6C1Ev();
extern void _ZN3ccc8CC1x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y6E[] = {
  NSPAIR(_ZN3ccc8CC1x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC1x11y63efgEv();
extern void _ZN3ccc8CC1x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y63abcEv,_ZTv0_n12_N3ccc8CC1x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y63abcEv,_ZThn4_N3ccc8CC1x11y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y63efgEv,_ZTv0_n20_N3ccc8CC1x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y63efgEv,_ZThn4_N3ccc8CC1x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y63abcEv,_ZTv0_n12_N3ccc8CC1x11y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y63efgEv,_ZTv0_n20_N3ccc8CC1x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y6E[] = {
  {&(_ZTVN3ccc8CC1x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y6E[];
static VTBL_ENTRY alt_thunk_names770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y63efgEv,_ZTv0_n20_N3ccc8CC1x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y63efgEv,_ZThn4_N3ccc8CC1x11y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y63abcEv,_ZTv0_n12_N3ccc8CC1x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y63abcEv,_ZThn4_N3ccc8CC1x11y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y6E = {  "_ZN3ccc8CC1x11y6E", // class name
  bases__ZN3ccc8CC1x11y6E, 2,
  &(vtc__ZN3ccc8CC1x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y6E),2, //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  DD1x11y6  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD1x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x11y63efgEv
  ~DD1x11y6(); // tgen
  DD1x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y63abcEv");}
void  ccc::DD1x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y63efgEv");}
ccc::DD1x11y6 ::~DD1x11y6(){ note_dtor("_ZN3ccc8DD1x11y6E", this);} // tgen
ccc::DD1x11y6 ::DD1x11y6(){ note_ctor("_ZN3ccc8DD1x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y6E, buf);
    ::ccc::DD1x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y6E);
    dp->::ccc::DD1x11y6::~DD1x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y6E(Test__ZN3ccc8DD1x11y6E, "_ZN3ccc8DD1x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y6C1Ev();
extern void _ZN3ccc8DD1x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y6E[] = {
  NSPAIR(_ZN3ccc8DD1x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y6E[];
extern void _ZN3ccc8DD1x11y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y63efgEv,_ZTv0_n16_N3ccc8DD1x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y63efgEv,_ZThn4_N3ccc8DD1x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y63efgEv,_ZTv0_n16_N3ccc8DD1x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y6E[] = {
  {&(_ZTVN3ccc8DD1x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y6E[];
static VTBL_ENTRY alt_thunk_names771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y63efgEv,_ZTv0_n16_N3ccc8DD1x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y63efgEv,_ZThn4_N3ccc8DD1x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y6E = {  "_ZN3ccc8DD1x11y6E", // class name
  bases__ZN3ccc8DD1x11y6E, 2,
  &(vtc__ZN3ccc8DD1x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y6E),3, //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  CC1x11y7  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y73pqrEv
  ~CC1x11y7(); // tgen
  CC1x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y7E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y73abcEv");}
void  ccc::CC1x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y73pqrEv");}
ccc::CC1x11y7 ::~CC1x11y7(){ note_dtor("_ZN3ccc8CC1x11y7E", this);} // tgen
ccc::CC1x11y7 ::CC1x11y7(){ note_ctor("_ZN3ccc8CC1x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y7E, buf);
    ::ccc::CC1x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y7E);
    dp->::ccc::CC1x11y7::~CC1x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y7E(Test__ZN3ccc8CC1x11y7E, "_ZN3ccc8CC1x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y7C1Ev();
extern void _ZN3ccc8CC1x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y7E[] = {
  NSPAIR(_ZN3ccc8CC1x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y7E[];
extern void _ZN3ccc8CC1x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC1x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y73abcEv,_ZTv0_n12_N3ccc8CC1x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y73abcEv,_ZThn4_N3ccc8CC1x11y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y73pqrEv,_ZTv0_n16_N3ccc8CC1x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y73pqrEv,_ZThn4_N3ccc8CC1x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y73abcEv,_ZTv0_n12_N3ccc8CC1x11y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y73pqrEv,_ZTv0_n16_N3ccc8CC1x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y7E[] = {
  {&(_ZTVN3ccc8CC1x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y7E[];
static VTBL_ENTRY alt_thunk_names772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y73pqrEv,_ZTv0_n16_N3ccc8CC1x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y73pqrEv,_ZThn4_N3ccc8CC1x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y73abcEv,_ZTv0_n12_N3ccc8CC1x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y73abcEv,_ZThn4_N3ccc8CC1x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y7E = {  "_ZN3ccc8CC1x11y7E", // class name
  bases__ZN3ccc8CC1x11y7E, 2,
  &(vtc__ZN3ccc8CC1x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y7E),2, //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  DD1x11y7  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD1x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y73pqrEv
  ~DD1x11y7(); // tgen
  DD1x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y73abcEv");}
void  ccc::DD1x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y73pqrEv");}
ccc::DD1x11y7 ::~DD1x11y7(){ note_dtor("_ZN3ccc8DD1x11y7E", this);} // tgen
ccc::DD1x11y7 ::DD1x11y7(){ note_ctor("_ZN3ccc8DD1x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y7E, buf);
    ::ccc::DD1x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y7E);
    dp->::ccc::DD1x11y7::~DD1x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y7E(Test__ZN3ccc8DD1x11y7E, "_ZN3ccc8DD1x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y7C1Ev();
extern void _ZN3ccc8DD1x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y7E[] = {
  NSPAIR(_ZN3ccc8DD1x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y7E[];
extern void _ZN3ccc8DD1x11y73abcEv();
extern void _ZN3ccc8DD1x11y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y73pqrEv,_ZTv0_n12_N3ccc8DD1x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y73pqrEv,_ZThn4_N3ccc8DD1x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y73pqrEv,_ZTv0_n12_N3ccc8DD1x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y7E[] = {
  {&(_ZTVN3ccc8DD1x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y7E[];
static VTBL_ENTRY alt_thunk_names773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y73pqrEv,_ZTv0_n12_N3ccc8DD1x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y73pqrEv,_ZThn4_N3ccc8DD1x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y7E = {  "_ZN3ccc8DD1x11y7E", // class name
  bases__ZN3ccc8DD1x11y7E, 2,
  &(vtc__ZN3ccc8DD1x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y7E),3, //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  CC1x11y8  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y83abcEv
  ~CC1x11y8(); // tgen
  CC1x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y8E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y83efgEv");}
void  ccc::CC1x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y83abcEv");}
ccc::CC1x11y8 ::~CC1x11y8(){ note_dtor("_ZN3ccc8CC1x11y8E", this);} // tgen
ccc::CC1x11y8 ::CC1x11y8(){ note_ctor("_ZN3ccc8CC1x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y8E, buf);
    ::ccc::CC1x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y8E);
    dp->::ccc::CC1x11y8::~CC1x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y8E(Test__ZN3ccc8CC1x11y8E, "_ZN3ccc8CC1x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y8C1Ev();
extern void _ZN3ccc8CC1x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y8E[] = {
  NSPAIR(_ZN3ccc8CC1x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC1x11y83efgEv();
extern void _ZN3ccc8CC1x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x11y83abcEv,_ZTv0_n12_N3ccc8CC1x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y83abcEv,_ZThn4_N3ccc8CC1x11y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y83efgEv,_ZTv0_n20_N3ccc8CC1x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y83efgEv,_ZThn4_N3ccc8CC1x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x11y83abcEv,_ZTv0_n12_N3ccc8CC1x11y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y83efgEv,_ZTv0_n20_N3ccc8CC1x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y8E[] = {
  {&(_ZTVN3ccc8CC1x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y8E[];
static VTBL_ENTRY alt_thunk_names774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y83efgEv,_ZTv0_n20_N3ccc8CC1x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y83efgEv,_ZThn4_N3ccc8CC1x11y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x11y83abcEv,_ZTv0_n12_N3ccc8CC1x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y83abcEv,_ZThn4_N3ccc8CC1x11y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y8E = {  "_ZN3ccc8CC1x11y8E", // class name
  bases__ZN3ccc8CC1x11y8E, 2,
  &(vtc__ZN3ccc8CC1x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y8E),2, //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  DD1x11y8  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD1x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x11y83abcEv
  ~DD1x11y8(); // tgen
  DD1x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y83efgEv");}
void  ccc::DD1x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x11y83abcEv");}
ccc::DD1x11y8 ::~DD1x11y8(){ note_dtor("_ZN3ccc8DD1x11y8E", this);} // tgen
ccc::DD1x11y8 ::DD1x11y8(){ note_ctor("_ZN3ccc8DD1x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y8E, buf);
    ::ccc::DD1x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y8E);
    dp->::ccc::DD1x11y8::~DD1x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y8E(Test__ZN3ccc8DD1x11y8E, "_ZN3ccc8DD1x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y8C1Ev();
extern void _ZN3ccc8DD1x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y8E[] = {
  NSPAIR(_ZN3ccc8DD1x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y8E[];
extern void _ZN3ccc8DD1x11y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y83efgEv,_ZTv0_n16_N3ccc8DD1x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y83efgEv,_ZThn4_N3ccc8DD1x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y83efgEv,_ZTv0_n16_N3ccc8DD1x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y8E[] = {
  {&(_ZTVN3ccc8DD1x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y8E[];
static VTBL_ENTRY alt_thunk_names775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y83efgEv,_ZTv0_n16_N3ccc8DD1x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y83efgEv,_ZThn4_N3ccc8DD1x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y8E = {  "_ZN3ccc8DD1x11y8E", // class name
  bases__ZN3ccc8DD1x11y8E, 2,
  &(vtc__ZN3ccc8DD1x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y8E),3, //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  CC1x11y9  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y93pqrEv
  ~CC1x11y9(); // tgen
  CC1x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y9E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y93efgEv");}
void  ccc::CC1x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y93pqrEv");}
ccc::CC1x11y9 ::~CC1x11y9(){ note_dtor("_ZN3ccc8CC1x11y9E", this);} // tgen
ccc::CC1x11y9 ::CC1x11y9(){ note_ctor("_ZN3ccc8CC1x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y9E, buf);
    ::ccc::CC1x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC1x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y9E);
    dp->::ccc::CC1x11y9::~CC1x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y9E(Test__ZN3ccc8CC1x11y9E, "_ZN3ccc8CC1x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y9C1Ev();
extern void _ZN3ccc8CC1x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y9E[] = {
  NSPAIR(_ZN3ccc8CC1x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y9E[];
extern void _ZN3ccc8CC1x11y93pqrEv();
extern void _ZN3ccc8CC1x11y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x11y93pqrEv,_ZTv0_n16_N3ccc8CC1x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y93pqrEv,_ZThn4_N3ccc8CC1x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x11y93efgEv,_ZTv0_n20_N3ccc8CC1x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y93efgEv,_ZThn4_N3ccc8CC1x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x11y93pqrEv,_ZTv0_n16_N3ccc8CC1x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x11y93efgEv,_ZTv0_n20_N3ccc8CC1x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x11y9E[] = {
  {&(_ZTVN3ccc8CC1x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x11y9E[];
static VTBL_ENTRY alt_thunk_names776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x11y93efgEv,_ZTv0_n20_N3ccc8CC1x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y93efgEv,_ZThn4_N3ccc8CC1x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x11y93pqrEv,_ZTv0_n16_N3ccc8CC1x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x11y93pqrEv,_ZThn4_N3ccc8CC1x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x11y9E = {  "_ZN3ccc8CC1x11y9E", // class name
  bases__ZN3ccc8CC1x11y9E, 2,
  &(vtc__ZN3ccc8CC1x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x11y9E),2, //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  DD1x11y9  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD1x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x11y93pqrEv
  ~DD1x11y9(); // tgen
  DD1x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x11y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x11y93efgEv");}
void  ccc::DD1x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x11y93pqrEv");}
ccc::DD1x11y9 ::~DD1x11y9(){ note_dtor("_ZN3ccc8DD1x11y9E", this);} // tgen
ccc::DD1x11y9 ::DD1x11y9(){ note_ctor("_ZN3ccc8DD1x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x11y9E, buf);
    ::ccc::DD1x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x11y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD1x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x11y9E);
    dp->::ccc::DD1x11y9::~DD1x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x11y9E(Test__ZN3ccc8DD1x11y9E, "_ZN3ccc8DD1x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x11y9C1Ev();
extern void _ZN3ccc8DD1x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x11y9E[] = {
  NSPAIR(_ZN3ccc8DD1x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD1x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x11y93pqrEv();
extern void _ZN3ccc8DD1x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x11y93pqrEv,_ZTv0_n12_N3ccc8DD1x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y93pqrEv,_ZThn4_N3ccc8DD1x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD1x11y93efgEv,_ZTv0_n16_N3ccc8DD1x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x11y93efgEv,_ZThn4_N3ccc8DD1x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x11y93pqrEv,_ZTv0_n12_N3ccc8DD1x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD1x11y93efgEv,_ZTv0_n16_N3ccc8DD1x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x11y9E[] = {
  {&(_ZTVN3ccc8DD1x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD1x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x11y9E[];
static VTBL_ENTRY alt_thunk_names777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD1x11y93efgEv,_ZTv0_n16_N3ccc8DD1x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y93efgEv,_ZThn4_N3ccc8DD1x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x11y93pqrEv,_ZTv0_n12_N3ccc8DD1x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x11y93pqrEv,_ZThn4_N3ccc8DD1x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x11y9E = {  "_ZN3ccc8DD1x11y9E", // class name
  bases__ZN3ccc8DD1x11y9E, 2,
  &(vtc__ZN3ccc8DD1x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x11y9E),3, //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  CC1x11y10  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x11y103abcEv
  ~CC1x11y10(); // tgen
  CC1x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y10E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y103pqrEv");}
void  ccc::CC1x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x11y103abcEv");}
ccc::CC1x11y10 ::~CC1x11y10(){ note_dtor("_ZN3ccc9CC1x11y10E", this);} // tgen
ccc::CC1x11y10 ::CC1x11y10(){ note_ctor("_ZN3ccc9CC1x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y10E, buf);
    ::ccc::CC1x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y10E);
    dp->::ccc::CC1x11y10::~CC1x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y10E(Test__ZN3ccc9CC1x11y10E, "_ZN3ccc9CC1x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y10C1Ev();
extern void _ZN3ccc9CC1x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y10E[] = {
  NSPAIR(_ZN3ccc9CC1x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y10E[];
extern void _ZN3ccc9CC1x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC1x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x11y103abcEv,_ZTv0_n12_N3ccc9CC1x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y103abcEv,_ZThn4_N3ccc9CC1x11y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x11y103pqrEv,_ZTv0_n16_N3ccc9CC1x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y103pqrEv,_ZThn4_N3ccc9CC1x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x11y103abcEv,_ZTv0_n12_N3ccc9CC1x11y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x11y103pqrEv,_ZTv0_n16_N3ccc9CC1x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y10E[] = {
  {&(_ZTVN3ccc9CC1x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y10E[];
static VTBL_ENTRY alt_thunk_names778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x11y103pqrEv,_ZTv0_n16_N3ccc9CC1x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y103pqrEv,_ZThn4_N3ccc9CC1x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x11y103abcEv,_ZTv0_n12_N3ccc9CC1x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y103abcEv,_ZThn4_N3ccc9CC1x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x11y10E = {  "_ZN3ccc9CC1x11y10E", // class name
  bases__ZN3ccc9CC1x11y10E, 2,
  &(vtc__ZN3ccc9CC1x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y10E),2, //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  DD1x11y10  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD1x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x11y103abcEv
  ~DD1x11y10(); // tgen
  DD1x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x11y103pqrEv");}
void  ccc::DD1x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x11y103abcEv");}
ccc::DD1x11y10 ::~DD1x11y10(){ note_dtor("_ZN3ccc9DD1x11y10E", this);} // tgen
ccc::DD1x11y10 ::DD1x11y10(){ note_ctor("_ZN3ccc9DD1x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y10E, buf);
    ::ccc::DD1x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y10E);
    dp->::ccc::DD1x11y10::~DD1x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y10E(Test__ZN3ccc9DD1x11y10E, "_ZN3ccc9DD1x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y10C1Ev();
extern void _ZN3ccc9DD1x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y10E[] = {
  NSPAIR(_ZN3ccc9DD1x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y10E[];
extern void _ZN3ccc9DD1x11y103abcEv();
extern void _ZN3ccc9DD1x11y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x11y103pqrEv,_ZTv0_n12_N3ccc9DD1x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x11y103pqrEv,_ZThn4_N3ccc9DD1x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x11y103pqrEv,_ZTv0_n12_N3ccc9DD1x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y10E[] = {
  {&(_ZTVN3ccc9DD1x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y10E[];
static VTBL_ENTRY alt_thunk_names779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x11y103pqrEv,_ZTv0_n12_N3ccc9DD1x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x11y103pqrEv,_ZThn4_N3ccc9DD1x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x11y10E = {  "_ZN3ccc9DD1x11y10E", // class name
  bases__ZN3ccc9DD1x11y10E, 2,
  &(vtc__ZN3ccc9DD1x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y10E),3, //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  CC1x11y11  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x11y113efgEv
  ~CC1x11y11(); // tgen
  CC1x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y11E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y113pqrEv");}
void  ccc::CC1x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x11y113efgEv");}
ccc::CC1x11y11 ::~CC1x11y11(){ note_dtor("_ZN3ccc9CC1x11y11E", this);} // tgen
ccc::CC1x11y11 ::CC1x11y11(){ note_ctor("_ZN3ccc9CC1x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y11E, buf);
    ::ccc::CC1x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y11E);
    dp->::ccc::CC1x11y11::~CC1x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y11E(Test__ZN3ccc9CC1x11y11E, "_ZN3ccc9CC1x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y11C1Ev();
extern void _ZN3ccc9CC1x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y11E[] = {
  NSPAIR(_ZN3ccc9CC1x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y11E[];
extern void _ZN3ccc9CC1x11y113pqrEv();
extern void _ZN3ccc9CC1x11y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x11y113pqrEv,_ZTv0_n16_N3ccc9CC1x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y113pqrEv,_ZThn4_N3ccc9CC1x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x11y113efgEv,_ZTv0_n20_N3ccc9CC1x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y113efgEv,_ZThn4_N3ccc9CC1x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x11y113pqrEv,_ZTv0_n16_N3ccc9CC1x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x11y113efgEv,_ZTv0_n20_N3ccc9CC1x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y11E[] = {
  {&(_ZTVN3ccc9CC1x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y11E[];
static VTBL_ENTRY alt_thunk_names780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x11y113efgEv,_ZTv0_n20_N3ccc9CC1x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y113efgEv,_ZThn4_N3ccc9CC1x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x11y113pqrEv,_ZTv0_n16_N3ccc9CC1x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y113pqrEv,_ZThn4_N3ccc9CC1x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x11y11E = {  "_ZN3ccc9CC1x11y11E", // class name
  bases__ZN3ccc9CC1x11y11E, 2,
  &(vtc__ZN3ccc9CC1x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y11E),2, //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  DD1x11y11  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD1x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x11y113efgEv
  ~DD1x11y11(); // tgen
  DD1x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x11y113pqrEv");}
void  ccc::DD1x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x11y113efgEv");}
ccc::DD1x11y11 ::~DD1x11y11(){ note_dtor("_ZN3ccc9DD1x11y11E", this);} // tgen
ccc::DD1x11y11 ::DD1x11y11(){ note_ctor("_ZN3ccc9DD1x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y11E, buf);
    ::ccc::DD1x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y11E);
    dp->::ccc::DD1x11y11::~DD1x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y11E(Test__ZN3ccc9DD1x11y11E, "_ZN3ccc9DD1x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y11C1Ev();
extern void _ZN3ccc9DD1x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y11E[] = {
  NSPAIR(_ZN3ccc9DD1x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x11y113pqrEv();
extern void _ZN3ccc9DD1x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x11y113pqrEv,_ZTv0_n12_N3ccc9DD1x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x11y113pqrEv,_ZThn4_N3ccc9DD1x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD1x11y113efgEv,_ZTv0_n16_N3ccc9DD1x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x11y113efgEv,_ZThn4_N3ccc9DD1x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x11y113pqrEv,_ZTv0_n12_N3ccc9DD1x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD1x11y113efgEv,_ZTv0_n16_N3ccc9DD1x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y11E[] = {
  {&(_ZTVN3ccc9DD1x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y11E[];
static VTBL_ENTRY alt_thunk_names781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD1x11y113efgEv,_ZTv0_n16_N3ccc9DD1x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x11y113efgEv,_ZThn4_N3ccc9DD1x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x11y113pqrEv,_ZTv0_n12_N3ccc9DD1x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x11y113pqrEv,_ZThn4_N3ccc9DD1x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x11y11E = {  "_ZN3ccc9DD1x11y11E", // class name
  bases__ZN3ccc9DD1x11y11E, 2,
  &(vtc__ZN3ccc9DD1x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y11E),3, //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  CC1x11y12  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC1x11y123abcEv
  ~CC1x11y12(); // tgen
  CC1x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x11y123abcEv");}
ccc::CC1x11y12 ::~CC1x11y12(){ note_dtor("_ZN3ccc9CC1x11y12E", this);} // tgen
ccc::CC1x11y12 ::CC1x11y12(){ note_ctor("_ZN3ccc9CC1x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y12E, buf);
    ::ccc::CC1x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y12E);
    dp->::ccc::CC1x11y12::~CC1x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y12E(Test__ZN3ccc9CC1x11y12E, "_ZN3ccc9CC1x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y12C1Ev();
extern void _ZN3ccc9CC1x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y12E[] = {
  NSPAIR(_ZN3ccc9CC1x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC1x11y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x11y123abcEv,_ZTv0_n12_N3ccc9CC1x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y123abcEv,_ZThn4_N3ccc9CC1x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x11y123abcEv,_ZTv0_n12_N3ccc9CC1x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y12E[] = {
  {&(_ZTVN3ccc9CC1x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y12E[];
static VTBL_ENTRY alt_thunk_names782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x11y123abcEv,_ZTv0_n12_N3ccc9CC1x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y123abcEv,_ZThn4_N3ccc9CC1x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x11y12E = {  "_ZN3ccc9CC1x11y12E", // class name
  bases__ZN3ccc9CC1x11y12E, 2,
  &(vtc__ZN3ccc9CC1x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y12E),2, //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  DD1x11y12  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD1x11y123abcEv
  ~DD1x11y12(); // tgen
  DD1x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD1x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x11y123abcEv");}
ccc::DD1x11y12 ::~DD1x11y12(){ note_dtor("_ZN3ccc9DD1x11y12E", this);} // tgen
ccc::DD1x11y12 ::DD1x11y12(){ note_ctor("_ZN3ccc9DD1x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y12E, buf);
    ::ccc::DD1x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y12E);
    dp->::ccc::DD1x11y12::~DD1x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y12E(Test__ZN3ccc9DD1x11y12E, "_ZN3ccc9DD1x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y12C1Ev();
extern void _ZN3ccc9DD1x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y12E[] = {
  NSPAIR(_ZN3ccc9DD1x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y12E[];
extern void _ZN3ccc9DD1x11y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y12E[] = {
  {&(_ZTVN3ccc9DD1x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y12E[];
Class_Descriptor cd__ZN3ccc9DD1x11y12E = {  "_ZN3ccc9DD1x11y12E", // class name
  bases__ZN3ccc9DD1x11y12E, 2,
  &(vtc__ZN3ccc9DD1x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y13  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC1x11y133efgEv
  ~CC1x11y13(); // tgen
  CC1x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x11y133efgEv");}
ccc::CC1x11y13 ::~CC1x11y13(){ note_dtor("_ZN3ccc9CC1x11y13E", this);} // tgen
ccc::CC1x11y13 ::CC1x11y13(){ note_ctor("_ZN3ccc9CC1x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y13E, buf);
    ::ccc::CC1x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y13E);
    dp->::ccc::CC1x11y13::~CC1x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y13E(Test__ZN3ccc9CC1x11y13E, "_ZN3ccc9CC1x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y13C1Ev();
extern void _ZN3ccc9CC1x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y13E[] = {
  NSPAIR(_ZN3ccc9CC1x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC1x11y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x11y133efgEv,_ZTv0_n20_N3ccc9CC1x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y133efgEv,_ZThn4_N3ccc9CC1x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x11y133efgEv,_ZTv0_n20_N3ccc9CC1x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y13E[] = {
  {&(_ZTVN3ccc9CC1x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y13E[];
static VTBL_ENTRY alt_thunk_names783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x11y133efgEv,_ZTv0_n20_N3ccc9CC1x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y133efgEv,_ZThn4_N3ccc9CC1x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x11y13E = {  "_ZN3ccc9CC1x11y13E", // class name
  bases__ZN3ccc9CC1x11y13E, 2,
  &(vtc__ZN3ccc9CC1x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y13E),2, //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  DD1x11y13  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD1x11y133efgEv
  ~DD1x11y13(); // tgen
  DD1x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD1x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x11y133efgEv");}
ccc::DD1x11y13 ::~DD1x11y13(){ note_dtor("_ZN3ccc9DD1x11y13E", this);} // tgen
ccc::DD1x11y13 ::DD1x11y13(){ note_ctor("_ZN3ccc9DD1x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y13E, buf);
    ::ccc::DD1x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y13E);
    dp->::ccc::DD1x11y13::~DD1x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y13E(Test__ZN3ccc9DD1x11y13E, "_ZN3ccc9DD1x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y13C1Ev();
extern void _ZN3ccc9DD1x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y13E[] = {
  NSPAIR(_ZN3ccc9DD1x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD1x11y133efgEv,_ZTv0_n16_N3ccc9DD1x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x11y133efgEv,_ZThn4_N3ccc9DD1x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD1x11y133efgEv,_ZTv0_n16_N3ccc9DD1x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y13E[] = {
  {&(_ZTVN3ccc9DD1x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y13E[];
static VTBL_ENTRY alt_thunk_names784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD1x11y133efgEv,_ZTv0_n16_N3ccc9DD1x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x11y133efgEv,_ZThn4_N3ccc9DD1x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x11y13E = {  "_ZN3ccc9DD1x11y13E", // class name
  bases__ZN3ccc9DD1x11y13E, 2,
  &(vtc__ZN3ccc9DD1x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y13E),3, //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  CC1x11y14  : virtual ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y143pqrEv
  ~CC1x11y14(); // tgen
  CC1x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y143pqrEv");}
ccc::CC1x11y14 ::~CC1x11y14(){ note_dtor("_ZN3ccc9CC1x11y14E", this);} // tgen
ccc::CC1x11y14 ::CC1x11y14(){ note_ctor("_ZN3ccc9CC1x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y14E, buf);
    ::ccc::CC1x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y14E);
    dp->::ccc::CC1x11y14::~CC1x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y14E(Test__ZN3ccc9CC1x11y14E, "_ZN3ccc9CC1x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y14C1Ev();
extern void _ZN3ccc9CC1x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y14E[] = {
  NSPAIR(_ZN3ccc9CC1x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y14E[];
extern void _ZN3ccc9CC1x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x11y143pqrEv,_ZTv0_n16_N3ccc9CC1x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y143pqrEv,_ZThn4_N3ccc9CC1x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x11y143pqrEv,_ZTv0_n16_N3ccc9CC1x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y14E[] = {
  {&(_ZTVN3ccc9CC1x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y14E[];
static VTBL_ENTRY alt_thunk_names785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x11y143pqrEv,_ZTv0_n16_N3ccc9CC1x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x11y143pqrEv,_ZThn4_N3ccc9CC1x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x11y14E = {  "_ZN3ccc9CC1x11y14E", // class name
  bases__ZN3ccc9CC1x11y14E, 2,
  &(vtc__ZN3ccc9CC1x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y14E),2, //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  DD1x11y14  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD1x11y143pqrEv
  ~DD1x11y14(); // tgen
  DD1x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD1x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x11y143pqrEv");}
ccc::DD1x11y14 ::~DD1x11y14(){ note_dtor("_ZN3ccc9DD1x11y14E", this);} // tgen
ccc::DD1x11y14 ::DD1x11y14(){ note_ctor("_ZN3ccc9DD1x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y14E, buf);
    ::ccc::DD1x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y14E);
    dp->::ccc::DD1x11y14::~DD1x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y14E(Test__ZN3ccc9DD1x11y14E, "_ZN3ccc9DD1x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y14C1Ev();
extern void _ZN3ccc9DD1x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y14E[] = {
  NSPAIR(_ZN3ccc9DD1x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x11y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x11y143pqrEv,_ZTv0_n12_N3ccc9DD1x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x11y143pqrEv,_ZThn4_N3ccc9DD1x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x11y143pqrEv,_ZTv0_n12_N3ccc9DD1x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y14E[] = {
  {&(_ZTVN3ccc9DD1x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y14E[];
static VTBL_ENTRY alt_thunk_names786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x11y143pqrEv,_ZTv0_n12_N3ccc9DD1x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x11y143pqrEv,_ZThn4_N3ccc9DD1x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x11y14E = {  "_ZN3ccc9DD1x11y14E", // class name
  bases__ZN3ccc9DD1x11y14E, 2,
  &(vtc__ZN3ccc9DD1x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y14E),3, //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  CC1x11y15  : virtual ::ccc::AA1 , ::ccc::BB11 {
  ~CC1x11y15(); // tgen
  CC1x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x11y15 ::~CC1x11y15(){ note_dtor("_ZN3ccc9CC1x11y15E", this);} // tgen
ccc::CC1x11y15 ::CC1x11y15(){ note_ctor("_ZN3ccc9CC1x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y15E, buf);
    ::ccc::CC1x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC1x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y15E);
    dp->::ccc::CC1x11y15::~CC1x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y15E(Test__ZN3ccc9CC1x11y15E, "_ZN3ccc9CC1x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y15C1Ev();
extern void _ZN3ccc9CC1x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y15E[] = {
  NSPAIR(_ZN3ccc9CC1x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x11y15E[] = {
  {&(_ZTVN3ccc9CC1x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x11y15E[];
Class_Descriptor cd__ZN3ccc9CC1x11y15E = {  "_ZN3ccc9CC1x11y15E", // class name
  bases__ZN3ccc9CC1x11y15E, 2,
  &(vtc__ZN3ccc9CC1x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x11y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x11y15  : virtual ::ccc::AA1 , virtual ::ccc::BB11 {
  ~DD1x11y15(); // tgen
  DD1x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD1x11y15 ::~DD1x11y15(){ note_dtor("_ZN3ccc9DD1x11y15E", this);} // tgen
ccc::DD1x11y15 ::DD1x11y15(){ note_ctor("_ZN3ccc9DD1x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x11y15E, buf);
    ::ccc::DD1x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x11y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD1x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x11y15E);
    dp->::ccc::DD1x11y15::~DD1x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x11y15E(Test__ZN3ccc9DD1x11y15E, "_ZN3ccc9DD1x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x11y15C1Ev();
extern void _ZN3ccc9DD1x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x11y15E[] = {
  NSPAIR(_ZN3ccc9DD1x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD1x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x11y15E[] = {
  {&(_ZTVN3ccc9DD1x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD1x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x11y15E[];
Class_Descriptor cd__ZN3ccc9DD1x11y15E = {  "_ZN3ccc9DD1x11y15E", // class name
  bases__ZN3ccc9DD1x11y15E, 2,
  &(vtc__ZN3ccc9DD1x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x11y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y0  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y03pqrEv
  ~CC1x12y0(); // tgen
  CC1x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y0E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y03abcEv");}
void  ccc::CC1x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y03efgEv");}
void  ccc::CC1x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y03pqrEv");}
ccc::CC1x12y0 ::~CC1x12y0(){ note_dtor("_ZN3ccc8CC1x12y0E", this);} // tgen
ccc::CC1x12y0 ::CC1x12y0(){ note_ctor("_ZN3ccc8CC1x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y0E, buf);
    ::ccc::CC1x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y0E);
    dp->::ccc::CC1x12y0::~CC1x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y0E(Test__ZN3ccc8CC1x12y0E, "_ZN3ccc8CC1x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y0C1Ev();
extern void _ZN3ccc8CC1x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y0E[] = {
  NSPAIR(_ZN3ccc8CC1x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y0E[];
extern void _ZN3ccc8CC1x12y03abcEv();
extern void _ZN3ccc8CC1x12y03efgEv();
extern void _ZN3ccc8CC1x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y03abcEv,_ZTv0_n12_N3ccc8CC1x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y03abcEv,_ZThn4_N3ccc8CC1x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y03pqrEv,_ZTv0_n16_N3ccc8CC1x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y03pqrEv,_ZThn4_N3ccc8CC1x12y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y03efgEv,_ZTv0_n20_N3ccc8CC1x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y03efgEv,_ZThn4_N3ccc8CC1x12y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y03abcEv,_ZTv0_n12_N3ccc8CC1x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y03pqrEv,_ZTv0_n16_N3ccc8CC1x12y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y03efgEv,_ZTv0_n20_N3ccc8CC1x12y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y0E[] = {
  {&(_ZTVN3ccc8CC1x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y0E[];
static VTBL_ENTRY alt_thunk_names787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y03efgEv,_ZTv0_n20_N3ccc8CC1x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y03efgEv,_ZThn4_N3ccc8CC1x12y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y03pqrEv,_ZTv0_n16_N3ccc8CC1x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y03pqrEv,_ZThn4_N3ccc8CC1x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y03abcEv,_ZTv0_n12_N3ccc8CC1x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y03abcEv,_ZThn4_N3ccc8CC1x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y0E = {  "_ZN3ccc8CC1x12y0E", // class name
  bases__ZN3ccc8CC1x12y0E, 2,
  &(vtc__ZN3ccc8CC1x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y0E),2, //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  DD1x12y0  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD1x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y03pqrEv
  ~DD1x12y0(); // tgen
  DD1x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y03abcEv");}
void  ccc::DD1x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y03efgEv");}
void  ccc::DD1x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y03pqrEv");}
ccc::DD1x12y0 ::~DD1x12y0(){ note_dtor("_ZN3ccc8DD1x12y0E", this);} // tgen
ccc::DD1x12y0 ::DD1x12y0(){ note_ctor("_ZN3ccc8DD1x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y0E, buf);
    ::ccc::DD1x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y0E);
    dp->::ccc::DD1x12y0::~DD1x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y0E(Test__ZN3ccc8DD1x12y0E, "_ZN3ccc8DD1x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y0C1Ev();
extern void _ZN3ccc8DD1x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y0E[] = {
  NSPAIR(_ZN3ccc8DD1x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y0E[];
extern void _ZN3ccc8DD1x12y03abcEv();
extern void _ZN3ccc8DD1x12y03pqrEv();
extern void _ZN3ccc8DD1x12y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y03abcEv,_ZTv0_n12_N3ccc8DD1x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y03abcEv,_ZThn4_N3ccc8DD1x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y03abcEv,_ZTv0_n12_N3ccc8DD1x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y0E[] = {
  {&(_ZTVN3ccc8DD1x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y0E[];
static VTBL_ENTRY alt_thunk_names788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y03abcEv,_ZTv0_n12_N3ccc8DD1x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y03abcEv,_ZThn4_N3ccc8DD1x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y0E = {  "_ZN3ccc8DD1x12y0E", // class name
  bases__ZN3ccc8DD1x12y0E, 2,
  &(vtc__ZN3ccc8DD1x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y0E),3, //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  CC1x12y1  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x12y13efgEv
  ~CC1x12y1(); // tgen
  CC1x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y1E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y13abcEv");}
void  ccc::CC1x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y13pqrEv");}
void  ccc::CC1x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y13efgEv");}
ccc::CC1x12y1 ::~CC1x12y1(){ note_dtor("_ZN3ccc8CC1x12y1E", this);} // tgen
ccc::CC1x12y1 ::CC1x12y1(){ note_ctor("_ZN3ccc8CC1x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y1E, buf);
    ::ccc::CC1x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y1E);
    dp->::ccc::CC1x12y1::~CC1x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y1E(Test__ZN3ccc8CC1x12y1E, "_ZN3ccc8CC1x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y1C1Ev();
extern void _ZN3ccc8CC1x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y1E[] = {
  NSPAIR(_ZN3ccc8CC1x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y1E[];
extern void _ZN3ccc8CC1x12y13abcEv();
extern void _ZN3ccc8CC1x12y13pqrEv();
extern void _ZN3ccc8CC1x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y13abcEv,_ZTv0_n12_N3ccc8CC1x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y13abcEv,_ZThn4_N3ccc8CC1x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y13pqrEv,_ZTv0_n16_N3ccc8CC1x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y13pqrEv,_ZThn4_N3ccc8CC1x12y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y13efgEv,_ZTv0_n20_N3ccc8CC1x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y13efgEv,_ZThn4_N3ccc8CC1x12y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y13abcEv,_ZTv0_n12_N3ccc8CC1x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y13pqrEv,_ZTv0_n16_N3ccc8CC1x12y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y13efgEv,_ZTv0_n20_N3ccc8CC1x12y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y1E[] = {
  {&(_ZTVN3ccc8CC1x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y1E[];
static VTBL_ENTRY alt_thunk_names789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y13efgEv,_ZTv0_n20_N3ccc8CC1x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y13efgEv,_ZThn4_N3ccc8CC1x12y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y13pqrEv,_ZTv0_n16_N3ccc8CC1x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y13pqrEv,_ZThn4_N3ccc8CC1x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y13abcEv,_ZTv0_n12_N3ccc8CC1x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y13abcEv,_ZThn4_N3ccc8CC1x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y1E = {  "_ZN3ccc8CC1x12y1E", // class name
  bases__ZN3ccc8CC1x12y1E, 2,
  &(vtc__ZN3ccc8CC1x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y1E),2, //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  DD1x12y1  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD1x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x12y13efgEv
  ~DD1x12y1(); // tgen
  DD1x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y13abcEv");}
void  ccc::DD1x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y13pqrEv");}
void  ccc::DD1x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y13efgEv");}
ccc::DD1x12y1 ::~DD1x12y1(){ note_dtor("_ZN3ccc8DD1x12y1E", this);} // tgen
ccc::DD1x12y1 ::DD1x12y1(){ note_ctor("_ZN3ccc8DD1x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y1E, buf);
    ::ccc::DD1x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y1E);
    dp->::ccc::DD1x12y1::~DD1x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y1E(Test__ZN3ccc8DD1x12y1E, "_ZN3ccc8DD1x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y1C1Ev();
extern void _ZN3ccc8DD1x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y1E[] = {
  NSPAIR(_ZN3ccc8DD1x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y1E[];
extern void _ZN3ccc8DD1x12y13abcEv();
extern void _ZN3ccc8DD1x12y13pqrEv();
extern void _ZN3ccc8DD1x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y13abcEv,_ZTv0_n12_N3ccc8DD1x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y13abcEv,_ZThn4_N3ccc8DD1x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y13abcEv,_ZTv0_n12_N3ccc8DD1x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y1E[] = {
  {&(_ZTVN3ccc8DD1x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y1E[];
static VTBL_ENTRY alt_thunk_names790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y13abcEv,_ZTv0_n12_N3ccc8DD1x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y13abcEv,_ZThn4_N3ccc8DD1x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y1E = {  "_ZN3ccc8DD1x12y1E", // class name
  bases__ZN3ccc8DD1x12y1E, 2,
  &(vtc__ZN3ccc8DD1x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y1E),3, //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  CC1x12y2  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y23pqrEv
  ~CC1x12y2(); // tgen
  CC1x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y2E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y23efgEv");}
void  ccc::CC1x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y23abcEv");}
void  ccc::CC1x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y23pqrEv");}
ccc::CC1x12y2 ::~CC1x12y2(){ note_dtor("_ZN3ccc8CC1x12y2E", this);} // tgen
ccc::CC1x12y2 ::CC1x12y2(){ note_ctor("_ZN3ccc8CC1x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y2E, buf);
    ::ccc::CC1x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y2E);
    dp->::ccc::CC1x12y2::~CC1x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y2E(Test__ZN3ccc8CC1x12y2E, "_ZN3ccc8CC1x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y2C1Ev();
extern void _ZN3ccc8CC1x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y2E[] = {
  NSPAIR(_ZN3ccc8CC1x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y2E[];
extern void _ZN3ccc8CC1x12y23abcEv();
extern void _ZN3ccc8CC1x12y23efgEv();
extern void _ZN3ccc8CC1x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y23abcEv,_ZTv0_n12_N3ccc8CC1x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y23abcEv,_ZThn4_N3ccc8CC1x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y23pqrEv,_ZTv0_n16_N3ccc8CC1x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y23pqrEv,_ZThn4_N3ccc8CC1x12y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y23efgEv,_ZTv0_n20_N3ccc8CC1x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y23efgEv,_ZThn4_N3ccc8CC1x12y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y23abcEv,_ZTv0_n12_N3ccc8CC1x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y23pqrEv,_ZTv0_n16_N3ccc8CC1x12y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y23efgEv,_ZTv0_n20_N3ccc8CC1x12y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y2E[] = {
  {&(_ZTVN3ccc8CC1x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y2E[];
static VTBL_ENTRY alt_thunk_names791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y23efgEv,_ZTv0_n20_N3ccc8CC1x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y23efgEv,_ZThn4_N3ccc8CC1x12y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y23pqrEv,_ZTv0_n16_N3ccc8CC1x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y23pqrEv,_ZThn4_N3ccc8CC1x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y23abcEv,_ZTv0_n12_N3ccc8CC1x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y23abcEv,_ZThn4_N3ccc8CC1x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y2E = {  "_ZN3ccc8CC1x12y2E", // class name
  bases__ZN3ccc8CC1x12y2E, 2,
  &(vtc__ZN3ccc8CC1x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y2E),2, //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  DD1x12y2  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD1x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y23pqrEv
  ~DD1x12y2(); // tgen
  DD1x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y23efgEv");}
void  ccc::DD1x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y23abcEv");}
void  ccc::DD1x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y23pqrEv");}
ccc::DD1x12y2 ::~DD1x12y2(){ note_dtor("_ZN3ccc8DD1x12y2E", this);} // tgen
ccc::DD1x12y2 ::DD1x12y2(){ note_ctor("_ZN3ccc8DD1x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y2E, buf);
    ::ccc::DD1x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y2E);
    dp->::ccc::DD1x12y2::~DD1x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y2E(Test__ZN3ccc8DD1x12y2E, "_ZN3ccc8DD1x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y2C1Ev();
extern void _ZN3ccc8DD1x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y2E[] = {
  NSPAIR(_ZN3ccc8DD1x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y2E[];
extern void _ZN3ccc8DD1x12y23abcEv();
extern void _ZN3ccc8DD1x12y23pqrEv();
extern void _ZN3ccc8DD1x12y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y23abcEv,_ZTv0_n12_N3ccc8DD1x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y23abcEv,_ZThn4_N3ccc8DD1x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y23abcEv,_ZTv0_n12_N3ccc8DD1x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y2E[] = {
  {&(_ZTVN3ccc8DD1x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y2E[];
static VTBL_ENTRY alt_thunk_names792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y23abcEv,_ZTv0_n12_N3ccc8DD1x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y23abcEv,_ZThn4_N3ccc8DD1x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y2E = {  "_ZN3ccc8DD1x12y2E", // class name
  bases__ZN3ccc8DD1x12y2E, 2,
  &(vtc__ZN3ccc8DD1x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y2E),3, //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  CC1x12y3  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x12y33abcEv
  ~CC1x12y3(); // tgen
  CC1x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y3E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y33efgEv");}
void  ccc::CC1x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y33pqrEv");}
void  ccc::CC1x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y33abcEv");}
ccc::CC1x12y3 ::~CC1x12y3(){ note_dtor("_ZN3ccc8CC1x12y3E", this);} // tgen
ccc::CC1x12y3 ::CC1x12y3(){ note_ctor("_ZN3ccc8CC1x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y3E, buf);
    ::ccc::CC1x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y3E);
    dp->::ccc::CC1x12y3::~CC1x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y3E(Test__ZN3ccc8CC1x12y3E, "_ZN3ccc8CC1x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y3C1Ev();
extern void _ZN3ccc8CC1x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y3E[] = {
  NSPAIR(_ZN3ccc8CC1x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y3E[];
extern void _ZN3ccc8CC1x12y33abcEv();
extern void _ZN3ccc8CC1x12y33efgEv();
extern void _ZN3ccc8CC1x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y33abcEv,_ZTv0_n12_N3ccc8CC1x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y33abcEv,_ZThn4_N3ccc8CC1x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y33pqrEv,_ZTv0_n16_N3ccc8CC1x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y33pqrEv,_ZThn4_N3ccc8CC1x12y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y33efgEv,_ZTv0_n20_N3ccc8CC1x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y33efgEv,_ZThn4_N3ccc8CC1x12y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y33abcEv,_ZTv0_n12_N3ccc8CC1x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y33pqrEv,_ZTv0_n16_N3ccc8CC1x12y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y33efgEv,_ZTv0_n20_N3ccc8CC1x12y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y3E[] = {
  {&(_ZTVN3ccc8CC1x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y3E[];
static VTBL_ENTRY alt_thunk_names793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y33efgEv,_ZTv0_n20_N3ccc8CC1x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y33efgEv,_ZThn4_N3ccc8CC1x12y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y33pqrEv,_ZTv0_n16_N3ccc8CC1x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y33pqrEv,_ZThn4_N3ccc8CC1x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y33abcEv,_ZTv0_n12_N3ccc8CC1x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y33abcEv,_ZThn4_N3ccc8CC1x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y3E = {  "_ZN3ccc8CC1x12y3E", // class name
  bases__ZN3ccc8CC1x12y3E, 2,
  &(vtc__ZN3ccc8CC1x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y3E),2, //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  DD1x12y3  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD1x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x12y33abcEv
  ~DD1x12y3(); // tgen
  DD1x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y33efgEv");}
void  ccc::DD1x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y33pqrEv");}
void  ccc::DD1x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y33abcEv");}
ccc::DD1x12y3 ::~DD1x12y3(){ note_dtor("_ZN3ccc8DD1x12y3E", this);} // tgen
ccc::DD1x12y3 ::DD1x12y3(){ note_ctor("_ZN3ccc8DD1x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y3E, buf);
    ::ccc::DD1x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y3E);
    dp->::ccc::DD1x12y3::~DD1x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y3E(Test__ZN3ccc8DD1x12y3E, "_ZN3ccc8DD1x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y3C1Ev();
extern void _ZN3ccc8DD1x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y3E[] = {
  NSPAIR(_ZN3ccc8DD1x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y3E[];
extern void _ZN3ccc8DD1x12y33abcEv();
extern void _ZN3ccc8DD1x12y33pqrEv();
extern void _ZN3ccc8DD1x12y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y33abcEv,_ZTv0_n12_N3ccc8DD1x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y33abcEv,_ZThn4_N3ccc8DD1x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y33abcEv,_ZTv0_n12_N3ccc8DD1x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y3E[] = {
  {&(_ZTVN3ccc8DD1x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y3E[];
static VTBL_ENTRY alt_thunk_names794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y33abcEv,_ZTv0_n12_N3ccc8DD1x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y33abcEv,_ZThn4_N3ccc8DD1x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y3E = {  "_ZN3ccc8DD1x12y3E", // class name
  bases__ZN3ccc8DD1x12y3E, 2,
  &(vtc__ZN3ccc8DD1x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y3E),3, //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  CC1x12y4  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC1x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y43efgEv
  ~CC1x12y4(); // tgen
  CC1x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y4E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y43pqrEv");}
void  ccc::CC1x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y43abcEv");}
void  ccc::CC1x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y43efgEv");}
ccc::CC1x12y4 ::~CC1x12y4(){ note_dtor("_ZN3ccc8CC1x12y4E", this);} // tgen
ccc::CC1x12y4 ::CC1x12y4(){ note_ctor("_ZN3ccc8CC1x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y4E, buf);
    ::ccc::CC1x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y4E);
    dp->::ccc::CC1x12y4::~CC1x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y4E(Test__ZN3ccc8CC1x12y4E, "_ZN3ccc8CC1x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y4C1Ev();
extern void _ZN3ccc8CC1x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y4E[] = {
  NSPAIR(_ZN3ccc8CC1x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y4E[];
extern void _ZN3ccc8CC1x12y43abcEv();
extern void _ZN3ccc8CC1x12y43pqrEv();
extern void _ZN3ccc8CC1x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y43abcEv,_ZTv0_n12_N3ccc8CC1x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y43abcEv,_ZThn4_N3ccc8CC1x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y43pqrEv,_ZTv0_n16_N3ccc8CC1x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y43pqrEv,_ZThn4_N3ccc8CC1x12y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y43efgEv,_ZTv0_n20_N3ccc8CC1x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y43efgEv,_ZThn4_N3ccc8CC1x12y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y43abcEv,_ZTv0_n12_N3ccc8CC1x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y43pqrEv,_ZTv0_n16_N3ccc8CC1x12y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y43efgEv,_ZTv0_n20_N3ccc8CC1x12y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y4E[] = {
  {&(_ZTVN3ccc8CC1x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y4E[];
static VTBL_ENTRY alt_thunk_names795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y43efgEv,_ZTv0_n20_N3ccc8CC1x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y43efgEv,_ZThn4_N3ccc8CC1x12y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y43pqrEv,_ZTv0_n16_N3ccc8CC1x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y43pqrEv,_ZThn4_N3ccc8CC1x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y43abcEv,_ZTv0_n12_N3ccc8CC1x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y43abcEv,_ZThn4_N3ccc8CC1x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y4E = {  "_ZN3ccc8CC1x12y4E", // class name
  bases__ZN3ccc8CC1x12y4E, 2,
  &(vtc__ZN3ccc8CC1x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y4E),2, //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  DD1x12y4  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD1x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x12y43efgEv
  ~DD1x12y4(); // tgen
  DD1x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y43pqrEv");}
void  ccc::DD1x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y43abcEv");}
void  ccc::DD1x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y43efgEv");}
ccc::DD1x12y4 ::~DD1x12y4(){ note_dtor("_ZN3ccc8DD1x12y4E", this);} // tgen
ccc::DD1x12y4 ::DD1x12y4(){ note_ctor("_ZN3ccc8DD1x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y4E, buf);
    ::ccc::DD1x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y4E);
    dp->::ccc::DD1x12y4::~DD1x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y4E(Test__ZN3ccc8DD1x12y4E, "_ZN3ccc8DD1x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y4C1Ev();
extern void _ZN3ccc8DD1x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y4E[] = {
  NSPAIR(_ZN3ccc8DD1x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y4E[];
extern void _ZN3ccc8DD1x12y43abcEv();
extern void _ZN3ccc8DD1x12y43pqrEv();
extern void _ZN3ccc8DD1x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y43abcEv,_ZTv0_n12_N3ccc8DD1x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y43abcEv,_ZThn4_N3ccc8DD1x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y43abcEv,_ZTv0_n12_N3ccc8DD1x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y4E[] = {
  {&(_ZTVN3ccc8DD1x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y4E[];
static VTBL_ENTRY alt_thunk_names796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y43abcEv,_ZTv0_n12_N3ccc8DD1x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y43abcEv,_ZThn4_N3ccc8DD1x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y4E = {  "_ZN3ccc8DD1x12y4E", // class name
  bases__ZN3ccc8DD1x12y4E, 2,
  &(vtc__ZN3ccc8DD1x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y4E),3, //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  CC1x12y5  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC1x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y53abcEv
  ~CC1x12y5(); // tgen
  CC1x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y5E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y53pqrEv");}
void  ccc::CC1x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y53efgEv");}
void  ccc::CC1x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y53abcEv");}
ccc::CC1x12y5 ::~CC1x12y5(){ note_dtor("_ZN3ccc8CC1x12y5E", this);} // tgen
ccc::CC1x12y5 ::CC1x12y5(){ note_ctor("_ZN3ccc8CC1x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y5E, buf);
    ::ccc::CC1x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y5E);
    dp->::ccc::CC1x12y5::~CC1x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y5E(Test__ZN3ccc8CC1x12y5E, "_ZN3ccc8CC1x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y5C1Ev();
extern void _ZN3ccc8CC1x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y5E[] = {
  NSPAIR(_ZN3ccc8CC1x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y5E[];
extern void _ZN3ccc8CC1x12y53abcEv();
extern void _ZN3ccc8CC1x12y53pqrEv();
extern void _ZN3ccc8CC1x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y53abcEv,_ZTv0_n12_N3ccc8CC1x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y53abcEv,_ZThn4_N3ccc8CC1x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y53pqrEv,_ZTv0_n16_N3ccc8CC1x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y53pqrEv,_ZThn4_N3ccc8CC1x12y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y53efgEv,_ZTv0_n20_N3ccc8CC1x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y53efgEv,_ZThn4_N3ccc8CC1x12y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y53abcEv,_ZTv0_n12_N3ccc8CC1x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y53pqrEv,_ZTv0_n16_N3ccc8CC1x12y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y53efgEv,_ZTv0_n20_N3ccc8CC1x12y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y5E[] = {
  {&(_ZTVN3ccc8CC1x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y5E[];
static VTBL_ENTRY alt_thunk_names797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y53efgEv,_ZTv0_n20_N3ccc8CC1x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y53efgEv,_ZThn4_N3ccc8CC1x12y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y53pqrEv,_ZTv0_n16_N3ccc8CC1x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y53pqrEv,_ZThn4_N3ccc8CC1x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y53abcEv,_ZTv0_n12_N3ccc8CC1x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y53abcEv,_ZThn4_N3ccc8CC1x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y5E = {  "_ZN3ccc8CC1x12y5E", // class name
  bases__ZN3ccc8CC1x12y5E, 2,
  &(vtc__ZN3ccc8CC1x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y5E),2, //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  DD1x12y5  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD1x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x12y53abcEv
  ~DD1x12y5(); // tgen
  DD1x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y53pqrEv");}
void  ccc::DD1x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y53efgEv");}
void  ccc::DD1x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y53abcEv");}
ccc::DD1x12y5 ::~DD1x12y5(){ note_dtor("_ZN3ccc8DD1x12y5E", this);} // tgen
ccc::DD1x12y5 ::DD1x12y5(){ note_ctor("_ZN3ccc8DD1x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y5E, buf);
    ::ccc::DD1x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y5E);
    dp->::ccc::DD1x12y5::~DD1x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y5E(Test__ZN3ccc8DD1x12y5E, "_ZN3ccc8DD1x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y5C1Ev();
extern void _ZN3ccc8DD1x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y5E[] = {
  NSPAIR(_ZN3ccc8DD1x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y5E[];
extern void _ZN3ccc8DD1x12y53abcEv();
extern void _ZN3ccc8DD1x12y53pqrEv();
extern void _ZN3ccc8DD1x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y53abcEv,_ZTv0_n12_N3ccc8DD1x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y53abcEv,_ZThn4_N3ccc8DD1x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y53abcEv,_ZTv0_n12_N3ccc8DD1x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y5E[] = {
  {&(_ZTVN3ccc8DD1x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y5E[];
static VTBL_ENTRY alt_thunk_names798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y53abcEv,_ZTv0_n12_N3ccc8DD1x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y53abcEv,_ZThn4_N3ccc8DD1x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y5E = {  "_ZN3ccc8DD1x12y5E", // class name
  bases__ZN3ccc8DD1x12y5E, 2,
  &(vtc__ZN3ccc8DD1x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y5E),3, //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  CC1x12y6  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y63efgEv
  ~CC1x12y6(); // tgen
  CC1x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y6E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y63abcEv");}
void  ccc::CC1x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y63efgEv");}
ccc::CC1x12y6 ::~CC1x12y6(){ note_dtor("_ZN3ccc8CC1x12y6E", this);} // tgen
ccc::CC1x12y6 ::CC1x12y6(){ note_ctor("_ZN3ccc8CC1x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y6E, buf);
    ::ccc::CC1x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y6E);
    dp->::ccc::CC1x12y6::~CC1x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y6E(Test__ZN3ccc8CC1x12y6E, "_ZN3ccc8CC1x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y6C1Ev();
extern void _ZN3ccc8CC1x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y6E[] = {
  NSPAIR(_ZN3ccc8CC1x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y6E[];
extern void _ZN3ccc8CC1x12y63abcEv();
extern void _ZN3ccc8CC1x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y63abcEv,_ZTv0_n12_N3ccc8CC1x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y63abcEv,_ZThn4_N3ccc8CC1x12y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y63efgEv,_ZTv0_n20_N3ccc8CC1x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y63efgEv,_ZThn4_N3ccc8CC1x12y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y63abcEv,_ZTv0_n12_N3ccc8CC1x12y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y63efgEv,_ZTv0_n20_N3ccc8CC1x12y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y6E[] = {
  {&(_ZTVN3ccc8CC1x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y6E[];
static VTBL_ENTRY alt_thunk_names799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y63efgEv,_ZTv0_n20_N3ccc8CC1x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y63efgEv,_ZThn4_N3ccc8CC1x12y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y63abcEv,_ZTv0_n12_N3ccc8CC1x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y63abcEv,_ZThn4_N3ccc8CC1x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y6E = {  "_ZN3ccc8CC1x12y6E", // class name
  bases__ZN3ccc8CC1x12y6E, 2,
  &(vtc__ZN3ccc8CC1x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y6E),2, //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  DD1x12y6  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD1x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x12y63efgEv
  ~DD1x12y6(); // tgen
  DD1x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y63abcEv");}
void  ccc::DD1x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y63efgEv");}
ccc::DD1x12y6 ::~DD1x12y6(){ note_dtor("_ZN3ccc8DD1x12y6E", this);} // tgen
ccc::DD1x12y6 ::DD1x12y6(){ note_ctor("_ZN3ccc8DD1x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y6E, buf);
    ::ccc::DD1x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y6E);
    dp->::ccc::DD1x12y6::~DD1x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y6E(Test__ZN3ccc8DD1x12y6E, "_ZN3ccc8DD1x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y6C1Ev();
extern void _ZN3ccc8DD1x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y6E[] = {
  NSPAIR(_ZN3ccc8DD1x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y6E[];
extern void _ZN3ccc8DD1x12y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y63abcEv,_ZTv0_n12_N3ccc8DD1x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y63abcEv,_ZThn4_N3ccc8DD1x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y63abcEv,_ZTv0_n12_N3ccc8DD1x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y6E[] = {
  {&(_ZTVN3ccc8DD1x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y6E[];
static VTBL_ENTRY alt_thunk_names800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y63abcEv,_ZTv0_n12_N3ccc8DD1x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y63abcEv,_ZThn4_N3ccc8DD1x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y6E = {  "_ZN3ccc8DD1x12y6E", // class name
  bases__ZN3ccc8DD1x12y6E, 2,
  &(vtc__ZN3ccc8DD1x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y6E),3, //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  CC1x12y7  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y73pqrEv
  ~CC1x12y7(); // tgen
  CC1x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y7E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y73abcEv");}
void  ccc::CC1x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y73pqrEv");}
ccc::CC1x12y7 ::~CC1x12y7(){ note_dtor("_ZN3ccc8CC1x12y7E", this);} // tgen
ccc::CC1x12y7 ::CC1x12y7(){ note_ctor("_ZN3ccc8CC1x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y7E, buf);
    ::ccc::CC1x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y7E);
    dp->::ccc::CC1x12y7::~CC1x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y7E(Test__ZN3ccc8CC1x12y7E, "_ZN3ccc8CC1x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y7C1Ev();
extern void _ZN3ccc8CC1x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y7E[] = {
  NSPAIR(_ZN3ccc8CC1x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y7E[];
extern void _ZN3ccc8CC1x12y73abcEv();
extern void _ZN3ccc8CC1x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y73abcEv,_ZTv0_n12_N3ccc8CC1x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y73abcEv,_ZThn4_N3ccc8CC1x12y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y73pqrEv,_ZTv0_n16_N3ccc8CC1x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y73pqrEv,_ZThn4_N3ccc8CC1x12y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y73abcEv,_ZTv0_n12_N3ccc8CC1x12y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y73pqrEv,_ZTv0_n16_N3ccc8CC1x12y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y7E[] = {
  {&(_ZTVN3ccc8CC1x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y7E[];
static VTBL_ENTRY alt_thunk_names801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y73pqrEv,_ZTv0_n16_N3ccc8CC1x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y73pqrEv,_ZThn4_N3ccc8CC1x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y73abcEv,_ZTv0_n12_N3ccc8CC1x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y73abcEv,_ZThn4_N3ccc8CC1x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y7E = {  "_ZN3ccc8CC1x12y7E", // class name
  bases__ZN3ccc8CC1x12y7E, 2,
  &(vtc__ZN3ccc8CC1x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y7E),2, //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  DD1x12y7  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD1x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y73pqrEv
  ~DD1x12y7(); // tgen
  DD1x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y73abcEv");}
void  ccc::DD1x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y73pqrEv");}
ccc::DD1x12y7 ::~DD1x12y7(){ note_dtor("_ZN3ccc8DD1x12y7E", this);} // tgen
ccc::DD1x12y7 ::DD1x12y7(){ note_ctor("_ZN3ccc8DD1x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y7E, buf);
    ::ccc::DD1x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y7E);
    dp->::ccc::DD1x12y7::~DD1x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y7E(Test__ZN3ccc8DD1x12y7E, "_ZN3ccc8DD1x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y7C1Ev();
extern void _ZN3ccc8DD1x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y7E[] = {
  NSPAIR(_ZN3ccc8DD1x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y7E[];
extern void _ZN3ccc8DD1x12y73abcEv();
extern void _ZN3ccc8DD1x12y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y73abcEv,_ZTv0_n12_N3ccc8DD1x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y73abcEv,_ZThn4_N3ccc8DD1x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y73abcEv,_ZTv0_n12_N3ccc8DD1x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y7E[] = {
  {&(_ZTVN3ccc8DD1x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y7E[];
static VTBL_ENTRY alt_thunk_names802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y73abcEv,_ZTv0_n12_N3ccc8DD1x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y73abcEv,_ZThn4_N3ccc8DD1x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y7E = {  "_ZN3ccc8DD1x12y7E", // class name
  bases__ZN3ccc8DD1x12y7E, 2,
  &(vtc__ZN3ccc8DD1x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y7E),3, //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  CC1x12y8  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y83abcEv
  ~CC1x12y8(); // tgen
  CC1x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y8E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y83efgEv");}
void  ccc::CC1x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y83abcEv");}
ccc::CC1x12y8 ::~CC1x12y8(){ note_dtor("_ZN3ccc8CC1x12y8E", this);} // tgen
ccc::CC1x12y8 ::CC1x12y8(){ note_ctor("_ZN3ccc8CC1x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y8E, buf);
    ::ccc::CC1x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y8E);
    dp->::ccc::CC1x12y8::~CC1x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y8E(Test__ZN3ccc8CC1x12y8E, "_ZN3ccc8CC1x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y8C1Ev();
extern void _ZN3ccc8CC1x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y8E[] = {
  NSPAIR(_ZN3ccc8CC1x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y8E[];
extern void _ZN3ccc8CC1x12y83abcEv();
extern void _ZN3ccc8CC1x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x12y83abcEv,_ZTv0_n12_N3ccc8CC1x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y83abcEv,_ZThn4_N3ccc8CC1x12y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y83efgEv,_ZTv0_n20_N3ccc8CC1x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y83efgEv,_ZThn4_N3ccc8CC1x12y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x12y83abcEv,_ZTv0_n12_N3ccc8CC1x12y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y83efgEv,_ZTv0_n20_N3ccc8CC1x12y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y8E[] = {
  {&(_ZTVN3ccc8CC1x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y8E[];
static VTBL_ENTRY alt_thunk_names803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y83efgEv,_ZTv0_n20_N3ccc8CC1x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y83efgEv,_ZThn4_N3ccc8CC1x12y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x12y83abcEv,_ZTv0_n12_N3ccc8CC1x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y83abcEv,_ZThn4_N3ccc8CC1x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y8E = {  "_ZN3ccc8CC1x12y8E", // class name
  bases__ZN3ccc8CC1x12y8E, 2,
  &(vtc__ZN3ccc8CC1x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y8E),2, //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  DD1x12y8  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD1x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x12y83abcEv
  ~DD1x12y8(); // tgen
  DD1x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y83efgEv");}
void  ccc::DD1x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x12y83abcEv");}
ccc::DD1x12y8 ::~DD1x12y8(){ note_dtor("_ZN3ccc8DD1x12y8E", this);} // tgen
ccc::DD1x12y8 ::DD1x12y8(){ note_ctor("_ZN3ccc8DD1x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y8E, buf);
    ::ccc::DD1x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y8E);
    dp->::ccc::DD1x12y8::~DD1x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y8E(Test__ZN3ccc8DD1x12y8E, "_ZN3ccc8DD1x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y8C1Ev();
extern void _ZN3ccc8DD1x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y8E[] = {
  NSPAIR(_ZN3ccc8DD1x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y8E[];
extern void _ZN3ccc8DD1x12y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x12y83abcEv,_ZTv0_n12_N3ccc8DD1x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x12y83abcEv,_ZThn4_N3ccc8DD1x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x12y83abcEv,_ZTv0_n12_N3ccc8DD1x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y8E[] = {
  {&(_ZTVN3ccc8DD1x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y8E[];
static VTBL_ENTRY alt_thunk_names804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x12y83abcEv,_ZTv0_n12_N3ccc8DD1x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x12y83abcEv,_ZThn4_N3ccc8DD1x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x12y8E = {  "_ZN3ccc8DD1x12y8E", // class name
  bases__ZN3ccc8DD1x12y8E, 2,
  &(vtc__ZN3ccc8DD1x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y8E),3, //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  CC1x12y9  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y93pqrEv
  ~CC1x12y9(); // tgen
  CC1x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y9E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y93efgEv");}
void  ccc::CC1x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y93pqrEv");}
ccc::CC1x12y9 ::~CC1x12y9(){ note_dtor("_ZN3ccc8CC1x12y9E", this);} // tgen
ccc::CC1x12y9 ::CC1x12y9(){ note_ctor("_ZN3ccc8CC1x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y9E, buf);
    ::ccc::CC1x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC1x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y9E);
    dp->::ccc::CC1x12y9::~CC1x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y9E(Test__ZN3ccc8CC1x12y9E, "_ZN3ccc8CC1x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y9C1Ev();
extern void _ZN3ccc8CC1x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y9E[] = {
  NSPAIR(_ZN3ccc8CC1x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC1x12y93efgEv();
extern void _ZN3ccc8CC1x12y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x12y93pqrEv,_ZTv0_n16_N3ccc8CC1x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y93pqrEv,_ZThn4_N3ccc8CC1x12y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x12y93efgEv,_ZTv0_n20_N3ccc8CC1x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y93efgEv,_ZThn4_N3ccc8CC1x12y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x12y93pqrEv,_ZTv0_n16_N3ccc8CC1x12y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x12y93efgEv,_ZTv0_n20_N3ccc8CC1x12y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x12y9E[] = {
  {&(_ZTVN3ccc8CC1x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x12y9E[];
static VTBL_ENTRY alt_thunk_names805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x12y93efgEv,_ZTv0_n20_N3ccc8CC1x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y93efgEv,_ZThn4_N3ccc8CC1x12y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x12y93pqrEv,_ZTv0_n16_N3ccc8CC1x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x12y93pqrEv,_ZThn4_N3ccc8CC1x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x12y9E = {  "_ZN3ccc8CC1x12y9E", // class name
  bases__ZN3ccc8CC1x12y9E, 2,
  &(vtc__ZN3ccc8CC1x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x12y9E),2, //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  DD1x12y9  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD1x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x12y93pqrEv
  ~DD1x12y9(); // tgen
  DD1x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x12y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x12y93efgEv");}
void  ccc::DD1x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x12y93pqrEv");}
ccc::DD1x12y9 ::~DD1x12y9(){ note_dtor("_ZN3ccc8DD1x12y9E", this);} // tgen
ccc::DD1x12y9 ::DD1x12y9(){ note_ctor("_ZN3ccc8DD1x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x12y9E, buf);
    ::ccc::DD1x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x12y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD1x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x12y9E);
    dp->::ccc::DD1x12y9::~DD1x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x12y9E(Test__ZN3ccc8DD1x12y9E, "_ZN3ccc8DD1x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x12y9C1Ev();
extern void _ZN3ccc8DD1x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x12y9E[] = {
  NSPAIR(_ZN3ccc8DD1x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD1x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x12y93pqrEv();
extern void _ZN3ccc8DD1x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x12y93efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x12y9E[] = {
  {&(_ZTVN3ccc8DD1x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x12y9E[];
Class_Descriptor cd__ZN3ccc8DD1x12y9E = {  "_ZN3ccc8DD1x12y9E", // class name
  bases__ZN3ccc8DD1x12y9E, 2,
  &(vtc__ZN3ccc8DD1x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x12y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y10  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x12y103abcEv
  ~CC1x12y10(); // tgen
  CC1x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y10E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y103pqrEv");}
void  ccc::CC1x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x12y103abcEv");}
ccc::CC1x12y10 ::~CC1x12y10(){ note_dtor("_ZN3ccc9CC1x12y10E", this);} // tgen
ccc::CC1x12y10 ::CC1x12y10(){ note_ctor("_ZN3ccc9CC1x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y10E, buf);
    ::ccc::CC1x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y10E);
    dp->::ccc::CC1x12y10::~CC1x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y10E(Test__ZN3ccc9CC1x12y10E, "_ZN3ccc9CC1x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y10C1Ev();
extern void _ZN3ccc9CC1x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y10E[] = {
  NSPAIR(_ZN3ccc9CC1x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y10E[];
extern void _ZN3ccc9CC1x12y103abcEv();
extern void _ZN3ccc9CC1x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x12y103abcEv,_ZTv0_n12_N3ccc9CC1x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y103abcEv,_ZThn4_N3ccc9CC1x12y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x12y103pqrEv,_ZTv0_n16_N3ccc9CC1x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y103pqrEv,_ZThn4_N3ccc9CC1x12y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x12y103abcEv,_ZTv0_n12_N3ccc9CC1x12y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x12y103pqrEv,_ZTv0_n16_N3ccc9CC1x12y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y10E[] = {
  {&(_ZTVN3ccc9CC1x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y10E[];
static VTBL_ENTRY alt_thunk_names806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x12y103pqrEv,_ZTv0_n16_N3ccc9CC1x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y103pqrEv,_ZThn4_N3ccc9CC1x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x12y103abcEv,_ZTv0_n12_N3ccc9CC1x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y103abcEv,_ZThn4_N3ccc9CC1x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x12y10E = {  "_ZN3ccc9CC1x12y10E", // class name
  bases__ZN3ccc9CC1x12y10E, 2,
  &(vtc__ZN3ccc9CC1x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y10E),2, //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  DD1x12y10  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD1x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x12y103abcEv
  ~DD1x12y10(); // tgen
  DD1x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x12y103pqrEv");}
void  ccc::DD1x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x12y103abcEv");}
ccc::DD1x12y10 ::~DD1x12y10(){ note_dtor("_ZN3ccc9DD1x12y10E", this);} // tgen
ccc::DD1x12y10 ::DD1x12y10(){ note_ctor("_ZN3ccc9DD1x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y10E, buf);
    ::ccc::DD1x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y10E);
    dp->::ccc::DD1x12y10::~DD1x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y10E(Test__ZN3ccc9DD1x12y10E, "_ZN3ccc9DD1x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y10C1Ev();
extern void _ZN3ccc9DD1x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y10E[] = {
  NSPAIR(_ZN3ccc9DD1x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y10E[];
extern void _ZN3ccc9DD1x12y103abcEv();
extern void _ZN3ccc9DD1x12y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x12y103abcEv,_ZTv0_n12_N3ccc9DD1x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x12y103abcEv,_ZThn4_N3ccc9DD1x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x12y103abcEv,_ZTv0_n12_N3ccc9DD1x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y10E[] = {
  {&(_ZTVN3ccc9DD1x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y10E[];
static VTBL_ENTRY alt_thunk_names807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x12y103abcEv,_ZTv0_n12_N3ccc9DD1x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x12y103abcEv,_ZThn4_N3ccc9DD1x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x12y10E = {  "_ZN3ccc9DD1x12y10E", // class name
  bases__ZN3ccc9DD1x12y10E, 2,
  &(vtc__ZN3ccc9DD1x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y10E),3, //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  CC1x12y11  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x12y113efgEv
  ~CC1x12y11(); // tgen
  CC1x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y11E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y113pqrEv");}
void  ccc::CC1x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x12y113efgEv");}
ccc::CC1x12y11 ::~CC1x12y11(){ note_dtor("_ZN3ccc9CC1x12y11E", this);} // tgen
ccc::CC1x12y11 ::CC1x12y11(){ note_ctor("_ZN3ccc9CC1x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y11E, buf);
    ::ccc::CC1x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y11E);
    dp->::ccc::CC1x12y11::~CC1x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y11E(Test__ZN3ccc9CC1x12y11E, "_ZN3ccc9CC1x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y11C1Ev();
extern void _ZN3ccc9CC1x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y11E[] = {
  NSPAIR(_ZN3ccc9CC1x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC1x12y113pqrEv();
extern void _ZN3ccc9CC1x12y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x12y113pqrEv,_ZTv0_n16_N3ccc9CC1x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y113pqrEv,_ZThn4_N3ccc9CC1x12y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x12y113efgEv,_ZTv0_n20_N3ccc9CC1x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y113efgEv,_ZThn4_N3ccc9CC1x12y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x12y113pqrEv,_ZTv0_n16_N3ccc9CC1x12y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x12y113efgEv,_ZTv0_n20_N3ccc9CC1x12y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y11E[] = {
  {&(_ZTVN3ccc9CC1x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y11E[];
static VTBL_ENTRY alt_thunk_names808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x12y113efgEv,_ZTv0_n20_N3ccc9CC1x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y113efgEv,_ZThn4_N3ccc9CC1x12y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x12y113pqrEv,_ZTv0_n16_N3ccc9CC1x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y113pqrEv,_ZThn4_N3ccc9CC1x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x12y11E = {  "_ZN3ccc9CC1x12y11E", // class name
  bases__ZN3ccc9CC1x12y11E, 2,
  &(vtc__ZN3ccc9CC1x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y11E),2, //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  DD1x12y11  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD1x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x12y113efgEv
  ~DD1x12y11(); // tgen
  DD1x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x12y113pqrEv");}
void  ccc::DD1x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x12y113efgEv");}
ccc::DD1x12y11 ::~DD1x12y11(){ note_dtor("_ZN3ccc9DD1x12y11E", this);} // tgen
ccc::DD1x12y11 ::DD1x12y11(){ note_ctor("_ZN3ccc9DD1x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y11E, buf);
    ::ccc::DD1x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y11E);
    dp->::ccc::DD1x12y11::~DD1x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y11E(Test__ZN3ccc9DD1x12y11E, "_ZN3ccc9DD1x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y11C1Ev();
extern void _ZN3ccc9DD1x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y11E[] = {
  NSPAIR(_ZN3ccc9DD1x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x12y113pqrEv();
extern void _ZN3ccc9DD1x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y11E[] = {
  {&(_ZTVN3ccc9DD1x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y11E[];
Class_Descriptor cd__ZN3ccc9DD1x12y11E = {  "_ZN3ccc9DD1x12y11E", // class name
  bases__ZN3ccc9DD1x12y11E, 2,
  &(vtc__ZN3ccc9DD1x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y12  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC1x12y123abcEv
  ~CC1x12y12(); // tgen
  CC1x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y12E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x12y123abcEv");}
ccc::CC1x12y12 ::~CC1x12y12(){ note_dtor("_ZN3ccc9CC1x12y12E", this);} // tgen
ccc::CC1x12y12 ::CC1x12y12(){ note_ctor("_ZN3ccc9CC1x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y12E, buf);
    ::ccc::CC1x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y12E);
    dp->::ccc::CC1x12y12::~CC1x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y12E(Test__ZN3ccc9CC1x12y12E, "_ZN3ccc9CC1x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y12C1Ev();
extern void _ZN3ccc9CC1x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y12E[] = {
  NSPAIR(_ZN3ccc9CC1x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y12E[];
extern void _ZN3ccc9CC1x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x12y123abcEv,_ZTv0_n12_N3ccc9CC1x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y123abcEv,_ZThn4_N3ccc9CC1x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x12y123abcEv,_ZTv0_n12_N3ccc9CC1x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y12E[] = {
  {&(_ZTVN3ccc9CC1x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y12E[];
static VTBL_ENTRY alt_thunk_names809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x12y123abcEv,_ZTv0_n12_N3ccc9CC1x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y123abcEv,_ZThn4_N3ccc9CC1x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x12y12E = {  "_ZN3ccc9CC1x12y12E", // class name
  bases__ZN3ccc9CC1x12y12E, 2,
  &(vtc__ZN3ccc9CC1x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y12E),2, //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  DD1x12y12  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD1x12y123abcEv
  ~DD1x12y12(); // tgen
  DD1x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD1x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x12y123abcEv");}
ccc::DD1x12y12 ::~DD1x12y12(){ note_dtor("_ZN3ccc9DD1x12y12E", this);} // tgen
ccc::DD1x12y12 ::DD1x12y12(){ note_ctor("_ZN3ccc9DD1x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y12E, buf);
    ::ccc::DD1x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y12E);
    dp->::ccc::DD1x12y12::~DD1x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y12E(Test__ZN3ccc9DD1x12y12E, "_ZN3ccc9DD1x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y12C1Ev();
extern void _ZN3ccc9DD1x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y12E[] = {
  NSPAIR(_ZN3ccc9DD1x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y12E[];
extern void _ZN3ccc9DD1x12y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x12y123abcEv,_ZTv0_n12_N3ccc9DD1x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x12y123abcEv,_ZThn4_N3ccc9DD1x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x12y123abcEv,_ZTv0_n12_N3ccc9DD1x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y12E[] = {
  {&(_ZTVN3ccc9DD1x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y12E[];
static VTBL_ENTRY alt_thunk_names810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x12y123abcEv,_ZTv0_n12_N3ccc9DD1x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x12y123abcEv,_ZThn4_N3ccc9DD1x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x12y12E = {  "_ZN3ccc9DD1x12y12E", // class name
  bases__ZN3ccc9DD1x12y12E, 2,
  &(vtc__ZN3ccc9DD1x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y12E),3, //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  CC1x12y13  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC1x12y133efgEv
  ~CC1x12y13(); // tgen
  CC1x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x12y133efgEv");}
ccc::CC1x12y13 ::~CC1x12y13(){ note_dtor("_ZN3ccc9CC1x12y13E", this);} // tgen
ccc::CC1x12y13 ::CC1x12y13(){ note_ctor("_ZN3ccc9CC1x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y13E, buf);
    ::ccc::CC1x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y13E);
    dp->::ccc::CC1x12y13::~CC1x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y13E(Test__ZN3ccc9CC1x12y13E, "_ZN3ccc9CC1x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y13C1Ev();
extern void _ZN3ccc9CC1x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y13E[] = {
  NSPAIR(_ZN3ccc9CC1x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC1x12y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x12y133efgEv,_ZTv0_n20_N3ccc9CC1x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y133efgEv,_ZThn4_N3ccc9CC1x12y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x12y133efgEv,_ZTv0_n20_N3ccc9CC1x12y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y13E[] = {
  {&(_ZTVN3ccc9CC1x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y13E[];
static VTBL_ENTRY alt_thunk_names811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x12y133efgEv,_ZTv0_n20_N3ccc9CC1x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y133efgEv,_ZThn4_N3ccc9CC1x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x12y13E = {  "_ZN3ccc9CC1x12y13E", // class name
  bases__ZN3ccc9CC1x12y13E, 2,
  &(vtc__ZN3ccc9CC1x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y13E),2, //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  DD1x12y13  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD1x12y133efgEv
  ~DD1x12y13(); // tgen
  DD1x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x12y133efgEv");}
ccc::DD1x12y13 ::~DD1x12y13(){ note_dtor("_ZN3ccc9DD1x12y13E", this);} // tgen
ccc::DD1x12y13 ::DD1x12y13(){ note_ctor("_ZN3ccc9DD1x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y13E, buf);
    ::ccc::DD1x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y13E);
    dp->::ccc::DD1x12y13::~DD1x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y13E(Test__ZN3ccc9DD1x12y13E, "_ZN3ccc9DD1x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y13C1Ev();
extern void _ZN3ccc9DD1x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y13E[] = {
  NSPAIR(_ZN3ccc9DD1x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y13E[] = {
  {&(_ZTVN3ccc9DD1x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y13E[];
Class_Descriptor cd__ZN3ccc9DD1x12y13E = {  "_ZN3ccc9DD1x12y13E", // class name
  bases__ZN3ccc9DD1x12y13E, 2,
  &(vtc__ZN3ccc9DD1x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y14  : virtual ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y143pqrEv
  ~CC1x12y14(); // tgen
  CC1x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y143pqrEv");}
ccc::CC1x12y14 ::~CC1x12y14(){ note_dtor("_ZN3ccc9CC1x12y14E", this);} // tgen
ccc::CC1x12y14 ::CC1x12y14(){ note_ctor("_ZN3ccc9CC1x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y14E, buf);
    ::ccc::CC1x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y14E);
    dp->::ccc::CC1x12y14::~CC1x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y14E(Test__ZN3ccc9CC1x12y14E, "_ZN3ccc9CC1x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y14C1Ev();
extern void _ZN3ccc9CC1x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y14E[] = {
  NSPAIR(_ZN3ccc9CC1x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC1x12y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x12y143pqrEv,_ZTv0_n16_N3ccc9CC1x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y143pqrEv,_ZThn4_N3ccc9CC1x12y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x12y143pqrEv,_ZTv0_n16_N3ccc9CC1x12y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y14E[] = {
  {&(_ZTVN3ccc9CC1x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y14E[];
static VTBL_ENTRY alt_thunk_names812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x12y143pqrEv,_ZTv0_n16_N3ccc9CC1x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x12y143pqrEv,_ZThn4_N3ccc9CC1x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x12y14E = {  "_ZN3ccc9CC1x12y14E", // class name
  bases__ZN3ccc9CC1x12y14E, 2,
  &(vtc__ZN3ccc9CC1x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y14E),2, //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  DD1x12y14  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD1x12y143pqrEv
  ~DD1x12y14(); // tgen
  DD1x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x12y143pqrEv");}
ccc::DD1x12y14 ::~DD1x12y14(){ note_dtor("_ZN3ccc9DD1x12y14E", this);} // tgen
ccc::DD1x12y14 ::DD1x12y14(){ note_ctor("_ZN3ccc9DD1x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y14E, buf);
    ::ccc::DD1x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y14E);
    dp->::ccc::DD1x12y14::~DD1x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y14E(Test__ZN3ccc9DD1x12y14E, "_ZN3ccc9DD1x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y14C1Ev();
extern void _ZN3ccc9DD1x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y14E[] = {
  NSPAIR(_ZN3ccc9DD1x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x12y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y14E[] = {
  {&(_ZTVN3ccc9DD1x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y14E[];
Class_Descriptor cd__ZN3ccc9DD1x12y14E = {  "_ZN3ccc9DD1x12y14E", // class name
  bases__ZN3ccc9DD1x12y14E, 2,
  &(vtc__ZN3ccc9DD1x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y15  : virtual ::ccc::AA1 , ::ccc::BB12 {
  ~CC1x12y15(); // tgen
  CC1x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x12y15 ::~CC1x12y15(){ note_dtor("_ZN3ccc9CC1x12y15E", this);} // tgen
ccc::CC1x12y15 ::CC1x12y15(){ note_ctor("_ZN3ccc9CC1x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y15E, buf);
    ::ccc::CC1x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC1x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y15E);
    dp->::ccc::CC1x12y15::~CC1x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y15E(Test__ZN3ccc9CC1x12y15E, "_ZN3ccc9CC1x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y15C1Ev();
extern void _ZN3ccc9CC1x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y15E[] = {
  NSPAIR(_ZN3ccc9CC1x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x12y15E[] = {
  {&(_ZTVN3ccc9CC1x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x12y15E[];
Class_Descriptor cd__ZN3ccc9CC1x12y15E = {  "_ZN3ccc9CC1x12y15E", // class name
  bases__ZN3ccc9CC1x12y15E, 2,
  &(vtc__ZN3ccc9CC1x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x12y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x12y15  : virtual ::ccc::AA1 , virtual ::ccc::BB12 {
  ~DD1x12y15(); // tgen
  DD1x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD1x12y15 ::~DD1x12y15(){ note_dtor("_ZN3ccc9DD1x12y15E", this);} // tgen
ccc::DD1x12y15 ::DD1x12y15(){ note_ctor("_ZN3ccc9DD1x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x12y15E, buf);
    ::ccc::DD1x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x12y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD1x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x12y15E);
    dp->::ccc::DD1x12y15::~DD1x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x12y15E(Test__ZN3ccc9DD1x12y15E, "_ZN3ccc9DD1x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x12y15C1Ev();
extern void _ZN3ccc9DD1x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x12y15E[] = {
  NSPAIR(_ZN3ccc9DD1x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD1x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x12y15E[] = {
  {&(_ZTVN3ccc9DD1x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x12y15E[];
Class_Descriptor cd__ZN3ccc9DD1x12y15E = {  "_ZN3ccc9DD1x12y15E", // class name
  bases__ZN3ccc9DD1x12y15E, 2,
  &(vtc__ZN3ccc9DD1x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x12y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y0  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y03pqrEv
  ~CC1x13y0(); // tgen
  CC1x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y0E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y03abcEv");}
void  ccc::CC1x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y03efgEv");}
void  ccc::CC1x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y03pqrEv");}
ccc::CC1x13y0 ::~CC1x13y0(){ note_dtor("_ZN3ccc8CC1x13y0E", this);} // tgen
ccc::CC1x13y0 ::CC1x13y0(){ note_ctor("_ZN3ccc8CC1x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y0E, buf);
    ::ccc::CC1x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y0E);
    dp->::ccc::CC1x13y0::~CC1x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y0E(Test__ZN3ccc8CC1x13y0E, "_ZN3ccc8CC1x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y0C1Ev();
extern void _ZN3ccc8CC1x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y0E[] = {
  NSPAIR(_ZN3ccc8CC1x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y0E[];
extern void _ZN3ccc8CC1x13y03efgEv();
extern void _ZN3ccc8CC1x13y03abcEv();
extern void _ZN3ccc8CC1x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y03abcEv,_ZTv0_n12_N3ccc8CC1x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y03abcEv,_ZThn4_N3ccc8CC1x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y03pqrEv,_ZTv0_n16_N3ccc8CC1x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y03pqrEv,_ZThn4_N3ccc8CC1x13y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y03efgEv,_ZTv0_n20_N3ccc8CC1x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y03efgEv,_ZThn4_N3ccc8CC1x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y03abcEv,_ZTv0_n12_N3ccc8CC1x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y03pqrEv,_ZTv0_n16_N3ccc8CC1x13y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y03efgEv,_ZTv0_n20_N3ccc8CC1x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y0E[] = {
  {&(_ZTVN3ccc8CC1x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y0E[];
static VTBL_ENTRY alt_thunk_names813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y03efgEv,_ZTv0_n20_N3ccc8CC1x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y03efgEv,_ZThn4_N3ccc8CC1x13y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y03pqrEv,_ZTv0_n16_N3ccc8CC1x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y03pqrEv,_ZThn4_N3ccc8CC1x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y03abcEv,_ZTv0_n12_N3ccc8CC1x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y03abcEv,_ZThn4_N3ccc8CC1x13y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y0E = {  "_ZN3ccc8CC1x13y0E", // class name
  bases__ZN3ccc8CC1x13y0E, 2,
  &(vtc__ZN3ccc8CC1x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y0E),2, //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  DD1x13y0  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD1x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y03pqrEv
  ~DD1x13y0(); // tgen
  DD1x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y03abcEv");}
void  ccc::DD1x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y03efgEv");}
void  ccc::DD1x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y03pqrEv");}
ccc::DD1x13y0 ::~DD1x13y0(){ note_dtor("_ZN3ccc8DD1x13y0E", this);} // tgen
ccc::DD1x13y0 ::DD1x13y0(){ note_ctor("_ZN3ccc8DD1x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y0E, buf);
    ::ccc::DD1x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y0E);
    dp->::ccc::DD1x13y0::~DD1x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y0E(Test__ZN3ccc8DD1x13y0E, "_ZN3ccc8DD1x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y0C1Ev();
extern void _ZN3ccc8DD1x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y0E[] = {
  NSPAIR(_ZN3ccc8DD1x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y0E[];
extern void _ZN3ccc8DD1x13y03abcEv();
extern void _ZN3ccc8DD1x13y03pqrEv();
extern void _ZN3ccc8DD1x13y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y03efgEv,_ZTv0_n12_N3ccc8DD1x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y03efgEv,_ZThn4_N3ccc8DD1x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y03efgEv,_ZTv0_n12_N3ccc8DD1x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y0E[] = {
  {&(_ZTVN3ccc8DD1x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y0E[];
static VTBL_ENTRY alt_thunk_names814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y03efgEv,_ZTv0_n12_N3ccc8DD1x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y03efgEv,_ZThn4_N3ccc8DD1x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y0E = {  "_ZN3ccc8DD1x13y0E", // class name
  bases__ZN3ccc8DD1x13y0E, 2,
  &(vtc__ZN3ccc8DD1x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y0E),3, //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  CC1x13y1  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x13y13efgEv
  ~CC1x13y1(); // tgen
  CC1x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y1E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y13abcEv");}
void  ccc::CC1x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y13pqrEv");}
void  ccc::CC1x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y13efgEv");}
ccc::CC1x13y1 ::~CC1x13y1(){ note_dtor("_ZN3ccc8CC1x13y1E", this);} // tgen
ccc::CC1x13y1 ::CC1x13y1(){ note_ctor("_ZN3ccc8CC1x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y1E, buf);
    ::ccc::CC1x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y1E);
    dp->::ccc::CC1x13y1::~CC1x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y1E(Test__ZN3ccc8CC1x13y1E, "_ZN3ccc8CC1x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y1C1Ev();
extern void _ZN3ccc8CC1x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y1E[] = {
  NSPAIR(_ZN3ccc8CC1x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y1E[];
extern void _ZN3ccc8CC1x13y13efgEv();
extern void _ZN3ccc8CC1x13y13abcEv();
extern void _ZN3ccc8CC1x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y13abcEv,_ZTv0_n12_N3ccc8CC1x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y13abcEv,_ZThn4_N3ccc8CC1x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y13pqrEv,_ZTv0_n16_N3ccc8CC1x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y13pqrEv,_ZThn4_N3ccc8CC1x13y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y13efgEv,_ZTv0_n20_N3ccc8CC1x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y13efgEv,_ZThn4_N3ccc8CC1x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y13abcEv,_ZTv0_n12_N3ccc8CC1x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y13pqrEv,_ZTv0_n16_N3ccc8CC1x13y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y13efgEv,_ZTv0_n20_N3ccc8CC1x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y1E[] = {
  {&(_ZTVN3ccc8CC1x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y1E[];
static VTBL_ENTRY alt_thunk_names815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y13efgEv,_ZTv0_n20_N3ccc8CC1x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y13efgEv,_ZThn4_N3ccc8CC1x13y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y13pqrEv,_ZTv0_n16_N3ccc8CC1x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y13pqrEv,_ZThn4_N3ccc8CC1x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y13abcEv,_ZTv0_n12_N3ccc8CC1x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y13abcEv,_ZThn4_N3ccc8CC1x13y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y1E = {  "_ZN3ccc8CC1x13y1E", // class name
  bases__ZN3ccc8CC1x13y1E, 2,
  &(vtc__ZN3ccc8CC1x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y1E),2, //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  DD1x13y1  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD1x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x13y13efgEv
  ~DD1x13y1(); // tgen
  DD1x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y13abcEv");}
void  ccc::DD1x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y13pqrEv");}
void  ccc::DD1x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y13efgEv");}
ccc::DD1x13y1 ::~DD1x13y1(){ note_dtor("_ZN3ccc8DD1x13y1E", this);} // tgen
ccc::DD1x13y1 ::DD1x13y1(){ note_ctor("_ZN3ccc8DD1x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y1E, buf);
    ::ccc::DD1x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y1E);
    dp->::ccc::DD1x13y1::~DD1x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y1E(Test__ZN3ccc8DD1x13y1E, "_ZN3ccc8DD1x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y1C1Ev();
extern void _ZN3ccc8DD1x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y1E[] = {
  NSPAIR(_ZN3ccc8DD1x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y1E[];
extern void _ZN3ccc8DD1x13y13abcEv();
extern void _ZN3ccc8DD1x13y13pqrEv();
extern void _ZN3ccc8DD1x13y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y13efgEv,_ZTv0_n12_N3ccc8DD1x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y13efgEv,_ZThn4_N3ccc8DD1x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y13efgEv,_ZTv0_n12_N3ccc8DD1x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y1E[] = {
  {&(_ZTVN3ccc8DD1x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y1E[];
static VTBL_ENTRY alt_thunk_names816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y13efgEv,_ZTv0_n12_N3ccc8DD1x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y13efgEv,_ZThn4_N3ccc8DD1x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y1E = {  "_ZN3ccc8DD1x13y1E", // class name
  bases__ZN3ccc8DD1x13y1E, 2,
  &(vtc__ZN3ccc8DD1x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y1E),3, //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  CC1x13y2  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y23pqrEv
  ~CC1x13y2(); // tgen
  CC1x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y2E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y23efgEv");}
void  ccc::CC1x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y23abcEv");}
void  ccc::CC1x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y23pqrEv");}
ccc::CC1x13y2 ::~CC1x13y2(){ note_dtor("_ZN3ccc8CC1x13y2E", this);} // tgen
ccc::CC1x13y2 ::CC1x13y2(){ note_ctor("_ZN3ccc8CC1x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y2E, buf);
    ::ccc::CC1x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y2E);
    dp->::ccc::CC1x13y2::~CC1x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y2E(Test__ZN3ccc8CC1x13y2E, "_ZN3ccc8CC1x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y2C1Ev();
extern void _ZN3ccc8CC1x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y2E[] = {
  NSPAIR(_ZN3ccc8CC1x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y2E[];
extern void _ZN3ccc8CC1x13y23efgEv();
extern void _ZN3ccc8CC1x13y23abcEv();
extern void _ZN3ccc8CC1x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y23abcEv,_ZTv0_n12_N3ccc8CC1x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y23abcEv,_ZThn4_N3ccc8CC1x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y23pqrEv,_ZTv0_n16_N3ccc8CC1x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y23pqrEv,_ZThn4_N3ccc8CC1x13y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y23efgEv,_ZTv0_n20_N3ccc8CC1x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y23efgEv,_ZThn4_N3ccc8CC1x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y23abcEv,_ZTv0_n12_N3ccc8CC1x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y23pqrEv,_ZTv0_n16_N3ccc8CC1x13y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y23efgEv,_ZTv0_n20_N3ccc8CC1x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y2E[] = {
  {&(_ZTVN3ccc8CC1x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y2E[];
static VTBL_ENTRY alt_thunk_names817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y23efgEv,_ZTv0_n20_N3ccc8CC1x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y23efgEv,_ZThn4_N3ccc8CC1x13y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y23pqrEv,_ZTv0_n16_N3ccc8CC1x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y23pqrEv,_ZThn4_N3ccc8CC1x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y23abcEv,_ZTv0_n12_N3ccc8CC1x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y23abcEv,_ZThn4_N3ccc8CC1x13y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y2E = {  "_ZN3ccc8CC1x13y2E", // class name
  bases__ZN3ccc8CC1x13y2E, 2,
  &(vtc__ZN3ccc8CC1x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y2E),2, //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  DD1x13y2  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD1x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y23pqrEv
  ~DD1x13y2(); // tgen
  DD1x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y23efgEv");}
void  ccc::DD1x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y23abcEv");}
void  ccc::DD1x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y23pqrEv");}
ccc::DD1x13y2 ::~DD1x13y2(){ note_dtor("_ZN3ccc8DD1x13y2E", this);} // tgen
ccc::DD1x13y2 ::DD1x13y2(){ note_ctor("_ZN3ccc8DD1x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y2E, buf);
    ::ccc::DD1x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y2E);
    dp->::ccc::DD1x13y2::~DD1x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y2E(Test__ZN3ccc8DD1x13y2E, "_ZN3ccc8DD1x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y2C1Ev();
extern void _ZN3ccc8DD1x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y2E[] = {
  NSPAIR(_ZN3ccc8DD1x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y2E[];
extern void _ZN3ccc8DD1x13y23abcEv();
extern void _ZN3ccc8DD1x13y23pqrEv();
extern void _ZN3ccc8DD1x13y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y23efgEv,_ZTv0_n12_N3ccc8DD1x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y23efgEv,_ZThn4_N3ccc8DD1x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y23efgEv,_ZTv0_n12_N3ccc8DD1x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y2E[] = {
  {&(_ZTVN3ccc8DD1x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y2E[];
static VTBL_ENTRY alt_thunk_names818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y23efgEv,_ZTv0_n12_N3ccc8DD1x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y23efgEv,_ZThn4_N3ccc8DD1x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y2E = {  "_ZN3ccc8DD1x13y2E", // class name
  bases__ZN3ccc8DD1x13y2E, 2,
  &(vtc__ZN3ccc8DD1x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y2E),3, //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  CC1x13y3  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x13y33abcEv
  ~CC1x13y3(); // tgen
  CC1x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y3E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y33efgEv");}
void  ccc::CC1x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y33pqrEv");}
void  ccc::CC1x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y33abcEv");}
ccc::CC1x13y3 ::~CC1x13y3(){ note_dtor("_ZN3ccc8CC1x13y3E", this);} // tgen
ccc::CC1x13y3 ::CC1x13y3(){ note_ctor("_ZN3ccc8CC1x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y3E, buf);
    ::ccc::CC1x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y3E);
    dp->::ccc::CC1x13y3::~CC1x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y3E(Test__ZN3ccc8CC1x13y3E, "_ZN3ccc8CC1x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y3C1Ev();
extern void _ZN3ccc8CC1x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y3E[] = {
  NSPAIR(_ZN3ccc8CC1x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y3E[];
extern void _ZN3ccc8CC1x13y33efgEv();
extern void _ZN3ccc8CC1x13y33pqrEv();
extern void _ZN3ccc8CC1x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y33abcEv,_ZTv0_n12_N3ccc8CC1x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y33abcEv,_ZThn4_N3ccc8CC1x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y33pqrEv,_ZTv0_n16_N3ccc8CC1x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y33pqrEv,_ZThn4_N3ccc8CC1x13y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y33efgEv,_ZTv0_n20_N3ccc8CC1x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y33efgEv,_ZThn4_N3ccc8CC1x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y33abcEv,_ZTv0_n12_N3ccc8CC1x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y33pqrEv,_ZTv0_n16_N3ccc8CC1x13y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y33efgEv,_ZTv0_n20_N3ccc8CC1x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y3E[] = {
  {&(_ZTVN3ccc8CC1x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y3E[];
static VTBL_ENTRY alt_thunk_names819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y33efgEv,_ZTv0_n20_N3ccc8CC1x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y33efgEv,_ZThn4_N3ccc8CC1x13y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y33pqrEv,_ZTv0_n16_N3ccc8CC1x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y33pqrEv,_ZThn4_N3ccc8CC1x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y33abcEv,_ZTv0_n12_N3ccc8CC1x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y33abcEv,_ZThn4_N3ccc8CC1x13y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y3E = {  "_ZN3ccc8CC1x13y3E", // class name
  bases__ZN3ccc8CC1x13y3E, 2,
  &(vtc__ZN3ccc8CC1x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y3E),2, //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  DD1x13y3  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD1x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x13y33abcEv
  ~DD1x13y3(); // tgen
  DD1x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y33efgEv");}
void  ccc::DD1x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y33pqrEv");}
void  ccc::DD1x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y33abcEv");}
ccc::DD1x13y3 ::~DD1x13y3(){ note_dtor("_ZN3ccc8DD1x13y3E", this);} // tgen
ccc::DD1x13y3 ::DD1x13y3(){ note_ctor("_ZN3ccc8DD1x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y3E, buf);
    ::ccc::DD1x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y3E);
    dp->::ccc::DD1x13y3::~DD1x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y3E(Test__ZN3ccc8DD1x13y3E, "_ZN3ccc8DD1x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y3C1Ev();
extern void _ZN3ccc8DD1x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y3E[] = {
  NSPAIR(_ZN3ccc8DD1x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y3E[];
extern void _ZN3ccc8DD1x13y33abcEv();
extern void _ZN3ccc8DD1x13y33pqrEv();
extern void _ZN3ccc8DD1x13y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y33efgEv,_ZTv0_n12_N3ccc8DD1x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y33efgEv,_ZThn4_N3ccc8DD1x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y33efgEv,_ZTv0_n12_N3ccc8DD1x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y3E[] = {
  {&(_ZTVN3ccc8DD1x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y3E[];
static VTBL_ENTRY alt_thunk_names820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y33efgEv,_ZTv0_n12_N3ccc8DD1x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y33efgEv,_ZThn4_N3ccc8DD1x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y3E = {  "_ZN3ccc8DD1x13y3E", // class name
  bases__ZN3ccc8DD1x13y3E, 2,
  &(vtc__ZN3ccc8DD1x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y3E),3, //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  CC1x13y4  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC1x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y43efgEv
  ~CC1x13y4(); // tgen
  CC1x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y4E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y43pqrEv");}
void  ccc::CC1x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y43abcEv");}
void  ccc::CC1x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y43efgEv");}
ccc::CC1x13y4 ::~CC1x13y4(){ note_dtor("_ZN3ccc8CC1x13y4E", this);} // tgen
ccc::CC1x13y4 ::CC1x13y4(){ note_ctor("_ZN3ccc8CC1x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y4E, buf);
    ::ccc::CC1x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y4E);
    dp->::ccc::CC1x13y4::~CC1x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y4E(Test__ZN3ccc8CC1x13y4E, "_ZN3ccc8CC1x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y4C1Ev();
extern void _ZN3ccc8CC1x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y4E[] = {
  NSPAIR(_ZN3ccc8CC1x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y4E[];
extern void _ZN3ccc8CC1x13y43efgEv();
extern void _ZN3ccc8CC1x13y43pqrEv();
extern void _ZN3ccc8CC1x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y43abcEv,_ZTv0_n12_N3ccc8CC1x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y43abcEv,_ZThn4_N3ccc8CC1x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y43pqrEv,_ZTv0_n16_N3ccc8CC1x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y43pqrEv,_ZThn4_N3ccc8CC1x13y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y43efgEv,_ZTv0_n20_N3ccc8CC1x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y43efgEv,_ZThn4_N3ccc8CC1x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y43abcEv,_ZTv0_n12_N3ccc8CC1x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y43pqrEv,_ZTv0_n16_N3ccc8CC1x13y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y43efgEv,_ZTv0_n20_N3ccc8CC1x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y4E[] = {
  {&(_ZTVN3ccc8CC1x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y4E[];
static VTBL_ENTRY alt_thunk_names821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y43efgEv,_ZTv0_n20_N3ccc8CC1x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y43efgEv,_ZThn4_N3ccc8CC1x13y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y43pqrEv,_ZTv0_n16_N3ccc8CC1x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y43pqrEv,_ZThn4_N3ccc8CC1x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y43abcEv,_ZTv0_n12_N3ccc8CC1x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y43abcEv,_ZThn4_N3ccc8CC1x13y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y4E = {  "_ZN3ccc8CC1x13y4E", // class name
  bases__ZN3ccc8CC1x13y4E, 2,
  &(vtc__ZN3ccc8CC1x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y4E),2, //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  DD1x13y4  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD1x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x13y43efgEv
  ~DD1x13y4(); // tgen
  DD1x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y43pqrEv");}
void  ccc::DD1x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y43abcEv");}
void  ccc::DD1x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y43efgEv");}
ccc::DD1x13y4 ::~DD1x13y4(){ note_dtor("_ZN3ccc8DD1x13y4E", this);} // tgen
ccc::DD1x13y4 ::DD1x13y4(){ note_ctor("_ZN3ccc8DD1x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y4E, buf);
    ::ccc::DD1x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y4E);
    dp->::ccc::DD1x13y4::~DD1x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y4E(Test__ZN3ccc8DD1x13y4E, "_ZN3ccc8DD1x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y4C1Ev();
extern void _ZN3ccc8DD1x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y4E[] = {
  NSPAIR(_ZN3ccc8DD1x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y4E[];
extern void _ZN3ccc8DD1x13y43abcEv();
extern void _ZN3ccc8DD1x13y43pqrEv();
extern void _ZN3ccc8DD1x13y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y43efgEv,_ZTv0_n12_N3ccc8DD1x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y43efgEv,_ZThn4_N3ccc8DD1x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y43efgEv,_ZTv0_n12_N3ccc8DD1x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y4E[] = {
  {&(_ZTVN3ccc8DD1x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y4E[];
static VTBL_ENTRY alt_thunk_names822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y43efgEv,_ZTv0_n12_N3ccc8DD1x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y43efgEv,_ZThn4_N3ccc8DD1x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y4E = {  "_ZN3ccc8DD1x13y4E", // class name
  bases__ZN3ccc8DD1x13y4E, 2,
  &(vtc__ZN3ccc8DD1x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y4E),3, //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  CC1x13y5  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC1x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y53abcEv
  ~CC1x13y5(); // tgen
  CC1x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y5E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y53pqrEv");}
void  ccc::CC1x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y53efgEv");}
void  ccc::CC1x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y53abcEv");}
ccc::CC1x13y5 ::~CC1x13y5(){ note_dtor("_ZN3ccc8CC1x13y5E", this);} // tgen
ccc::CC1x13y5 ::CC1x13y5(){ note_ctor("_ZN3ccc8CC1x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y5E, buf);
    ::ccc::CC1x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y5E);
    dp->::ccc::CC1x13y5::~CC1x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y5E(Test__ZN3ccc8CC1x13y5E, "_ZN3ccc8CC1x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y5C1Ev();
extern void _ZN3ccc8CC1x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y5E[] = {
  NSPAIR(_ZN3ccc8CC1x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y5E[];
extern void _ZN3ccc8CC1x13y53efgEv();
extern void _ZN3ccc8CC1x13y53pqrEv();
extern void _ZN3ccc8CC1x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y53abcEv,_ZTv0_n12_N3ccc8CC1x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y53abcEv,_ZThn4_N3ccc8CC1x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y53pqrEv,_ZTv0_n16_N3ccc8CC1x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y53pqrEv,_ZThn4_N3ccc8CC1x13y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y53efgEv,_ZTv0_n20_N3ccc8CC1x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y53efgEv,_ZThn4_N3ccc8CC1x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y53abcEv,_ZTv0_n12_N3ccc8CC1x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y53pqrEv,_ZTv0_n16_N3ccc8CC1x13y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y53efgEv,_ZTv0_n20_N3ccc8CC1x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y5E[] = {
  {&(_ZTVN3ccc8CC1x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y5E[];
static VTBL_ENTRY alt_thunk_names823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y53efgEv,_ZTv0_n20_N3ccc8CC1x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y53efgEv,_ZThn4_N3ccc8CC1x13y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y53pqrEv,_ZTv0_n16_N3ccc8CC1x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y53pqrEv,_ZThn4_N3ccc8CC1x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y53abcEv,_ZTv0_n12_N3ccc8CC1x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y53abcEv,_ZThn4_N3ccc8CC1x13y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y5E = {  "_ZN3ccc8CC1x13y5E", // class name
  bases__ZN3ccc8CC1x13y5E, 2,
  &(vtc__ZN3ccc8CC1x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y5E),2, //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  DD1x13y5  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD1x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x13y53abcEv
  ~DD1x13y5(); // tgen
  DD1x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y53pqrEv");}
void  ccc::DD1x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y53efgEv");}
void  ccc::DD1x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y53abcEv");}
ccc::DD1x13y5 ::~DD1x13y5(){ note_dtor("_ZN3ccc8DD1x13y5E", this);} // tgen
ccc::DD1x13y5 ::DD1x13y5(){ note_ctor("_ZN3ccc8DD1x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y5E, buf);
    ::ccc::DD1x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y5E);
    dp->::ccc::DD1x13y5::~DD1x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y5E(Test__ZN3ccc8DD1x13y5E, "_ZN3ccc8DD1x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y5C1Ev();
extern void _ZN3ccc8DD1x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y5E[] = {
  NSPAIR(_ZN3ccc8DD1x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y5E[];
extern void _ZN3ccc8DD1x13y53abcEv();
extern void _ZN3ccc8DD1x13y53pqrEv();
extern void _ZN3ccc8DD1x13y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y53efgEv,_ZTv0_n12_N3ccc8DD1x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y53efgEv,_ZThn4_N3ccc8DD1x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y53efgEv,_ZTv0_n12_N3ccc8DD1x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y5E[] = {
  {&(_ZTVN3ccc8DD1x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y5E[];
static VTBL_ENTRY alt_thunk_names824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y53efgEv,_ZTv0_n12_N3ccc8DD1x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y53efgEv,_ZThn4_N3ccc8DD1x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y5E = {  "_ZN3ccc8DD1x13y5E", // class name
  bases__ZN3ccc8DD1x13y5E, 2,
  &(vtc__ZN3ccc8DD1x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y5E),3, //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  CC1x13y6  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y63efgEv
  ~CC1x13y6(); // tgen
  CC1x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y6E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y63abcEv");}
void  ccc::CC1x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y63efgEv");}
ccc::CC1x13y6 ::~CC1x13y6(){ note_dtor("_ZN3ccc8CC1x13y6E", this);} // tgen
ccc::CC1x13y6 ::CC1x13y6(){ note_ctor("_ZN3ccc8CC1x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y6E, buf);
    ::ccc::CC1x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y6E);
    dp->::ccc::CC1x13y6::~CC1x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y6E(Test__ZN3ccc8CC1x13y6E, "_ZN3ccc8CC1x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y6C1Ev();
extern void _ZN3ccc8CC1x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y6E[] = {
  NSPAIR(_ZN3ccc8CC1x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y6E[];
extern void _ZN3ccc8CC1x13y63efgEv();
extern void _ZN3ccc8CC1x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y63abcEv,_ZTv0_n12_N3ccc8CC1x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y63abcEv,_ZThn4_N3ccc8CC1x13y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y63efgEv,_ZTv0_n20_N3ccc8CC1x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y63efgEv,_ZThn4_N3ccc8CC1x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y63abcEv,_ZTv0_n12_N3ccc8CC1x13y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y63efgEv,_ZTv0_n20_N3ccc8CC1x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y6E[] = {
  {&(_ZTVN3ccc8CC1x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y6E[];
static VTBL_ENTRY alt_thunk_names825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y63efgEv,_ZTv0_n20_N3ccc8CC1x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y63efgEv,_ZThn4_N3ccc8CC1x13y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y63abcEv,_ZTv0_n12_N3ccc8CC1x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y63abcEv,_ZThn4_N3ccc8CC1x13y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y6E = {  "_ZN3ccc8CC1x13y6E", // class name
  bases__ZN3ccc8CC1x13y6E, 2,
  &(vtc__ZN3ccc8CC1x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y6E),2, //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  DD1x13y6  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD1x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x13y63efgEv
  ~DD1x13y6(); // tgen
  DD1x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y63abcEv");}
void  ccc::DD1x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y63efgEv");}
ccc::DD1x13y6 ::~DD1x13y6(){ note_dtor("_ZN3ccc8DD1x13y6E", this);} // tgen
ccc::DD1x13y6 ::DD1x13y6(){ note_ctor("_ZN3ccc8DD1x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y6E, buf);
    ::ccc::DD1x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y6E);
    dp->::ccc::DD1x13y6::~DD1x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y6E(Test__ZN3ccc8DD1x13y6E, "_ZN3ccc8DD1x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y6C1Ev();
extern void _ZN3ccc8DD1x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y6E[] = {
  NSPAIR(_ZN3ccc8DD1x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y6E[];
extern void _ZN3ccc8DD1x13y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x13y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y63efgEv,_ZTv0_n12_N3ccc8DD1x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y63efgEv,_ZThn4_N3ccc8DD1x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y63efgEv,_ZTv0_n12_N3ccc8DD1x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y6E[] = {
  {&(_ZTVN3ccc8DD1x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y6E[];
static VTBL_ENTRY alt_thunk_names826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y63efgEv,_ZTv0_n12_N3ccc8DD1x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y63efgEv,_ZThn4_N3ccc8DD1x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y6E = {  "_ZN3ccc8DD1x13y6E", // class name
  bases__ZN3ccc8DD1x13y6E, 2,
  &(vtc__ZN3ccc8DD1x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y6E),3, //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  CC1x13y7  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y73pqrEv
  ~CC1x13y7(); // tgen
  CC1x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y7E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y73abcEv");}
void  ccc::CC1x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y73pqrEv");}
ccc::CC1x13y7 ::~CC1x13y7(){ note_dtor("_ZN3ccc8CC1x13y7E", this);} // tgen
ccc::CC1x13y7 ::CC1x13y7(){ note_ctor("_ZN3ccc8CC1x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y7E, buf);
    ::ccc::CC1x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y7E);
    dp->::ccc::CC1x13y7::~CC1x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y7E(Test__ZN3ccc8CC1x13y7E, "_ZN3ccc8CC1x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y7C1Ev();
extern void _ZN3ccc8CC1x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y7E[] = {
  NSPAIR(_ZN3ccc8CC1x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC1x13y73abcEv();
extern void _ZN3ccc8CC1x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y73abcEv,_ZTv0_n12_N3ccc8CC1x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y73abcEv,_ZThn4_N3ccc8CC1x13y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y73pqrEv,_ZTv0_n16_N3ccc8CC1x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y73pqrEv,_ZThn4_N3ccc8CC1x13y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y73abcEv,_ZTv0_n12_N3ccc8CC1x13y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y73pqrEv,_ZTv0_n16_N3ccc8CC1x13y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y7E[] = {
  {&(_ZTVN3ccc8CC1x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y7E[];
static VTBL_ENTRY alt_thunk_names827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y73pqrEv,_ZTv0_n16_N3ccc8CC1x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y73pqrEv,_ZThn4_N3ccc8CC1x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y73abcEv,_ZTv0_n12_N3ccc8CC1x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y73abcEv,_ZThn4_N3ccc8CC1x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y7E = {  "_ZN3ccc8CC1x13y7E", // class name
  bases__ZN3ccc8CC1x13y7E, 2,
  &(vtc__ZN3ccc8CC1x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y7E),2, //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  DD1x13y7  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD1x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y73pqrEv
  ~DD1x13y7(); // tgen
  DD1x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y73abcEv");}
void  ccc::DD1x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y73pqrEv");}
ccc::DD1x13y7 ::~DD1x13y7(){ note_dtor("_ZN3ccc8DD1x13y7E", this);} // tgen
ccc::DD1x13y7 ::DD1x13y7(){ note_ctor("_ZN3ccc8DD1x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y7E, buf);
    ::ccc::DD1x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y7E);
    dp->::ccc::DD1x13y7::~DD1x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y7E(Test__ZN3ccc8DD1x13y7E, "_ZN3ccc8DD1x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y7C1Ev();
extern void _ZN3ccc8DD1x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y7E[] = {
  NSPAIR(_ZN3ccc8DD1x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y7E[];
extern void _ZN3ccc8DD1x13y73abcEv();
extern void _ZN3ccc8DD1x13y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y7E[] = {
  {&(_ZTVN3ccc8DD1x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y7E[];
Class_Descriptor cd__ZN3ccc8DD1x13y7E = {  "_ZN3ccc8DD1x13y7E", // class name
  bases__ZN3ccc8DD1x13y7E, 2,
  &(vtc__ZN3ccc8DD1x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y8  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y83abcEv
  ~CC1x13y8(); // tgen
  CC1x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y8E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y83efgEv");}
void  ccc::CC1x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y83abcEv");}
ccc::CC1x13y8 ::~CC1x13y8(){ note_dtor("_ZN3ccc8CC1x13y8E", this);} // tgen
ccc::CC1x13y8 ::CC1x13y8(){ note_ctor("_ZN3ccc8CC1x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y8E, buf);
    ::ccc::CC1x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y8E);
    dp->::ccc::CC1x13y8::~CC1x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y8E(Test__ZN3ccc8CC1x13y8E, "_ZN3ccc8CC1x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y8C1Ev();
extern void _ZN3ccc8CC1x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y8E[] = {
  NSPAIR(_ZN3ccc8CC1x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y8E[];
extern void _ZN3ccc8CC1x13y83efgEv();
extern void _ZN3ccc8CC1x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x13y83abcEv,_ZTv0_n12_N3ccc8CC1x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y83abcEv,_ZThn4_N3ccc8CC1x13y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y83efgEv,_ZTv0_n20_N3ccc8CC1x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y83efgEv,_ZThn4_N3ccc8CC1x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x13y83abcEv,_ZTv0_n12_N3ccc8CC1x13y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y83efgEv,_ZTv0_n20_N3ccc8CC1x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y8E[] = {
  {&(_ZTVN3ccc8CC1x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y8E[];
static VTBL_ENTRY alt_thunk_names828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y83efgEv,_ZTv0_n20_N3ccc8CC1x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y83efgEv,_ZThn4_N3ccc8CC1x13y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x13y83abcEv,_ZTv0_n12_N3ccc8CC1x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y83abcEv,_ZThn4_N3ccc8CC1x13y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y8E = {  "_ZN3ccc8CC1x13y8E", // class name
  bases__ZN3ccc8CC1x13y8E, 2,
  &(vtc__ZN3ccc8CC1x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y8E),2, //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  DD1x13y8  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD1x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x13y83abcEv
  ~DD1x13y8(); // tgen
  DD1x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y83efgEv");}
void  ccc::DD1x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x13y83abcEv");}
ccc::DD1x13y8 ::~DD1x13y8(){ note_dtor("_ZN3ccc8DD1x13y8E", this);} // tgen
ccc::DD1x13y8 ::DD1x13y8(){ note_ctor("_ZN3ccc8DD1x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y8E, buf);
    ::ccc::DD1x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y8E);
    dp->::ccc::DD1x13y8::~DD1x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y8E(Test__ZN3ccc8DD1x13y8E, "_ZN3ccc8DD1x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y8C1Ev();
extern void _ZN3ccc8DD1x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y8E[] = {
  NSPAIR(_ZN3ccc8DD1x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y8E[];
extern void _ZN3ccc8DD1x13y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x13y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y83efgEv,_ZTv0_n12_N3ccc8DD1x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y83efgEv,_ZThn4_N3ccc8DD1x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y83efgEv,_ZTv0_n12_N3ccc8DD1x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y8E[] = {
  {&(_ZTVN3ccc8DD1x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y8E[];
static VTBL_ENTRY alt_thunk_names829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y83efgEv,_ZTv0_n12_N3ccc8DD1x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y83efgEv,_ZThn4_N3ccc8DD1x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y8E = {  "_ZN3ccc8DD1x13y8E", // class name
  bases__ZN3ccc8DD1x13y8E, 2,
  &(vtc__ZN3ccc8DD1x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y8E),3, //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  CC1x13y9  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y93pqrEv
  ~CC1x13y9(); // tgen
  CC1x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y9E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y93efgEv");}
void  ccc::CC1x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y93pqrEv");}
ccc::CC1x13y9 ::~CC1x13y9(){ note_dtor("_ZN3ccc8CC1x13y9E", this);} // tgen
ccc::CC1x13y9 ::CC1x13y9(){ note_ctor("_ZN3ccc8CC1x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y9E, buf);
    ::ccc::CC1x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC1x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y9E);
    dp->::ccc::CC1x13y9::~CC1x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y9E(Test__ZN3ccc8CC1x13y9E, "_ZN3ccc8CC1x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y9C1Ev();
extern void _ZN3ccc8CC1x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y9E[] = {
  NSPAIR(_ZN3ccc8CC1x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y9E[];
extern void _ZN3ccc8CC1x13y93efgEv();
extern void _ZN3ccc8CC1x13y93pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x13y93pqrEv,_ZTv0_n16_N3ccc8CC1x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y93pqrEv,_ZThn4_N3ccc8CC1x13y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x13y93efgEv,_ZTv0_n20_N3ccc8CC1x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y93efgEv,_ZThn4_N3ccc8CC1x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x13y93pqrEv,_ZTv0_n16_N3ccc8CC1x13y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x13y93efgEv,_ZTv0_n20_N3ccc8CC1x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x13y9E[] = {
  {&(_ZTVN3ccc8CC1x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x13y9E[];
static VTBL_ENTRY alt_thunk_names830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x13y93efgEv,_ZTv0_n20_N3ccc8CC1x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y93efgEv,_ZThn4_N3ccc8CC1x13y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x13y93pqrEv,_ZTv0_n16_N3ccc8CC1x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x13y93pqrEv,_ZThn4_N3ccc8CC1x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x13y9E = {  "_ZN3ccc8CC1x13y9E", // class name
  bases__ZN3ccc8CC1x13y9E, 2,
  &(vtc__ZN3ccc8CC1x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x13y9E),2, //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  DD1x13y9  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD1x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x13y93pqrEv
  ~DD1x13y9(); // tgen
  DD1x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x13y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x13y93efgEv");}
void  ccc::DD1x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x13y93pqrEv");}
ccc::DD1x13y9 ::~DD1x13y9(){ note_dtor("_ZN3ccc8DD1x13y9E", this);} // tgen
ccc::DD1x13y9 ::DD1x13y9(){ note_ctor("_ZN3ccc8DD1x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x13y9E, buf);
    ::ccc::DD1x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x13y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD1x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x13y9E);
    dp->::ccc::DD1x13y9::~DD1x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x13y9E(Test__ZN3ccc8DD1x13y9E, "_ZN3ccc8DD1x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x13y9C1Ev();
extern void _ZN3ccc8DD1x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x13y9E[] = {
  NSPAIR(_ZN3ccc8DD1x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD1x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x13y93pqrEv();
extern void _ZN3ccc8DD1x13y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x13y93efgEv,_ZTv0_n12_N3ccc8DD1x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x13y93efgEv,_ZThn4_N3ccc8DD1x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x13y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x13y93efgEv,_ZTv0_n12_N3ccc8DD1x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x13y9E[] = {
  {&(_ZTVN3ccc8DD1x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x13y9E[];
static VTBL_ENTRY alt_thunk_names831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x13y93efgEv,_ZTv0_n12_N3ccc8DD1x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x13y93efgEv,_ZThn4_N3ccc8DD1x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x13y9E = {  "_ZN3ccc8DD1x13y9E", // class name
  bases__ZN3ccc8DD1x13y9E, 2,
  &(vtc__ZN3ccc8DD1x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x13y9E),3, //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  CC1x13y10  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x13y103abcEv
  ~CC1x13y10(); // tgen
  CC1x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y10E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y103pqrEv");}
void  ccc::CC1x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x13y103abcEv");}
ccc::CC1x13y10 ::~CC1x13y10(){ note_dtor("_ZN3ccc9CC1x13y10E", this);} // tgen
ccc::CC1x13y10 ::CC1x13y10(){ note_ctor("_ZN3ccc9CC1x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y10E, buf);
    ::ccc::CC1x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y10E);
    dp->::ccc::CC1x13y10::~CC1x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y10E(Test__ZN3ccc9CC1x13y10E, "_ZN3ccc9CC1x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y10C1Ev();
extern void _ZN3ccc9CC1x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y10E[] = {
  NSPAIR(_ZN3ccc9CC1x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC1x13y103pqrEv();
extern void _ZN3ccc9CC1x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x13y103abcEv,_ZTv0_n12_N3ccc9CC1x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y103abcEv,_ZThn4_N3ccc9CC1x13y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x13y103pqrEv,_ZTv0_n16_N3ccc9CC1x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y103pqrEv,_ZThn4_N3ccc9CC1x13y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x13y103abcEv,_ZTv0_n12_N3ccc9CC1x13y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x13y103pqrEv,_ZTv0_n16_N3ccc9CC1x13y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y10E[] = {
  {&(_ZTVN3ccc9CC1x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC1x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y10E[];
static VTBL_ENTRY alt_thunk_names832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x13y103pqrEv,_ZTv0_n16_N3ccc9CC1x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y103pqrEv,_ZThn4_N3ccc9CC1x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x13y103abcEv,_ZTv0_n12_N3ccc9CC1x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y103abcEv,_ZThn4_N3ccc9CC1x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x13y10E = {  "_ZN3ccc9CC1x13y10E", // class name
  bases__ZN3ccc9CC1x13y10E, 2,
  &(vtc__ZN3ccc9CC1x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y10E),2, //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  DD1x13y10  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD1x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x13y103abcEv
  ~DD1x13y10(); // tgen
  DD1x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x13y103pqrEv");}
void  ccc::DD1x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x13y103abcEv");}
ccc::DD1x13y10 ::~DD1x13y10(){ note_dtor("_ZN3ccc9DD1x13y10E", this);} // tgen
ccc::DD1x13y10 ::DD1x13y10(){ note_ctor("_ZN3ccc9DD1x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y10E, buf);
    ::ccc::DD1x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y10E);
    dp->::ccc::DD1x13y10::~DD1x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y10E(Test__ZN3ccc9DD1x13y10E, "_ZN3ccc9DD1x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y10C1Ev();
extern void _ZN3ccc9DD1x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y10E[] = {
  NSPAIR(_ZN3ccc9DD1x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y10E[];
extern void _ZN3ccc9DD1x13y103abcEv();
extern void _ZN3ccc9DD1x13y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y10E[] = {
  {&(_ZTVN3ccc9DD1x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y10E[];
Class_Descriptor cd__ZN3ccc9DD1x13y10E = {  "_ZN3ccc9DD1x13y10E", // class name
  bases__ZN3ccc9DD1x13y10E, 2,
  &(vtc__ZN3ccc9DD1x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y11  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x13y113efgEv
  ~CC1x13y11(); // tgen
  CC1x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y11E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y113pqrEv");}
void  ccc::CC1x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x13y113efgEv");}
ccc::CC1x13y11 ::~CC1x13y11(){ note_dtor("_ZN3ccc9CC1x13y11E", this);} // tgen
ccc::CC1x13y11 ::CC1x13y11(){ note_ctor("_ZN3ccc9CC1x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y11E, buf);
    ::ccc::CC1x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y11E);
    dp->::ccc::CC1x13y11::~CC1x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y11E(Test__ZN3ccc9CC1x13y11E, "_ZN3ccc9CC1x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y11C1Ev();
extern void _ZN3ccc9CC1x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y11E[] = {
  NSPAIR(_ZN3ccc9CC1x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y11E[];
extern void _ZN3ccc9CC1x13y113efgEv();
extern void _ZN3ccc9CC1x13y113pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x13y113pqrEv,_ZTv0_n16_N3ccc9CC1x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y113pqrEv,_ZThn4_N3ccc9CC1x13y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x13y113efgEv,_ZTv0_n20_N3ccc9CC1x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y113efgEv,_ZThn4_N3ccc9CC1x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x13y113pqrEv,_ZTv0_n16_N3ccc9CC1x13y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x13y113efgEv,_ZTv0_n20_N3ccc9CC1x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y11E[] = {
  {&(_ZTVN3ccc9CC1x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y11E[];
static VTBL_ENTRY alt_thunk_names833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x13y113efgEv,_ZTv0_n20_N3ccc9CC1x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y113efgEv,_ZThn4_N3ccc9CC1x13y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x13y113pqrEv,_ZTv0_n16_N3ccc9CC1x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y113pqrEv,_ZThn4_N3ccc9CC1x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x13y11E = {  "_ZN3ccc9CC1x13y11E", // class name
  bases__ZN3ccc9CC1x13y11E, 2,
  &(vtc__ZN3ccc9CC1x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y11E),2, //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  DD1x13y11  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD1x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x13y113efgEv
  ~DD1x13y11(); // tgen
  DD1x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x13y113pqrEv");}
void  ccc::DD1x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x13y113efgEv");}
ccc::DD1x13y11 ::~DD1x13y11(){ note_dtor("_ZN3ccc9DD1x13y11E", this);} // tgen
ccc::DD1x13y11 ::DD1x13y11(){ note_ctor("_ZN3ccc9DD1x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y11E, buf);
    ::ccc::DD1x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y11E);
    dp->::ccc::DD1x13y11::~DD1x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y11E(Test__ZN3ccc9DD1x13y11E, "_ZN3ccc9DD1x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y11C1Ev();
extern void _ZN3ccc9DD1x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y11E[] = {
  NSPAIR(_ZN3ccc9DD1x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x13y113pqrEv();
extern void _ZN3ccc9DD1x13y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x13y113efgEv,_ZTv0_n12_N3ccc9DD1x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x13y113efgEv,_ZThn4_N3ccc9DD1x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x13y113efgEv,_ZTv0_n12_N3ccc9DD1x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y11E[] = {
  {&(_ZTVN3ccc9DD1x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y11E[];
static VTBL_ENTRY alt_thunk_names834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x13y113efgEv,_ZTv0_n12_N3ccc9DD1x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x13y113efgEv,_ZThn4_N3ccc9DD1x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x13y11E = {  "_ZN3ccc9DD1x13y11E", // class name
  bases__ZN3ccc9DD1x13y11E, 2,
  &(vtc__ZN3ccc9DD1x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y11E),3, //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  CC1x13y12  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC1x13y123abcEv
  ~CC1x13y12(); // tgen
  CC1x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x13y123abcEv");}
ccc::CC1x13y12 ::~CC1x13y12(){ note_dtor("_ZN3ccc9CC1x13y12E", this);} // tgen
ccc::CC1x13y12 ::CC1x13y12(){ note_ctor("_ZN3ccc9CC1x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y12E, buf);
    ::ccc::CC1x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y12E);
    dp->::ccc::CC1x13y12::~CC1x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y12E(Test__ZN3ccc9CC1x13y12E, "_ZN3ccc9CC1x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y12C1Ev();
extern void _ZN3ccc9CC1x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y12E[] = {
  NSPAIR(_ZN3ccc9CC1x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC1x13y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x13y123abcEv,_ZTv0_n12_N3ccc9CC1x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y123abcEv,_ZThn4_N3ccc9CC1x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x13y123abcEv,_ZTv0_n12_N3ccc9CC1x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y12E[] = {
  {&(_ZTVN3ccc9CC1x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y12E[];
static VTBL_ENTRY alt_thunk_names835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x13y123abcEv,_ZTv0_n12_N3ccc9CC1x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y123abcEv,_ZThn4_N3ccc9CC1x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x13y12E = {  "_ZN3ccc9CC1x13y12E", // class name
  bases__ZN3ccc9CC1x13y12E, 2,
  &(vtc__ZN3ccc9CC1x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y12E),2, //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  DD1x13y12  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD1x13y123abcEv
  ~DD1x13y12(); // tgen
  DD1x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x13y123abcEv");}
ccc::DD1x13y12 ::~DD1x13y12(){ note_dtor("_ZN3ccc9DD1x13y12E", this);} // tgen
ccc::DD1x13y12 ::DD1x13y12(){ note_ctor("_ZN3ccc9DD1x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y12E, buf);
    ::ccc::DD1x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y12E);
    dp->::ccc::DD1x13y12::~DD1x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y12E(Test__ZN3ccc9DD1x13y12E, "_ZN3ccc9DD1x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y12C1Ev();
extern void _ZN3ccc9DD1x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y12E[] = {
  NSPAIR(_ZN3ccc9DD1x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y12E[];
extern void _ZN3ccc9DD1x13y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y12E[] = {
  {&(_ZTVN3ccc9DD1x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y12E[];
Class_Descriptor cd__ZN3ccc9DD1x13y12E = {  "_ZN3ccc9DD1x13y12E", // class name
  bases__ZN3ccc9DD1x13y12E, 2,
  &(vtc__ZN3ccc9DD1x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y13  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC1x13y133efgEv
  ~CC1x13y13(); // tgen
  CC1x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x13y133efgEv");}
ccc::CC1x13y13 ::~CC1x13y13(){ note_dtor("_ZN3ccc9CC1x13y13E", this);} // tgen
ccc::CC1x13y13 ::CC1x13y13(){ note_ctor("_ZN3ccc9CC1x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y13E, buf);
    ::ccc::CC1x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y13E);
    dp->::ccc::CC1x13y13::~CC1x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y13E(Test__ZN3ccc9CC1x13y13E, "_ZN3ccc9CC1x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y13C1Ev();
extern void _ZN3ccc9CC1x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y13E[] = {
  NSPAIR(_ZN3ccc9CC1x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y13E[];
extern void _ZN3ccc9CC1x13y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x13y133efgEv,_ZTv0_n20_N3ccc9CC1x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y133efgEv,_ZThn4_N3ccc9CC1x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x13y133efgEv,_ZTv0_n20_N3ccc9CC1x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y13E[] = {
  {&(_ZTVN3ccc9CC1x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y13E[];
static VTBL_ENTRY alt_thunk_names836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x13y133efgEv,_ZTv0_n20_N3ccc9CC1x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y133efgEv,_ZThn4_N3ccc9CC1x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x13y13E = {  "_ZN3ccc9CC1x13y13E", // class name
  bases__ZN3ccc9CC1x13y13E, 2,
  &(vtc__ZN3ccc9CC1x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y13E),2, //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  DD1x13y13  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD1x13y133efgEv
  ~DD1x13y13(); // tgen
  DD1x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD1x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x13y133efgEv");}
ccc::DD1x13y13 ::~DD1x13y13(){ note_dtor("_ZN3ccc9DD1x13y13E", this);} // tgen
ccc::DD1x13y13 ::DD1x13y13(){ note_ctor("_ZN3ccc9DD1x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y13E, buf);
    ::ccc::DD1x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y13E);
    dp->::ccc::DD1x13y13::~DD1x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y13E(Test__ZN3ccc9DD1x13y13E, "_ZN3ccc9DD1x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y13C1Ev();
extern void _ZN3ccc9DD1x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y13E[] = {
  NSPAIR(_ZN3ccc9DD1x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x13y133efgEv,_ZTv0_n12_N3ccc9DD1x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x13y133efgEv,_ZThn4_N3ccc9DD1x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y133efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x13y133efgEv,_ZTv0_n12_N3ccc9DD1x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y13E[] = {
  {&(_ZTVN3ccc9DD1x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y13E[];
static VTBL_ENTRY alt_thunk_names837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x13y133efgEv,_ZTv0_n12_N3ccc9DD1x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x13y133efgEv,_ZThn4_N3ccc9DD1x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x13y13E = {  "_ZN3ccc9DD1x13y13E", // class name
  bases__ZN3ccc9DD1x13y13E, 2,
  &(vtc__ZN3ccc9DD1x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y13E),3, //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  CC1x13y14  : virtual ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y143pqrEv
  ~CC1x13y14(); // tgen
  CC1x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y143pqrEv");}
ccc::CC1x13y14 ::~CC1x13y14(){ note_dtor("_ZN3ccc9CC1x13y14E", this);} // tgen
ccc::CC1x13y14 ::CC1x13y14(){ note_ctor("_ZN3ccc9CC1x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y14E, buf);
    ::ccc::CC1x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y14E);
    dp->::ccc::CC1x13y14::~CC1x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y14E(Test__ZN3ccc9CC1x13y14E, "_ZN3ccc9CC1x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y14C1Ev();
extern void _ZN3ccc9CC1x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y14E[] = {
  NSPAIR(_ZN3ccc9CC1x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC1x13y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x13y143pqrEv,_ZTv0_n16_N3ccc9CC1x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y143pqrEv,_ZThn4_N3ccc9CC1x13y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x13y143pqrEv,_ZTv0_n16_N3ccc9CC1x13y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y14E[] = {
  {&(_ZTVN3ccc9CC1x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y14E[];
static VTBL_ENTRY alt_thunk_names838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x13y143pqrEv,_ZTv0_n16_N3ccc9CC1x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x13y143pqrEv,_ZThn4_N3ccc9CC1x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x13y14E = {  "_ZN3ccc9CC1x13y14E", // class name
  bases__ZN3ccc9CC1x13y14E, 2,
  &(vtc__ZN3ccc9CC1x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y14E),2, //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  DD1x13y14  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD1x13y143pqrEv
  ~DD1x13y14(); // tgen
  DD1x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x13y143pqrEv");}
ccc::DD1x13y14 ::~DD1x13y14(){ note_dtor("_ZN3ccc9DD1x13y14E", this);} // tgen
ccc::DD1x13y14 ::DD1x13y14(){ note_ctor("_ZN3ccc9DD1x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y14E, buf);
    ::ccc::DD1x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y14E);
    dp->::ccc::DD1x13y14::~DD1x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y14E(Test__ZN3ccc9DD1x13y14E, "_ZN3ccc9DD1x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y14C1Ev();
extern void _ZN3ccc9DD1x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y14E[] = {
  NSPAIR(_ZN3ccc9DD1x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x13y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y14E[] = {
  {&(_ZTVN3ccc9DD1x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y14E[];
Class_Descriptor cd__ZN3ccc9DD1x13y14E = {  "_ZN3ccc9DD1x13y14E", // class name
  bases__ZN3ccc9DD1x13y14E, 2,
  &(vtc__ZN3ccc9DD1x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y15  : virtual ::ccc::AA1 , ::ccc::BB13 {
  ~CC1x13y15(); // tgen
  CC1x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x13y15 ::~CC1x13y15(){ note_dtor("_ZN3ccc9CC1x13y15E", this);} // tgen
ccc::CC1x13y15 ::CC1x13y15(){ note_ctor("_ZN3ccc9CC1x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y15E, buf);
    ::ccc::CC1x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC1x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y15E);
    dp->::ccc::CC1x13y15::~CC1x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y15E(Test__ZN3ccc9CC1x13y15E, "_ZN3ccc9CC1x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y15C1Ev();
extern void _ZN3ccc9CC1x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y15E[] = {
  NSPAIR(_ZN3ccc9CC1x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x13y15E[] = {
  {&(_ZTVN3ccc9CC1x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x13y15E[];
Class_Descriptor cd__ZN3ccc9CC1x13y15E = {  "_ZN3ccc9CC1x13y15E", // class name
  bases__ZN3ccc9CC1x13y15E, 2,
  &(vtc__ZN3ccc9CC1x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x13y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x13y15  : virtual ::ccc::AA1 , virtual ::ccc::BB13 {
  ~DD1x13y15(); // tgen
  DD1x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD1x13y15 ::~DD1x13y15(){ note_dtor("_ZN3ccc9DD1x13y15E", this);} // tgen
ccc::DD1x13y15 ::DD1x13y15(){ note_ctor("_ZN3ccc9DD1x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x13y15E, buf);
    ::ccc::DD1x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x13y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD1x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x13y15E);
    dp->::ccc::DD1x13y15::~DD1x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x13y15E(Test__ZN3ccc9DD1x13y15E, "_ZN3ccc9DD1x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x13y15C1Ev();
extern void _ZN3ccc9DD1x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x13y15E[] = {
  NSPAIR(_ZN3ccc9DD1x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD1x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x13y15E[] = {
  {&(_ZTVN3ccc9DD1x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x13y15E[];
Class_Descriptor cd__ZN3ccc9DD1x13y15E = {  "_ZN3ccc9DD1x13y15E", // class name
  bases__ZN3ccc9DD1x13y15E, 2,
  &(vtc__ZN3ccc9DD1x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x13y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y0  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y03pqrEv
  ~CC1x14y0(); // tgen
  CC1x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y0E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y03abcEv");}
void  ccc::CC1x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y03efgEv");}
void  ccc::CC1x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y03pqrEv");}
ccc::CC1x14y0 ::~CC1x14y0(){ note_dtor("_ZN3ccc8CC1x14y0E", this);} // tgen
ccc::CC1x14y0 ::CC1x14y0(){ note_ctor("_ZN3ccc8CC1x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y0E, buf);
    ::ccc::CC1x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y0E);
    dp->::ccc::CC1x14y0::~CC1x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y0E(Test__ZN3ccc8CC1x14y0E, "_ZN3ccc8CC1x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y0C1Ev();
extern void _ZN3ccc8CC1x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y0E[] = {
  NSPAIR(_ZN3ccc8CC1x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y0E[];
extern void _ZN3ccc8CC1x14y03pqrEv();
extern void _ZN3ccc8CC1x14y03abcEv();
extern void _ZN3ccc8CC1x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y03abcEv,_ZTv0_n12_N3ccc8CC1x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y03abcEv,_ZThn4_N3ccc8CC1x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y03pqrEv,_ZTv0_n16_N3ccc8CC1x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y03pqrEv,_ZThn4_N3ccc8CC1x14y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y03efgEv,_ZTv0_n20_N3ccc8CC1x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y03efgEv,_ZThn4_N3ccc8CC1x14y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y03abcEv,_ZTv0_n12_N3ccc8CC1x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y03pqrEv,_ZTv0_n16_N3ccc8CC1x14y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y03efgEv,_ZTv0_n20_N3ccc8CC1x14y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y0E[] = {
  {&(_ZTVN3ccc8CC1x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y0E[];
static VTBL_ENTRY alt_thunk_names839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y03efgEv,_ZTv0_n20_N3ccc8CC1x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y03efgEv,_ZThn4_N3ccc8CC1x14y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y03pqrEv,_ZTv0_n16_N3ccc8CC1x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y03pqrEv,_ZThn4_N3ccc8CC1x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y03abcEv,_ZTv0_n12_N3ccc8CC1x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y03abcEv,_ZThn4_N3ccc8CC1x14y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y0E = {  "_ZN3ccc8CC1x14y0E", // class name
  bases__ZN3ccc8CC1x14y0E, 2,
  &(vtc__ZN3ccc8CC1x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y0E),2, //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  DD1x14y0  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD1x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y03pqrEv
  ~DD1x14y0(); // tgen
  DD1x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y0E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y03abcEv");}
void  ccc::DD1x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y03efgEv");}
void  ccc::DD1x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y03pqrEv");}
ccc::DD1x14y0 ::~DD1x14y0(){ note_dtor("_ZN3ccc8DD1x14y0E", this);} // tgen
ccc::DD1x14y0 ::DD1x14y0(){ note_ctor("_ZN3ccc8DD1x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y0E, buf);
    ::ccc::DD1x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y0E);
    dp->::ccc::DD1x14y0::~DD1x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y0E(Test__ZN3ccc8DD1x14y0E, "_ZN3ccc8DD1x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y0C1Ev();
extern void _ZN3ccc8DD1x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y0E[] = {
  NSPAIR(_ZN3ccc8DD1x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y0E[];
extern void _ZN3ccc8DD1x14y03abcEv();
extern void _ZN3ccc8DD1x14y03pqrEv();
extern void _ZN3ccc8DD1x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y03pqrEv,_ZTv0_n12_N3ccc8DD1x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y03pqrEv,_ZThn4_N3ccc8DD1x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y03pqrEv,_ZTv0_n12_N3ccc8DD1x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y0E[] = {
  {&(_ZTVN3ccc8DD1x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y0E[];
static VTBL_ENTRY alt_thunk_names840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y03pqrEv,_ZTv0_n12_N3ccc8DD1x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y03pqrEv,_ZThn4_N3ccc8DD1x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y0E = {  "_ZN3ccc8DD1x14y0E", // class name
  bases__ZN3ccc8DD1x14y0E, 2,
  &(vtc__ZN3ccc8DD1x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y0E),3, //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  CC1x14y1  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x14y13efgEv
  ~CC1x14y1(); // tgen
  CC1x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y1E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y13abcEv");}
void  ccc::CC1x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y13pqrEv");}
void  ccc::CC1x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y13efgEv");}
ccc::CC1x14y1 ::~CC1x14y1(){ note_dtor("_ZN3ccc8CC1x14y1E", this);} // tgen
ccc::CC1x14y1 ::CC1x14y1(){ note_ctor("_ZN3ccc8CC1x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y1E, buf);
    ::ccc::CC1x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y1E);
    dp->::ccc::CC1x14y1::~CC1x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y1E(Test__ZN3ccc8CC1x14y1E, "_ZN3ccc8CC1x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y1C1Ev();
extern void _ZN3ccc8CC1x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y1E[] = {
  NSPAIR(_ZN3ccc8CC1x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y1E[];
extern void _ZN3ccc8CC1x14y13pqrEv();
extern void _ZN3ccc8CC1x14y13abcEv();
extern void _ZN3ccc8CC1x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y13abcEv,_ZTv0_n12_N3ccc8CC1x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y13abcEv,_ZThn4_N3ccc8CC1x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y13pqrEv,_ZTv0_n16_N3ccc8CC1x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y13pqrEv,_ZThn4_N3ccc8CC1x14y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y13efgEv,_ZTv0_n20_N3ccc8CC1x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y13efgEv,_ZThn4_N3ccc8CC1x14y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y13abcEv,_ZTv0_n12_N3ccc8CC1x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y13pqrEv,_ZTv0_n16_N3ccc8CC1x14y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y13efgEv,_ZTv0_n20_N3ccc8CC1x14y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y1E[] = {
  {&(_ZTVN3ccc8CC1x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y1E[];
static VTBL_ENTRY alt_thunk_names841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y13efgEv,_ZTv0_n20_N3ccc8CC1x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y13efgEv,_ZThn4_N3ccc8CC1x14y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y13pqrEv,_ZTv0_n16_N3ccc8CC1x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y13pqrEv,_ZThn4_N3ccc8CC1x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y13abcEv,_ZTv0_n12_N3ccc8CC1x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y13abcEv,_ZThn4_N3ccc8CC1x14y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y1E = {  "_ZN3ccc8CC1x14y1E", // class name
  bases__ZN3ccc8CC1x14y1E, 2,
  &(vtc__ZN3ccc8CC1x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y1E),2, //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  DD1x14y1  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD1x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x14y13efgEv
  ~DD1x14y1(); // tgen
  DD1x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y1E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y13abcEv");}
void  ccc::DD1x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y13pqrEv");}
void  ccc::DD1x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y13efgEv");}
ccc::DD1x14y1 ::~DD1x14y1(){ note_dtor("_ZN3ccc8DD1x14y1E", this);} // tgen
ccc::DD1x14y1 ::DD1x14y1(){ note_ctor("_ZN3ccc8DD1x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y1E, buf);
    ::ccc::DD1x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y1E);
    dp->::ccc::DD1x14y1::~DD1x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y1E(Test__ZN3ccc8DD1x14y1E, "_ZN3ccc8DD1x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y1C1Ev();
extern void _ZN3ccc8DD1x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y1E[] = {
  NSPAIR(_ZN3ccc8DD1x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y1E[];
extern void _ZN3ccc8DD1x14y13abcEv();
extern void _ZN3ccc8DD1x14y13pqrEv();
extern void _ZN3ccc8DD1x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y13pqrEv,_ZTv0_n12_N3ccc8DD1x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y13pqrEv,_ZThn4_N3ccc8DD1x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y13pqrEv,_ZTv0_n12_N3ccc8DD1x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y1E[] = {
  {&(_ZTVN3ccc8DD1x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y1E[];
static VTBL_ENTRY alt_thunk_names842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y13pqrEv,_ZTv0_n12_N3ccc8DD1x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y13pqrEv,_ZThn4_N3ccc8DD1x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y1E = {  "_ZN3ccc8DD1x14y1E", // class name
  bases__ZN3ccc8DD1x14y1E, 2,
  &(vtc__ZN3ccc8DD1x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y1E),3, //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  CC1x14y2  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y23pqrEv
  ~CC1x14y2(); // tgen
  CC1x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y2E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y23efgEv");}
void  ccc::CC1x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y23abcEv");}
void  ccc::CC1x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y23pqrEv");}
ccc::CC1x14y2 ::~CC1x14y2(){ note_dtor("_ZN3ccc8CC1x14y2E", this);} // tgen
ccc::CC1x14y2 ::CC1x14y2(){ note_ctor("_ZN3ccc8CC1x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y2E, buf);
    ::ccc::CC1x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y2E);
    dp->::ccc::CC1x14y2::~CC1x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y2E(Test__ZN3ccc8CC1x14y2E, "_ZN3ccc8CC1x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y2C1Ev();
extern void _ZN3ccc8CC1x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y2E[] = {
  NSPAIR(_ZN3ccc8CC1x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y2E[];
extern void _ZN3ccc8CC1x14y23pqrEv();
extern void _ZN3ccc8CC1x14y23efgEv();
extern void _ZN3ccc8CC1x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y23abcEv,_ZTv0_n12_N3ccc8CC1x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y23abcEv,_ZThn4_N3ccc8CC1x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y23pqrEv,_ZTv0_n16_N3ccc8CC1x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y23pqrEv,_ZThn4_N3ccc8CC1x14y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y23efgEv,_ZTv0_n20_N3ccc8CC1x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y23efgEv,_ZThn4_N3ccc8CC1x14y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y23abcEv,_ZTv0_n12_N3ccc8CC1x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y23pqrEv,_ZTv0_n16_N3ccc8CC1x14y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y23efgEv,_ZTv0_n20_N3ccc8CC1x14y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y2E[] = {
  {&(_ZTVN3ccc8CC1x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y2E[];
static VTBL_ENTRY alt_thunk_names843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y23efgEv,_ZTv0_n20_N3ccc8CC1x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y23efgEv,_ZThn4_N3ccc8CC1x14y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y23pqrEv,_ZTv0_n16_N3ccc8CC1x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y23pqrEv,_ZThn4_N3ccc8CC1x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y23abcEv,_ZTv0_n12_N3ccc8CC1x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y23abcEv,_ZThn4_N3ccc8CC1x14y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y2E = {  "_ZN3ccc8CC1x14y2E", // class name
  bases__ZN3ccc8CC1x14y2E, 2,
  &(vtc__ZN3ccc8CC1x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y2E),2, //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  DD1x14y2  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD1x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y23pqrEv
  ~DD1x14y2(); // tgen
  DD1x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y2E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y23efgEv");}
void  ccc::DD1x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y23abcEv");}
void  ccc::DD1x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y23pqrEv");}
ccc::DD1x14y2 ::~DD1x14y2(){ note_dtor("_ZN3ccc8DD1x14y2E", this);} // tgen
ccc::DD1x14y2 ::DD1x14y2(){ note_ctor("_ZN3ccc8DD1x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y2E, buf);
    ::ccc::DD1x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y2E);
    dp->::ccc::DD1x14y2::~DD1x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y2E(Test__ZN3ccc8DD1x14y2E, "_ZN3ccc8DD1x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y2C1Ev();
extern void _ZN3ccc8DD1x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y2E[] = {
  NSPAIR(_ZN3ccc8DD1x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y2E[];
extern void _ZN3ccc8DD1x14y23abcEv();
extern void _ZN3ccc8DD1x14y23pqrEv();
extern void _ZN3ccc8DD1x14y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y23pqrEv,_ZTv0_n12_N3ccc8DD1x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y23pqrEv,_ZThn4_N3ccc8DD1x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y23pqrEv,_ZTv0_n12_N3ccc8DD1x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y2E[] = {
  {&(_ZTVN3ccc8DD1x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y2E[];
static VTBL_ENTRY alt_thunk_names844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y23pqrEv,_ZTv0_n12_N3ccc8DD1x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y23pqrEv,_ZThn4_N3ccc8DD1x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y2E = {  "_ZN3ccc8DD1x14y2E", // class name
  bases__ZN3ccc8DD1x14y2E, 2,
  &(vtc__ZN3ccc8DD1x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y2E),3, //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  CC1x14y3  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x14y33abcEv
  ~CC1x14y3(); // tgen
  CC1x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y3E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y33efgEv");}
void  ccc::CC1x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y33pqrEv");}
void  ccc::CC1x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y33abcEv");}
ccc::CC1x14y3 ::~CC1x14y3(){ note_dtor("_ZN3ccc8CC1x14y3E", this);} // tgen
ccc::CC1x14y3 ::CC1x14y3(){ note_ctor("_ZN3ccc8CC1x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y3E, buf);
    ::ccc::CC1x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y3E);
    dp->::ccc::CC1x14y3::~CC1x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y3E(Test__ZN3ccc8CC1x14y3E, "_ZN3ccc8CC1x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y3C1Ev();
extern void _ZN3ccc8CC1x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y3E[] = {
  NSPAIR(_ZN3ccc8CC1x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y3E[];
extern void _ZN3ccc8CC1x14y33pqrEv();
extern void _ZN3ccc8CC1x14y33efgEv();
extern void _ZN3ccc8CC1x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y33abcEv,_ZTv0_n12_N3ccc8CC1x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y33abcEv,_ZThn4_N3ccc8CC1x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y33pqrEv,_ZTv0_n16_N3ccc8CC1x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y33pqrEv,_ZThn4_N3ccc8CC1x14y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y33efgEv,_ZTv0_n20_N3ccc8CC1x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y33efgEv,_ZThn4_N3ccc8CC1x14y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y33abcEv,_ZTv0_n12_N3ccc8CC1x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y33pqrEv,_ZTv0_n16_N3ccc8CC1x14y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y33efgEv,_ZTv0_n20_N3ccc8CC1x14y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y3E[] = {
  {&(_ZTVN3ccc8CC1x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y3E[];
static VTBL_ENTRY alt_thunk_names845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y33efgEv,_ZTv0_n20_N3ccc8CC1x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y33efgEv,_ZThn4_N3ccc8CC1x14y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y33pqrEv,_ZTv0_n16_N3ccc8CC1x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y33pqrEv,_ZThn4_N3ccc8CC1x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y33abcEv,_ZTv0_n12_N3ccc8CC1x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y33abcEv,_ZThn4_N3ccc8CC1x14y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y3E = {  "_ZN3ccc8CC1x14y3E", // class name
  bases__ZN3ccc8CC1x14y3E, 2,
  &(vtc__ZN3ccc8CC1x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y3E),2, //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  DD1x14y3  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD1x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x14y33abcEv
  ~DD1x14y3(); // tgen
  DD1x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y3E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y33efgEv");}
void  ccc::DD1x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y33pqrEv");}
void  ccc::DD1x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y33abcEv");}
ccc::DD1x14y3 ::~DD1x14y3(){ note_dtor("_ZN3ccc8DD1x14y3E", this);} // tgen
ccc::DD1x14y3 ::DD1x14y3(){ note_ctor("_ZN3ccc8DD1x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y3E, buf);
    ::ccc::DD1x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y3E);
    dp->::ccc::DD1x14y3::~DD1x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y3E(Test__ZN3ccc8DD1x14y3E, "_ZN3ccc8DD1x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y3C1Ev();
extern void _ZN3ccc8DD1x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y3E[] = {
  NSPAIR(_ZN3ccc8DD1x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y3E[];
extern void _ZN3ccc8DD1x14y33abcEv();
extern void _ZN3ccc8DD1x14y33pqrEv();
extern void _ZN3ccc8DD1x14y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y33pqrEv,_ZTv0_n12_N3ccc8DD1x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y33pqrEv,_ZThn4_N3ccc8DD1x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y33pqrEv,_ZTv0_n12_N3ccc8DD1x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y3E[] = {
  {&(_ZTVN3ccc8DD1x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y3E[];
static VTBL_ENTRY alt_thunk_names846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y33pqrEv,_ZTv0_n12_N3ccc8DD1x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y33pqrEv,_ZThn4_N3ccc8DD1x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y3E = {  "_ZN3ccc8DD1x14y3E", // class name
  bases__ZN3ccc8DD1x14y3E, 2,
  &(vtc__ZN3ccc8DD1x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y3E),3, //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  CC1x14y4  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC1x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y43efgEv
  ~CC1x14y4(); // tgen
  CC1x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y4E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y43pqrEv");}
void  ccc::CC1x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y43abcEv");}
void  ccc::CC1x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y43efgEv");}
ccc::CC1x14y4 ::~CC1x14y4(){ note_dtor("_ZN3ccc8CC1x14y4E", this);} // tgen
ccc::CC1x14y4 ::CC1x14y4(){ note_ctor("_ZN3ccc8CC1x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y4E, buf);
    ::ccc::CC1x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y4E);
    dp->::ccc::CC1x14y4::~CC1x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y4E(Test__ZN3ccc8CC1x14y4E, "_ZN3ccc8CC1x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y4C1Ev();
extern void _ZN3ccc8CC1x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y4E[] = {
  NSPAIR(_ZN3ccc8CC1x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y4E[];
extern void _ZN3ccc8CC1x14y43pqrEv();
extern void _ZN3ccc8CC1x14y43abcEv();
extern void _ZN3ccc8CC1x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y43abcEv,_ZTv0_n12_N3ccc8CC1x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y43abcEv,_ZThn4_N3ccc8CC1x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y43pqrEv,_ZTv0_n16_N3ccc8CC1x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y43pqrEv,_ZThn4_N3ccc8CC1x14y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y43efgEv,_ZTv0_n20_N3ccc8CC1x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y43efgEv,_ZThn4_N3ccc8CC1x14y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y43abcEv,_ZTv0_n12_N3ccc8CC1x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y43pqrEv,_ZTv0_n16_N3ccc8CC1x14y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y43efgEv,_ZTv0_n20_N3ccc8CC1x14y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y4E[] = {
  {&(_ZTVN3ccc8CC1x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y4E[];
static VTBL_ENTRY alt_thunk_names847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y43efgEv,_ZTv0_n20_N3ccc8CC1x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y43efgEv,_ZThn4_N3ccc8CC1x14y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y43pqrEv,_ZTv0_n16_N3ccc8CC1x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y43pqrEv,_ZThn4_N3ccc8CC1x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y43abcEv,_ZTv0_n12_N3ccc8CC1x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y43abcEv,_ZThn4_N3ccc8CC1x14y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y4E = {  "_ZN3ccc8CC1x14y4E", // class name
  bases__ZN3ccc8CC1x14y4E, 2,
  &(vtc__ZN3ccc8CC1x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y4E),2, //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  DD1x14y4  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD1x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x14y43efgEv
  ~DD1x14y4(); // tgen
  DD1x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y4E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y43pqrEv");}
void  ccc::DD1x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y43abcEv");}
void  ccc::DD1x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y43efgEv");}
ccc::DD1x14y4 ::~DD1x14y4(){ note_dtor("_ZN3ccc8DD1x14y4E", this);} // tgen
ccc::DD1x14y4 ::DD1x14y4(){ note_ctor("_ZN3ccc8DD1x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y4E, buf);
    ::ccc::DD1x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y4E);
    dp->::ccc::DD1x14y4::~DD1x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y4E(Test__ZN3ccc8DD1x14y4E, "_ZN3ccc8DD1x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y4C1Ev();
extern void _ZN3ccc8DD1x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y4E[] = {
  NSPAIR(_ZN3ccc8DD1x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y4E[];
extern void _ZN3ccc8DD1x14y43abcEv();
extern void _ZN3ccc8DD1x14y43pqrEv();
extern void _ZN3ccc8DD1x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y43pqrEv,_ZTv0_n12_N3ccc8DD1x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y43pqrEv,_ZThn4_N3ccc8DD1x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y43pqrEv,_ZTv0_n12_N3ccc8DD1x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y4E[] = {
  {&(_ZTVN3ccc8DD1x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y4E[];
static VTBL_ENTRY alt_thunk_names848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y43pqrEv,_ZTv0_n12_N3ccc8DD1x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y43pqrEv,_ZThn4_N3ccc8DD1x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y4E = {  "_ZN3ccc8DD1x14y4E", // class name
  bases__ZN3ccc8DD1x14y4E, 2,
  &(vtc__ZN3ccc8DD1x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y4E),3, //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  CC1x14y5  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC1x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y53abcEv
  ~CC1x14y5(); // tgen
  CC1x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y5E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y53pqrEv");}
void  ccc::CC1x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y53efgEv");}
void  ccc::CC1x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y53abcEv");}
ccc::CC1x14y5 ::~CC1x14y5(){ note_dtor("_ZN3ccc8CC1x14y5E", this);} // tgen
ccc::CC1x14y5 ::CC1x14y5(){ note_ctor("_ZN3ccc8CC1x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y5E, buf);
    ::ccc::CC1x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y5E);
    dp->::ccc::CC1x14y5::~CC1x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y5E(Test__ZN3ccc8CC1x14y5E, "_ZN3ccc8CC1x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y5C1Ev();
extern void _ZN3ccc8CC1x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y5E[] = {
  NSPAIR(_ZN3ccc8CC1x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y5E[];
extern void _ZN3ccc8CC1x14y53pqrEv();
extern void _ZN3ccc8CC1x14y53efgEv();
extern void _ZN3ccc8CC1x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y53abcEv,_ZTv0_n12_N3ccc8CC1x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y53abcEv,_ZThn4_N3ccc8CC1x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y53pqrEv,_ZTv0_n16_N3ccc8CC1x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y53pqrEv,_ZThn4_N3ccc8CC1x14y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y53efgEv,_ZTv0_n20_N3ccc8CC1x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y53efgEv,_ZThn4_N3ccc8CC1x14y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y53abcEv,_ZTv0_n12_N3ccc8CC1x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y53pqrEv,_ZTv0_n16_N3ccc8CC1x14y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y53efgEv,_ZTv0_n20_N3ccc8CC1x14y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y5E[] = {
  {&(_ZTVN3ccc8CC1x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y5E[];
static VTBL_ENTRY alt_thunk_names849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y53efgEv,_ZTv0_n20_N3ccc8CC1x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y53efgEv,_ZThn4_N3ccc8CC1x14y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y53pqrEv,_ZTv0_n16_N3ccc8CC1x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y53pqrEv,_ZThn4_N3ccc8CC1x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y53abcEv,_ZTv0_n12_N3ccc8CC1x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y53abcEv,_ZThn4_N3ccc8CC1x14y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y5E = {  "_ZN3ccc8CC1x14y5E", // class name
  bases__ZN3ccc8CC1x14y5E, 2,
  &(vtc__ZN3ccc8CC1x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y5E),2, //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  DD1x14y5  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD1x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x14y53abcEv
  ~DD1x14y5(); // tgen
  DD1x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y5E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y53pqrEv");}
void  ccc::DD1x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y53efgEv");}
void  ccc::DD1x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y53abcEv");}
ccc::DD1x14y5 ::~DD1x14y5(){ note_dtor("_ZN3ccc8DD1x14y5E", this);} // tgen
ccc::DD1x14y5 ::DD1x14y5(){ note_ctor("_ZN3ccc8DD1x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y5E, buf);
    ::ccc::DD1x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y5E);
    dp->::ccc::DD1x14y5::~DD1x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y5E(Test__ZN3ccc8DD1x14y5E, "_ZN3ccc8DD1x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y5C1Ev();
extern void _ZN3ccc8DD1x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y5E[] = {
  NSPAIR(_ZN3ccc8DD1x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y5E[];
extern void _ZN3ccc8DD1x14y53abcEv();
extern void _ZN3ccc8DD1x14y53pqrEv();
extern void _ZN3ccc8DD1x14y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y53pqrEv,_ZTv0_n12_N3ccc8DD1x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y53pqrEv,_ZThn4_N3ccc8DD1x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y53pqrEv,_ZTv0_n12_N3ccc8DD1x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y5E[] = {
  {&(_ZTVN3ccc8DD1x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y5E[];
static VTBL_ENTRY alt_thunk_names850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y53pqrEv,_ZTv0_n12_N3ccc8DD1x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y53pqrEv,_ZThn4_N3ccc8DD1x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y5E = {  "_ZN3ccc8DD1x14y5E", // class name
  bases__ZN3ccc8DD1x14y5E, 2,
  &(vtc__ZN3ccc8DD1x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y5E),3, //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  CC1x14y6  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y63efgEv
  ~CC1x14y6(); // tgen
  CC1x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y6E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y63abcEv");}
void  ccc::CC1x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y63efgEv");}
ccc::CC1x14y6 ::~CC1x14y6(){ note_dtor("_ZN3ccc8CC1x14y6E", this);} // tgen
ccc::CC1x14y6 ::CC1x14y6(){ note_ctor("_ZN3ccc8CC1x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y6E, buf);
    ::ccc::CC1x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y6E);
    dp->::ccc::CC1x14y6::~CC1x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y6E(Test__ZN3ccc8CC1x14y6E, "_ZN3ccc8CC1x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y6C1Ev();
extern void _ZN3ccc8CC1x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y6E[] = {
  NSPAIR(_ZN3ccc8CC1x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC1x14y63abcEv();
extern void _ZN3ccc8CC1x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y63abcEv,_ZTv0_n12_N3ccc8CC1x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y63abcEv,_ZThn4_N3ccc8CC1x14y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y63efgEv,_ZTv0_n20_N3ccc8CC1x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y63efgEv,_ZThn4_N3ccc8CC1x14y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y63abcEv,_ZTv0_n12_N3ccc8CC1x14y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y63efgEv,_ZTv0_n20_N3ccc8CC1x14y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y6E[] = {
  {&(_ZTVN3ccc8CC1x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y6E[];
static VTBL_ENTRY alt_thunk_names851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y63efgEv,_ZTv0_n20_N3ccc8CC1x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y63efgEv,_ZThn4_N3ccc8CC1x14y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y63abcEv,_ZTv0_n12_N3ccc8CC1x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y63abcEv,_ZThn4_N3ccc8CC1x14y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y6E = {  "_ZN3ccc8CC1x14y6E", // class name
  bases__ZN3ccc8CC1x14y6E, 2,
  &(vtc__ZN3ccc8CC1x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y6E),2, //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  DD1x14y6  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD1x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x14y63efgEv
  ~DD1x14y6(); // tgen
  DD1x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y6E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y63abcEv");}
void  ccc::DD1x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y63efgEv");}
ccc::DD1x14y6 ::~DD1x14y6(){ note_dtor("_ZN3ccc8DD1x14y6E", this);} // tgen
ccc::DD1x14y6 ::DD1x14y6(){ note_ctor("_ZN3ccc8DD1x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y6E, buf);
    ::ccc::DD1x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y6E);
    dp->::ccc::DD1x14y6::~DD1x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y6E(Test__ZN3ccc8DD1x14y6E, "_ZN3ccc8DD1x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y6C1Ev();
extern void _ZN3ccc8DD1x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y6E[] = {
  NSPAIR(_ZN3ccc8DD1x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y6E[];
extern void _ZN3ccc8DD1x14y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y6E[] = {
  {&(_ZTVN3ccc8DD1x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y6E[];
Class_Descriptor cd__ZN3ccc8DD1x14y6E = {  "_ZN3ccc8DD1x14y6E", // class name
  bases__ZN3ccc8DD1x14y6E, 2,
  &(vtc__ZN3ccc8DD1x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y7  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y73pqrEv
  ~CC1x14y7(); // tgen
  CC1x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y7E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y73abcEv");}
void  ccc::CC1x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y73pqrEv");}
ccc::CC1x14y7 ::~CC1x14y7(){ note_dtor("_ZN3ccc8CC1x14y7E", this);} // tgen
ccc::CC1x14y7 ::CC1x14y7(){ note_ctor("_ZN3ccc8CC1x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y7E, buf);
    ::ccc::CC1x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y7E);
    dp->::ccc::CC1x14y7::~CC1x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y7E(Test__ZN3ccc8CC1x14y7E, "_ZN3ccc8CC1x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y7C1Ev();
extern void _ZN3ccc8CC1x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y7E[] = {
  NSPAIR(_ZN3ccc8CC1x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y7E[];
extern void _ZN3ccc8CC1x14y73pqrEv();
extern void _ZN3ccc8CC1x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y73abcEv,_ZTv0_n12_N3ccc8CC1x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y73abcEv,_ZThn4_N3ccc8CC1x14y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y73pqrEv,_ZTv0_n16_N3ccc8CC1x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y73pqrEv,_ZThn4_N3ccc8CC1x14y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y73abcEv,_ZTv0_n12_N3ccc8CC1x14y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y73pqrEv,_ZTv0_n16_N3ccc8CC1x14y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y7E[] = {
  {&(_ZTVN3ccc8CC1x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y7E[];
static VTBL_ENTRY alt_thunk_names852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y73pqrEv,_ZTv0_n16_N3ccc8CC1x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y73pqrEv,_ZThn4_N3ccc8CC1x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y73abcEv,_ZTv0_n12_N3ccc8CC1x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y73abcEv,_ZThn4_N3ccc8CC1x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y7E = {  "_ZN3ccc8CC1x14y7E", // class name
  bases__ZN3ccc8CC1x14y7E, 2,
  &(vtc__ZN3ccc8CC1x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y7E),2, //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  DD1x14y7  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD1x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y73pqrEv
  ~DD1x14y7(); // tgen
  DD1x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y7E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y73abcEv");}
void  ccc::DD1x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y73pqrEv");}
ccc::DD1x14y7 ::~DD1x14y7(){ note_dtor("_ZN3ccc8DD1x14y7E", this);} // tgen
ccc::DD1x14y7 ::DD1x14y7(){ note_ctor("_ZN3ccc8DD1x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y7E, buf);
    ::ccc::DD1x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y7E);
    dp->::ccc::DD1x14y7::~DD1x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y7E(Test__ZN3ccc8DD1x14y7E, "_ZN3ccc8DD1x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y7C1Ev();
extern void _ZN3ccc8DD1x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y7E[] = {
  NSPAIR(_ZN3ccc8DD1x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y7E[];
extern void _ZN3ccc8DD1x14y73abcEv();
extern void _ZN3ccc8DD1x14y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y73pqrEv,_ZTv0_n12_N3ccc8DD1x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y73pqrEv,_ZThn4_N3ccc8DD1x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y73pqrEv,_ZTv0_n12_N3ccc8DD1x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y7E[] = {
  {&(_ZTVN3ccc8DD1x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y7E[];
static VTBL_ENTRY alt_thunk_names853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y73pqrEv,_ZTv0_n12_N3ccc8DD1x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y73pqrEv,_ZThn4_N3ccc8DD1x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y7E = {  "_ZN3ccc8DD1x14y7E", // class name
  bases__ZN3ccc8DD1x14y7E, 2,
  &(vtc__ZN3ccc8DD1x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y7E),3, //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  CC1x14y8  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y83abcEv
  ~CC1x14y8(); // tgen
  CC1x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y8E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y83efgEv");}
void  ccc::CC1x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y83abcEv");}
ccc::CC1x14y8 ::~CC1x14y8(){ note_dtor("_ZN3ccc8CC1x14y8E", this);} // tgen
ccc::CC1x14y8 ::CC1x14y8(){ note_ctor("_ZN3ccc8CC1x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y8E, buf);
    ::ccc::CC1x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y8E);
    dp->::ccc::CC1x14y8::~CC1x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y8E(Test__ZN3ccc8CC1x14y8E, "_ZN3ccc8CC1x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y8C1Ev();
extern void _ZN3ccc8CC1x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y8E[] = {
  NSPAIR(_ZN3ccc8CC1x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC1x14y83efgEv();
extern void _ZN3ccc8CC1x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC1x14y83abcEv,_ZTv0_n12_N3ccc8CC1x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y83abcEv,_ZThn4_N3ccc8CC1x14y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y83efgEv,_ZTv0_n20_N3ccc8CC1x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y83efgEv,_ZThn4_N3ccc8CC1x14y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC1x14y83abcEv,_ZTv0_n12_N3ccc8CC1x14y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y83efgEv,_ZTv0_n20_N3ccc8CC1x14y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y8E[] = {
  {&(_ZTVN3ccc8CC1x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC1x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y8E[];
static VTBL_ENTRY alt_thunk_names854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y83efgEv,_ZTv0_n20_N3ccc8CC1x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y83efgEv,_ZThn4_N3ccc8CC1x14y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC1x14y83abcEv,_ZTv0_n12_N3ccc8CC1x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y83abcEv,_ZThn4_N3ccc8CC1x14y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y8E = {  "_ZN3ccc8CC1x14y8E", // class name
  bases__ZN3ccc8CC1x14y8E, 2,
  &(vtc__ZN3ccc8CC1x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y8E),2, //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  DD1x14y8  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD1x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x14y83abcEv
  ~DD1x14y8(); // tgen
  DD1x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y8E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y83efgEv");}
void  ccc::DD1x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x14y83abcEv");}
ccc::DD1x14y8 ::~DD1x14y8(){ note_dtor("_ZN3ccc8DD1x14y8E", this);} // tgen
ccc::DD1x14y8 ::DD1x14y8(){ note_ctor("_ZN3ccc8DD1x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y8E, buf);
    ::ccc::DD1x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y8E);
    dp->::ccc::DD1x14y8::~DD1x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y8E(Test__ZN3ccc8DD1x14y8E, "_ZN3ccc8DD1x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y8C1Ev();
extern void _ZN3ccc8DD1x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y8E[] = {
  NSPAIR(_ZN3ccc8DD1x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y8E[];
extern void _ZN3ccc8DD1x14y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y83efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y8E[] = {
  {&(_ZTVN3ccc8DD1x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y8E[];
Class_Descriptor cd__ZN3ccc8DD1x14y8E = {  "_ZN3ccc8DD1x14y8E", // class name
  bases__ZN3ccc8DD1x14y8E, 2,
  &(vtc__ZN3ccc8DD1x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y9  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y93pqrEv
  ~CC1x14y9(); // tgen
  CC1x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y9E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y93efgEv");}
void  ccc::CC1x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y93pqrEv");}
ccc::CC1x14y9 ::~CC1x14y9(){ note_dtor("_ZN3ccc8CC1x14y9E", this);} // tgen
ccc::CC1x14y9 ::CC1x14y9(){ note_ctor("_ZN3ccc8CC1x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y9E, buf);
    ::ccc::CC1x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc8CC1x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC1x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y9E);
    dp->::ccc::CC1x14y9::~CC1x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y9E(Test__ZN3ccc8CC1x14y9E, "_ZN3ccc8CC1x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y9C1Ev();
extern void _ZN3ccc8CC1x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y9E[] = {
  NSPAIR(_ZN3ccc8CC1x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y9E[];
extern void _ZN3ccc8CC1x14y93pqrEv();
extern void _ZN3ccc8CC1x14y93efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC1x14y93pqrEv,_ZTv0_n16_N3ccc8CC1x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y93pqrEv,_ZThn4_N3ccc8CC1x14y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC1x14y93efgEv,_ZTv0_n20_N3ccc8CC1x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y93efgEv,_ZThn4_N3ccc8CC1x14y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC1x14y93pqrEv,_ZTv0_n16_N3ccc8CC1x14y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC1x14y93efgEv,_ZTv0_n20_N3ccc8CC1x14y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x14y9E[] = {
  {&(_ZTVN3ccc8CC1x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC1x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x14y9E[];
static VTBL_ENTRY alt_thunk_names855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC1x14y93efgEv,_ZTv0_n20_N3ccc8CC1x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y93efgEv,_ZThn4_N3ccc8CC1x14y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC1x14y93pqrEv,_ZTv0_n16_N3ccc8CC1x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC1x14y93pqrEv,_ZThn4_N3ccc8CC1x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC1x14y9E = {  "_ZN3ccc8CC1x14y9E", // class name
  bases__ZN3ccc8CC1x14y9E, 2,
  &(vtc__ZN3ccc8CC1x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x14y9E),2, //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  DD1x14y9  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD1x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x14y93pqrEv
  ~DD1x14y9(); // tgen
  DD1x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x14y9E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x14y93efgEv");}
void  ccc::DD1x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x14y93pqrEv");}
ccc::DD1x14y9 ::~DD1x14y9(){ note_dtor("_ZN3ccc8DD1x14y9E", this);} // tgen
ccc::DD1x14y9 ::DD1x14y9(){ note_ctor("_ZN3ccc8DD1x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD1x14y9E, buf);
    ::ccc::DD1x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD1x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x14y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD1x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x14y9E);
    dp->::ccc::DD1x14y9::~DD1x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x14y9E(Test__ZN3ccc8DD1x14y9E, "_ZN3ccc8DD1x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD1x14y9C1Ev();
extern void _ZN3ccc8DD1x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x14y9E[] = {
  NSPAIR(_ZN3ccc8DD1x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD1x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x14y93pqrEv();
extern void _ZN3ccc8DD1x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD1x14y93pqrEv,_ZTv0_n12_N3ccc8DD1x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD1x14y93pqrEv,_ZThn4_N3ccc8DD1x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD1x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD1x14y93pqrEv,_ZTv0_n12_N3ccc8DD1x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x14y9E[] = {
  {&(_ZTVN3ccc8DD1x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD1x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x14y9E[];
static VTBL_ENTRY alt_thunk_names856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD1x14y93pqrEv,_ZTv0_n12_N3ccc8DD1x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD1x14y93pqrEv,_ZThn4_N3ccc8DD1x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD1x14y9E = {  "_ZN3ccc8DD1x14y9E", // class name
  bases__ZN3ccc8DD1x14y9E, 2,
  &(vtc__ZN3ccc8DD1x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD1x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x14y9E),3, //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  CC1x14y10  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x14y103abcEv
  ~CC1x14y10(); // tgen
  CC1x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y10E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y103pqrEv");}
void  ccc::CC1x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x14y103abcEv");}
ccc::CC1x14y10 ::~CC1x14y10(){ note_dtor("_ZN3ccc9CC1x14y10E", this);} // tgen
ccc::CC1x14y10 ::CC1x14y10(){ note_ctor("_ZN3ccc9CC1x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y10E, buf);
    ::ccc::CC1x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y10E);
    dp->::ccc::CC1x14y10::~CC1x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y10E(Test__ZN3ccc9CC1x14y10E, "_ZN3ccc9CC1x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y10C1Ev();
extern void _ZN3ccc9CC1x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y10E[] = {
  NSPAIR(_ZN3ccc9CC1x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y10E[];
extern void _ZN3ccc9CC1x14y103pqrEv();
extern void _ZN3ccc9CC1x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x14y103abcEv,_ZTv0_n12_N3ccc9CC1x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y103abcEv,_ZThn4_N3ccc9CC1x14y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x14y103pqrEv,_ZTv0_n16_N3ccc9CC1x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y103pqrEv,_ZThn4_N3ccc9CC1x14y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x14y103abcEv,_ZTv0_n12_N3ccc9CC1x14y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x14y103pqrEv,_ZTv0_n16_N3ccc9CC1x14y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y10E[] = {
  {&(_ZTVN3ccc9CC1x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y10E[];
static VTBL_ENTRY alt_thunk_names857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x14y103pqrEv,_ZTv0_n16_N3ccc9CC1x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y103pqrEv,_ZThn4_N3ccc9CC1x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x14y103abcEv,_ZTv0_n12_N3ccc9CC1x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y103abcEv,_ZThn4_N3ccc9CC1x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x14y10E = {  "_ZN3ccc9CC1x14y10E", // class name
  bases__ZN3ccc9CC1x14y10E, 2,
  &(vtc__ZN3ccc9CC1x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y10E),2, //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  DD1x14y10  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD1x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x14y103abcEv
  ~DD1x14y10(); // tgen
  DD1x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y10E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x14y103pqrEv");}
void  ccc::DD1x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x14y103abcEv");}
ccc::DD1x14y10 ::~DD1x14y10(){ note_dtor("_ZN3ccc9DD1x14y10E", this);} // tgen
ccc::DD1x14y10 ::DD1x14y10(){ note_ctor("_ZN3ccc9DD1x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y10E, buf);
    ::ccc::DD1x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y10E);
    dp->::ccc::DD1x14y10::~DD1x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y10E(Test__ZN3ccc9DD1x14y10E, "_ZN3ccc9DD1x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y10C1Ev();
extern void _ZN3ccc9DD1x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y10E[] = {
  NSPAIR(_ZN3ccc9DD1x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y10E[];
extern void _ZN3ccc9DD1x14y103abcEv();
extern void _ZN3ccc9DD1x14y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x14y103pqrEv,_ZTv0_n12_N3ccc9DD1x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x14y103pqrEv,_ZThn4_N3ccc9DD1x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x14y103pqrEv,_ZTv0_n12_N3ccc9DD1x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y10E[] = {
  {&(_ZTVN3ccc9DD1x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y10E[];
static VTBL_ENTRY alt_thunk_names858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x14y103pqrEv,_ZTv0_n12_N3ccc9DD1x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x14y103pqrEv,_ZThn4_N3ccc9DD1x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x14y10E = {  "_ZN3ccc9DD1x14y10E", // class name
  bases__ZN3ccc9DD1x14y10E, 2,
  &(vtc__ZN3ccc9DD1x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y10E),3, //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  CC1x14y11  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x14y113efgEv
  ~CC1x14y11(); // tgen
  CC1x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y11E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y113pqrEv");}
void  ccc::CC1x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x14y113efgEv");}
ccc::CC1x14y11 ::~CC1x14y11(){ note_dtor("_ZN3ccc9CC1x14y11E", this);} // tgen
ccc::CC1x14y11 ::CC1x14y11(){ note_ctor("_ZN3ccc9CC1x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y11E, buf);
    ::ccc::CC1x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y11E);
    dp->::ccc::CC1x14y11::~CC1x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y11E(Test__ZN3ccc9CC1x14y11E, "_ZN3ccc9CC1x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y11C1Ev();
extern void _ZN3ccc9CC1x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y11E[] = {
  NSPAIR(_ZN3ccc9CC1x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y11E[];
extern void _ZN3ccc9CC1x14y113pqrEv();
extern void _ZN3ccc9CC1x14y113efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x14y113pqrEv,_ZTv0_n16_N3ccc9CC1x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y113pqrEv,_ZThn4_N3ccc9CC1x14y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x14y113efgEv,_ZTv0_n20_N3ccc9CC1x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y113efgEv,_ZThn4_N3ccc9CC1x14y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x14y113pqrEv,_ZTv0_n16_N3ccc9CC1x14y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x14y113efgEv,_ZTv0_n20_N3ccc9CC1x14y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y11E[] = {
  {&(_ZTVN3ccc9CC1x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y11E[];
static VTBL_ENTRY alt_thunk_names859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x14y113efgEv,_ZTv0_n20_N3ccc9CC1x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y113efgEv,_ZThn4_N3ccc9CC1x14y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x14y113pqrEv,_ZTv0_n16_N3ccc9CC1x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y113pqrEv,_ZThn4_N3ccc9CC1x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x14y11E = {  "_ZN3ccc9CC1x14y11E", // class name
  bases__ZN3ccc9CC1x14y11E, 2,
  &(vtc__ZN3ccc9CC1x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y11E),2, //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  DD1x14y11  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD1x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x14y113efgEv
  ~DD1x14y11(); // tgen
  DD1x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y11E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD1x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x14y113pqrEv");}
void  ccc::DD1x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x14y113efgEv");}
ccc::DD1x14y11 ::~DD1x14y11(){ note_dtor("_ZN3ccc9DD1x14y11E", this);} // tgen
ccc::DD1x14y11 ::DD1x14y11(){ note_ctor("_ZN3ccc9DD1x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y11E, buf);
    ::ccc::DD1x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y11E);
    dp->::ccc::DD1x14y11::~DD1x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y11E(Test__ZN3ccc9DD1x14y11E, "_ZN3ccc9DD1x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y11C1Ev();
extern void _ZN3ccc9DD1x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y11E[] = {
  NSPAIR(_ZN3ccc9DD1x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x14y113pqrEv();
extern void _ZN3ccc9DD1x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x14y113pqrEv,_ZTv0_n12_N3ccc9DD1x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x14y113pqrEv,_ZThn4_N3ccc9DD1x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x14y113pqrEv,_ZTv0_n12_N3ccc9DD1x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y11E[] = {
  {&(_ZTVN3ccc9DD1x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y11E[];
static VTBL_ENTRY alt_thunk_names860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x14y113pqrEv,_ZTv0_n12_N3ccc9DD1x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x14y113pqrEv,_ZThn4_N3ccc9DD1x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x14y11E = {  "_ZN3ccc9DD1x14y11E", // class name
  bases__ZN3ccc9DD1x14y11E, 2,
  &(vtc__ZN3ccc9DD1x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y11E),3, //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  CC1x14y12  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC1x14y123abcEv
  ~CC1x14y12(); // tgen
  CC1x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y12E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x14y123abcEv");}
ccc::CC1x14y12 ::~CC1x14y12(){ note_dtor("_ZN3ccc9CC1x14y12E", this);} // tgen
ccc::CC1x14y12 ::CC1x14y12(){ note_ctor("_ZN3ccc9CC1x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y12E, buf);
    ::ccc::CC1x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y12E);
    dp->::ccc::CC1x14y12::~CC1x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y12E(Test__ZN3ccc9CC1x14y12E, "_ZN3ccc9CC1x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y12C1Ev();
extern void _ZN3ccc9CC1x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y12E[] = {
  NSPAIR(_ZN3ccc9CC1x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC1x14y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC1x14y123abcEv,_ZTv0_n12_N3ccc9CC1x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y123abcEv,_ZThn4_N3ccc9CC1x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC1x14y123abcEv,_ZTv0_n12_N3ccc9CC1x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y12E[] = {
  {&(_ZTVN3ccc9CC1x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y12E[];
static VTBL_ENTRY alt_thunk_names861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC1x14y123abcEv,_ZTv0_n12_N3ccc9CC1x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y123abcEv,_ZThn4_N3ccc9CC1x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x14y12E = {  "_ZN3ccc9CC1x14y12E", // class name
  bases__ZN3ccc9CC1x14y12E, 2,
  &(vtc__ZN3ccc9CC1x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y12E),2, //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  DD1x14y12  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD1x14y123abcEv
  ~DD1x14y12(); // tgen
  DD1x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y12E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x14y123abcEv");}
ccc::DD1x14y12 ::~DD1x14y12(){ note_dtor("_ZN3ccc9DD1x14y12E", this);} // tgen
ccc::DD1x14y12 ::DD1x14y12(){ note_ctor("_ZN3ccc9DD1x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y12E, buf);
    ::ccc::DD1x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y12E);
    dp->::ccc::DD1x14y12::~DD1x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y12E(Test__ZN3ccc9DD1x14y12E, "_ZN3ccc9DD1x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y12C1Ev();
extern void _ZN3ccc9DD1x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y12E[] = {
  NSPAIR(_ZN3ccc9DD1x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y12E[];
extern void _ZN3ccc9DD1x14y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y12E[] = {
  {&(_ZTVN3ccc9DD1x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y12E[];
Class_Descriptor cd__ZN3ccc9DD1x14y12E = {  "_ZN3ccc9DD1x14y12E", // class name
  bases__ZN3ccc9DD1x14y12E, 2,
  &(vtc__ZN3ccc9DD1x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y13  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC1x14y133efgEv
  ~CC1x14y13(); // tgen
  CC1x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x14y133efgEv");}
ccc::CC1x14y13 ::~CC1x14y13(){ note_dtor("_ZN3ccc9CC1x14y13E", this);} // tgen
ccc::CC1x14y13 ::CC1x14y13(){ note_ctor("_ZN3ccc9CC1x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y13E, buf);
    ::ccc::CC1x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y13E);
    dp->::ccc::CC1x14y13::~CC1x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y13E(Test__ZN3ccc9CC1x14y13E, "_ZN3ccc9CC1x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y13C1Ev();
extern void _ZN3ccc9CC1x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y13E[] = {
  NSPAIR(_ZN3ccc9CC1x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC1x14y133efgEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC1x14y133efgEv,_ZTv0_n20_N3ccc9CC1x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y133efgEv,_ZThn4_N3ccc9CC1x14y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC1x14y133efgEv,_ZTv0_n20_N3ccc9CC1x14y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y13E[] = {
  {&(_ZTVN3ccc9CC1x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC1x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y13E[];
static VTBL_ENTRY alt_thunk_names862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC1x14y133efgEv,_ZTv0_n20_N3ccc9CC1x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y133efgEv,_ZThn4_N3ccc9CC1x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x14y13E = {  "_ZN3ccc9CC1x14y13E", // class name
  bases__ZN3ccc9CC1x14y13E, 2,
  &(vtc__ZN3ccc9CC1x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y13E),2, //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  DD1x14y13  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD1x14y133efgEv
  ~DD1x14y13(); // tgen
  DD1x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD1x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x14y133efgEv");}
ccc::DD1x14y13 ::~DD1x14y13(){ note_dtor("_ZN3ccc9DD1x14y13E", this);} // tgen
ccc::DD1x14y13 ::DD1x14y13(){ note_ctor("_ZN3ccc9DD1x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y13E, buf);
    ::ccc::DD1x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y13E);
    dp->::ccc::DD1x14y13::~DD1x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y13E(Test__ZN3ccc9DD1x14y13E, "_ZN3ccc9DD1x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y13C1Ev();
extern void _ZN3ccc9DD1x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y13E[] = {
  NSPAIR(_ZN3ccc9DD1x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y13E[] = {
  {&(_ZTVN3ccc9DD1x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y13E[];
Class_Descriptor cd__ZN3ccc9DD1x14y13E = {  "_ZN3ccc9DD1x14y13E", // class name
  bases__ZN3ccc9DD1x14y13E, 2,
  &(vtc__ZN3ccc9DD1x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y14  : virtual ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y143pqrEv
  ~CC1x14y14(); // tgen
  CC1x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y143pqrEv");}
ccc::CC1x14y14 ::~CC1x14y14(){ note_dtor("_ZN3ccc9CC1x14y14E", this);} // tgen
ccc::CC1x14y14 ::CC1x14y14(){ note_ctor("_ZN3ccc9CC1x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y14E, buf);
    ::ccc::CC1x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y14E);
    dp->::ccc::CC1x14y14::~CC1x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y14E(Test__ZN3ccc9CC1x14y14E, "_ZN3ccc9CC1x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y14C1Ev();
extern void _ZN3ccc9CC1x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y14E[] = {
  NSPAIR(_ZN3ccc9CC1x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y14E[];
extern void _ZN3ccc9CC1x14y143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC1x14y143pqrEv,_ZTv0_n16_N3ccc9CC1x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y143pqrEv,_ZThn4_N3ccc9CC1x14y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC1x14y143pqrEv,_ZTv0_n16_N3ccc9CC1x14y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y14E[] = {
  {&(_ZTVN3ccc9CC1x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y14E[];
static VTBL_ENTRY alt_thunk_names863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC1x14y143pqrEv,_ZTv0_n16_N3ccc9CC1x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC1x14y143pqrEv,_ZThn4_N3ccc9CC1x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC1x14y14E = {  "_ZN3ccc9CC1x14y14E", // class name
  bases__ZN3ccc9CC1x14y14E, 2,
  &(vtc__ZN3ccc9CC1x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y14E),2, //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  DD1x14y14  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD1x14y143pqrEv
  ~DD1x14y14(); // tgen
  DD1x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD1x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x14y143pqrEv");}
ccc::DD1x14y14 ::~DD1x14y14(){ note_dtor("_ZN3ccc9DD1x14y14E", this);} // tgen
ccc::DD1x14y14 ::DD1x14y14(){ note_ctor("_ZN3ccc9DD1x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y14E, buf);
    ::ccc::DD1x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y14E);
    dp->::ccc::DD1x14y14::~DD1x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y14E(Test__ZN3ccc9DD1x14y14E, "_ZN3ccc9DD1x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y14C1Ev();
extern void _ZN3ccc9DD1x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y14E[] = {
  NSPAIR(_ZN3ccc9DD1x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x14y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD1x14y143pqrEv,_ZTv0_n12_N3ccc9DD1x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD1x14y143pqrEv,_ZThn4_N3ccc9DD1x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD1x14y143pqrEv,_ZTv0_n12_N3ccc9DD1x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y14E[] = {
  {&(_ZTVN3ccc9DD1x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y14E[];
static VTBL_ENTRY alt_thunk_names864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD1x14y143pqrEv,_ZTv0_n12_N3ccc9DD1x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD1x14y143pqrEv,_ZThn4_N3ccc9DD1x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD1x14y14E = {  "_ZN3ccc9DD1x14y14E", // class name
  bases__ZN3ccc9DD1x14y14E, 2,
  &(vtc__ZN3ccc9DD1x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y14E),3, //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  CC1x14y15  : virtual ::ccc::AA1 , ::ccc::BB14 {
  ~CC1x14y15(); // tgen
  CC1x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x14y15 ::~CC1x14y15(){ note_dtor("_ZN3ccc9CC1x14y15E", this);} // tgen
ccc::CC1x14y15 ::CC1x14y15(){ note_ctor("_ZN3ccc9CC1x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y15E, buf);
    ::ccc::CC1x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), ABISELECT(8,4), "_ZN3ccc9CC1x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC1x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y15E);
    dp->::ccc::CC1x14y15::~CC1x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y15E(Test__ZN3ccc9CC1x14y15E, "_ZN3ccc9CC1x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y15C1Ev();
extern void _ZN3ccc9CC1x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y15E[] = {
  NSPAIR(_ZN3ccc9CC1x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x14y15E[] = {
  {&(_ZTVN3ccc9CC1x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC1x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x14y15E[];
Class_Descriptor cd__ZN3ccc9CC1x14y15E = {  "_ZN3ccc9CC1x14y15E", // class name
  bases__ZN3ccc9CC1x14y15E, 2,
  &(vtc__ZN3ccc9CC1x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x14y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD1x14y15  : virtual ::ccc::AA1 , virtual ::ccc::BB14 {
  ~DD1x14y15(); // tgen
  DD1x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD1x14y15 ::~DD1x14y15(){ note_dtor("_ZN3ccc9DD1x14y15E", this);} // tgen
ccc::DD1x14y15 ::DD1x14y15(){ note_ctor("_ZN3ccc9DD1x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD1x14y15E, buf);
    ::ccc::DD1x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD1x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x14y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD1x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x14y15E);
    dp->::ccc::DD1x14y15::~DD1x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x14y15E(Test__ZN3ccc9DD1x14y15E, "_ZN3ccc9DD1x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD1x14y15C1Ev();
extern void _ZN3ccc9DD1x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x14y15E[] = {
  NSPAIR(_ZN3ccc9DD1x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD1x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x14y15E[] = {
  {&(_ZTVN3ccc9DD1x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD1x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x14y15E[];
Class_Descriptor cd__ZN3ccc9DD1x14y15E = {  "_ZN3ccc9DD1x14y15E", // class name
  bases__ZN3ccc9DD1x14y15E, 2,
  &(vtc__ZN3ccc9DD1x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD1x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x14y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y0  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y03pqrEv
  ~CC1x15y0(); // tgen
  CC1x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y0E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y03abcEv");}
void  ccc::CC1x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y03efgEv");}
void  ccc::CC1x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y03pqrEv");}
ccc::CC1x15y0 ::~CC1x15y0(){ note_dtor("_ZN3ccc8CC1x15y0E", this);} // tgen
ccc::CC1x15y0 ::CC1x15y0(){ note_ctor("_ZN3ccc8CC1x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y0E, buf);
    ::ccc::CC1x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y0E);
    dp->::ccc::CC1x15y0::~CC1x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y0E(Test__ZN3ccc8CC1x15y0E, "_ZN3ccc8CC1x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y0C1Ev();
extern void _ZN3ccc8CC1x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y0E[] = {
  NSPAIR(_ZN3ccc8CC1x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y0E[];
extern void _ZN3ccc8CC1x15y03abcEv();
extern void _ZN3ccc8CC1x15y03pqrEv();
extern void _ZN3ccc8CC1x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y0E[] = {
  {&(_ZTVN3ccc8CC1x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y0E[];
Class_Descriptor cd__ZN3ccc8CC1x15y0E = {  "_ZN3ccc8CC1x15y0E", // class name
  bases__ZN3ccc8CC1x15y0E, 2,
  &(vtc__ZN3ccc8CC1x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y0E),2, //virtual 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  DD1x15y0  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD1x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD1x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y03pqrEv
  ~DD1x15y0(); // tgen
  DD1x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y0E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y03abcEv");}
void  ccc::DD1x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y03efgEv");}
void  ccc::DD1x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y03pqrEv");}
ccc::DD1x15y0 ::~DD1x15y0(){ note_dtor("_ZN3ccc8DD1x15y0E", this);} // tgen
ccc::DD1x15y0 ::DD1x15y0(){ note_ctor("_ZN3ccc8DD1x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y0E, buf);
    ::ccc::DD1x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y0E);
    dp->::ccc::DD1x15y0::~DD1x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y0E(Test__ZN3ccc8DD1x15y0E, "_ZN3ccc8DD1x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y0C1Ev();
extern void _ZN3ccc8DD1x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y0E[] = {
  NSPAIR(_ZN3ccc8DD1x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y0E[];
extern void _ZN3ccc8DD1x15y03abcEv();
extern void _ZN3ccc8DD1x15y03pqrEv();
extern void _ZN3ccc8DD1x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y0E[] = {
  {&(_ZTVN3ccc8DD1x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y0E[];
Class_Descriptor cd__ZN3ccc8DD1x15y0E = {  "_ZN3ccc8DD1x15y0E", // class name
  bases__ZN3ccc8DD1x15y0E, 2,
  &(vtc__ZN3ccc8DD1x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y0E),2, //virtual 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  CC1x15y1  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x15y13efgEv
  ~CC1x15y1(); // tgen
  CC1x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y1E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y13abcEv");}
void  ccc::CC1x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y13pqrEv");}
void  ccc::CC1x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y13efgEv");}
ccc::CC1x15y1 ::~CC1x15y1(){ note_dtor("_ZN3ccc8CC1x15y1E", this);} // tgen
ccc::CC1x15y1 ::CC1x15y1(){ note_ctor("_ZN3ccc8CC1x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y1E, buf);
    ::ccc::CC1x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y1E);
    dp->::ccc::CC1x15y1::~CC1x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y1E(Test__ZN3ccc8CC1x15y1E, "_ZN3ccc8CC1x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y1C1Ev();
extern void _ZN3ccc8CC1x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y1E[] = {
  NSPAIR(_ZN3ccc8CC1x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y1E[];
extern void _ZN3ccc8CC1x15y13abcEv();
extern void _ZN3ccc8CC1x15y13pqrEv();
extern void _ZN3ccc8CC1x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y1E[] = {
  {&(_ZTVN3ccc8CC1x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y1E[];
Class_Descriptor cd__ZN3ccc8CC1x15y1E = {  "_ZN3ccc8CC1x15y1E", // class name
  bases__ZN3ccc8CC1x15y1E, 2,
  &(vtc__ZN3ccc8CC1x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y1E),2, //virtual 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  DD1x15y1  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD1x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x15y13efgEv
  ~DD1x15y1(); // tgen
  DD1x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y1E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y13abcEv");}
void  ccc::DD1x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y13pqrEv");}
void  ccc::DD1x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y13efgEv");}
ccc::DD1x15y1 ::~DD1x15y1(){ note_dtor("_ZN3ccc8DD1x15y1E", this);} // tgen
ccc::DD1x15y1 ::DD1x15y1(){ note_ctor("_ZN3ccc8DD1x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y1E, buf);
    ::ccc::DD1x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y1E);
    dp->::ccc::DD1x15y1::~DD1x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y1E(Test__ZN3ccc8DD1x15y1E, "_ZN3ccc8DD1x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y1C1Ev();
extern void _ZN3ccc8DD1x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y1E[] = {
  NSPAIR(_ZN3ccc8DD1x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y1E[];
extern void _ZN3ccc8DD1x15y13abcEv();
extern void _ZN3ccc8DD1x15y13pqrEv();
extern void _ZN3ccc8DD1x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y1E[] = {
  {&(_ZTVN3ccc8DD1x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y1E[];
Class_Descriptor cd__ZN3ccc8DD1x15y1E = {  "_ZN3ccc8DD1x15y1E", // class name
  bases__ZN3ccc8DD1x15y1E, 2,
  &(vtc__ZN3ccc8DD1x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y1E),2, //virtual 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  CC1x15y2  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y23pqrEv
  ~CC1x15y2(); // tgen
  CC1x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y2E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y23efgEv");}
void  ccc::CC1x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y23abcEv");}
void  ccc::CC1x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y23pqrEv");}
ccc::CC1x15y2 ::~CC1x15y2(){ note_dtor("_ZN3ccc8CC1x15y2E", this);} // tgen
ccc::CC1x15y2 ::CC1x15y2(){ note_ctor("_ZN3ccc8CC1x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y2E, buf);
    ::ccc::CC1x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y2E);
    dp->::ccc::CC1x15y2::~CC1x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y2E(Test__ZN3ccc8CC1x15y2E, "_ZN3ccc8CC1x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y2C1Ev();
extern void _ZN3ccc8CC1x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y2E[] = {
  NSPAIR(_ZN3ccc8CC1x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y2E[];
extern void _ZN3ccc8CC1x15y23abcEv();
extern void _ZN3ccc8CC1x15y23pqrEv();
extern void _ZN3ccc8CC1x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y2E[] = {
  {&(_ZTVN3ccc8CC1x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y2E[];
Class_Descriptor cd__ZN3ccc8CC1x15y2E = {  "_ZN3ccc8CC1x15y2E", // class name
  bases__ZN3ccc8CC1x15y2E, 2,
  &(vtc__ZN3ccc8CC1x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y2E),2, //virtual 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  DD1x15y2  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD1x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD1x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y23pqrEv
  ~DD1x15y2(); // tgen
  DD1x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y2E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y23efgEv");}
void  ccc::DD1x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y23abcEv");}
void  ccc::DD1x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y23pqrEv");}
ccc::DD1x15y2 ::~DD1x15y2(){ note_dtor("_ZN3ccc8DD1x15y2E", this);} // tgen
ccc::DD1x15y2 ::DD1x15y2(){ note_ctor("_ZN3ccc8DD1x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y2E, buf);
    ::ccc::DD1x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y2E);
    dp->::ccc::DD1x15y2::~DD1x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y2E(Test__ZN3ccc8DD1x15y2E, "_ZN3ccc8DD1x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y2C1Ev();
extern void _ZN3ccc8DD1x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y2E[] = {
  NSPAIR(_ZN3ccc8DD1x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y2E[];
extern void _ZN3ccc8DD1x15y23abcEv();
extern void _ZN3ccc8DD1x15y23pqrEv();
extern void _ZN3ccc8DD1x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y2E[] = {
  {&(_ZTVN3ccc8DD1x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y2E[];
Class_Descriptor cd__ZN3ccc8DD1x15y2E = {  "_ZN3ccc8DD1x15y2E", // class name
  bases__ZN3ccc8DD1x15y2E, 2,
  &(vtc__ZN3ccc8DD1x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y2E),2, //virtual 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  CC1x15y3  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x15y33abcEv
  ~CC1x15y3(); // tgen
  CC1x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y3E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y33efgEv");}
void  ccc::CC1x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y33pqrEv");}
void  ccc::CC1x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y33abcEv");}
ccc::CC1x15y3 ::~CC1x15y3(){ note_dtor("_ZN3ccc8CC1x15y3E", this);} // tgen
ccc::CC1x15y3 ::CC1x15y3(){ note_ctor("_ZN3ccc8CC1x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y3E, buf);
    ::ccc::CC1x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y3E);
    dp->::ccc::CC1x15y3::~CC1x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y3E(Test__ZN3ccc8CC1x15y3E, "_ZN3ccc8CC1x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y3C1Ev();
extern void _ZN3ccc8CC1x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y3E[] = {
  NSPAIR(_ZN3ccc8CC1x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y3E[];
extern void _ZN3ccc8CC1x15y33abcEv();
extern void _ZN3ccc8CC1x15y33pqrEv();
extern void _ZN3ccc8CC1x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y3E[] = {
  {&(_ZTVN3ccc8CC1x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y3E[];
Class_Descriptor cd__ZN3ccc8CC1x15y3E = {  "_ZN3ccc8CC1x15y3E", // class name
  bases__ZN3ccc8CC1x15y3E, 2,
  &(vtc__ZN3ccc8CC1x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y3E),2, //virtual 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  DD1x15y3  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD1x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x15y33abcEv
  ~DD1x15y3(); // tgen
  DD1x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y3E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y33efgEv");}
void  ccc::DD1x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y33pqrEv");}
void  ccc::DD1x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y33abcEv");}
ccc::DD1x15y3 ::~DD1x15y3(){ note_dtor("_ZN3ccc8DD1x15y3E", this);} // tgen
ccc::DD1x15y3 ::DD1x15y3(){ note_ctor("_ZN3ccc8DD1x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y3E, buf);
    ::ccc::DD1x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y3E);
    dp->::ccc::DD1x15y3::~DD1x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y3E(Test__ZN3ccc8DD1x15y3E, "_ZN3ccc8DD1x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y3C1Ev();
extern void _ZN3ccc8DD1x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y3E[] = {
  NSPAIR(_ZN3ccc8DD1x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y3E[];
extern void _ZN3ccc8DD1x15y33abcEv();
extern void _ZN3ccc8DD1x15y33pqrEv();
extern void _ZN3ccc8DD1x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y3E[] = {
  {&(_ZTVN3ccc8DD1x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y3E[];
Class_Descriptor cd__ZN3ccc8DD1x15y3E = {  "_ZN3ccc8DD1x15y3E", // class name
  bases__ZN3ccc8DD1x15y3E, 2,
  &(vtc__ZN3ccc8DD1x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y3E),2, //virtual 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  CC1x15y4  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC1x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y43efgEv
  ~CC1x15y4(); // tgen
  CC1x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y4E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y43pqrEv");}
void  ccc::CC1x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y43abcEv");}
void  ccc::CC1x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y43efgEv");}
ccc::CC1x15y4 ::~CC1x15y4(){ note_dtor("_ZN3ccc8CC1x15y4E", this);} // tgen
ccc::CC1x15y4 ::CC1x15y4(){ note_ctor("_ZN3ccc8CC1x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y4E, buf);
    ::ccc::CC1x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y4E);
    dp->::ccc::CC1x15y4::~CC1x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y4E(Test__ZN3ccc8CC1x15y4E, "_ZN3ccc8CC1x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y4C1Ev();
extern void _ZN3ccc8CC1x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y4E[] = {
  NSPAIR(_ZN3ccc8CC1x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y4E[];
extern void _ZN3ccc8CC1x15y43abcEv();
extern void _ZN3ccc8CC1x15y43pqrEv();
extern void _ZN3ccc8CC1x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y4E[] = {
  {&(_ZTVN3ccc8CC1x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y4E[];
Class_Descriptor cd__ZN3ccc8CC1x15y4E = {  "_ZN3ccc8CC1x15y4E", // class name
  bases__ZN3ccc8CC1x15y4E, 2,
  &(vtc__ZN3ccc8CC1x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y4E),2, //virtual 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  DD1x15y4  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD1x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD1x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD1x15y43efgEv
  ~DD1x15y4(); // tgen
  DD1x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y4E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y43pqrEv");}
void  ccc::DD1x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y43abcEv");}
void  ccc::DD1x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y43efgEv");}
ccc::DD1x15y4 ::~DD1x15y4(){ note_dtor("_ZN3ccc8DD1x15y4E", this);} // tgen
ccc::DD1x15y4 ::DD1x15y4(){ note_ctor("_ZN3ccc8DD1x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y4E, buf);
    ::ccc::DD1x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y4E);
    dp->::ccc::DD1x15y4::~DD1x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y4E(Test__ZN3ccc8DD1x15y4E, "_ZN3ccc8DD1x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y4C1Ev();
extern void _ZN3ccc8DD1x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y4E[] = {
  NSPAIR(_ZN3ccc8DD1x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y4E[];
extern void _ZN3ccc8DD1x15y43abcEv();
extern void _ZN3ccc8DD1x15y43pqrEv();
extern void _ZN3ccc8DD1x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y4E[] = {
  {&(_ZTVN3ccc8DD1x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y4E[];
Class_Descriptor cd__ZN3ccc8DD1x15y4E = {  "_ZN3ccc8DD1x15y4E", // class name
  bases__ZN3ccc8DD1x15y4E, 2,
  &(vtc__ZN3ccc8DD1x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y4E),2, //virtual 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  CC1x15y5  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC1x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y53abcEv
  ~CC1x15y5(); // tgen
  CC1x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y5E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y53pqrEv");}
void  ccc::CC1x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y53efgEv");}
void  ccc::CC1x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y53abcEv");}
ccc::CC1x15y5 ::~CC1x15y5(){ note_dtor("_ZN3ccc8CC1x15y5E", this);} // tgen
ccc::CC1x15y5 ::CC1x15y5(){ note_ctor("_ZN3ccc8CC1x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y5E, buf);
    ::ccc::CC1x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y5E);
    dp->::ccc::CC1x15y5::~CC1x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y5E(Test__ZN3ccc8CC1x15y5E, "_ZN3ccc8CC1x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y5C1Ev();
extern void _ZN3ccc8CC1x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y5E[] = {
  NSPAIR(_ZN3ccc8CC1x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y5E[];
extern void _ZN3ccc8CC1x15y53abcEv();
extern void _ZN3ccc8CC1x15y53pqrEv();
extern void _ZN3ccc8CC1x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y5E[] = {
  {&(_ZTVN3ccc8CC1x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y5E[];
Class_Descriptor cd__ZN3ccc8CC1x15y5E = {  "_ZN3ccc8CC1x15y5E", // class name
  bases__ZN3ccc8CC1x15y5E, 2,
  &(vtc__ZN3ccc8CC1x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y5E),2, //virtual 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  DD1x15y5  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD1x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD1x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD1x15y53abcEv
  ~DD1x15y5(); // tgen
  DD1x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y5E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD1x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y53pqrEv");}
void  ccc::DD1x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y53efgEv");}
void  ccc::DD1x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y53abcEv");}
ccc::DD1x15y5 ::~DD1x15y5(){ note_dtor("_ZN3ccc8DD1x15y5E", this);} // tgen
ccc::DD1x15y5 ::DD1x15y5(){ note_ctor("_ZN3ccc8DD1x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y5E, buf);
    ::ccc::DD1x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y5E);
    dp->::ccc::DD1x15y5::~DD1x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y5E(Test__ZN3ccc8DD1x15y5E, "_ZN3ccc8DD1x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y5C1Ev();
extern void _ZN3ccc8DD1x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y5E[] = {
  NSPAIR(_ZN3ccc8DD1x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y5E[];
extern void _ZN3ccc8DD1x15y53abcEv();
extern void _ZN3ccc8DD1x15y53pqrEv();
extern void _ZN3ccc8DD1x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y5E[] = {
  {&(_ZTVN3ccc8DD1x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y5E[];
Class_Descriptor cd__ZN3ccc8DD1x15y5E = {  "_ZN3ccc8DD1x15y5E", // class name
  bases__ZN3ccc8DD1x15y5E, 2,
  &(vtc__ZN3ccc8DD1x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y5E),2, //virtual 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  CC1x15y6  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y63efgEv
  ~CC1x15y6(); // tgen
  CC1x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y6E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y63abcEv");}
void  ccc::CC1x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y63efgEv");}
ccc::CC1x15y6 ::~CC1x15y6(){ note_dtor("_ZN3ccc8CC1x15y6E", this);} // tgen
ccc::CC1x15y6 ::CC1x15y6(){ note_ctor("_ZN3ccc8CC1x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y6E, buf);
    ::ccc::CC1x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y6E);
    dp->::ccc::CC1x15y6::~CC1x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y6E(Test__ZN3ccc8CC1x15y6E, "_ZN3ccc8CC1x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y6C1Ev();
extern void _ZN3ccc8CC1x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y6E[] = {
  NSPAIR(_ZN3ccc8CC1x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y6E[];
extern void _ZN3ccc8CC1x15y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y6E[] = {
  {&(_ZTVN3ccc8CC1x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y6E[];
Class_Descriptor cd__ZN3ccc8CC1x15y6E = {  "_ZN3ccc8CC1x15y6E", // class name
  bases__ZN3ccc8CC1x15y6E, 2,
  &(vtc__ZN3ccc8CC1x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y6E),2, //virtual 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  DD1x15y6  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD1x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD1x15y63efgEv
  ~DD1x15y6(); // tgen
  DD1x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y6E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y63abcEv");}
void  ccc::DD1x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y63efgEv");}
ccc::DD1x15y6 ::~DD1x15y6(){ note_dtor("_ZN3ccc8DD1x15y6E", this);} // tgen
ccc::DD1x15y6 ::DD1x15y6(){ note_ctor("_ZN3ccc8DD1x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y6E, buf);
    ::ccc::DD1x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y6E);
    dp->::ccc::DD1x15y6::~DD1x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y6E(Test__ZN3ccc8DD1x15y6E, "_ZN3ccc8DD1x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y6C1Ev();
extern void _ZN3ccc8DD1x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y6E[] = {
  NSPAIR(_ZN3ccc8DD1x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y6E[];
extern void _ZN3ccc8DD1x15y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y6E[] = {
  {&(_ZTVN3ccc8DD1x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y6E[];
Class_Descriptor cd__ZN3ccc8DD1x15y6E = {  "_ZN3ccc8DD1x15y6E", // class name
  bases__ZN3ccc8DD1x15y6E, 2,
  &(vtc__ZN3ccc8DD1x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y6E),2, //virtual 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  CC1x15y7  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y73pqrEv
  ~CC1x15y7(); // tgen
  CC1x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y7E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y73abcEv");}
void  ccc::CC1x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y73pqrEv");}
ccc::CC1x15y7 ::~CC1x15y7(){ note_dtor("_ZN3ccc8CC1x15y7E", this);} // tgen
ccc::CC1x15y7 ::CC1x15y7(){ note_ctor("_ZN3ccc8CC1x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y7E, buf);
    ::ccc::CC1x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y7E);
    dp->::ccc::CC1x15y7::~CC1x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y7E(Test__ZN3ccc8CC1x15y7E, "_ZN3ccc8CC1x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y7C1Ev();
extern void _ZN3ccc8CC1x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y7E[] = {
  NSPAIR(_ZN3ccc8CC1x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y7E[];
extern void _ZN3ccc8CC1x15y73abcEv();
extern void _ZN3ccc8CC1x15y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y7E[] = {
  {&(_ZTVN3ccc8CC1x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y7E[];
Class_Descriptor cd__ZN3ccc8CC1x15y7E = {  "_ZN3ccc8CC1x15y7E", // class name
  bases__ZN3ccc8CC1x15y7E, 2,
  &(vtc__ZN3ccc8CC1x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y7E),2, //virtual 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  DD1x15y7  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD1x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y73pqrEv
  ~DD1x15y7(); // tgen
  DD1x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y7E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y73abcEv");}
void  ccc::DD1x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y73pqrEv");}
ccc::DD1x15y7 ::~DD1x15y7(){ note_dtor("_ZN3ccc8DD1x15y7E", this);} // tgen
ccc::DD1x15y7 ::DD1x15y7(){ note_ctor("_ZN3ccc8DD1x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y7E, buf);
    ::ccc::DD1x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y7E);
    dp->::ccc::DD1x15y7::~DD1x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y7E(Test__ZN3ccc8DD1x15y7E, "_ZN3ccc8DD1x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y7C1Ev();
extern void _ZN3ccc8DD1x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y7E[] = {
  NSPAIR(_ZN3ccc8DD1x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y7E[];
extern void _ZN3ccc8DD1x15y73abcEv();
extern void _ZN3ccc8DD1x15y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y7E[] = {
  {&(_ZTVN3ccc8DD1x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y7E[];
Class_Descriptor cd__ZN3ccc8DD1x15y7E = {  "_ZN3ccc8DD1x15y7E", // class name
  bases__ZN3ccc8DD1x15y7E, 2,
  &(vtc__ZN3ccc8DD1x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y7E),2, //virtual 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  CC1x15y8  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y83abcEv
  ~CC1x15y8(); // tgen
  CC1x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y8E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y83efgEv");}
void  ccc::CC1x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y83abcEv");}
ccc::CC1x15y8 ::~CC1x15y8(){ note_dtor("_ZN3ccc8CC1x15y8E", this);} // tgen
ccc::CC1x15y8 ::CC1x15y8(){ note_ctor("_ZN3ccc8CC1x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y8E, buf);
    ::ccc::CC1x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y8E);
    dp->::ccc::CC1x15y8::~CC1x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y8E(Test__ZN3ccc8CC1x15y8E, "_ZN3ccc8CC1x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y8C1Ev();
extern void _ZN3ccc8CC1x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y8E[] = {
  NSPAIR(_ZN3ccc8CC1x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y8E[];
extern void _ZN3ccc8CC1x15y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y8E[] = {
  {&(_ZTVN3ccc8CC1x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y8E[];
Class_Descriptor cd__ZN3ccc8CC1x15y8E = {  "_ZN3ccc8CC1x15y8E", // class name
  bases__ZN3ccc8CC1x15y8E, 2,
  &(vtc__ZN3ccc8CC1x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y8E),2, //virtual 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  DD1x15y8  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD1x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD1x15y83abcEv
  ~DD1x15y8(); // tgen
  DD1x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y8E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y83efgEv");}
void  ccc::DD1x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD1x15y83abcEv");}
ccc::DD1x15y8 ::~DD1x15y8(){ note_dtor("_ZN3ccc8DD1x15y8E", this);} // tgen
ccc::DD1x15y8 ::DD1x15y8(){ note_ctor("_ZN3ccc8DD1x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y8E, buf);
    ::ccc::DD1x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y8E);
    dp->::ccc::DD1x15y8::~DD1x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y8E(Test__ZN3ccc8DD1x15y8E, "_ZN3ccc8DD1x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y8C1Ev();
extern void _ZN3ccc8DD1x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y8E[] = {
  NSPAIR(_ZN3ccc8DD1x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y8E[];
extern void _ZN3ccc8DD1x15y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8DD1x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y8E[] = {
  {&(_ZTVN3ccc8DD1x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y8E[];
Class_Descriptor cd__ZN3ccc8DD1x15y8E = {  "_ZN3ccc8DD1x15y8E", // class name
  bases__ZN3ccc8DD1x15y8E, 2,
  &(vtc__ZN3ccc8DD1x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y8E),2, //virtual 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  CC1x15y9  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y93pqrEv
  ~CC1x15y9(); // tgen
  CC1x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y9E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y93efgEv");}
void  ccc::CC1x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y93pqrEv");}
ccc::CC1x15y9 ::~CC1x15y9(){ note_dtor("_ZN3ccc8CC1x15y9E", this);} // tgen
ccc::CC1x15y9 ::CC1x15y9(){ note_ctor("_ZN3ccc8CC1x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y9E, buf);
    ::ccc::CC1x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y9E);
    dp->::ccc::CC1x15y9::~CC1x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y9E(Test__ZN3ccc8CC1x15y9E, "_ZN3ccc8CC1x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y9C1Ev();
extern void _ZN3ccc8CC1x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y9E[] = {
  NSPAIR(_ZN3ccc8CC1x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x15y93pqrEv();
extern void _ZN3ccc8CC1x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC1x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC1x15y9E[] = {
  {&(_ZTVN3ccc8CC1x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC1x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC1x15y9E[];
Class_Descriptor cd__ZN3ccc8CC1x15y9E = {  "_ZN3ccc8CC1x15y9E", // class name
  bases__ZN3ccc8CC1x15y9E, 2,
  &(vtc__ZN3ccc8CC1x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC1x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC1x15y9E),2, //virtual 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  DD1x15y9  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD1x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD1x15y93pqrEv
  ~DD1x15y9(); // tgen
  DD1x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD1x15y9E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD1x15y93efgEv");}
void  ccc::DD1x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD1x15y93pqrEv");}
ccc::DD1x15y9 ::~DD1x15y9(){ note_dtor("_ZN3ccc8DD1x15y9E", this);} // tgen
ccc::DD1x15y9 ::DD1x15y9(){ note_ctor("_ZN3ccc8DD1x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD1x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD1x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD1x15y9E, buf);
    ::ccc::DD1x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD1x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD1x15y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8DD1x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD1x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD1x15y9E);
    dp->::ccc::DD1x15y9::~DD1x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD1x15y9E(Test__ZN3ccc8DD1x15y9E, "_ZN3ccc8DD1x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD1x15y9C1Ev();
extern void _ZN3ccc8DD1x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD1x15y9E[] = {
  NSPAIR(_ZN3ccc8DD1x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD1x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD1x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8DD1x15y93pqrEv();
extern void _ZN3ccc8DD1x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD1x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD1x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD1x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD1x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD1x15y9E[] = {
  {&(_ZTVN3ccc8DD1x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD1x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD1x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD1x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD1x15y9E[];
Class_Descriptor cd__ZN3ccc8DD1x15y9E = {  "_ZN3ccc8DD1x15y9E", // class name
  bases__ZN3ccc8DD1x15y9E, 2,
  &(vtc__ZN3ccc8DD1x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD1x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD1x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD1x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD1x15y9E),2, //virtual 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  CC1x15y10  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x15y103abcEv
  ~CC1x15y10(); // tgen
  CC1x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y10E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y103pqrEv");}
void  ccc::CC1x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x15y103abcEv");}
ccc::CC1x15y10 ::~CC1x15y10(){ note_dtor("_ZN3ccc9CC1x15y10E", this);} // tgen
ccc::CC1x15y10 ::CC1x15y10(){ note_ctor("_ZN3ccc9CC1x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y10E, buf);
    ::ccc::CC1x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y10E);
    dp->::ccc::CC1x15y10::~CC1x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y10E(Test__ZN3ccc9CC1x15y10E, "_ZN3ccc9CC1x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y10C1Ev();
extern void _ZN3ccc9CC1x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y10E[] = {
  NSPAIR(_ZN3ccc9CC1x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y10E[];
extern void _ZN3ccc9CC1x15y103abcEv();
extern void _ZN3ccc9CC1x15y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y10E[] = {
  {&(_ZTVN3ccc9CC1x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y10E[];
Class_Descriptor cd__ZN3ccc9CC1x15y10E = {  "_ZN3ccc9CC1x15y10E", // class name
  bases__ZN3ccc9CC1x15y10E, 2,
  &(vtc__ZN3ccc9CC1x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y10E),2, //virtual 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  DD1x15y10  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD1x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD1x15y103abcEv
  ~DD1x15y10(); // tgen
  DD1x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y10E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x15y103pqrEv");}
void  ccc::DD1x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x15y103abcEv");}
ccc::DD1x15y10 ::~DD1x15y10(){ note_dtor("_ZN3ccc9DD1x15y10E", this);} // tgen
ccc::DD1x15y10 ::DD1x15y10(){ note_ctor("_ZN3ccc9DD1x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y10E, buf);
    ::ccc::DD1x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y10E);
    dp->::ccc::DD1x15y10::~DD1x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y10E(Test__ZN3ccc9DD1x15y10E, "_ZN3ccc9DD1x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y10C1Ev();
extern void _ZN3ccc9DD1x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y10E[] = {
  NSPAIR(_ZN3ccc9DD1x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y10E[];
extern void _ZN3ccc9DD1x15y103abcEv();
extern void _ZN3ccc9DD1x15y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y10E[] = {
  {&(_ZTVN3ccc9DD1x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y10E[];
Class_Descriptor cd__ZN3ccc9DD1x15y10E = {  "_ZN3ccc9DD1x15y10E", // class name
  bases__ZN3ccc9DD1x15y10E, 2,
  &(vtc__ZN3ccc9DD1x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y10E),2, //virtual 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  CC1x15y11  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x15y113efgEv
  ~CC1x15y11(); // tgen
  CC1x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y11E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y113pqrEv");}
void  ccc::CC1x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x15y113efgEv");}
ccc::CC1x15y11 ::~CC1x15y11(){ note_dtor("_ZN3ccc9CC1x15y11E", this);} // tgen
ccc::CC1x15y11 ::CC1x15y11(){ note_ctor("_ZN3ccc9CC1x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y11E, buf);
    ::ccc::CC1x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y11E);
    dp->::ccc::CC1x15y11::~CC1x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y11E(Test__ZN3ccc9CC1x15y11E, "_ZN3ccc9CC1x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y11C1Ev();
extern void _ZN3ccc9CC1x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y11E[] = {
  NSPAIR(_ZN3ccc9CC1x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x15y113pqrEv();
extern void _ZN3ccc9CC1x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y11E[] = {
  {&(_ZTVN3ccc9CC1x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y11E[];
Class_Descriptor cd__ZN3ccc9CC1x15y11E = {  "_ZN3ccc9CC1x15y11E", // class name
  bases__ZN3ccc9CC1x15y11E, 2,
  &(vtc__ZN3ccc9CC1x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y11E),2, //virtual 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  DD1x15y11  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD1x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD1x15y113efgEv
  ~DD1x15y11(); // tgen
  DD1x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y11E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD1x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x15y113pqrEv");}
void  ccc::DD1x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x15y113efgEv");}
ccc::DD1x15y11 ::~DD1x15y11(){ note_dtor("_ZN3ccc9DD1x15y11E", this);} // tgen
ccc::DD1x15y11 ::DD1x15y11(){ note_ctor("_ZN3ccc9DD1x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y11E, buf);
    ::ccc::DD1x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y11E);
    dp->::ccc::DD1x15y11::~DD1x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y11E(Test__ZN3ccc9DD1x15y11E, "_ZN3ccc9DD1x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y11C1Ev();
extern void _ZN3ccc9DD1x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y11E[] = {
  NSPAIR(_ZN3ccc9DD1x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x15y113pqrEv();
extern void _ZN3ccc9DD1x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y11E[] = {
  {&(_ZTVN3ccc9DD1x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y11E[];
Class_Descriptor cd__ZN3ccc9DD1x15y11E = {  "_ZN3ccc9DD1x15y11E", // class name
  bases__ZN3ccc9DD1x15y11E, 2,
  &(vtc__ZN3ccc9DD1x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y11E),2, //virtual 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  CC1x15y12  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC1x15y123abcEv
  ~CC1x15y12(); // tgen
  CC1x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y12E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x15y123abcEv");}
ccc::CC1x15y12 ::~CC1x15y12(){ note_dtor("_ZN3ccc9CC1x15y12E", this);} // tgen
ccc::CC1x15y12 ::CC1x15y12(){ note_ctor("_ZN3ccc9CC1x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y12E, buf);
    ::ccc::CC1x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y12E);
    dp->::ccc::CC1x15y12::~CC1x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y12E(Test__ZN3ccc9CC1x15y12E, "_ZN3ccc9CC1x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y12C1Ev();
extern void _ZN3ccc9CC1x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y12E[] = {
  NSPAIR(_ZN3ccc9CC1x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y12E[];
extern void _ZN3ccc9CC1x15y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y12E[] = {
  {&(_ZTVN3ccc9CC1x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y12E[];
Class_Descriptor cd__ZN3ccc9CC1x15y12E = {  "_ZN3ccc9CC1x15y12E", // class name
  bases__ZN3ccc9CC1x15y12E, 2,
  &(vtc__ZN3ccc9CC1x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y12E),2, //virtual 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  DD1x15y12  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD1x15y123abcEv
  ~DD1x15y12(); // tgen
  DD1x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y12E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD1x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD1x15y123abcEv");}
ccc::DD1x15y12 ::~DD1x15y12(){ note_dtor("_ZN3ccc9DD1x15y12E", this);} // tgen
ccc::DD1x15y12 ::DD1x15y12(){ note_ctor("_ZN3ccc9DD1x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y12E, buf);
    ::ccc::DD1x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y12E);
    dp->::ccc::DD1x15y12::~DD1x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y12E(Test__ZN3ccc9DD1x15y12E, "_ZN3ccc9DD1x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y12C1Ev();
extern void _ZN3ccc9DD1x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y12E[] = {
  NSPAIR(_ZN3ccc9DD1x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y12E[];
extern void _ZN3ccc9DD1x15y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y12E[] = {
  {&(_ZTVN3ccc9DD1x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y12E[];
Class_Descriptor cd__ZN3ccc9DD1x15y12E = {  "_ZN3ccc9DD1x15y12E", // class name
  bases__ZN3ccc9DD1x15y12E, 2,
  &(vtc__ZN3ccc9DD1x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y12E),2, //virtual 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  CC1x15y13  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC1x15y133efgEv
  ~CC1x15y13(); // tgen
  CC1x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y13E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x15y133efgEv");}
ccc::CC1x15y13 ::~CC1x15y13(){ note_dtor("_ZN3ccc9CC1x15y13E", this);} // tgen
ccc::CC1x15y13 ::CC1x15y13(){ note_ctor("_ZN3ccc9CC1x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y13E, buf);
    ::ccc::CC1x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y13E);
    dp->::ccc::CC1x15y13::~CC1x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y13E(Test__ZN3ccc9CC1x15y13E, "_ZN3ccc9CC1x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y13C1Ev();
extern void _ZN3ccc9CC1x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y13E[] = {
  NSPAIR(_ZN3ccc9CC1x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y13E[] = {
  {&(_ZTVN3ccc9CC1x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y13E[];
Class_Descriptor cd__ZN3ccc9CC1x15y13E = {  "_ZN3ccc9CC1x15y13E", // class name
  bases__ZN3ccc9CC1x15y13E, 2,
  &(vtc__ZN3ccc9CC1x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y13E),2, //virtual 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  DD1x15y13  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD1x15y133efgEv
  ~DD1x15y13(); // tgen
  DD1x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y13E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD1x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD1x15y133efgEv");}
ccc::DD1x15y13 ::~DD1x15y13(){ note_dtor("_ZN3ccc9DD1x15y13E", this);} // tgen
ccc::DD1x15y13 ::DD1x15y13(){ note_ctor("_ZN3ccc9DD1x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y13E, buf);
    ::ccc::DD1x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y13E);
    dp->::ccc::DD1x15y13::~DD1x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y13E(Test__ZN3ccc9DD1x15y13E, "_ZN3ccc9DD1x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y13C1Ev();
extern void _ZN3ccc9DD1x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y13E[] = {
  NSPAIR(_ZN3ccc9DD1x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9DD1x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y13E[] = {
  {&(_ZTVN3ccc9DD1x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y13E[];
Class_Descriptor cd__ZN3ccc9DD1x15y13E = {  "_ZN3ccc9DD1x15y13E", // class name
  bases__ZN3ccc9DD1x15y13E, 2,
  &(vtc__ZN3ccc9DD1x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y13E),2, //virtual 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  CC1x15y14  : virtual ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y143pqrEv
  ~CC1x15y14(); // tgen
  CC1x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y14E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y143pqrEv");}
ccc::CC1x15y14 ::~CC1x15y14(){ note_dtor("_ZN3ccc9CC1x15y14E", this);} // tgen
ccc::CC1x15y14 ::CC1x15y14(){ note_ctor("_ZN3ccc9CC1x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y14E, buf);
    ::ccc::CC1x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y14E);
    dp->::ccc::CC1x15y14::~CC1x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y14E(Test__ZN3ccc9CC1x15y14E, "_ZN3ccc9CC1x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y14C1Ev();
extern void _ZN3ccc9CC1x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y14E[] = {
  NSPAIR(_ZN3ccc9CC1x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x15y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y14E[] = {
  {&(_ZTVN3ccc9CC1x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y14E[];
Class_Descriptor cd__ZN3ccc9CC1x15y14E = {  "_ZN3ccc9CC1x15y14E", // class name
  bases__ZN3ccc9CC1x15y14E, 2,
  &(vtc__ZN3ccc9CC1x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y14E),2, //virtual 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  DD1x15y14  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD1x15y143pqrEv
  ~DD1x15y14(); // tgen
  DD1x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y14E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD1x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD1x15y143pqrEv");}
ccc::DD1x15y14 ::~DD1x15y14(){ note_dtor("_ZN3ccc9DD1x15y14E", this);} // tgen
ccc::DD1x15y14 ::DD1x15y14(){ note_ctor("_ZN3ccc9DD1x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y14E, buf);
    ::ccc::DD1x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y14E);
    dp->::ccc::DD1x15y14::~DD1x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y14E(Test__ZN3ccc9DD1x15y14E, "_ZN3ccc9DD1x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y14C1Ev();
extern void _ZN3ccc9DD1x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y14E[] = {
  NSPAIR(_ZN3ccc9DD1x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9DD1x15y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD1x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y14E[] = {
  {&(_ZTVN3ccc9DD1x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y14E[];
Class_Descriptor cd__ZN3ccc9DD1x15y14E = {  "_ZN3ccc9DD1x15y14E", // class name
  bases__ZN3ccc9DD1x15y14E, 2,
  &(vtc__ZN3ccc9DD1x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y14E),2, //virtual 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  CC1x15y15  : virtual ::ccc::AA1 , ::ccc::BB15 {
  ~CC1x15y15(); // tgen
  CC1x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC1x15y15 ::~CC1x15y15(){ note_dtor("_ZN3ccc9CC1x15y15E", this);} // tgen
ccc::CC1x15y15 ::CC1x15y15(){ note_ctor("_ZN3ccc9CC1x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y15E, buf);
    ::ccc::CC1x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y15E);
    dp->::ccc::CC1x15y15::~CC1x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y15E(Test__ZN3ccc9CC1x15y15E, "_ZN3ccc9CC1x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y15C1Ev();
extern void _ZN3ccc9CC1x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y15E[] = {
  NSPAIR(_ZN3ccc9CC1x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC1x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC1x15y15E[] = {
  {&(_ZTVN3ccc9CC1x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC1x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC1x15y15E[];
Class_Descriptor cd__ZN3ccc9CC1x15y15E = {  "_ZN3ccc9CC1x15y15E", // class name
  bases__ZN3ccc9CC1x15y15E, 2,
  &(vtc__ZN3ccc9CC1x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC1x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC1x15y15E),2, //virtual 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  DD1x15y15  : virtual ::ccc::AA1 , virtual ::ccc::BB15 {
  ~DD1x15y15(); // tgen
  DD1x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD1x15y15E) C1{ VBC2{ v1 v2 v3} VBC3{}}
}
namespace ccc { 
ccc::DD1x15y15 ::~DD1x15y15(){ note_dtor("_ZN3ccc9DD1x15y15E", this);} // tgen
ccc::DD1x15y15 ::DD1x15y15(){ note_ctor("_ZN3ccc9DD1x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD1x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD1x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD1x15y15E, buf);
    ::ccc::DD1x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD1x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD1x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD1x15y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9DD1x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD1x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD1x15y15E);
    dp->::ccc::DD1x15y15::~DD1x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD1x15y15E(Test__ZN3ccc9DD1x15y15E, "_ZN3ccc9DD1x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD1x15y15C1Ev();
extern void _ZN3ccc9DD1x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD1x15y15E[] = {
  NSPAIR(_ZN3ccc9DD1x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD1x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD1x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD1x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD1x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD1x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD1x15y15E[] = {
  {&(_ZTVN3ccc9DD1x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD1x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD1x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD1x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD1x15y15E[];
Class_Descriptor cd__ZN3ccc9DD1x15y15E = {  "_ZN3ccc9DD1x15y15E", // class name
  bases__ZN3ccc9DD1x15y15E, 2,
  &(vtc__ZN3ccc9DD1x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD1x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD1x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD1x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD1x15y15E),2, //virtual 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  CC2x0y0  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y03pqrEv
  ~CC2x0y0(); // tgen
  CC2x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y0E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y03abcEv");}
void  ccc::CC2x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y03efgEv");}
void  ccc::CC2x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y03pqrEv");}
ccc::CC2x0y0 ::~CC2x0y0(){ note_dtor("_ZN3ccc7CC2x0y0E", this);} // tgen
ccc::CC2x0y0 ::CC2x0y0(){ note_ctor("_ZN3ccc7CC2x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y0E, buf);
    ::ccc::CC2x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y0E);
    dp->::ccc::CC2x0y0::~CC2x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y0E(Test__ZN3ccc7CC2x0y0E, "_ZN3ccc7CC2x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y0C1Ev();
extern void _ZN3ccc7CC2x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y0E[] = {
  NSPAIR(_ZN3ccc7CC2x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y0E[];
extern void _ZN3ccc7CC2x0y03abcEv();
extern void _ZN3ccc7CC2x0y03efgEv();
extern void _ZN3ccc7CC2x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y03efgEv,_ZTv0_n12_N3ccc7CC2x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03efgEv,_ZThn4_N3ccc7CC2x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y03abcEv,_ZTv0_n16_N3ccc7CC2x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03abcEv,_ZThn4_N3ccc7CC2x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y03pqrEv,_ZTv0_n20_N3ccc7CC2x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03pqrEv,_ZThn4_N3ccc7CC2x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y03efgEv,_ZTv0_n12_N3ccc7CC2x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y03abcEv,_ZTv0_n16_N3ccc7CC2x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y03pqrEv,_ZTv0_n20_N3ccc7CC2x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y0E[] = {
  {&(_ZTVN3ccc7CC2x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y0E[];
static VTBL_ENTRY alt_thunk_names865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y03pqrEv,_ZTv0_n20_N3ccc7CC2x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y03pqrEv,_ZThn4_N3ccc7CC2x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y03abcEv,_ZTv0_n16_N3ccc7CC2x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y03abcEv,_ZThn4_N3ccc7CC2x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y03efgEv,_ZTv0_n12_N3ccc7CC2x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y03efgEv,_ZThn4_N3ccc7CC2x0y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y0E = {  "_ZN3ccc7CC2x0y0E", // class name
  bases__ZN3ccc7CC2x0y0E, 2,
  &(vtc__ZN3ccc7CC2x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y0E),2, //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  DD2x0y0  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD2x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y03pqrEv
  ~DD2x0y0(); // tgen
  DD2x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y03abcEv");}
void  ccc::DD2x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y03efgEv");}
void  ccc::DD2x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y03pqrEv");}
ccc::DD2x0y0 ::~DD2x0y0(){ note_dtor("_ZN3ccc7DD2x0y0E", this);} // tgen
ccc::DD2x0y0 ::DD2x0y0(){ note_ctor("_ZN3ccc7DD2x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y0E, buf);
    ::ccc::DD2x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y0E);
    dp->::ccc::DD2x0y0::~DD2x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y0E(Test__ZN3ccc7DD2x0y0E, "_ZN3ccc7DD2x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y0C1Ev();
extern void _ZN3ccc7DD2x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y0E[] = {
  NSPAIR(_ZN3ccc7DD2x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y0E[];
extern void _ZN3ccc7DD2x0y03efgEv();
extern void _ZN3ccc7DD2x0y03abcEv();
extern void _ZN3ccc7DD2x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y03abcEv,_ZTv0_n12_N3ccc7DD2x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y03abcEv,_ZThn4_N3ccc7DD2x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y03efgEv,_ZTv0_n16_N3ccc7DD2x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y03efgEv,_ZThn4_N3ccc7DD2x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y03pqrEv,_ZTv0_n20_N3ccc7DD2x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y03pqrEv,_ZThn4_N3ccc7DD2x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y03abcEv,_ZTv0_n12_N3ccc7DD2x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y03efgEv,_ZTv0_n16_N3ccc7DD2x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y03pqrEv,_ZTv0_n20_N3ccc7DD2x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y0E[] = {
  {&(_ZTVN3ccc7DD2x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y0E[];
static VTBL_ENTRY alt_thunk_names866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y03pqrEv,_ZTv0_n20_N3ccc7DD2x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y03pqrEv,_ZThn4_N3ccc7DD2x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y03efgEv,_ZTv0_n16_N3ccc7DD2x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y03efgEv,_ZThn4_N3ccc7DD2x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y03abcEv,_ZTv0_n12_N3ccc7DD2x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y03abcEv,_ZThn4_N3ccc7DD2x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y0E = {  "_ZN3ccc7DD2x0y0E", // class name
  bases__ZN3ccc7DD2x0y0E, 2,
  &(vtc__ZN3ccc7DD2x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y0E),3, //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  CC2x0y1  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x0y13efgEv
  ~CC2x0y1(); // tgen
  CC2x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y1E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y13abcEv");}
void  ccc::CC2x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y13pqrEv");}
void  ccc::CC2x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y13efgEv");}
ccc::CC2x0y1 ::~CC2x0y1(){ note_dtor("_ZN3ccc7CC2x0y1E", this);} // tgen
ccc::CC2x0y1 ::CC2x0y1(){ note_ctor("_ZN3ccc7CC2x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y1E, buf);
    ::ccc::CC2x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y1E);
    dp->::ccc::CC2x0y1::~CC2x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y1E(Test__ZN3ccc7CC2x0y1E, "_ZN3ccc7CC2x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y1C1Ev();
extern void _ZN3ccc7CC2x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y1E[] = {
  NSPAIR(_ZN3ccc7CC2x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y1E[];
extern void _ZN3ccc7CC2x0y13abcEv();
extern void _ZN3ccc7CC2x0y13efgEv();
extern void _ZN3ccc7CC2x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y13efgEv,_ZTv0_n12_N3ccc7CC2x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13efgEv,_ZThn4_N3ccc7CC2x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y13abcEv,_ZTv0_n16_N3ccc7CC2x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13abcEv,_ZThn4_N3ccc7CC2x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y13pqrEv,_ZTv0_n20_N3ccc7CC2x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13pqrEv,_ZThn4_N3ccc7CC2x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y13efgEv,_ZTv0_n12_N3ccc7CC2x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y13abcEv,_ZTv0_n16_N3ccc7CC2x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y13pqrEv,_ZTv0_n20_N3ccc7CC2x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y1E[] = {
  {&(_ZTVN3ccc7CC2x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y1E[];
static VTBL_ENTRY alt_thunk_names867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y13pqrEv,_ZTv0_n20_N3ccc7CC2x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y13pqrEv,_ZThn4_N3ccc7CC2x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y13abcEv,_ZTv0_n16_N3ccc7CC2x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y13abcEv,_ZThn4_N3ccc7CC2x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y13efgEv,_ZTv0_n12_N3ccc7CC2x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y13efgEv,_ZThn4_N3ccc7CC2x0y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y1E = {  "_ZN3ccc7CC2x0y1E", // class name
  bases__ZN3ccc7CC2x0y1E, 2,
  &(vtc__ZN3ccc7CC2x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y1E),2, //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  DD2x0y1  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD2x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x0y13efgEv
  ~DD2x0y1(); // tgen
  DD2x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y13abcEv");}
void  ccc::DD2x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y13pqrEv");}
void  ccc::DD2x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y13efgEv");}
ccc::DD2x0y1 ::~DD2x0y1(){ note_dtor("_ZN3ccc7DD2x0y1E", this);} // tgen
ccc::DD2x0y1 ::DD2x0y1(){ note_ctor("_ZN3ccc7DD2x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y1E, buf);
    ::ccc::DD2x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y1E);
    dp->::ccc::DD2x0y1::~DD2x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y1E(Test__ZN3ccc7DD2x0y1E, "_ZN3ccc7DD2x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y1C1Ev();
extern void _ZN3ccc7DD2x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y1E[] = {
  NSPAIR(_ZN3ccc7DD2x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y1E[];
extern void _ZN3ccc7DD2x0y13efgEv();
extern void _ZN3ccc7DD2x0y13abcEv();
extern void _ZN3ccc7DD2x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y13abcEv,_ZTv0_n12_N3ccc7DD2x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y13abcEv,_ZThn4_N3ccc7DD2x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y13efgEv,_ZTv0_n16_N3ccc7DD2x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y13efgEv,_ZThn4_N3ccc7DD2x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y13pqrEv,_ZTv0_n20_N3ccc7DD2x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y13pqrEv,_ZThn4_N3ccc7DD2x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y13abcEv,_ZTv0_n12_N3ccc7DD2x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y13efgEv,_ZTv0_n16_N3ccc7DD2x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y13pqrEv,_ZTv0_n20_N3ccc7DD2x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y1E[] = {
  {&(_ZTVN3ccc7DD2x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y1E[];
static VTBL_ENTRY alt_thunk_names868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y13pqrEv,_ZTv0_n20_N3ccc7DD2x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y13pqrEv,_ZThn4_N3ccc7DD2x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y13efgEv,_ZTv0_n16_N3ccc7DD2x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y13efgEv,_ZThn4_N3ccc7DD2x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y13abcEv,_ZTv0_n12_N3ccc7DD2x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y13abcEv,_ZThn4_N3ccc7DD2x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y1E = {  "_ZN3ccc7DD2x0y1E", // class name
  bases__ZN3ccc7DD2x0y1E, 2,
  &(vtc__ZN3ccc7DD2x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y1E),3, //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  CC2x0y2  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y23pqrEv
  ~CC2x0y2(); // tgen
  CC2x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y2E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y23efgEv");}
void  ccc::CC2x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y23abcEv");}
void  ccc::CC2x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y23pqrEv");}
ccc::CC2x0y2 ::~CC2x0y2(){ note_dtor("_ZN3ccc7CC2x0y2E", this);} // tgen
ccc::CC2x0y2 ::CC2x0y2(){ note_ctor("_ZN3ccc7CC2x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y2E, buf);
    ::ccc::CC2x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y2E);
    dp->::ccc::CC2x0y2::~CC2x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y2E(Test__ZN3ccc7CC2x0y2E, "_ZN3ccc7CC2x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y2C1Ev();
extern void _ZN3ccc7CC2x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y2E[] = {
  NSPAIR(_ZN3ccc7CC2x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y2E[];
extern void _ZN3ccc7CC2x0y23abcEv();
extern void _ZN3ccc7CC2x0y23efgEv();
extern void _ZN3ccc7CC2x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y23efgEv,_ZTv0_n12_N3ccc7CC2x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23efgEv,_ZThn4_N3ccc7CC2x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y23abcEv,_ZTv0_n16_N3ccc7CC2x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23abcEv,_ZThn4_N3ccc7CC2x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y23pqrEv,_ZTv0_n20_N3ccc7CC2x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23pqrEv,_ZThn4_N3ccc7CC2x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y23efgEv,_ZTv0_n12_N3ccc7CC2x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y23abcEv,_ZTv0_n16_N3ccc7CC2x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y23pqrEv,_ZTv0_n20_N3ccc7CC2x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y2E[] = {
  {&(_ZTVN3ccc7CC2x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y2E[];
static VTBL_ENTRY alt_thunk_names869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y23pqrEv,_ZTv0_n20_N3ccc7CC2x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y23pqrEv,_ZThn4_N3ccc7CC2x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y23abcEv,_ZTv0_n16_N3ccc7CC2x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y23abcEv,_ZThn4_N3ccc7CC2x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y23efgEv,_ZTv0_n12_N3ccc7CC2x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y23efgEv,_ZThn4_N3ccc7CC2x0y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y2E = {  "_ZN3ccc7CC2x0y2E", // class name
  bases__ZN3ccc7CC2x0y2E, 2,
  &(vtc__ZN3ccc7CC2x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y2E),2, //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  DD2x0y2  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD2x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y23pqrEv
  ~DD2x0y2(); // tgen
  DD2x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y23efgEv");}
void  ccc::DD2x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y23abcEv");}
void  ccc::DD2x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y23pqrEv");}
ccc::DD2x0y2 ::~DD2x0y2(){ note_dtor("_ZN3ccc7DD2x0y2E", this);} // tgen
ccc::DD2x0y2 ::DD2x0y2(){ note_ctor("_ZN3ccc7DD2x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y2E, buf);
    ::ccc::DD2x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y2E);
    dp->::ccc::DD2x0y2::~DD2x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y2E(Test__ZN3ccc7DD2x0y2E, "_ZN3ccc7DD2x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y2C1Ev();
extern void _ZN3ccc7DD2x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y2E[] = {
  NSPAIR(_ZN3ccc7DD2x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y2E[];
extern void _ZN3ccc7DD2x0y23efgEv();
extern void _ZN3ccc7DD2x0y23abcEv();
extern void _ZN3ccc7DD2x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y23abcEv,_ZTv0_n12_N3ccc7DD2x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y23abcEv,_ZThn4_N3ccc7DD2x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y23efgEv,_ZTv0_n16_N3ccc7DD2x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y23efgEv,_ZThn4_N3ccc7DD2x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y23pqrEv,_ZTv0_n20_N3ccc7DD2x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y23pqrEv,_ZThn4_N3ccc7DD2x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y23abcEv,_ZTv0_n12_N3ccc7DD2x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y23efgEv,_ZTv0_n16_N3ccc7DD2x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y23pqrEv,_ZTv0_n20_N3ccc7DD2x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y2E[] = {
  {&(_ZTVN3ccc7DD2x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y2E[];
static VTBL_ENTRY alt_thunk_names870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y23pqrEv,_ZTv0_n20_N3ccc7DD2x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y23pqrEv,_ZThn4_N3ccc7DD2x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y23efgEv,_ZTv0_n16_N3ccc7DD2x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y23efgEv,_ZThn4_N3ccc7DD2x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y23abcEv,_ZTv0_n12_N3ccc7DD2x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y23abcEv,_ZThn4_N3ccc7DD2x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y2E = {  "_ZN3ccc7DD2x0y2E", // class name
  bases__ZN3ccc7DD2x0y2E, 2,
  &(vtc__ZN3ccc7DD2x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y2E),3, //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  CC2x0y3  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x0y33abcEv
  ~CC2x0y3(); // tgen
  CC2x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y3E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y33efgEv");}
void  ccc::CC2x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y33pqrEv");}
void  ccc::CC2x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y33abcEv");}
ccc::CC2x0y3 ::~CC2x0y3(){ note_dtor("_ZN3ccc7CC2x0y3E", this);} // tgen
ccc::CC2x0y3 ::CC2x0y3(){ note_ctor("_ZN3ccc7CC2x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y3E, buf);
    ::ccc::CC2x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y3E);
    dp->::ccc::CC2x0y3::~CC2x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y3E(Test__ZN3ccc7CC2x0y3E, "_ZN3ccc7CC2x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y3C1Ev();
extern void _ZN3ccc7CC2x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y3E[] = {
  NSPAIR(_ZN3ccc7CC2x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y3E[];
extern void _ZN3ccc7CC2x0y33abcEv();
extern void _ZN3ccc7CC2x0y33efgEv();
extern void _ZN3ccc7CC2x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y33efgEv,_ZTv0_n12_N3ccc7CC2x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33efgEv,_ZThn4_N3ccc7CC2x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y33abcEv,_ZTv0_n16_N3ccc7CC2x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33abcEv,_ZThn4_N3ccc7CC2x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y33pqrEv,_ZTv0_n20_N3ccc7CC2x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33pqrEv,_ZThn4_N3ccc7CC2x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y33efgEv,_ZTv0_n12_N3ccc7CC2x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y33abcEv,_ZTv0_n16_N3ccc7CC2x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y33pqrEv,_ZTv0_n20_N3ccc7CC2x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y3E[] = {
  {&(_ZTVN3ccc7CC2x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y3E[];
static VTBL_ENTRY alt_thunk_names871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y33pqrEv,_ZTv0_n20_N3ccc7CC2x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y33pqrEv,_ZThn4_N3ccc7CC2x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y33abcEv,_ZTv0_n16_N3ccc7CC2x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y33abcEv,_ZThn4_N3ccc7CC2x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y33efgEv,_ZTv0_n12_N3ccc7CC2x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y33efgEv,_ZThn4_N3ccc7CC2x0y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y3E = {  "_ZN3ccc7CC2x0y3E", // class name
  bases__ZN3ccc7CC2x0y3E, 2,
  &(vtc__ZN3ccc7CC2x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y3E),2, //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  DD2x0y3  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD2x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x0y33abcEv
  ~DD2x0y3(); // tgen
  DD2x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y33efgEv");}
void  ccc::DD2x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y33pqrEv");}
void  ccc::DD2x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y33abcEv");}
ccc::DD2x0y3 ::~DD2x0y3(){ note_dtor("_ZN3ccc7DD2x0y3E", this);} // tgen
ccc::DD2x0y3 ::DD2x0y3(){ note_ctor("_ZN3ccc7DD2x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y3E, buf);
    ::ccc::DD2x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y3E);
    dp->::ccc::DD2x0y3::~DD2x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y3E(Test__ZN3ccc7DD2x0y3E, "_ZN3ccc7DD2x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y3C1Ev();
extern void _ZN3ccc7DD2x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y3E[] = {
  NSPAIR(_ZN3ccc7DD2x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y3E[];
extern void _ZN3ccc7DD2x0y33efgEv();
extern void _ZN3ccc7DD2x0y33abcEv();
extern void _ZN3ccc7DD2x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y33abcEv,_ZTv0_n12_N3ccc7DD2x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y33abcEv,_ZThn4_N3ccc7DD2x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y33efgEv,_ZTv0_n16_N3ccc7DD2x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y33efgEv,_ZThn4_N3ccc7DD2x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y33pqrEv,_ZTv0_n20_N3ccc7DD2x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y33pqrEv,_ZThn4_N3ccc7DD2x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y33abcEv,_ZTv0_n12_N3ccc7DD2x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y33efgEv,_ZTv0_n16_N3ccc7DD2x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y33pqrEv,_ZTv0_n20_N3ccc7DD2x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y3E[] = {
  {&(_ZTVN3ccc7DD2x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y3E[];
static VTBL_ENTRY alt_thunk_names872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y33pqrEv,_ZTv0_n20_N3ccc7DD2x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y33pqrEv,_ZThn4_N3ccc7DD2x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y33efgEv,_ZTv0_n16_N3ccc7DD2x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y33efgEv,_ZThn4_N3ccc7DD2x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y33abcEv,_ZTv0_n12_N3ccc7DD2x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y33abcEv,_ZThn4_N3ccc7DD2x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y3E = {  "_ZN3ccc7DD2x0y3E", // class name
  bases__ZN3ccc7DD2x0y3E, 2,
  &(vtc__ZN3ccc7DD2x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y3E),3, //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  CC2x0y4  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC2x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y43efgEv
  ~CC2x0y4(); // tgen
  CC2x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y4E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y43pqrEv");}
void  ccc::CC2x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y43abcEv");}
void  ccc::CC2x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y43efgEv");}
ccc::CC2x0y4 ::~CC2x0y4(){ note_dtor("_ZN3ccc7CC2x0y4E", this);} // tgen
ccc::CC2x0y4 ::CC2x0y4(){ note_ctor("_ZN3ccc7CC2x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y4E, buf);
    ::ccc::CC2x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y4E);
    dp->::ccc::CC2x0y4::~CC2x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y4E(Test__ZN3ccc7CC2x0y4E, "_ZN3ccc7CC2x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y4C1Ev();
extern void _ZN3ccc7CC2x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y4E[] = {
  NSPAIR(_ZN3ccc7CC2x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y4E[];
extern void _ZN3ccc7CC2x0y43abcEv();
extern void _ZN3ccc7CC2x0y43efgEv();
extern void _ZN3ccc7CC2x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y43efgEv,_ZTv0_n12_N3ccc7CC2x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43efgEv,_ZThn4_N3ccc7CC2x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y43abcEv,_ZTv0_n16_N3ccc7CC2x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43abcEv,_ZThn4_N3ccc7CC2x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y43pqrEv,_ZTv0_n20_N3ccc7CC2x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43pqrEv,_ZThn4_N3ccc7CC2x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y43efgEv,_ZTv0_n12_N3ccc7CC2x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y43abcEv,_ZTv0_n16_N3ccc7CC2x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y43pqrEv,_ZTv0_n20_N3ccc7CC2x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y4E[] = {
  {&(_ZTVN3ccc7CC2x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y4E[];
static VTBL_ENTRY alt_thunk_names873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y43pqrEv,_ZTv0_n20_N3ccc7CC2x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y43pqrEv,_ZThn4_N3ccc7CC2x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y43abcEv,_ZTv0_n16_N3ccc7CC2x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y43abcEv,_ZThn4_N3ccc7CC2x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y43efgEv,_ZTv0_n12_N3ccc7CC2x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y43efgEv,_ZThn4_N3ccc7CC2x0y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y4E = {  "_ZN3ccc7CC2x0y4E", // class name
  bases__ZN3ccc7CC2x0y4E, 2,
  &(vtc__ZN3ccc7CC2x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y4E),2, //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  DD2x0y4  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD2x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x0y43efgEv
  ~DD2x0y4(); // tgen
  DD2x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y43pqrEv");}
void  ccc::DD2x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y43abcEv");}
void  ccc::DD2x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y43efgEv");}
ccc::DD2x0y4 ::~DD2x0y4(){ note_dtor("_ZN3ccc7DD2x0y4E", this);} // tgen
ccc::DD2x0y4 ::DD2x0y4(){ note_ctor("_ZN3ccc7DD2x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y4E, buf);
    ::ccc::DD2x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y4E);
    dp->::ccc::DD2x0y4::~DD2x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y4E(Test__ZN3ccc7DD2x0y4E, "_ZN3ccc7DD2x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y4C1Ev();
extern void _ZN3ccc7DD2x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y4E[] = {
  NSPAIR(_ZN3ccc7DD2x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y4E[];
extern void _ZN3ccc7DD2x0y43efgEv();
extern void _ZN3ccc7DD2x0y43abcEv();
extern void _ZN3ccc7DD2x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y43abcEv,_ZTv0_n12_N3ccc7DD2x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y43abcEv,_ZThn4_N3ccc7DD2x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y43efgEv,_ZTv0_n16_N3ccc7DD2x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y43efgEv,_ZThn4_N3ccc7DD2x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y43pqrEv,_ZTv0_n20_N3ccc7DD2x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y43pqrEv,_ZThn4_N3ccc7DD2x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y43abcEv,_ZTv0_n12_N3ccc7DD2x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y43efgEv,_ZTv0_n16_N3ccc7DD2x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y43pqrEv,_ZTv0_n20_N3ccc7DD2x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y4E[] = {
  {&(_ZTVN3ccc7DD2x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y4E[];
static VTBL_ENTRY alt_thunk_names874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y43pqrEv,_ZTv0_n20_N3ccc7DD2x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y43pqrEv,_ZThn4_N3ccc7DD2x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y43efgEv,_ZTv0_n16_N3ccc7DD2x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y43efgEv,_ZThn4_N3ccc7DD2x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y43abcEv,_ZTv0_n12_N3ccc7DD2x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y43abcEv,_ZThn4_N3ccc7DD2x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y4E = {  "_ZN3ccc7DD2x0y4E", // class name
  bases__ZN3ccc7DD2x0y4E, 2,
  &(vtc__ZN3ccc7DD2x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y4E),3, //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  CC2x0y5  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC2x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y53abcEv
  ~CC2x0y5(); // tgen
  CC2x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y5E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y53pqrEv");}
void  ccc::CC2x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y53efgEv");}
void  ccc::CC2x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y53abcEv");}
ccc::CC2x0y5 ::~CC2x0y5(){ note_dtor("_ZN3ccc7CC2x0y5E", this);} // tgen
ccc::CC2x0y5 ::CC2x0y5(){ note_ctor("_ZN3ccc7CC2x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y5E, buf);
    ::ccc::CC2x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y5E);
    dp->::ccc::CC2x0y5::~CC2x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y5E(Test__ZN3ccc7CC2x0y5E, "_ZN3ccc7CC2x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y5C1Ev();
extern void _ZN3ccc7CC2x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y5E[] = {
  NSPAIR(_ZN3ccc7CC2x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y5E[];
extern void _ZN3ccc7CC2x0y53abcEv();
extern void _ZN3ccc7CC2x0y53efgEv();
extern void _ZN3ccc7CC2x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y53efgEv,_ZTv0_n12_N3ccc7CC2x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53efgEv,_ZThn4_N3ccc7CC2x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y53abcEv,_ZTv0_n16_N3ccc7CC2x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53abcEv,_ZThn4_N3ccc7CC2x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y53pqrEv,_ZTv0_n20_N3ccc7CC2x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53pqrEv,_ZThn4_N3ccc7CC2x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y53efgEv,_ZTv0_n12_N3ccc7CC2x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y53abcEv,_ZTv0_n16_N3ccc7CC2x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y53pqrEv,_ZTv0_n20_N3ccc7CC2x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y5E[] = {
  {&(_ZTVN3ccc7CC2x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y5E[];
static VTBL_ENTRY alt_thunk_names875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y53pqrEv,_ZTv0_n20_N3ccc7CC2x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y53pqrEv,_ZThn4_N3ccc7CC2x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y53abcEv,_ZTv0_n16_N3ccc7CC2x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y53abcEv,_ZThn4_N3ccc7CC2x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y53efgEv,_ZTv0_n12_N3ccc7CC2x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y53efgEv,_ZThn4_N3ccc7CC2x0y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y5E = {  "_ZN3ccc7CC2x0y5E", // class name
  bases__ZN3ccc7CC2x0y5E, 2,
  &(vtc__ZN3ccc7CC2x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y5E),2, //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  DD2x0y5  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD2x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x0y53abcEv
  ~DD2x0y5(); // tgen
  DD2x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y53pqrEv");}
void  ccc::DD2x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y53efgEv");}
void  ccc::DD2x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y53abcEv");}
ccc::DD2x0y5 ::~DD2x0y5(){ note_dtor("_ZN3ccc7DD2x0y5E", this);} // tgen
ccc::DD2x0y5 ::DD2x0y5(){ note_ctor("_ZN3ccc7DD2x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y5E, buf);
    ::ccc::DD2x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y5E);
    dp->::ccc::DD2x0y5::~DD2x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y5E(Test__ZN3ccc7DD2x0y5E, "_ZN3ccc7DD2x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y5C1Ev();
extern void _ZN3ccc7DD2x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y5E[] = {
  NSPAIR(_ZN3ccc7DD2x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y5E[];
extern void _ZN3ccc7DD2x0y53efgEv();
extern void _ZN3ccc7DD2x0y53abcEv();
extern void _ZN3ccc7DD2x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y53abcEv,_ZTv0_n12_N3ccc7DD2x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y53abcEv,_ZThn4_N3ccc7DD2x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y53efgEv,_ZTv0_n16_N3ccc7DD2x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y53efgEv,_ZThn4_N3ccc7DD2x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y53pqrEv,_ZTv0_n20_N3ccc7DD2x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y53pqrEv,_ZThn4_N3ccc7DD2x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y53abcEv,_ZTv0_n12_N3ccc7DD2x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y53efgEv,_ZTv0_n16_N3ccc7DD2x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y53pqrEv,_ZTv0_n20_N3ccc7DD2x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y5E[] = {
  {&(_ZTVN3ccc7DD2x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y5E[];
static VTBL_ENTRY alt_thunk_names876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y53pqrEv,_ZTv0_n20_N3ccc7DD2x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y53pqrEv,_ZThn4_N3ccc7DD2x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y53efgEv,_ZTv0_n16_N3ccc7DD2x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y53efgEv,_ZThn4_N3ccc7DD2x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y53abcEv,_ZTv0_n12_N3ccc7DD2x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y53abcEv,_ZThn4_N3ccc7DD2x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y5E = {  "_ZN3ccc7DD2x0y5E", // class name
  bases__ZN3ccc7DD2x0y5E, 2,
  &(vtc__ZN3ccc7DD2x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y5E),3, //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  CC2x0y6  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y63efgEv
  ~CC2x0y6(); // tgen
  CC2x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y6E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y63abcEv");}
void  ccc::CC2x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y63efgEv");}
ccc::CC2x0y6 ::~CC2x0y6(){ note_dtor("_ZN3ccc7CC2x0y6E", this);} // tgen
ccc::CC2x0y6 ::CC2x0y6(){ note_ctor("_ZN3ccc7CC2x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y6E, buf);
    ::ccc::CC2x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y6E);
    dp->::ccc::CC2x0y6::~CC2x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y6E(Test__ZN3ccc7CC2x0y6E, "_ZN3ccc7CC2x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y6C1Ev();
extern void _ZN3ccc7CC2x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y6E[] = {
  NSPAIR(_ZN3ccc7CC2x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y6E[];
extern void _ZN3ccc7CC2x0y63abcEv();
extern void _ZN3ccc7CC2x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y63efgEv,_ZTv0_n12_N3ccc7CC2x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y63efgEv,_ZThn4_N3ccc7CC2x0y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y63abcEv,_ZTv0_n16_N3ccc7CC2x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y63abcEv,_ZThn4_N3ccc7CC2x0y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y63efgEv,_ZTv0_n12_N3ccc7CC2x0y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y63abcEv,_ZTv0_n16_N3ccc7CC2x0y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y6E[] = {
  {&(_ZTVN3ccc7CC2x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y6E[];
static VTBL_ENTRY alt_thunk_names877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y63abcEv,_ZTv0_n16_N3ccc7CC2x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y63abcEv,_ZThn4_N3ccc7CC2x0y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y63efgEv,_ZTv0_n12_N3ccc7CC2x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y63efgEv,_ZThn4_N3ccc7CC2x0y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y6E = {  "_ZN3ccc7CC2x0y6E", // class name
  bases__ZN3ccc7CC2x0y6E, 2,
  &(vtc__ZN3ccc7CC2x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y6E),2, //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  DD2x0y6  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD2x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x0y63efgEv
  ~DD2x0y6(); // tgen
  DD2x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y63abcEv");}
void  ccc::DD2x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y63efgEv");}
ccc::DD2x0y6 ::~DD2x0y6(){ note_dtor("_ZN3ccc7DD2x0y6E", this);} // tgen
ccc::DD2x0y6 ::DD2x0y6(){ note_ctor("_ZN3ccc7DD2x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y6E, buf);
    ::ccc::DD2x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y6E);
    dp->::ccc::DD2x0y6::~DD2x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y6E(Test__ZN3ccc7DD2x0y6E, "_ZN3ccc7DD2x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y6C1Ev();
extern void _ZN3ccc7DD2x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y6E[] = {
  NSPAIR(_ZN3ccc7DD2x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y6E[];
extern void _ZN3ccc7DD2x0y63efgEv();
extern void _ZN3ccc7DD2x0y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y63abcEv,_ZTv0_n12_N3ccc7DD2x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y63abcEv,_ZThn4_N3ccc7DD2x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y63efgEv,_ZTv0_n16_N3ccc7DD2x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y63efgEv,_ZThn4_N3ccc7DD2x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y63abcEv,_ZTv0_n12_N3ccc7DD2x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y63efgEv,_ZTv0_n16_N3ccc7DD2x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y6E[] = {
  {&(_ZTVN3ccc7DD2x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y6E[];
static VTBL_ENTRY alt_thunk_names878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y63efgEv,_ZTv0_n16_N3ccc7DD2x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y63efgEv,_ZThn4_N3ccc7DD2x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y63abcEv,_ZTv0_n12_N3ccc7DD2x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y63abcEv,_ZThn4_N3ccc7DD2x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y6E = {  "_ZN3ccc7DD2x0y6E", // class name
  bases__ZN3ccc7DD2x0y6E, 2,
  &(vtc__ZN3ccc7DD2x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y6E),3, //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  CC2x0y7  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y73pqrEv
  ~CC2x0y7(); // tgen
  CC2x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y7E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y73abcEv");}
void  ccc::CC2x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y73pqrEv");}
ccc::CC2x0y7 ::~CC2x0y7(){ note_dtor("_ZN3ccc7CC2x0y7E", this);} // tgen
ccc::CC2x0y7 ::CC2x0y7(){ note_ctor("_ZN3ccc7CC2x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y7E, buf);
    ::ccc::CC2x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y7E);
    dp->::ccc::CC2x0y7::~CC2x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y7E(Test__ZN3ccc7CC2x0y7E, "_ZN3ccc7CC2x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y7C1Ev();
extern void _ZN3ccc7CC2x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y7E[] = {
  NSPAIR(_ZN3ccc7CC2x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y7E[];
extern void _ZN3ccc7CC2x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC2x0y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y73abcEv,_ZTv0_n16_N3ccc7CC2x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y73abcEv,_ZThn4_N3ccc7CC2x0y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y73pqrEv,_ZTv0_n20_N3ccc7CC2x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y73pqrEv,_ZThn4_N3ccc7CC2x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y73abcEv,_ZTv0_n16_N3ccc7CC2x0y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y73pqrEv,_ZTv0_n20_N3ccc7CC2x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y7E[] = {
  {&(_ZTVN3ccc7CC2x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y7E[];
static VTBL_ENTRY alt_thunk_names879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y73pqrEv,_ZTv0_n20_N3ccc7CC2x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y73pqrEv,_ZThn4_N3ccc7CC2x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y73abcEv,_ZTv0_n16_N3ccc7CC2x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y73abcEv,_ZThn4_N3ccc7CC2x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y7E = {  "_ZN3ccc7CC2x0y7E", // class name
  bases__ZN3ccc7CC2x0y7E, 2,
  &(vtc__ZN3ccc7CC2x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y7E),2, //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  DD2x0y7  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD2x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y73pqrEv
  ~DD2x0y7(); // tgen
  DD2x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y73abcEv");}
void  ccc::DD2x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y73pqrEv");}
ccc::DD2x0y7 ::~DD2x0y7(){ note_dtor("_ZN3ccc7DD2x0y7E", this);} // tgen
ccc::DD2x0y7 ::DD2x0y7(){ note_ctor("_ZN3ccc7DD2x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y7E, buf);
    ::ccc::DD2x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y7E);
    dp->::ccc::DD2x0y7::~DD2x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y7E(Test__ZN3ccc7DD2x0y7E, "_ZN3ccc7DD2x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y7C1Ev();
extern void _ZN3ccc7DD2x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y7E[] = {
  NSPAIR(_ZN3ccc7DD2x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x0y73abcEv();
extern void _ZN3ccc7DD2x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y73abcEv,_ZTv0_n12_N3ccc7DD2x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y73abcEv,_ZThn4_N3ccc7DD2x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y73pqrEv,_ZTv0_n20_N3ccc7DD2x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y73pqrEv,_ZThn4_N3ccc7DD2x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y73abcEv,_ZTv0_n12_N3ccc7DD2x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y73pqrEv,_ZTv0_n20_N3ccc7DD2x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y7E[] = {
  {&(_ZTVN3ccc7DD2x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y7E[];
static VTBL_ENTRY alt_thunk_names880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y73pqrEv,_ZTv0_n20_N3ccc7DD2x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y73pqrEv,_ZThn4_N3ccc7DD2x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y73abcEv,_ZTv0_n12_N3ccc7DD2x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y73abcEv,_ZThn4_N3ccc7DD2x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y7E = {  "_ZN3ccc7DD2x0y7E", // class name
  bases__ZN3ccc7DD2x0y7E, 2,
  &(vtc__ZN3ccc7DD2x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y7E),3, //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  CC2x0y8  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y83abcEv
  ~CC2x0y8(); // tgen
  CC2x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y8E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y83efgEv");}
void  ccc::CC2x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y83abcEv");}
ccc::CC2x0y8 ::~CC2x0y8(){ note_dtor("_ZN3ccc7CC2x0y8E", this);} // tgen
ccc::CC2x0y8 ::CC2x0y8(){ note_ctor("_ZN3ccc7CC2x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y8E, buf);
    ::ccc::CC2x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y8E);
    dp->::ccc::CC2x0y8::~CC2x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y8E(Test__ZN3ccc7CC2x0y8E, "_ZN3ccc7CC2x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y8C1Ev();
extern void _ZN3ccc7CC2x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y8E[] = {
  NSPAIR(_ZN3ccc7CC2x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y8E[];
extern void _ZN3ccc7CC2x0y83abcEv();
extern void _ZN3ccc7CC2x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y83efgEv,_ZTv0_n12_N3ccc7CC2x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y83efgEv,_ZThn4_N3ccc7CC2x0y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x0y83abcEv,_ZTv0_n16_N3ccc7CC2x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y83abcEv,_ZThn4_N3ccc7CC2x0y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y83efgEv,_ZTv0_n12_N3ccc7CC2x0y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x0y83abcEv,_ZTv0_n16_N3ccc7CC2x0y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y8E[] = {
  {&(_ZTVN3ccc7CC2x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y8E[];
static VTBL_ENTRY alt_thunk_names881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x0y83abcEv,_ZTv0_n16_N3ccc7CC2x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y83abcEv,_ZThn4_N3ccc7CC2x0y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y83efgEv,_ZTv0_n12_N3ccc7CC2x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y83efgEv,_ZThn4_N3ccc7CC2x0y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y8E = {  "_ZN3ccc7CC2x0y8E", // class name
  bases__ZN3ccc7CC2x0y8E, 2,
  &(vtc__ZN3ccc7CC2x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y8E),2, //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  DD2x0y8  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD2x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x0y83abcEv
  ~DD2x0y8(); // tgen
  DD2x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y83efgEv");}
void  ccc::DD2x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x0y83abcEv");}
ccc::DD2x0y8 ::~DD2x0y8(){ note_dtor("_ZN3ccc7DD2x0y8E", this);} // tgen
ccc::DD2x0y8 ::DD2x0y8(){ note_ctor("_ZN3ccc7DD2x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y8E, buf);
    ::ccc::DD2x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y8E);
    dp->::ccc::DD2x0y8::~DD2x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y8E(Test__ZN3ccc7DD2x0y8E, "_ZN3ccc7DD2x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y8C1Ev();
extern void _ZN3ccc7DD2x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y8E[] = {
  NSPAIR(_ZN3ccc7DD2x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y8E[];
extern void _ZN3ccc7DD2x0y83efgEv();
extern void _ZN3ccc7DD2x0y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x0y83abcEv,_ZTv0_n12_N3ccc7DD2x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y83abcEv,_ZThn4_N3ccc7DD2x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y83efgEv,_ZTv0_n16_N3ccc7DD2x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y83efgEv,_ZThn4_N3ccc7DD2x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x0y83abcEv,_ZTv0_n12_N3ccc7DD2x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y83efgEv,_ZTv0_n16_N3ccc7DD2x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y8E[] = {
  {&(_ZTVN3ccc7DD2x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y8E[];
static VTBL_ENTRY alt_thunk_names882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y83efgEv,_ZTv0_n16_N3ccc7DD2x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y83efgEv,_ZThn4_N3ccc7DD2x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x0y83abcEv,_ZTv0_n12_N3ccc7DD2x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y83abcEv,_ZThn4_N3ccc7DD2x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y8E = {  "_ZN3ccc7DD2x0y8E", // class name
  bases__ZN3ccc7DD2x0y8E, 2,
  &(vtc__ZN3ccc7DD2x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y8E),3, //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  CC2x0y9  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y93pqrEv
  ~CC2x0y9(); // tgen
  CC2x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y9E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y93efgEv");}
void  ccc::CC2x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y93pqrEv");}
ccc::CC2x0y9 ::~CC2x0y9(){ note_dtor("_ZN3ccc7CC2x0y9E", this);} // tgen
ccc::CC2x0y9 ::CC2x0y9(){ note_ctor("_ZN3ccc7CC2x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y9E, buf);
    ::ccc::CC2x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC2x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y9E);
    dp->::ccc::CC2x0y9::~CC2x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y9E(Test__ZN3ccc7CC2x0y9E, "_ZN3ccc7CC2x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y9C1Ev();
extern void _ZN3ccc7CC2x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y9E[] = {
  NSPAIR(_ZN3ccc7CC2x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC2x0y93efgEv();
extern void _ZN3ccc7CC2x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x0y93efgEv,_ZTv0_n12_N3ccc7CC2x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y93efgEv,_ZThn4_N3ccc7CC2x0y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x0y93pqrEv,_ZTv0_n20_N3ccc7CC2x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y93pqrEv,_ZThn4_N3ccc7CC2x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x0y93efgEv,_ZTv0_n12_N3ccc7CC2x0y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x0y93pqrEv,_ZTv0_n20_N3ccc7CC2x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x0y9E[] = {
  {&(_ZTVN3ccc7CC2x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x0y9E[];
static VTBL_ENTRY alt_thunk_names883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x0y93pqrEv,_ZTv0_n20_N3ccc7CC2x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y93pqrEv,_ZThn4_N3ccc7CC2x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x0y93efgEv,_ZTv0_n12_N3ccc7CC2x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x0y93efgEv,_ZThn4_N3ccc7CC2x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x0y9E = {  "_ZN3ccc7CC2x0y9E", // class name
  bases__ZN3ccc7CC2x0y9E, 2,
  &(vtc__ZN3ccc7CC2x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x0y9E),2, //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  DD2x0y9  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD2x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x0y93pqrEv
  ~DD2x0y9(); // tgen
  DD2x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x0y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x0y93efgEv");}
void  ccc::DD2x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x0y93pqrEv");}
ccc::DD2x0y9 ::~DD2x0y9(){ note_dtor("_ZN3ccc7DD2x0y9E", this);} // tgen
ccc::DD2x0y9 ::DD2x0y9(){ note_ctor("_ZN3ccc7DD2x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x0y9E, buf);
    ::ccc::DD2x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x0y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD2x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x0y9E);
    dp->::ccc::DD2x0y9::~DD2x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x0y9E(Test__ZN3ccc7DD2x0y9E, "_ZN3ccc7DD2x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x0y9C1Ev();
extern void _ZN3ccc7DD2x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x0y9E[] = {
  NSPAIR(_ZN3ccc7DD2x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD2x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y9E[];
extern void _ZN3ccc7DD2x0y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x0y93efgEv,_ZTv0_n16_N3ccc7DD2x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y93efgEv,_ZThn4_N3ccc7DD2x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x0y93pqrEv,_ZTv0_n20_N3ccc7DD2x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x0y93pqrEv,_ZThn4_N3ccc7DD2x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x0y93efgEv,_ZTv0_n16_N3ccc7DD2x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x0y93pqrEv,_ZTv0_n20_N3ccc7DD2x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x0y9E[] = {
  {&(_ZTVN3ccc7DD2x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x0y9E[];
static VTBL_ENTRY alt_thunk_names884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x0y93pqrEv,_ZTv0_n20_N3ccc7DD2x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y93pqrEv,_ZThn4_N3ccc7DD2x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x0y93efgEv,_ZTv0_n16_N3ccc7DD2x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x0y93efgEv,_ZThn4_N3ccc7DD2x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x0y9E = {  "_ZN3ccc7DD2x0y9E", // class name
  bases__ZN3ccc7DD2x0y9E, 2,
  &(vtc__ZN3ccc7DD2x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x0y9E),3, //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  CC2x0y10  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x0y103abcEv
  ~CC2x0y10(); // tgen
  CC2x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y10E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y103pqrEv");}
void  ccc::CC2x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x0y103abcEv");}
ccc::CC2x0y10 ::~CC2x0y10(){ note_dtor("_ZN3ccc8CC2x0y10E", this);} // tgen
ccc::CC2x0y10 ::CC2x0y10(){ note_ctor("_ZN3ccc8CC2x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y10E, buf);
    ::ccc::CC2x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y10E);
    dp->::ccc::CC2x0y10::~CC2x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y10E(Test__ZN3ccc8CC2x0y10E, "_ZN3ccc8CC2x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y10C1Ev();
extern void _ZN3ccc8CC2x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y10E[] = {
  NSPAIR(_ZN3ccc8CC2x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y10E[];
extern void _ZN3ccc8CC2x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC2x0y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x0y103abcEv,_ZTv0_n16_N3ccc8CC2x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y103abcEv,_ZThn4_N3ccc8CC2x0y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x0y103pqrEv,_ZTv0_n20_N3ccc8CC2x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y103pqrEv,_ZThn4_N3ccc8CC2x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x0y103abcEv,_ZTv0_n16_N3ccc8CC2x0y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x0y103pqrEv,_ZTv0_n20_N3ccc8CC2x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y10E[] = {
  {&(_ZTVN3ccc8CC2x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y10E[];
static VTBL_ENTRY alt_thunk_names885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x0y103pqrEv,_ZTv0_n20_N3ccc8CC2x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y103pqrEv,_ZThn4_N3ccc8CC2x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x0y103abcEv,_ZTv0_n16_N3ccc8CC2x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y103abcEv,_ZThn4_N3ccc8CC2x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x0y10E = {  "_ZN3ccc8CC2x0y10E", // class name
  bases__ZN3ccc8CC2x0y10E, 2,
  &(vtc__ZN3ccc8CC2x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y10E),2, //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  DD2x0y10  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD2x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x0y103abcEv
  ~DD2x0y10(); // tgen
  DD2x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x0y103pqrEv");}
void  ccc::DD2x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x0y103abcEv");}
ccc::DD2x0y10 ::~DD2x0y10(){ note_dtor("_ZN3ccc8DD2x0y10E", this);} // tgen
ccc::DD2x0y10 ::DD2x0y10(){ note_ctor("_ZN3ccc8DD2x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y10E, buf);
    ::ccc::DD2x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y10E);
    dp->::ccc::DD2x0y10::~DD2x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y10E(Test__ZN3ccc8DD2x0y10E, "_ZN3ccc8DD2x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y10C1Ev();
extern void _ZN3ccc8DD2x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y10E[] = {
  NSPAIR(_ZN3ccc8DD2x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x0y103abcEv();
extern void _ZN3ccc8DD2x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x0y103abcEv,_ZTv0_n12_N3ccc8DD2x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y103abcEv,_ZThn4_N3ccc8DD2x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x0y103pqrEv,_ZTv0_n20_N3ccc8DD2x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y103pqrEv,_ZThn4_N3ccc8DD2x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x0y103abcEv,_ZTv0_n12_N3ccc8DD2x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x0y103pqrEv,_ZTv0_n20_N3ccc8DD2x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y10E[] = {
  {&(_ZTVN3ccc8DD2x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y10E[];
static VTBL_ENTRY alt_thunk_names886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x0y103pqrEv,_ZTv0_n20_N3ccc8DD2x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y103pqrEv,_ZThn4_N3ccc8DD2x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x0y103abcEv,_ZTv0_n12_N3ccc8DD2x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y103abcEv,_ZThn4_N3ccc8DD2x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x0y10E = {  "_ZN3ccc8DD2x0y10E", // class name
  bases__ZN3ccc8DD2x0y10E, 2,
  &(vtc__ZN3ccc8DD2x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y10E),3, //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  CC2x0y11  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x0y113efgEv
  ~CC2x0y11(); // tgen
  CC2x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y11E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y113pqrEv");}
void  ccc::CC2x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x0y113efgEv");}
ccc::CC2x0y11 ::~CC2x0y11(){ note_dtor("_ZN3ccc8CC2x0y11E", this);} // tgen
ccc::CC2x0y11 ::CC2x0y11(){ note_ctor("_ZN3ccc8CC2x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y11E, buf);
    ::ccc::CC2x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y11E);
    dp->::ccc::CC2x0y11::~CC2x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y11E(Test__ZN3ccc8CC2x0y11E, "_ZN3ccc8CC2x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y11C1Ev();
extern void _ZN3ccc8CC2x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y11E[] = {
  NSPAIR(_ZN3ccc8CC2x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC2x0y113efgEv();
extern void _ZN3ccc8CC2x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x0y113efgEv,_ZTv0_n12_N3ccc8CC2x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y113efgEv,_ZThn4_N3ccc8CC2x0y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x0y113pqrEv,_ZTv0_n20_N3ccc8CC2x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y113pqrEv,_ZThn4_N3ccc8CC2x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x0y113efgEv,_ZTv0_n12_N3ccc8CC2x0y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x0y113pqrEv,_ZTv0_n20_N3ccc8CC2x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y11E[] = {
  {&(_ZTVN3ccc8CC2x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y11E[];
static VTBL_ENTRY alt_thunk_names887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x0y113pqrEv,_ZTv0_n20_N3ccc8CC2x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y113pqrEv,_ZThn4_N3ccc8CC2x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x0y113efgEv,_ZTv0_n12_N3ccc8CC2x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y113efgEv,_ZThn4_N3ccc8CC2x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x0y11E = {  "_ZN3ccc8CC2x0y11E", // class name
  bases__ZN3ccc8CC2x0y11E, 2,
  &(vtc__ZN3ccc8CC2x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y11E),2, //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  DD2x0y11  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD2x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x0y113efgEv
  ~DD2x0y11(); // tgen
  DD2x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x0y113pqrEv");}
void  ccc::DD2x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x0y113efgEv");}
ccc::DD2x0y11 ::~DD2x0y11(){ note_dtor("_ZN3ccc8DD2x0y11E", this);} // tgen
ccc::DD2x0y11 ::DD2x0y11(){ note_ctor("_ZN3ccc8DD2x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y11E, buf);
    ::ccc::DD2x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y11E);
    dp->::ccc::DD2x0y11::~DD2x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y11E(Test__ZN3ccc8DD2x0y11E, "_ZN3ccc8DD2x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y11C1Ev();
extern void _ZN3ccc8DD2x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y11E[] = {
  NSPAIR(_ZN3ccc8DD2x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y11E[];
extern void _ZN3ccc8DD2x0y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x0y113efgEv,_ZTv0_n16_N3ccc8DD2x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y113efgEv,_ZThn4_N3ccc8DD2x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x0y113pqrEv,_ZTv0_n20_N3ccc8DD2x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y113pqrEv,_ZThn4_N3ccc8DD2x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x0y113efgEv,_ZTv0_n16_N3ccc8DD2x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x0y113pqrEv,_ZTv0_n20_N3ccc8DD2x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y11E[] = {
  {&(_ZTVN3ccc8DD2x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y11E[];
static VTBL_ENTRY alt_thunk_names888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x0y113pqrEv,_ZTv0_n20_N3ccc8DD2x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y113pqrEv,_ZThn4_N3ccc8DD2x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x0y113efgEv,_ZTv0_n16_N3ccc8DD2x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y113efgEv,_ZThn4_N3ccc8DD2x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x0y11E = {  "_ZN3ccc8DD2x0y11E", // class name
  bases__ZN3ccc8DD2x0y11E, 2,
  &(vtc__ZN3ccc8DD2x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y11E),3, //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  CC2x0y12  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC2x0y123abcEv
  ~CC2x0y12(); // tgen
  CC2x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x0y123abcEv");}
ccc::CC2x0y12 ::~CC2x0y12(){ note_dtor("_ZN3ccc8CC2x0y12E", this);} // tgen
ccc::CC2x0y12 ::CC2x0y12(){ note_ctor("_ZN3ccc8CC2x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y12E, buf);
    ::ccc::CC2x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y12E);
    dp->::ccc::CC2x0y12::~CC2x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y12E(Test__ZN3ccc8CC2x0y12E, "_ZN3ccc8CC2x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y12C1Ev();
extern void _ZN3ccc8CC2x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y12E[] = {
  NSPAIR(_ZN3ccc8CC2x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y12E[];
extern void _ZN3ccc8CC2x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x0y123abcEv,_ZTv0_n16_N3ccc8CC2x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y123abcEv,_ZThn4_N3ccc8CC2x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x0y123abcEv,_ZTv0_n16_N3ccc8CC2x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y12E[] = {
  {&(_ZTVN3ccc8CC2x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y12E[];
static VTBL_ENTRY alt_thunk_names889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x0y123abcEv,_ZTv0_n16_N3ccc8CC2x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y123abcEv,_ZThn4_N3ccc8CC2x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x0y12E = {  "_ZN3ccc8CC2x0y12E", // class name
  bases__ZN3ccc8CC2x0y12E, 2,
  &(vtc__ZN3ccc8CC2x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y12E),2, //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  DD2x0y12  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD2x0y123abcEv
  ~DD2x0y12(); // tgen
  DD2x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x0y123abcEv");}
ccc::DD2x0y12 ::~DD2x0y12(){ note_dtor("_ZN3ccc8DD2x0y12E", this);} // tgen
ccc::DD2x0y12 ::DD2x0y12(){ note_ctor("_ZN3ccc8DD2x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y12E, buf);
    ::ccc::DD2x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y12E);
    dp->::ccc::DD2x0y12::~DD2x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y12E(Test__ZN3ccc8DD2x0y12E, "_ZN3ccc8DD2x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y12C1Ev();
extern void _ZN3ccc8DD2x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y12E[] = {
  NSPAIR(_ZN3ccc8DD2x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x0y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x0y123abcEv,_ZTv0_n12_N3ccc8DD2x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y123abcEv,_ZThn4_N3ccc8DD2x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x0y123abcEv,_ZTv0_n12_N3ccc8DD2x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y12E[] = {
  {&(_ZTVN3ccc8DD2x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y12E[];
static VTBL_ENTRY alt_thunk_names890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x0y123abcEv,_ZTv0_n12_N3ccc8DD2x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y123abcEv,_ZThn4_N3ccc8DD2x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x0y12E = {  "_ZN3ccc8DD2x0y12E", // class name
  bases__ZN3ccc8DD2x0y12E, 2,
  &(vtc__ZN3ccc8DD2x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y12E),3, //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  CC2x0y13  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC2x0y133efgEv
  ~CC2x0y13(); // tgen
  CC2x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x0y133efgEv");}
ccc::CC2x0y13 ::~CC2x0y13(){ note_dtor("_ZN3ccc8CC2x0y13E", this);} // tgen
ccc::CC2x0y13 ::CC2x0y13(){ note_ctor("_ZN3ccc8CC2x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y13E, buf);
    ::ccc::CC2x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y13E);
    dp->::ccc::CC2x0y13::~CC2x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y13E(Test__ZN3ccc8CC2x0y13E, "_ZN3ccc8CC2x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y13C1Ev();
extern void _ZN3ccc8CC2x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y13E[] = {
  NSPAIR(_ZN3ccc8CC2x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC2x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x0y133efgEv,_ZTv0_n12_N3ccc8CC2x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y133efgEv,_ZThn4_N3ccc8CC2x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x0y133efgEv,_ZTv0_n12_N3ccc8CC2x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y13E[] = {
  {&(_ZTVN3ccc8CC2x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y13E[];
static VTBL_ENTRY alt_thunk_names891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x0y133efgEv,_ZTv0_n12_N3ccc8CC2x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y133efgEv,_ZThn4_N3ccc8CC2x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x0y13E = {  "_ZN3ccc8CC2x0y13E", // class name
  bases__ZN3ccc8CC2x0y13E, 2,
  &(vtc__ZN3ccc8CC2x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y13E),2, //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  DD2x0y13  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD2x0y133efgEv
  ~DD2x0y13(); // tgen
  DD2x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x0y133efgEv");}
ccc::DD2x0y13 ::~DD2x0y13(){ note_dtor("_ZN3ccc8DD2x0y13E", this);} // tgen
ccc::DD2x0y13 ::DD2x0y13(){ note_ctor("_ZN3ccc8DD2x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y13E, buf);
    ::ccc::DD2x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y13E);
    dp->::ccc::DD2x0y13::~DD2x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y13E(Test__ZN3ccc8DD2x0y13E, "_ZN3ccc8DD2x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y13C1Ev();
extern void _ZN3ccc8DD2x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y13E[] = {
  NSPAIR(_ZN3ccc8DD2x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y13E[];
extern void _ZN3ccc8DD2x0y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x0y133efgEv,_ZTv0_n16_N3ccc8DD2x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y133efgEv,_ZThn4_N3ccc8DD2x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x0y133efgEv,_ZTv0_n16_N3ccc8DD2x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y13E[] = {
  {&(_ZTVN3ccc8DD2x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y13E[];
static VTBL_ENTRY alt_thunk_names892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x0y133efgEv,_ZTv0_n16_N3ccc8DD2x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y133efgEv,_ZThn4_N3ccc8DD2x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x0y13E = {  "_ZN3ccc8DD2x0y13E", // class name
  bases__ZN3ccc8DD2x0y13E, 2,
  &(vtc__ZN3ccc8DD2x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y13E),3, //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  CC2x0y14  : virtual ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y143pqrEv
  ~CC2x0y14(); // tgen
  CC2x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y143pqrEv");}
ccc::CC2x0y14 ::~CC2x0y14(){ note_dtor("_ZN3ccc8CC2x0y14E", this);} // tgen
ccc::CC2x0y14 ::CC2x0y14(){ note_ctor("_ZN3ccc8CC2x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y14E, buf);
    ::ccc::CC2x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y14E);
    dp->::ccc::CC2x0y14::~CC2x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y14E(Test__ZN3ccc8CC2x0y14E, "_ZN3ccc8CC2x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y14C1Ev();
extern void _ZN3ccc8CC2x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y14E[] = {
  NSPAIR(_ZN3ccc8CC2x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC2x0y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x0y143pqrEv,_ZTv0_n20_N3ccc8CC2x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y143pqrEv,_ZThn4_N3ccc8CC2x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x0y143pqrEv,_ZTv0_n20_N3ccc8CC2x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y14E[] = {
  {&(_ZTVN3ccc8CC2x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y14E[];
static VTBL_ENTRY alt_thunk_names893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x0y143pqrEv,_ZTv0_n20_N3ccc8CC2x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x0y143pqrEv,_ZThn4_N3ccc8CC2x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x0y14E = {  "_ZN3ccc8CC2x0y14E", // class name
  bases__ZN3ccc8CC2x0y14E, 2,
  &(vtc__ZN3ccc8CC2x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y14E),2, //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  DD2x0y14  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD2x0y143pqrEv
  ~DD2x0y14(); // tgen
  DD2x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x0y143pqrEv");}
ccc::DD2x0y14 ::~DD2x0y14(){ note_dtor("_ZN3ccc8DD2x0y14E", this);} // tgen
ccc::DD2x0y14 ::DD2x0y14(){ note_ctor("_ZN3ccc8DD2x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y14E, buf);
    ::ccc::DD2x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y14E);
    dp->::ccc::DD2x0y14::~DD2x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y14E(Test__ZN3ccc8DD2x0y14E, "_ZN3ccc8DD2x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y14C1Ev();
extern void _ZN3ccc8DD2x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y14E[] = {
  NSPAIR(_ZN3ccc8DD2x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x0y143pqrEv,_ZTv0_n20_N3ccc8DD2x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x0y143pqrEv,_ZThn4_N3ccc8DD2x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x0y143pqrEv,_ZTv0_n20_N3ccc8DD2x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y14E[] = {
  {&(_ZTVN3ccc8DD2x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y14E[];
static VTBL_ENTRY alt_thunk_names894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x0y143pqrEv,_ZTv0_n20_N3ccc8DD2x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x0y143pqrEv,_ZThn4_N3ccc8DD2x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x0y14E = {  "_ZN3ccc8DD2x0y14E", // class name
  bases__ZN3ccc8DD2x0y14E, 2,
  &(vtc__ZN3ccc8DD2x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y14E),3, //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  CC2x0y15  : virtual ::ccc::AA2 , ::ccc::BB0 {
  ~CC2x0y15(); // tgen
  CC2x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x0y15 ::~CC2x0y15(){ note_dtor("_ZN3ccc8CC2x0y15E", this);} // tgen
ccc::CC2x0y15 ::CC2x0y15(){ note_ctor("_ZN3ccc8CC2x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y15E, buf);
    ::ccc::CC2x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC2x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y15E);
    dp->::ccc::CC2x0y15::~CC2x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y15E(Test__ZN3ccc8CC2x0y15E, "_ZN3ccc8CC2x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y15C1Ev();
extern void _ZN3ccc8CC2x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y15E[] = {
  NSPAIR(_ZN3ccc8CC2x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x0y15E[] = {
  {&(_ZTVN3ccc8CC2x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x0y15E[];
Class_Descriptor cd__ZN3ccc8CC2x0y15E = {  "_ZN3ccc8CC2x0y15E", // class name
  bases__ZN3ccc8CC2x0y15E, 2,
  &(vtc__ZN3ccc8CC2x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x0y15  : virtual ::ccc::AA2 , virtual ::ccc::BB0 {
  ~DD2x0y15(); // tgen
  DD2x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x0y15 ::~DD2x0y15(){ note_dtor("_ZN3ccc8DD2x0y15E", this);} // tgen
ccc::DD2x0y15 ::DD2x0y15(){ note_ctor("_ZN3ccc8DD2x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x0y15E, buf);
    ::ccc::DD2x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x0y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD2x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x0y15E);
    dp->::ccc::DD2x0y15::~DD2x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x0y15E(Test__ZN3ccc8DD2x0y15E, "_ZN3ccc8DD2x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x0y15C1Ev();
extern void _ZN3ccc8DD2x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x0y15E[] = {
  NSPAIR(_ZN3ccc8DD2x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD2x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x0y15E[] = {
  {&(_ZTVN3ccc8DD2x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x0y15E[];
Class_Descriptor cd__ZN3ccc8DD2x0y15E = {  "_ZN3ccc8DD2x0y15E", // class name
  bases__ZN3ccc8DD2x0y15E, 2,
  &(vtc__ZN3ccc8DD2x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y0  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y03pqrEv
  ~CC2x1y0(); // tgen
  CC2x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y0E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y03abcEv");}
void  ccc::CC2x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y03efgEv");}
void  ccc::CC2x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y03pqrEv");}
ccc::CC2x1y0 ::~CC2x1y0(){ note_dtor("_ZN3ccc7CC2x1y0E", this);} // tgen
ccc::CC2x1y0 ::CC2x1y0(){ note_ctor("_ZN3ccc7CC2x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y0E, buf);
    ::ccc::CC2x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y0E);
    dp->::ccc::CC2x1y0::~CC2x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y0E(Test__ZN3ccc7CC2x1y0E, "_ZN3ccc7CC2x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y0C1Ev();
extern void _ZN3ccc7CC2x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y0E[] = {
  NSPAIR(_ZN3ccc7CC2x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y0E[];
extern void _ZN3ccc7CC2x1y03abcEv();
extern void _ZN3ccc7CC2x1y03pqrEv();
extern void _ZN3ccc7CC2x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y03efgEv,_ZTv0_n12_N3ccc7CC2x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03efgEv,_ZThn4_N3ccc7CC2x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y03abcEv,_ZTv0_n16_N3ccc7CC2x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03abcEv,_ZThn4_N3ccc7CC2x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y03pqrEv,_ZTv0_n20_N3ccc7CC2x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03pqrEv,_ZThn4_N3ccc7CC2x1y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y03efgEv,_ZTv0_n12_N3ccc7CC2x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y03abcEv,_ZTv0_n16_N3ccc7CC2x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y03pqrEv,_ZTv0_n20_N3ccc7CC2x1y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y0E[] = {
  {&(_ZTVN3ccc7CC2x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y0E[];
static VTBL_ENTRY alt_thunk_names895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y03pqrEv,_ZTv0_n20_N3ccc7CC2x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y03pqrEv,_ZThn4_N3ccc7CC2x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y03abcEv,_ZTv0_n16_N3ccc7CC2x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y03abcEv,_ZThn4_N3ccc7CC2x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y03efgEv,_ZTv0_n12_N3ccc7CC2x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y03efgEv,_ZThn4_N3ccc7CC2x1y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y0E = {  "_ZN3ccc7CC2x1y0E", // class name
  bases__ZN3ccc7CC2x1y0E, 2,
  &(vtc__ZN3ccc7CC2x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y0E),2, //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  DD2x1y0  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD2x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y03pqrEv
  ~DD2x1y0(); // tgen
  DD2x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y03abcEv");}
void  ccc::DD2x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y03efgEv");}
void  ccc::DD2x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y03pqrEv");}
ccc::DD2x1y0 ::~DD2x1y0(){ note_dtor("_ZN3ccc7DD2x1y0E", this);} // tgen
ccc::DD2x1y0 ::DD2x1y0(){ note_ctor("_ZN3ccc7DD2x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y0E, buf);
    ::ccc::DD2x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y0E);
    dp->::ccc::DD2x1y0::~DD2x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y0E(Test__ZN3ccc7DD2x1y0E, "_ZN3ccc7DD2x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y0C1Ev();
extern void _ZN3ccc7DD2x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y0E[] = {
  NSPAIR(_ZN3ccc7DD2x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y0E[];
extern void _ZN3ccc7DD2x1y03efgEv();
extern void _ZN3ccc7DD2x1y03abcEv();
extern void _ZN3ccc7DD2x1y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y03abcEv,_ZTv0_n12_N3ccc7DD2x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y03abcEv,_ZThn4_N3ccc7DD2x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y03pqrEv,_ZTv0_n16_N3ccc7DD2x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y03pqrEv,_ZThn4_N3ccc7DD2x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y03efgEv,_ZTv0_n20_N3ccc7DD2x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y03efgEv,_ZThn4_N3ccc7DD2x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y03abcEv,_ZTv0_n12_N3ccc7DD2x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y03pqrEv,_ZTv0_n16_N3ccc7DD2x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y03efgEv,_ZTv0_n20_N3ccc7DD2x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y0E[] = {
  {&(_ZTVN3ccc7DD2x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y0E[];
static VTBL_ENTRY alt_thunk_names896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y03efgEv,_ZTv0_n20_N3ccc7DD2x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y03efgEv,_ZThn4_N3ccc7DD2x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y03pqrEv,_ZTv0_n16_N3ccc7DD2x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y03pqrEv,_ZThn4_N3ccc7DD2x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y03abcEv,_ZTv0_n12_N3ccc7DD2x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y03abcEv,_ZThn4_N3ccc7DD2x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y0E = {  "_ZN3ccc7DD2x1y0E", // class name
  bases__ZN3ccc7DD2x1y0E, 2,
  &(vtc__ZN3ccc7DD2x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y0E),3, //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  CC2x1y1  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x1y13efgEv
  ~CC2x1y1(); // tgen
  CC2x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y1E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y13abcEv");}
void  ccc::CC2x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y13pqrEv");}
void  ccc::CC2x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y13efgEv");}
ccc::CC2x1y1 ::~CC2x1y1(){ note_dtor("_ZN3ccc7CC2x1y1E", this);} // tgen
ccc::CC2x1y1 ::CC2x1y1(){ note_ctor("_ZN3ccc7CC2x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y1E, buf);
    ::ccc::CC2x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y1E);
    dp->::ccc::CC2x1y1::~CC2x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y1E(Test__ZN3ccc7CC2x1y1E, "_ZN3ccc7CC2x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y1C1Ev();
extern void _ZN3ccc7CC2x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y1E[] = {
  NSPAIR(_ZN3ccc7CC2x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y1E[];
extern void _ZN3ccc7CC2x1y13abcEv();
extern void _ZN3ccc7CC2x1y13pqrEv();
extern void _ZN3ccc7CC2x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y13efgEv,_ZTv0_n12_N3ccc7CC2x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13efgEv,_ZThn4_N3ccc7CC2x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y13abcEv,_ZTv0_n16_N3ccc7CC2x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13abcEv,_ZThn4_N3ccc7CC2x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y13pqrEv,_ZTv0_n20_N3ccc7CC2x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13pqrEv,_ZThn4_N3ccc7CC2x1y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y13efgEv,_ZTv0_n12_N3ccc7CC2x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y13abcEv,_ZTv0_n16_N3ccc7CC2x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y13pqrEv,_ZTv0_n20_N3ccc7CC2x1y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y1E[] = {
  {&(_ZTVN3ccc7CC2x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y1E[];
static VTBL_ENTRY alt_thunk_names897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y13pqrEv,_ZTv0_n20_N3ccc7CC2x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y13pqrEv,_ZThn4_N3ccc7CC2x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y13abcEv,_ZTv0_n16_N3ccc7CC2x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y13abcEv,_ZThn4_N3ccc7CC2x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y13efgEv,_ZTv0_n12_N3ccc7CC2x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y13efgEv,_ZThn4_N3ccc7CC2x1y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y1E = {  "_ZN3ccc7CC2x1y1E", // class name
  bases__ZN3ccc7CC2x1y1E, 2,
  &(vtc__ZN3ccc7CC2x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y1E),2, //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  DD2x1y1  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD2x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x1y13efgEv
  ~DD2x1y1(); // tgen
  DD2x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y13abcEv");}
void  ccc::DD2x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y13pqrEv");}
void  ccc::DD2x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y13efgEv");}
ccc::DD2x1y1 ::~DD2x1y1(){ note_dtor("_ZN3ccc7DD2x1y1E", this);} // tgen
ccc::DD2x1y1 ::DD2x1y1(){ note_ctor("_ZN3ccc7DD2x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y1E, buf);
    ::ccc::DD2x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y1E);
    dp->::ccc::DD2x1y1::~DD2x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y1E(Test__ZN3ccc7DD2x1y1E, "_ZN3ccc7DD2x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y1C1Ev();
extern void _ZN3ccc7DD2x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y1E[] = {
  NSPAIR(_ZN3ccc7DD2x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y1E[];
extern void _ZN3ccc7DD2x1y13efgEv();
extern void _ZN3ccc7DD2x1y13abcEv();
extern void _ZN3ccc7DD2x1y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y13abcEv,_ZTv0_n12_N3ccc7DD2x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y13abcEv,_ZThn4_N3ccc7DD2x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y13pqrEv,_ZTv0_n16_N3ccc7DD2x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y13pqrEv,_ZThn4_N3ccc7DD2x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y13efgEv,_ZTv0_n20_N3ccc7DD2x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y13efgEv,_ZThn4_N3ccc7DD2x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y13abcEv,_ZTv0_n12_N3ccc7DD2x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y13pqrEv,_ZTv0_n16_N3ccc7DD2x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y13efgEv,_ZTv0_n20_N3ccc7DD2x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y1E[] = {
  {&(_ZTVN3ccc7DD2x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y1E[];
static VTBL_ENTRY alt_thunk_names898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y13efgEv,_ZTv0_n20_N3ccc7DD2x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y13efgEv,_ZThn4_N3ccc7DD2x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y13pqrEv,_ZTv0_n16_N3ccc7DD2x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y13pqrEv,_ZThn4_N3ccc7DD2x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y13abcEv,_ZTv0_n12_N3ccc7DD2x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y13abcEv,_ZThn4_N3ccc7DD2x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y1E = {  "_ZN3ccc7DD2x1y1E", // class name
  bases__ZN3ccc7DD2x1y1E, 2,
  &(vtc__ZN3ccc7DD2x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y1E),3, //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  CC2x1y2  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y23pqrEv
  ~CC2x1y2(); // tgen
  CC2x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y2E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y23efgEv");}
void  ccc::CC2x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y23abcEv");}
void  ccc::CC2x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y23pqrEv");}
ccc::CC2x1y2 ::~CC2x1y2(){ note_dtor("_ZN3ccc7CC2x1y2E", this);} // tgen
ccc::CC2x1y2 ::CC2x1y2(){ note_ctor("_ZN3ccc7CC2x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y2E, buf);
    ::ccc::CC2x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y2E);
    dp->::ccc::CC2x1y2::~CC2x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y2E(Test__ZN3ccc7CC2x1y2E, "_ZN3ccc7CC2x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y2C1Ev();
extern void _ZN3ccc7CC2x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y2E[] = {
  NSPAIR(_ZN3ccc7CC2x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y2E[];
extern void _ZN3ccc7CC2x1y23abcEv();
extern void _ZN3ccc7CC2x1y23pqrEv();
extern void _ZN3ccc7CC2x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y23efgEv,_ZTv0_n12_N3ccc7CC2x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23efgEv,_ZThn4_N3ccc7CC2x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y23abcEv,_ZTv0_n16_N3ccc7CC2x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23abcEv,_ZThn4_N3ccc7CC2x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y23pqrEv,_ZTv0_n20_N3ccc7CC2x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23pqrEv,_ZThn4_N3ccc7CC2x1y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y23efgEv,_ZTv0_n12_N3ccc7CC2x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y23abcEv,_ZTv0_n16_N3ccc7CC2x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y23pqrEv,_ZTv0_n20_N3ccc7CC2x1y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y2E[] = {
  {&(_ZTVN3ccc7CC2x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y2E[];
static VTBL_ENTRY alt_thunk_names899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y23pqrEv,_ZTv0_n20_N3ccc7CC2x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y23pqrEv,_ZThn4_N3ccc7CC2x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y23abcEv,_ZTv0_n16_N3ccc7CC2x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y23abcEv,_ZThn4_N3ccc7CC2x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y23efgEv,_ZTv0_n12_N3ccc7CC2x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y23efgEv,_ZThn4_N3ccc7CC2x1y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y2E = {  "_ZN3ccc7CC2x1y2E", // class name
  bases__ZN3ccc7CC2x1y2E, 2,
  &(vtc__ZN3ccc7CC2x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y2E),2, //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  DD2x1y2  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD2x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y23pqrEv
  ~DD2x1y2(); // tgen
  DD2x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y23efgEv");}
void  ccc::DD2x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y23abcEv");}
void  ccc::DD2x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y23pqrEv");}
ccc::DD2x1y2 ::~DD2x1y2(){ note_dtor("_ZN3ccc7DD2x1y2E", this);} // tgen
ccc::DD2x1y2 ::DD2x1y2(){ note_ctor("_ZN3ccc7DD2x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y2E, buf);
    ::ccc::DD2x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y2E);
    dp->::ccc::DD2x1y2::~DD2x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y2E(Test__ZN3ccc7DD2x1y2E, "_ZN3ccc7DD2x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y2C1Ev();
extern void _ZN3ccc7DD2x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y2E[] = {
  NSPAIR(_ZN3ccc7DD2x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y2E[];
extern void _ZN3ccc7DD2x1y23efgEv();
extern void _ZN3ccc7DD2x1y23abcEv();
extern void _ZN3ccc7DD2x1y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y23abcEv,_ZTv0_n12_N3ccc7DD2x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y23abcEv,_ZThn4_N3ccc7DD2x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y23pqrEv,_ZTv0_n16_N3ccc7DD2x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y23pqrEv,_ZThn4_N3ccc7DD2x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y23efgEv,_ZTv0_n20_N3ccc7DD2x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y23efgEv,_ZThn4_N3ccc7DD2x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y23abcEv,_ZTv0_n12_N3ccc7DD2x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y23pqrEv,_ZTv0_n16_N3ccc7DD2x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y23efgEv,_ZTv0_n20_N3ccc7DD2x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y2E[] = {
  {&(_ZTVN3ccc7DD2x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y2E[];
static VTBL_ENTRY alt_thunk_names900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y23efgEv,_ZTv0_n20_N3ccc7DD2x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y23efgEv,_ZThn4_N3ccc7DD2x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y23pqrEv,_ZTv0_n16_N3ccc7DD2x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y23pqrEv,_ZThn4_N3ccc7DD2x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y23abcEv,_ZTv0_n12_N3ccc7DD2x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y23abcEv,_ZThn4_N3ccc7DD2x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y2E = {  "_ZN3ccc7DD2x1y2E", // class name
  bases__ZN3ccc7DD2x1y2E, 2,
  &(vtc__ZN3ccc7DD2x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y2E),3, //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  CC2x1y3  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x1y33abcEv
  ~CC2x1y3(); // tgen
  CC2x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y3E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y33efgEv");}
void  ccc::CC2x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y33pqrEv");}
void  ccc::CC2x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y33abcEv");}
ccc::CC2x1y3 ::~CC2x1y3(){ note_dtor("_ZN3ccc7CC2x1y3E", this);} // tgen
ccc::CC2x1y3 ::CC2x1y3(){ note_ctor("_ZN3ccc7CC2x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y3E, buf);
    ::ccc::CC2x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y3E);
    dp->::ccc::CC2x1y3::~CC2x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y3E(Test__ZN3ccc7CC2x1y3E, "_ZN3ccc7CC2x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y3C1Ev();
extern void _ZN3ccc7CC2x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y3E[] = {
  NSPAIR(_ZN3ccc7CC2x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y3E[];
extern void _ZN3ccc7CC2x1y33abcEv();
extern void _ZN3ccc7CC2x1y33pqrEv();
extern void _ZN3ccc7CC2x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y33efgEv,_ZTv0_n12_N3ccc7CC2x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33efgEv,_ZThn4_N3ccc7CC2x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y33abcEv,_ZTv0_n16_N3ccc7CC2x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33abcEv,_ZThn4_N3ccc7CC2x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y33pqrEv,_ZTv0_n20_N3ccc7CC2x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33pqrEv,_ZThn4_N3ccc7CC2x1y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y33efgEv,_ZTv0_n12_N3ccc7CC2x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y33abcEv,_ZTv0_n16_N3ccc7CC2x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y33pqrEv,_ZTv0_n20_N3ccc7CC2x1y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y3E[] = {
  {&(_ZTVN3ccc7CC2x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y3E[];
static VTBL_ENTRY alt_thunk_names901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y33pqrEv,_ZTv0_n20_N3ccc7CC2x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y33pqrEv,_ZThn4_N3ccc7CC2x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y33abcEv,_ZTv0_n16_N3ccc7CC2x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y33abcEv,_ZThn4_N3ccc7CC2x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y33efgEv,_ZTv0_n12_N3ccc7CC2x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y33efgEv,_ZThn4_N3ccc7CC2x1y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y3E = {  "_ZN3ccc7CC2x1y3E", // class name
  bases__ZN3ccc7CC2x1y3E, 2,
  &(vtc__ZN3ccc7CC2x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y3E),2, //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  DD2x1y3  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD2x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x1y33abcEv
  ~DD2x1y3(); // tgen
  DD2x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y33efgEv");}
void  ccc::DD2x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y33pqrEv");}
void  ccc::DD2x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y33abcEv");}
ccc::DD2x1y3 ::~DD2x1y3(){ note_dtor("_ZN3ccc7DD2x1y3E", this);} // tgen
ccc::DD2x1y3 ::DD2x1y3(){ note_ctor("_ZN3ccc7DD2x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y3E, buf);
    ::ccc::DD2x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y3E);
    dp->::ccc::DD2x1y3::~DD2x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y3E(Test__ZN3ccc7DD2x1y3E, "_ZN3ccc7DD2x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y3C1Ev();
extern void _ZN3ccc7DD2x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y3E[] = {
  NSPAIR(_ZN3ccc7DD2x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y3E[];
extern void _ZN3ccc7DD2x1y33efgEv();
extern void _ZN3ccc7DD2x1y33abcEv();
extern void _ZN3ccc7DD2x1y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y33abcEv,_ZTv0_n12_N3ccc7DD2x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y33abcEv,_ZThn4_N3ccc7DD2x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y33pqrEv,_ZTv0_n16_N3ccc7DD2x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y33pqrEv,_ZThn4_N3ccc7DD2x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y33efgEv,_ZTv0_n20_N3ccc7DD2x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y33efgEv,_ZThn4_N3ccc7DD2x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y33abcEv,_ZTv0_n12_N3ccc7DD2x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y33pqrEv,_ZTv0_n16_N3ccc7DD2x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y33efgEv,_ZTv0_n20_N3ccc7DD2x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y3E[] = {
  {&(_ZTVN3ccc7DD2x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y3E[];
static VTBL_ENTRY alt_thunk_names902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y33efgEv,_ZTv0_n20_N3ccc7DD2x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y33efgEv,_ZThn4_N3ccc7DD2x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y33pqrEv,_ZTv0_n16_N3ccc7DD2x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y33pqrEv,_ZThn4_N3ccc7DD2x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y33abcEv,_ZTv0_n12_N3ccc7DD2x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y33abcEv,_ZThn4_N3ccc7DD2x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y3E = {  "_ZN3ccc7DD2x1y3E", // class name
  bases__ZN3ccc7DD2x1y3E, 2,
  &(vtc__ZN3ccc7DD2x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y3E),3, //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  CC2x1y4  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC2x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y43efgEv
  ~CC2x1y4(); // tgen
  CC2x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y4E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y43pqrEv");}
void  ccc::CC2x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y43abcEv");}
void  ccc::CC2x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y43efgEv");}
ccc::CC2x1y4 ::~CC2x1y4(){ note_dtor("_ZN3ccc7CC2x1y4E", this);} // tgen
ccc::CC2x1y4 ::CC2x1y4(){ note_ctor("_ZN3ccc7CC2x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y4E, buf);
    ::ccc::CC2x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y4E);
    dp->::ccc::CC2x1y4::~CC2x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y4E(Test__ZN3ccc7CC2x1y4E, "_ZN3ccc7CC2x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y4C1Ev();
extern void _ZN3ccc7CC2x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y4E[] = {
  NSPAIR(_ZN3ccc7CC2x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y4E[];
extern void _ZN3ccc7CC2x1y43abcEv();
extern void _ZN3ccc7CC2x1y43pqrEv();
extern void _ZN3ccc7CC2x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y43efgEv,_ZTv0_n12_N3ccc7CC2x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43efgEv,_ZThn4_N3ccc7CC2x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y43abcEv,_ZTv0_n16_N3ccc7CC2x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43abcEv,_ZThn4_N3ccc7CC2x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y43pqrEv,_ZTv0_n20_N3ccc7CC2x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43pqrEv,_ZThn4_N3ccc7CC2x1y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y43efgEv,_ZTv0_n12_N3ccc7CC2x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y43abcEv,_ZTv0_n16_N3ccc7CC2x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y43pqrEv,_ZTv0_n20_N3ccc7CC2x1y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y4E[] = {
  {&(_ZTVN3ccc7CC2x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y4E[];
static VTBL_ENTRY alt_thunk_names903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y43pqrEv,_ZTv0_n20_N3ccc7CC2x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y43pqrEv,_ZThn4_N3ccc7CC2x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y43abcEv,_ZTv0_n16_N3ccc7CC2x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y43abcEv,_ZThn4_N3ccc7CC2x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y43efgEv,_ZTv0_n12_N3ccc7CC2x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y43efgEv,_ZThn4_N3ccc7CC2x1y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y4E = {  "_ZN3ccc7CC2x1y4E", // class name
  bases__ZN3ccc7CC2x1y4E, 2,
  &(vtc__ZN3ccc7CC2x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y4E),2, //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  DD2x1y4  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD2x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x1y43efgEv
  ~DD2x1y4(); // tgen
  DD2x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y43pqrEv");}
void  ccc::DD2x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y43abcEv");}
void  ccc::DD2x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y43efgEv");}
ccc::DD2x1y4 ::~DD2x1y4(){ note_dtor("_ZN3ccc7DD2x1y4E", this);} // tgen
ccc::DD2x1y4 ::DD2x1y4(){ note_ctor("_ZN3ccc7DD2x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y4E, buf);
    ::ccc::DD2x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y4E);
    dp->::ccc::DD2x1y4::~DD2x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y4E(Test__ZN3ccc7DD2x1y4E, "_ZN3ccc7DD2x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y4C1Ev();
extern void _ZN3ccc7DD2x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y4E[] = {
  NSPAIR(_ZN3ccc7DD2x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y4E[];
extern void _ZN3ccc7DD2x1y43efgEv();
extern void _ZN3ccc7DD2x1y43abcEv();
extern void _ZN3ccc7DD2x1y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y43abcEv,_ZTv0_n12_N3ccc7DD2x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y43abcEv,_ZThn4_N3ccc7DD2x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y43pqrEv,_ZTv0_n16_N3ccc7DD2x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y43pqrEv,_ZThn4_N3ccc7DD2x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y43efgEv,_ZTv0_n20_N3ccc7DD2x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y43efgEv,_ZThn4_N3ccc7DD2x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y43abcEv,_ZTv0_n12_N3ccc7DD2x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y43pqrEv,_ZTv0_n16_N3ccc7DD2x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y43efgEv,_ZTv0_n20_N3ccc7DD2x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y4E[] = {
  {&(_ZTVN3ccc7DD2x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y4E[];
static VTBL_ENTRY alt_thunk_names904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y43efgEv,_ZTv0_n20_N3ccc7DD2x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y43efgEv,_ZThn4_N3ccc7DD2x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y43pqrEv,_ZTv0_n16_N3ccc7DD2x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y43pqrEv,_ZThn4_N3ccc7DD2x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y43abcEv,_ZTv0_n12_N3ccc7DD2x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y43abcEv,_ZThn4_N3ccc7DD2x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y4E = {  "_ZN3ccc7DD2x1y4E", // class name
  bases__ZN3ccc7DD2x1y4E, 2,
  &(vtc__ZN3ccc7DD2x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y4E),3, //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  CC2x1y5  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC2x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y53abcEv
  ~CC2x1y5(); // tgen
  CC2x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y5E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y53pqrEv");}
void  ccc::CC2x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y53efgEv");}
void  ccc::CC2x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y53abcEv");}
ccc::CC2x1y5 ::~CC2x1y5(){ note_dtor("_ZN3ccc7CC2x1y5E", this);} // tgen
ccc::CC2x1y5 ::CC2x1y5(){ note_ctor("_ZN3ccc7CC2x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y5E, buf);
    ::ccc::CC2x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y5E);
    dp->::ccc::CC2x1y5::~CC2x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y5E(Test__ZN3ccc7CC2x1y5E, "_ZN3ccc7CC2x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y5C1Ev();
extern void _ZN3ccc7CC2x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y5E[] = {
  NSPAIR(_ZN3ccc7CC2x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y5E[];
extern void _ZN3ccc7CC2x1y53abcEv();
extern void _ZN3ccc7CC2x1y53pqrEv();
extern void _ZN3ccc7CC2x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y53efgEv,_ZTv0_n12_N3ccc7CC2x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53efgEv,_ZThn4_N3ccc7CC2x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y53abcEv,_ZTv0_n16_N3ccc7CC2x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53abcEv,_ZThn4_N3ccc7CC2x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y53pqrEv,_ZTv0_n20_N3ccc7CC2x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53pqrEv,_ZThn4_N3ccc7CC2x1y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y53efgEv,_ZTv0_n12_N3ccc7CC2x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y53abcEv,_ZTv0_n16_N3ccc7CC2x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y53pqrEv,_ZTv0_n20_N3ccc7CC2x1y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y5E[] = {
  {&(_ZTVN3ccc7CC2x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y5E[];
static VTBL_ENTRY alt_thunk_names905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y53pqrEv,_ZTv0_n20_N3ccc7CC2x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y53pqrEv,_ZThn4_N3ccc7CC2x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y53abcEv,_ZTv0_n16_N3ccc7CC2x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y53abcEv,_ZThn4_N3ccc7CC2x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y53efgEv,_ZTv0_n12_N3ccc7CC2x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y53efgEv,_ZThn4_N3ccc7CC2x1y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y5E = {  "_ZN3ccc7CC2x1y5E", // class name
  bases__ZN3ccc7CC2x1y5E, 2,
  &(vtc__ZN3ccc7CC2x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y5E),2, //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  DD2x1y5  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD2x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x1y53abcEv
  ~DD2x1y5(); // tgen
  DD2x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y53pqrEv");}
void  ccc::DD2x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y53efgEv");}
void  ccc::DD2x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y53abcEv");}
ccc::DD2x1y5 ::~DD2x1y5(){ note_dtor("_ZN3ccc7DD2x1y5E", this);} // tgen
ccc::DD2x1y5 ::DD2x1y5(){ note_ctor("_ZN3ccc7DD2x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y5E, buf);
    ::ccc::DD2x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y5E);
    dp->::ccc::DD2x1y5::~DD2x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y5E(Test__ZN3ccc7DD2x1y5E, "_ZN3ccc7DD2x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y5C1Ev();
extern void _ZN3ccc7DD2x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y5E[] = {
  NSPAIR(_ZN3ccc7DD2x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y5E[];
extern void _ZN3ccc7DD2x1y53efgEv();
extern void _ZN3ccc7DD2x1y53abcEv();
extern void _ZN3ccc7DD2x1y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y53abcEv,_ZTv0_n12_N3ccc7DD2x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y53abcEv,_ZThn4_N3ccc7DD2x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y53pqrEv,_ZTv0_n16_N3ccc7DD2x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y53pqrEv,_ZThn4_N3ccc7DD2x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y53efgEv,_ZTv0_n20_N3ccc7DD2x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y53efgEv,_ZThn4_N3ccc7DD2x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y53abcEv,_ZTv0_n12_N3ccc7DD2x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y53pqrEv,_ZTv0_n16_N3ccc7DD2x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y53efgEv,_ZTv0_n20_N3ccc7DD2x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y5E[] = {
  {&(_ZTVN3ccc7DD2x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y5E[];
static VTBL_ENTRY alt_thunk_names906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y53efgEv,_ZTv0_n20_N3ccc7DD2x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y53efgEv,_ZThn4_N3ccc7DD2x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y53pqrEv,_ZTv0_n16_N3ccc7DD2x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y53pqrEv,_ZThn4_N3ccc7DD2x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y53abcEv,_ZTv0_n12_N3ccc7DD2x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y53abcEv,_ZThn4_N3ccc7DD2x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y5E = {  "_ZN3ccc7DD2x1y5E", // class name
  bases__ZN3ccc7DD2x1y5E, 2,
  &(vtc__ZN3ccc7DD2x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y5E),3, //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  CC2x1y6  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y63efgEv
  ~CC2x1y6(); // tgen
  CC2x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y6E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y63abcEv");}
void  ccc::CC2x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y63efgEv");}
ccc::CC2x1y6 ::~CC2x1y6(){ note_dtor("_ZN3ccc7CC2x1y6E", this);} // tgen
ccc::CC2x1y6 ::CC2x1y6(){ note_ctor("_ZN3ccc7CC2x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y6E, buf);
    ::ccc::CC2x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y6E);
    dp->::ccc::CC2x1y6::~CC2x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y6E(Test__ZN3ccc7CC2x1y6E, "_ZN3ccc7CC2x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y6C1Ev();
extern void _ZN3ccc7CC2x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y6E[] = {
  NSPAIR(_ZN3ccc7CC2x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y6E[];
extern void _ZN3ccc7CC2x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC2x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y63efgEv,_ZTv0_n12_N3ccc7CC2x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y63efgEv,_ZThn4_N3ccc7CC2x1y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y63abcEv,_ZTv0_n16_N3ccc7CC2x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y63abcEv,_ZThn4_N3ccc7CC2x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y63efgEv,_ZTv0_n12_N3ccc7CC2x1y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y63abcEv,_ZTv0_n16_N3ccc7CC2x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y6E[] = {
  {&(_ZTVN3ccc7CC2x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y6E[];
static VTBL_ENTRY alt_thunk_names907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y63abcEv,_ZTv0_n16_N3ccc7CC2x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y63abcEv,_ZThn4_N3ccc7CC2x1y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y63efgEv,_ZTv0_n12_N3ccc7CC2x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y63efgEv,_ZThn4_N3ccc7CC2x1y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y6E = {  "_ZN3ccc7CC2x1y6E", // class name
  bases__ZN3ccc7CC2x1y6E, 2,
  &(vtc__ZN3ccc7CC2x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y6E),2, //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  DD2x1y6  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD2x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x1y63efgEv
  ~DD2x1y6(); // tgen
  DD2x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y63abcEv");}
void  ccc::DD2x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y63efgEv");}
ccc::DD2x1y6 ::~DD2x1y6(){ note_dtor("_ZN3ccc7DD2x1y6E", this);} // tgen
ccc::DD2x1y6 ::DD2x1y6(){ note_ctor("_ZN3ccc7DD2x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y6E, buf);
    ::ccc::DD2x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y6E);
    dp->::ccc::DD2x1y6::~DD2x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y6E(Test__ZN3ccc7DD2x1y6E, "_ZN3ccc7DD2x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y6C1Ev();
extern void _ZN3ccc7DD2x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y6E[] = {
  NSPAIR(_ZN3ccc7DD2x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y6E[];
extern void _ZN3ccc7DD2x1y63efgEv();
extern void _ZN3ccc7DD2x1y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y63abcEv,_ZTv0_n12_N3ccc7DD2x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y63abcEv,_ZThn4_N3ccc7DD2x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y63efgEv,_ZTv0_n20_N3ccc7DD2x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y63efgEv,_ZThn4_N3ccc7DD2x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y63abcEv,_ZTv0_n12_N3ccc7DD2x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y63efgEv,_ZTv0_n20_N3ccc7DD2x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y6E[] = {
  {&(_ZTVN3ccc7DD2x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y6E[];
static VTBL_ENTRY alt_thunk_names908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y63efgEv,_ZTv0_n20_N3ccc7DD2x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y63efgEv,_ZThn4_N3ccc7DD2x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y63abcEv,_ZTv0_n12_N3ccc7DD2x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y63abcEv,_ZThn4_N3ccc7DD2x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y6E = {  "_ZN3ccc7DD2x1y6E", // class name
  bases__ZN3ccc7DD2x1y6E, 2,
  &(vtc__ZN3ccc7DD2x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y6E),3, //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  CC2x1y7  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y73pqrEv
  ~CC2x1y7(); // tgen
  CC2x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y7E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y73abcEv");}
void  ccc::CC2x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y73pqrEv");}
ccc::CC2x1y7 ::~CC2x1y7(){ note_dtor("_ZN3ccc7CC2x1y7E", this);} // tgen
ccc::CC2x1y7 ::CC2x1y7(){ note_ctor("_ZN3ccc7CC2x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y7E, buf);
    ::ccc::CC2x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y7E);
    dp->::ccc::CC2x1y7::~CC2x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y7E(Test__ZN3ccc7CC2x1y7E, "_ZN3ccc7CC2x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y7C1Ev();
extern void _ZN3ccc7CC2x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y7E[] = {
  NSPAIR(_ZN3ccc7CC2x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y7E[];
extern void _ZN3ccc7CC2x1y73abcEv();
extern void _ZN3ccc7CC2x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y73abcEv,_ZTv0_n16_N3ccc7CC2x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y73abcEv,_ZThn4_N3ccc7CC2x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y73pqrEv,_ZTv0_n20_N3ccc7CC2x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y73pqrEv,_ZThn4_N3ccc7CC2x1y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y73abcEv,_ZTv0_n16_N3ccc7CC2x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y73pqrEv,_ZTv0_n20_N3ccc7CC2x1y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y7E[] = {
  {&(_ZTVN3ccc7CC2x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y7E[];
static VTBL_ENTRY alt_thunk_names909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y73pqrEv,_ZTv0_n20_N3ccc7CC2x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y73pqrEv,_ZThn4_N3ccc7CC2x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y73abcEv,_ZTv0_n16_N3ccc7CC2x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y73abcEv,_ZThn4_N3ccc7CC2x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y7E = {  "_ZN3ccc7CC2x1y7E", // class name
  bases__ZN3ccc7CC2x1y7E, 2,
  &(vtc__ZN3ccc7CC2x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y7E),2, //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  DD2x1y7  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD2x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y73pqrEv
  ~DD2x1y7(); // tgen
  DD2x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y73abcEv");}
void  ccc::DD2x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y73pqrEv");}
ccc::DD2x1y7 ::~DD2x1y7(){ note_dtor("_ZN3ccc7DD2x1y7E", this);} // tgen
ccc::DD2x1y7 ::DD2x1y7(){ note_ctor("_ZN3ccc7DD2x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y7E, buf);
    ::ccc::DD2x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y7E);
    dp->::ccc::DD2x1y7::~DD2x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y7E(Test__ZN3ccc7DD2x1y7E, "_ZN3ccc7DD2x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y7C1Ev();
extern void _ZN3ccc7DD2x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y7E[] = {
  NSPAIR(_ZN3ccc7DD2x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x1y73abcEv();
extern void _ZN3ccc7DD2x1y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y73abcEv,_ZTv0_n12_N3ccc7DD2x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y73abcEv,_ZThn4_N3ccc7DD2x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y73pqrEv,_ZTv0_n16_N3ccc7DD2x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y73pqrEv,_ZThn4_N3ccc7DD2x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y73abcEv,_ZTv0_n12_N3ccc7DD2x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y73pqrEv,_ZTv0_n16_N3ccc7DD2x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y7E[] = {
  {&(_ZTVN3ccc7DD2x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y7E[];
static VTBL_ENTRY alt_thunk_names910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y73pqrEv,_ZTv0_n16_N3ccc7DD2x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y73pqrEv,_ZThn4_N3ccc7DD2x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y73abcEv,_ZTv0_n12_N3ccc7DD2x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y73abcEv,_ZThn4_N3ccc7DD2x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y7E = {  "_ZN3ccc7DD2x1y7E", // class name
  bases__ZN3ccc7DD2x1y7E, 2,
  &(vtc__ZN3ccc7DD2x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y7E),3, //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  CC2x1y8  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y83abcEv
  ~CC2x1y8(); // tgen
  CC2x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y8E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y83efgEv");}
void  ccc::CC2x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y83abcEv");}
ccc::CC2x1y8 ::~CC2x1y8(){ note_dtor("_ZN3ccc7CC2x1y8E", this);} // tgen
ccc::CC2x1y8 ::CC2x1y8(){ note_ctor("_ZN3ccc7CC2x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y8E, buf);
    ::ccc::CC2x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y8E);
    dp->::ccc::CC2x1y8::~CC2x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y8E(Test__ZN3ccc7CC2x1y8E, "_ZN3ccc7CC2x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y8C1Ev();
extern void _ZN3ccc7CC2x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y8E[] = {
  NSPAIR(_ZN3ccc7CC2x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y8E[];
extern void _ZN3ccc7CC2x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC2x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y83efgEv,_ZTv0_n12_N3ccc7CC2x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y83efgEv,_ZThn4_N3ccc7CC2x1y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x1y83abcEv,_ZTv0_n16_N3ccc7CC2x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y83abcEv,_ZThn4_N3ccc7CC2x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y83efgEv,_ZTv0_n12_N3ccc7CC2x1y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x1y83abcEv,_ZTv0_n16_N3ccc7CC2x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y8E[] = {
  {&(_ZTVN3ccc7CC2x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y8E[];
static VTBL_ENTRY alt_thunk_names911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x1y83abcEv,_ZTv0_n16_N3ccc7CC2x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y83abcEv,_ZThn4_N3ccc7CC2x1y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y83efgEv,_ZTv0_n12_N3ccc7CC2x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y83efgEv,_ZThn4_N3ccc7CC2x1y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y8E = {  "_ZN3ccc7CC2x1y8E", // class name
  bases__ZN3ccc7CC2x1y8E, 2,
  &(vtc__ZN3ccc7CC2x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y8E),2, //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  DD2x1y8  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD2x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x1y83abcEv
  ~DD2x1y8(); // tgen
  DD2x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y83efgEv");}
void  ccc::DD2x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x1y83abcEv");}
ccc::DD2x1y8 ::~DD2x1y8(){ note_dtor("_ZN3ccc7DD2x1y8E", this);} // tgen
ccc::DD2x1y8 ::DD2x1y8(){ note_ctor("_ZN3ccc7DD2x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y8E, buf);
    ::ccc::DD2x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y8E);
    dp->::ccc::DD2x1y8::~DD2x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y8E(Test__ZN3ccc7DD2x1y8E, "_ZN3ccc7DD2x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y8C1Ev();
extern void _ZN3ccc7DD2x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y8E[] = {
  NSPAIR(_ZN3ccc7DD2x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y8E[];
extern void _ZN3ccc7DD2x1y83efgEv();
extern void _ZN3ccc7DD2x1y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x1y83abcEv,_ZTv0_n12_N3ccc7DD2x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y83abcEv,_ZThn4_N3ccc7DD2x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y83efgEv,_ZTv0_n20_N3ccc7DD2x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y83efgEv,_ZThn4_N3ccc7DD2x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x1y83abcEv,_ZTv0_n12_N3ccc7DD2x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y83efgEv,_ZTv0_n20_N3ccc7DD2x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y8E[] = {
  {&(_ZTVN3ccc7DD2x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y8E[];
static VTBL_ENTRY alt_thunk_names912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y83efgEv,_ZTv0_n20_N3ccc7DD2x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y83efgEv,_ZThn4_N3ccc7DD2x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x1y83abcEv,_ZTv0_n12_N3ccc7DD2x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y83abcEv,_ZThn4_N3ccc7DD2x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y8E = {  "_ZN3ccc7DD2x1y8E", // class name
  bases__ZN3ccc7DD2x1y8E, 2,
  &(vtc__ZN3ccc7DD2x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y8E),3, //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  CC2x1y9  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y93pqrEv
  ~CC2x1y9(); // tgen
  CC2x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y9E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y93efgEv");}
void  ccc::CC2x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y93pqrEv");}
ccc::CC2x1y9 ::~CC2x1y9(){ note_dtor("_ZN3ccc7CC2x1y9E", this);} // tgen
ccc::CC2x1y9 ::CC2x1y9(){ note_ctor("_ZN3ccc7CC2x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y9E, buf);
    ::ccc::CC2x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC2x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y9E);
    dp->::ccc::CC2x1y9::~CC2x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y9E(Test__ZN3ccc7CC2x1y9E, "_ZN3ccc7CC2x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y9C1Ev();
extern void _ZN3ccc7CC2x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y9E[] = {
  NSPAIR(_ZN3ccc7CC2x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC2x1y93pqrEv();
extern void _ZN3ccc7CC2x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x1y93efgEv,_ZTv0_n12_N3ccc7CC2x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y93efgEv,_ZThn4_N3ccc7CC2x1y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x1y93pqrEv,_ZTv0_n20_N3ccc7CC2x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y93pqrEv,_ZThn4_N3ccc7CC2x1y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x1y93efgEv,_ZTv0_n12_N3ccc7CC2x1y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x1y93pqrEv,_ZTv0_n20_N3ccc7CC2x1y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x1y9E[] = {
  {&(_ZTVN3ccc7CC2x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x1y9E[];
static VTBL_ENTRY alt_thunk_names913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x1y93pqrEv,_ZTv0_n20_N3ccc7CC2x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y93pqrEv,_ZThn4_N3ccc7CC2x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x1y93efgEv,_ZTv0_n12_N3ccc7CC2x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x1y93efgEv,_ZThn4_N3ccc7CC2x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x1y9E = {  "_ZN3ccc7CC2x1y9E", // class name
  bases__ZN3ccc7CC2x1y9E, 2,
  &(vtc__ZN3ccc7CC2x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x1y9E),2, //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  DD2x1y9  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD2x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x1y93pqrEv
  ~DD2x1y9(); // tgen
  DD2x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x1y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x1y93efgEv");}
void  ccc::DD2x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x1y93pqrEv");}
ccc::DD2x1y9 ::~DD2x1y9(){ note_dtor("_ZN3ccc7DD2x1y9E", this);} // tgen
ccc::DD2x1y9 ::DD2x1y9(){ note_ctor("_ZN3ccc7DD2x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x1y9E, buf);
    ::ccc::DD2x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x1y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD2x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x1y9E);
    dp->::ccc::DD2x1y9::~DD2x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x1y9E(Test__ZN3ccc7DD2x1y9E, "_ZN3ccc7DD2x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x1y9C1Ev();
extern void _ZN3ccc7DD2x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x1y9E[] = {
  NSPAIR(_ZN3ccc7DD2x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD2x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y9E[];
extern void _ZN3ccc7DD2x1y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x1y93pqrEv,_ZTv0_n16_N3ccc7DD2x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y93pqrEv,_ZThn4_N3ccc7DD2x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x1y93efgEv,_ZTv0_n20_N3ccc7DD2x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x1y93efgEv,_ZThn4_N3ccc7DD2x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x1y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x1y93pqrEv,_ZTv0_n16_N3ccc7DD2x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x1y93efgEv,_ZTv0_n20_N3ccc7DD2x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x1y9E[] = {
  {&(_ZTVN3ccc7DD2x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x1y9E[];
static VTBL_ENTRY alt_thunk_names914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x1y93efgEv,_ZTv0_n20_N3ccc7DD2x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y93efgEv,_ZThn4_N3ccc7DD2x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x1y93pqrEv,_ZTv0_n16_N3ccc7DD2x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x1y93pqrEv,_ZThn4_N3ccc7DD2x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x1y9E = {  "_ZN3ccc7DD2x1y9E", // class name
  bases__ZN3ccc7DD2x1y9E, 2,
  &(vtc__ZN3ccc7DD2x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x1y9E),3, //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  CC2x1y10  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x1y103abcEv
  ~CC2x1y10(); // tgen
  CC2x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y10E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y103pqrEv");}
void  ccc::CC2x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x1y103abcEv");}
ccc::CC2x1y10 ::~CC2x1y10(){ note_dtor("_ZN3ccc8CC2x1y10E", this);} // tgen
ccc::CC2x1y10 ::CC2x1y10(){ note_ctor("_ZN3ccc8CC2x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y10E, buf);
    ::ccc::CC2x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y10E);
    dp->::ccc::CC2x1y10::~CC2x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y10E(Test__ZN3ccc8CC2x1y10E, "_ZN3ccc8CC2x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y10C1Ev();
extern void _ZN3ccc8CC2x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y10E[] = {
  NSPAIR(_ZN3ccc8CC2x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y10E[];
extern void _ZN3ccc8CC2x1y103abcEv();
extern void _ZN3ccc8CC2x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x1y103abcEv,_ZTv0_n16_N3ccc8CC2x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y103abcEv,_ZThn4_N3ccc8CC2x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x1y103pqrEv,_ZTv0_n20_N3ccc8CC2x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y103pqrEv,_ZThn4_N3ccc8CC2x1y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x1y103abcEv,_ZTv0_n16_N3ccc8CC2x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x1y103pqrEv,_ZTv0_n20_N3ccc8CC2x1y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y10E[] = {
  {&(_ZTVN3ccc8CC2x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y10E[];
static VTBL_ENTRY alt_thunk_names915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x1y103pqrEv,_ZTv0_n20_N3ccc8CC2x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y103pqrEv,_ZThn4_N3ccc8CC2x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x1y103abcEv,_ZTv0_n16_N3ccc8CC2x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y103abcEv,_ZThn4_N3ccc8CC2x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x1y10E = {  "_ZN3ccc8CC2x1y10E", // class name
  bases__ZN3ccc8CC2x1y10E, 2,
  &(vtc__ZN3ccc8CC2x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y10E),2, //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  DD2x1y10  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD2x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x1y103abcEv
  ~DD2x1y10(); // tgen
  DD2x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x1y103pqrEv");}
void  ccc::DD2x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x1y103abcEv");}
ccc::DD2x1y10 ::~DD2x1y10(){ note_dtor("_ZN3ccc8DD2x1y10E", this);} // tgen
ccc::DD2x1y10 ::DD2x1y10(){ note_ctor("_ZN3ccc8DD2x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y10E, buf);
    ::ccc::DD2x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y10E);
    dp->::ccc::DD2x1y10::~DD2x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y10E(Test__ZN3ccc8DD2x1y10E, "_ZN3ccc8DD2x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y10C1Ev();
extern void _ZN3ccc8DD2x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y10E[] = {
  NSPAIR(_ZN3ccc8DD2x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x1y103abcEv();
extern void _ZN3ccc8DD2x1y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x1y103abcEv,_ZTv0_n12_N3ccc8DD2x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y103abcEv,_ZThn4_N3ccc8DD2x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x1y103pqrEv,_ZTv0_n16_N3ccc8DD2x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y103pqrEv,_ZThn4_N3ccc8DD2x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x1y103abcEv,_ZTv0_n12_N3ccc8DD2x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x1y103pqrEv,_ZTv0_n16_N3ccc8DD2x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y10E[] = {
  {&(_ZTVN3ccc8DD2x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y10E[];
static VTBL_ENTRY alt_thunk_names916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x1y103pqrEv,_ZTv0_n16_N3ccc8DD2x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y103pqrEv,_ZThn4_N3ccc8DD2x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x1y103abcEv,_ZTv0_n12_N3ccc8DD2x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y103abcEv,_ZThn4_N3ccc8DD2x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x1y10E = {  "_ZN3ccc8DD2x1y10E", // class name
  bases__ZN3ccc8DD2x1y10E, 2,
  &(vtc__ZN3ccc8DD2x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y10E),3, //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  CC2x1y11  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x1y113efgEv
  ~CC2x1y11(); // tgen
  CC2x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y11E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y113pqrEv");}
void  ccc::CC2x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x1y113efgEv");}
ccc::CC2x1y11 ::~CC2x1y11(){ note_dtor("_ZN3ccc8CC2x1y11E", this);} // tgen
ccc::CC2x1y11 ::CC2x1y11(){ note_ctor("_ZN3ccc8CC2x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y11E, buf);
    ::ccc::CC2x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y11E);
    dp->::ccc::CC2x1y11::~CC2x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y11E(Test__ZN3ccc8CC2x1y11E, "_ZN3ccc8CC2x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y11C1Ev();
extern void _ZN3ccc8CC2x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y11E[] = {
  NSPAIR(_ZN3ccc8CC2x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC2x1y113pqrEv();
extern void _ZN3ccc8CC2x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x1y113efgEv,_ZTv0_n12_N3ccc8CC2x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y113efgEv,_ZThn4_N3ccc8CC2x1y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x1y113pqrEv,_ZTv0_n20_N3ccc8CC2x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y113pqrEv,_ZThn4_N3ccc8CC2x1y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x1y113efgEv,_ZTv0_n12_N3ccc8CC2x1y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x1y113pqrEv,_ZTv0_n20_N3ccc8CC2x1y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y11E[] = {
  {&(_ZTVN3ccc8CC2x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y11E[];
static VTBL_ENTRY alt_thunk_names917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x1y113pqrEv,_ZTv0_n20_N3ccc8CC2x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y113pqrEv,_ZThn4_N3ccc8CC2x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x1y113efgEv,_ZTv0_n12_N3ccc8CC2x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y113efgEv,_ZThn4_N3ccc8CC2x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x1y11E = {  "_ZN3ccc8CC2x1y11E", // class name
  bases__ZN3ccc8CC2x1y11E, 2,
  &(vtc__ZN3ccc8CC2x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y11E),2, //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  DD2x1y11  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD2x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x1y113efgEv
  ~DD2x1y11(); // tgen
  DD2x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x1y113pqrEv");}
void  ccc::DD2x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x1y113efgEv");}
ccc::DD2x1y11 ::~DD2x1y11(){ note_dtor("_ZN3ccc8DD2x1y11E", this);} // tgen
ccc::DD2x1y11 ::DD2x1y11(){ note_ctor("_ZN3ccc8DD2x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y11E, buf);
    ::ccc::DD2x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y11E);
    dp->::ccc::DD2x1y11::~DD2x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y11E(Test__ZN3ccc8DD2x1y11E, "_ZN3ccc8DD2x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y11C1Ev();
extern void _ZN3ccc8DD2x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y11E[] = {
  NSPAIR(_ZN3ccc8DD2x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y11E[];
extern void _ZN3ccc8DD2x1y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x1y113pqrEv,_ZTv0_n16_N3ccc8DD2x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y113pqrEv,_ZThn4_N3ccc8DD2x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x1y113efgEv,_ZTv0_n20_N3ccc8DD2x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y113efgEv,_ZThn4_N3ccc8DD2x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x1y113pqrEv,_ZTv0_n16_N3ccc8DD2x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x1y113efgEv,_ZTv0_n20_N3ccc8DD2x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y11E[] = {
  {&(_ZTVN3ccc8DD2x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y11E[];
static VTBL_ENTRY alt_thunk_names918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x1y113efgEv,_ZTv0_n20_N3ccc8DD2x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y113efgEv,_ZThn4_N3ccc8DD2x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x1y113pqrEv,_ZTv0_n16_N3ccc8DD2x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y113pqrEv,_ZThn4_N3ccc8DD2x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x1y11E = {  "_ZN3ccc8DD2x1y11E", // class name
  bases__ZN3ccc8DD2x1y11E, 2,
  &(vtc__ZN3ccc8DD2x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y11E),3, //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  CC2x1y12  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC2x1y123abcEv
  ~CC2x1y12(); // tgen
  CC2x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x1y123abcEv");}
ccc::CC2x1y12 ::~CC2x1y12(){ note_dtor("_ZN3ccc8CC2x1y12E", this);} // tgen
ccc::CC2x1y12 ::CC2x1y12(){ note_ctor("_ZN3ccc8CC2x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y12E, buf);
    ::ccc::CC2x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y12E);
    dp->::ccc::CC2x1y12::~CC2x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y12E(Test__ZN3ccc8CC2x1y12E, "_ZN3ccc8CC2x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y12C1Ev();
extern void _ZN3ccc8CC2x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y12E[] = {
  NSPAIR(_ZN3ccc8CC2x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y12E[];
extern void _ZN3ccc8CC2x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x1y123abcEv,_ZTv0_n16_N3ccc8CC2x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y123abcEv,_ZThn4_N3ccc8CC2x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x1y123abcEv,_ZTv0_n16_N3ccc8CC2x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y12E[] = {
  {&(_ZTVN3ccc8CC2x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y12E[];
static VTBL_ENTRY alt_thunk_names919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x1y123abcEv,_ZTv0_n16_N3ccc8CC2x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y123abcEv,_ZThn4_N3ccc8CC2x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x1y12E = {  "_ZN3ccc8CC2x1y12E", // class name
  bases__ZN3ccc8CC2x1y12E, 2,
  &(vtc__ZN3ccc8CC2x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y12E),2, //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  DD2x1y12  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD2x1y123abcEv
  ~DD2x1y12(); // tgen
  DD2x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x1y123abcEv");}
ccc::DD2x1y12 ::~DD2x1y12(){ note_dtor("_ZN3ccc8DD2x1y12E", this);} // tgen
ccc::DD2x1y12 ::DD2x1y12(){ note_ctor("_ZN3ccc8DD2x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y12E, buf);
    ::ccc::DD2x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y12E);
    dp->::ccc::DD2x1y12::~DD2x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y12E(Test__ZN3ccc8DD2x1y12E, "_ZN3ccc8DD2x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y12C1Ev();
extern void _ZN3ccc8DD2x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y12E[] = {
  NSPAIR(_ZN3ccc8DD2x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x1y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x1y123abcEv,_ZTv0_n12_N3ccc8DD2x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y123abcEv,_ZThn4_N3ccc8DD2x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x1y123abcEv,_ZTv0_n12_N3ccc8DD2x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y12E[] = {
  {&(_ZTVN3ccc8DD2x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y12E[];
static VTBL_ENTRY alt_thunk_names920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x1y123abcEv,_ZTv0_n12_N3ccc8DD2x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y123abcEv,_ZThn4_N3ccc8DD2x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x1y12E = {  "_ZN3ccc8DD2x1y12E", // class name
  bases__ZN3ccc8DD2x1y12E, 2,
  &(vtc__ZN3ccc8DD2x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y12E),3, //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  CC2x1y13  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC2x1y133efgEv
  ~CC2x1y13(); // tgen
  CC2x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x1y133efgEv");}
ccc::CC2x1y13 ::~CC2x1y13(){ note_dtor("_ZN3ccc8CC2x1y13E", this);} // tgen
ccc::CC2x1y13 ::CC2x1y13(){ note_ctor("_ZN3ccc8CC2x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y13E, buf);
    ::ccc::CC2x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y13E);
    dp->::ccc::CC2x1y13::~CC2x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y13E(Test__ZN3ccc8CC2x1y13E, "_ZN3ccc8CC2x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y13C1Ev();
extern void _ZN3ccc8CC2x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y13E[] = {
  NSPAIR(_ZN3ccc8CC2x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC2x1y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x1y133efgEv,_ZTv0_n12_N3ccc8CC2x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y133efgEv,_ZThn4_N3ccc8CC2x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x1y133efgEv,_ZTv0_n12_N3ccc8CC2x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y13E[] = {
  {&(_ZTVN3ccc8CC2x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y13E[];
static VTBL_ENTRY alt_thunk_names921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x1y133efgEv,_ZTv0_n12_N3ccc8CC2x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y133efgEv,_ZThn4_N3ccc8CC2x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x1y13E = {  "_ZN3ccc8CC2x1y13E", // class name
  bases__ZN3ccc8CC2x1y13E, 2,
  &(vtc__ZN3ccc8CC2x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y13E),2, //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  DD2x1y13  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD2x1y133efgEv
  ~DD2x1y13(); // tgen
  DD2x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x1y133efgEv");}
ccc::DD2x1y13 ::~DD2x1y13(){ note_dtor("_ZN3ccc8DD2x1y13E", this);} // tgen
ccc::DD2x1y13 ::DD2x1y13(){ note_ctor("_ZN3ccc8DD2x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y13E, buf);
    ::ccc::DD2x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y13E);
    dp->::ccc::DD2x1y13::~DD2x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y13E(Test__ZN3ccc8DD2x1y13E, "_ZN3ccc8DD2x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y13C1Ev();
extern void _ZN3ccc8DD2x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y13E[] = {
  NSPAIR(_ZN3ccc8DD2x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y13E[];
extern void _ZN3ccc8DD2x1y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x1y133efgEv,_ZTv0_n20_N3ccc8DD2x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y133efgEv,_ZThn4_N3ccc8DD2x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x1y133efgEv,_ZTv0_n20_N3ccc8DD2x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y13E[] = {
  {&(_ZTVN3ccc8DD2x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y13E[];
static VTBL_ENTRY alt_thunk_names922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x1y133efgEv,_ZTv0_n20_N3ccc8DD2x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y133efgEv,_ZThn4_N3ccc8DD2x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x1y13E = {  "_ZN3ccc8DD2x1y13E", // class name
  bases__ZN3ccc8DD2x1y13E, 2,
  &(vtc__ZN3ccc8DD2x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y13E),3, //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  CC2x1y14  : virtual ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y143pqrEv
  ~CC2x1y14(); // tgen
  CC2x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y143pqrEv");}
ccc::CC2x1y14 ::~CC2x1y14(){ note_dtor("_ZN3ccc8CC2x1y14E", this);} // tgen
ccc::CC2x1y14 ::CC2x1y14(){ note_ctor("_ZN3ccc8CC2x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y14E, buf);
    ::ccc::CC2x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y14E);
    dp->::ccc::CC2x1y14::~CC2x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y14E(Test__ZN3ccc8CC2x1y14E, "_ZN3ccc8CC2x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y14C1Ev();
extern void _ZN3ccc8CC2x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y14E[] = {
  NSPAIR(_ZN3ccc8CC2x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC2x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x1y143pqrEv,_ZTv0_n20_N3ccc8CC2x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y143pqrEv,_ZThn4_N3ccc8CC2x1y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x1y143pqrEv,_ZTv0_n20_N3ccc8CC2x1y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y14E[] = {
  {&(_ZTVN3ccc8CC2x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y14E[];
static VTBL_ENTRY alt_thunk_names923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x1y143pqrEv,_ZTv0_n20_N3ccc8CC2x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x1y143pqrEv,_ZThn4_N3ccc8CC2x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x1y14E = {  "_ZN3ccc8CC2x1y14E", // class name
  bases__ZN3ccc8CC2x1y14E, 2,
  &(vtc__ZN3ccc8CC2x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y14E),2, //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  DD2x1y14  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD2x1y143pqrEv
  ~DD2x1y14(); // tgen
  DD2x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x1y143pqrEv");}
ccc::DD2x1y14 ::~DD2x1y14(){ note_dtor("_ZN3ccc8DD2x1y14E", this);} // tgen
ccc::DD2x1y14 ::DD2x1y14(){ note_ctor("_ZN3ccc8DD2x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y14E, buf);
    ::ccc::DD2x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y14E);
    dp->::ccc::DD2x1y14::~DD2x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y14E(Test__ZN3ccc8DD2x1y14E, "_ZN3ccc8DD2x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y14C1Ev();
extern void _ZN3ccc8DD2x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y14E[] = {
  NSPAIR(_ZN3ccc8DD2x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x1y143pqrEv,_ZTv0_n16_N3ccc8DD2x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x1y143pqrEv,_ZThn4_N3ccc8DD2x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x1y143pqrEv,_ZTv0_n16_N3ccc8DD2x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y14E[] = {
  {&(_ZTVN3ccc8DD2x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y14E[];
static VTBL_ENTRY alt_thunk_names924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x1y143pqrEv,_ZTv0_n16_N3ccc8DD2x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x1y143pqrEv,_ZThn4_N3ccc8DD2x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x1y14E = {  "_ZN3ccc8DD2x1y14E", // class name
  bases__ZN3ccc8DD2x1y14E, 2,
  &(vtc__ZN3ccc8DD2x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y14E),3, //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  CC2x1y15  : virtual ::ccc::AA2 , ::ccc::BB1 {
  ~CC2x1y15(); // tgen
  CC2x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x1y15 ::~CC2x1y15(){ note_dtor("_ZN3ccc8CC2x1y15E", this);} // tgen
ccc::CC2x1y15 ::CC2x1y15(){ note_ctor("_ZN3ccc8CC2x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y15E, buf);
    ::ccc::CC2x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC2x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y15E);
    dp->::ccc::CC2x1y15::~CC2x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y15E(Test__ZN3ccc8CC2x1y15E, "_ZN3ccc8CC2x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y15C1Ev();
extern void _ZN3ccc8CC2x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y15E[] = {
  NSPAIR(_ZN3ccc8CC2x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x1y15E[] = {
  {&(_ZTVN3ccc8CC2x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x1y15E[];
Class_Descriptor cd__ZN3ccc8CC2x1y15E = {  "_ZN3ccc8CC2x1y15E", // class name
  bases__ZN3ccc8CC2x1y15E, 2,
  &(vtc__ZN3ccc8CC2x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x1y15  : virtual ::ccc::AA2 , virtual ::ccc::BB1 {
  ~DD2x1y15(); // tgen
  DD2x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x1y15 ::~DD2x1y15(){ note_dtor("_ZN3ccc8DD2x1y15E", this);} // tgen
ccc::DD2x1y15 ::DD2x1y15(){ note_ctor("_ZN3ccc8DD2x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x1y15E, buf);
    ::ccc::DD2x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x1y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD2x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x1y15E);
    dp->::ccc::DD2x1y15::~DD2x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x1y15E(Test__ZN3ccc8DD2x1y15E, "_ZN3ccc8DD2x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x1y15C1Ev();
extern void _ZN3ccc8DD2x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x1y15E[] = {
  NSPAIR(_ZN3ccc8DD2x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD2x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x1y15E[] = {
  {&(_ZTVN3ccc8DD2x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x1y15E[];
Class_Descriptor cd__ZN3ccc8DD2x1y15E = {  "_ZN3ccc8DD2x1y15E", // class name
  bases__ZN3ccc8DD2x1y15E, 2,
  &(vtc__ZN3ccc8DD2x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y0  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y03pqrEv
  ~CC2x2y0(); // tgen
  CC2x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y0E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y03abcEv");}
void  ccc::CC2x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y03efgEv");}
void  ccc::CC2x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y03pqrEv");}
ccc::CC2x2y0 ::~CC2x2y0(){ note_dtor("_ZN3ccc7CC2x2y0E", this);} // tgen
ccc::CC2x2y0 ::CC2x2y0(){ note_ctor("_ZN3ccc7CC2x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y0E, buf);
    ::ccc::CC2x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y0E);
    dp->::ccc::CC2x2y0::~CC2x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y0E(Test__ZN3ccc7CC2x2y0E, "_ZN3ccc7CC2x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y0C1Ev();
extern void _ZN3ccc7CC2x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y0E[] = {
  NSPAIR(_ZN3ccc7CC2x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y0E[];
extern void _ZN3ccc7CC2x2y03efgEv();
extern void _ZN3ccc7CC2x2y03abcEv();
extern void _ZN3ccc7CC2x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y03efgEv,_ZTv0_n12_N3ccc7CC2x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03efgEv,_ZThn4_N3ccc7CC2x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y03abcEv,_ZTv0_n16_N3ccc7CC2x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03abcEv,_ZThn4_N3ccc7CC2x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y03pqrEv,_ZTv0_n20_N3ccc7CC2x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03pqrEv,_ZThn4_N3ccc7CC2x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y03efgEv,_ZTv0_n12_N3ccc7CC2x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y03abcEv,_ZTv0_n16_N3ccc7CC2x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y03pqrEv,_ZTv0_n20_N3ccc7CC2x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y0E[] = {
  {&(_ZTVN3ccc7CC2x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y0E[];
static VTBL_ENTRY alt_thunk_names925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y03pqrEv,_ZTv0_n20_N3ccc7CC2x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y03pqrEv,_ZThn4_N3ccc7CC2x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y03abcEv,_ZTv0_n16_N3ccc7CC2x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y03abcEv,_ZThn4_N3ccc7CC2x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y03efgEv,_ZTv0_n12_N3ccc7CC2x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y03efgEv,_ZThn4_N3ccc7CC2x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y0E = {  "_ZN3ccc7CC2x2y0E", // class name
  bases__ZN3ccc7CC2x2y0E, 2,
  &(vtc__ZN3ccc7CC2x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y0E),2, //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  DD2x2y0  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD2x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y03pqrEv
  ~DD2x2y0(); // tgen
  DD2x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y03abcEv");}
void  ccc::DD2x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y03efgEv");}
void  ccc::DD2x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y03pqrEv");}
ccc::DD2x2y0 ::~DD2x2y0(){ note_dtor("_ZN3ccc7DD2x2y0E", this);} // tgen
ccc::DD2x2y0 ::DD2x2y0(){ note_ctor("_ZN3ccc7DD2x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y0E, buf);
    ::ccc::DD2x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y0E);
    dp->::ccc::DD2x2y0::~DD2x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y0E(Test__ZN3ccc7DD2x2y0E, "_ZN3ccc7DD2x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y0C1Ev();
extern void _ZN3ccc7DD2x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y0E[] = {
  NSPAIR(_ZN3ccc7DD2x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y0E[];
extern void _ZN3ccc7DD2x2y03efgEv();
extern void _ZN3ccc7DD2x2y03abcEv();
extern void _ZN3ccc7DD2x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y03efgEv,_ZTv0_n12_N3ccc7DD2x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y03efgEv,_ZThn4_N3ccc7DD2x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y03abcEv,_ZTv0_n16_N3ccc7DD2x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y03abcEv,_ZThn4_N3ccc7DD2x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y03pqrEv,_ZTv0_n20_N3ccc7DD2x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y03pqrEv,_ZThn4_N3ccc7DD2x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y03efgEv,_ZTv0_n12_N3ccc7DD2x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y03abcEv,_ZTv0_n16_N3ccc7DD2x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y03pqrEv,_ZTv0_n20_N3ccc7DD2x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y0E[] = {
  {&(_ZTVN3ccc7DD2x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y0E[];
static VTBL_ENTRY alt_thunk_names926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y03pqrEv,_ZTv0_n20_N3ccc7DD2x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y03pqrEv,_ZThn4_N3ccc7DD2x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y03abcEv,_ZTv0_n16_N3ccc7DD2x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y03abcEv,_ZThn4_N3ccc7DD2x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y03efgEv,_ZTv0_n12_N3ccc7DD2x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y03efgEv,_ZThn4_N3ccc7DD2x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y0E = {  "_ZN3ccc7DD2x2y0E", // class name
  bases__ZN3ccc7DD2x2y0E, 2,
  &(vtc__ZN3ccc7DD2x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y0E),3, //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  CC2x2y1  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x2y13efgEv
  ~CC2x2y1(); // tgen
  CC2x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y1E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y13abcEv");}
void  ccc::CC2x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y13pqrEv");}
void  ccc::CC2x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y13efgEv");}
ccc::CC2x2y1 ::~CC2x2y1(){ note_dtor("_ZN3ccc7CC2x2y1E", this);} // tgen
ccc::CC2x2y1 ::CC2x2y1(){ note_ctor("_ZN3ccc7CC2x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y1E, buf);
    ::ccc::CC2x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y1E);
    dp->::ccc::CC2x2y1::~CC2x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y1E(Test__ZN3ccc7CC2x2y1E, "_ZN3ccc7CC2x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y1C1Ev();
extern void _ZN3ccc7CC2x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y1E[] = {
  NSPAIR(_ZN3ccc7CC2x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y1E[];
extern void _ZN3ccc7CC2x2y13efgEv();
extern void _ZN3ccc7CC2x2y13abcEv();
extern void _ZN3ccc7CC2x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y13efgEv,_ZTv0_n12_N3ccc7CC2x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13efgEv,_ZThn4_N3ccc7CC2x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y13abcEv,_ZTv0_n16_N3ccc7CC2x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13abcEv,_ZThn4_N3ccc7CC2x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y13pqrEv,_ZTv0_n20_N3ccc7CC2x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13pqrEv,_ZThn4_N3ccc7CC2x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y13efgEv,_ZTv0_n12_N3ccc7CC2x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y13abcEv,_ZTv0_n16_N3ccc7CC2x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y13pqrEv,_ZTv0_n20_N3ccc7CC2x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y1E[] = {
  {&(_ZTVN3ccc7CC2x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y1E[];
static VTBL_ENTRY alt_thunk_names927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y13pqrEv,_ZTv0_n20_N3ccc7CC2x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y13pqrEv,_ZThn4_N3ccc7CC2x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y13abcEv,_ZTv0_n16_N3ccc7CC2x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y13abcEv,_ZThn4_N3ccc7CC2x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y13efgEv,_ZTv0_n12_N3ccc7CC2x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y13efgEv,_ZThn4_N3ccc7CC2x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y1E = {  "_ZN3ccc7CC2x2y1E", // class name
  bases__ZN3ccc7CC2x2y1E, 2,
  &(vtc__ZN3ccc7CC2x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y1E),2, //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  DD2x2y1  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD2x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x2y13efgEv
  ~DD2x2y1(); // tgen
  DD2x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y13abcEv");}
void  ccc::DD2x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y13pqrEv");}
void  ccc::DD2x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y13efgEv");}
ccc::DD2x2y1 ::~DD2x2y1(){ note_dtor("_ZN3ccc7DD2x2y1E", this);} // tgen
ccc::DD2x2y1 ::DD2x2y1(){ note_ctor("_ZN3ccc7DD2x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y1E, buf);
    ::ccc::DD2x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y1E);
    dp->::ccc::DD2x2y1::~DD2x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y1E(Test__ZN3ccc7DD2x2y1E, "_ZN3ccc7DD2x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y1C1Ev();
extern void _ZN3ccc7DD2x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y1E[] = {
  NSPAIR(_ZN3ccc7DD2x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y1E[];
extern void _ZN3ccc7DD2x2y13efgEv();
extern void _ZN3ccc7DD2x2y13abcEv();
extern void _ZN3ccc7DD2x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y13efgEv,_ZTv0_n12_N3ccc7DD2x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y13efgEv,_ZThn4_N3ccc7DD2x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y13abcEv,_ZTv0_n16_N3ccc7DD2x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y13abcEv,_ZThn4_N3ccc7DD2x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y13pqrEv,_ZTv0_n20_N3ccc7DD2x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y13pqrEv,_ZThn4_N3ccc7DD2x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y13efgEv,_ZTv0_n12_N3ccc7DD2x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y13abcEv,_ZTv0_n16_N3ccc7DD2x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y13pqrEv,_ZTv0_n20_N3ccc7DD2x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y1E[] = {
  {&(_ZTVN3ccc7DD2x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y1E[];
static VTBL_ENTRY alt_thunk_names928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y13pqrEv,_ZTv0_n20_N3ccc7DD2x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y13pqrEv,_ZThn4_N3ccc7DD2x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y13abcEv,_ZTv0_n16_N3ccc7DD2x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y13abcEv,_ZThn4_N3ccc7DD2x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y13efgEv,_ZTv0_n12_N3ccc7DD2x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y13efgEv,_ZThn4_N3ccc7DD2x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y1E = {  "_ZN3ccc7DD2x2y1E", // class name
  bases__ZN3ccc7DD2x2y1E, 2,
  &(vtc__ZN3ccc7DD2x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y1E),3, //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  CC2x2y2  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y23pqrEv
  ~CC2x2y2(); // tgen
  CC2x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y2E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y23efgEv");}
void  ccc::CC2x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y23abcEv");}
void  ccc::CC2x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y23pqrEv");}
ccc::CC2x2y2 ::~CC2x2y2(){ note_dtor("_ZN3ccc7CC2x2y2E", this);} // tgen
ccc::CC2x2y2 ::CC2x2y2(){ note_ctor("_ZN3ccc7CC2x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y2E, buf);
    ::ccc::CC2x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y2E);
    dp->::ccc::CC2x2y2::~CC2x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y2E(Test__ZN3ccc7CC2x2y2E, "_ZN3ccc7CC2x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y2C1Ev();
extern void _ZN3ccc7CC2x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y2E[] = {
  NSPAIR(_ZN3ccc7CC2x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y2E[];
extern void _ZN3ccc7CC2x2y23efgEv();
extern void _ZN3ccc7CC2x2y23abcEv();
extern void _ZN3ccc7CC2x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y23efgEv,_ZTv0_n12_N3ccc7CC2x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23efgEv,_ZThn4_N3ccc7CC2x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y23abcEv,_ZTv0_n16_N3ccc7CC2x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23abcEv,_ZThn4_N3ccc7CC2x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y23pqrEv,_ZTv0_n20_N3ccc7CC2x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23pqrEv,_ZThn4_N3ccc7CC2x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y23efgEv,_ZTv0_n12_N3ccc7CC2x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y23abcEv,_ZTv0_n16_N3ccc7CC2x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y23pqrEv,_ZTv0_n20_N3ccc7CC2x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y2E[] = {
  {&(_ZTVN3ccc7CC2x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y2E[];
static VTBL_ENTRY alt_thunk_names929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y23pqrEv,_ZTv0_n20_N3ccc7CC2x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y23pqrEv,_ZThn4_N3ccc7CC2x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y23abcEv,_ZTv0_n16_N3ccc7CC2x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y23abcEv,_ZThn4_N3ccc7CC2x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y23efgEv,_ZTv0_n12_N3ccc7CC2x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y23efgEv,_ZThn4_N3ccc7CC2x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y2E = {  "_ZN3ccc7CC2x2y2E", // class name
  bases__ZN3ccc7CC2x2y2E, 2,
  &(vtc__ZN3ccc7CC2x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y2E),2, //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  DD2x2y2  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD2x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y23pqrEv
  ~DD2x2y2(); // tgen
  DD2x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y23efgEv");}
void  ccc::DD2x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y23abcEv");}
void  ccc::DD2x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y23pqrEv");}
ccc::DD2x2y2 ::~DD2x2y2(){ note_dtor("_ZN3ccc7DD2x2y2E", this);} // tgen
ccc::DD2x2y2 ::DD2x2y2(){ note_ctor("_ZN3ccc7DD2x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y2E, buf);
    ::ccc::DD2x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y2E);
    dp->::ccc::DD2x2y2::~DD2x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y2E(Test__ZN3ccc7DD2x2y2E, "_ZN3ccc7DD2x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y2C1Ev();
extern void _ZN3ccc7DD2x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y2E[] = {
  NSPAIR(_ZN3ccc7DD2x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y2E[];
extern void _ZN3ccc7DD2x2y23efgEv();
extern void _ZN3ccc7DD2x2y23abcEv();
extern void _ZN3ccc7DD2x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y23efgEv,_ZTv0_n12_N3ccc7DD2x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y23efgEv,_ZThn4_N3ccc7DD2x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y23abcEv,_ZTv0_n16_N3ccc7DD2x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y23abcEv,_ZThn4_N3ccc7DD2x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y23pqrEv,_ZTv0_n20_N3ccc7DD2x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y23pqrEv,_ZThn4_N3ccc7DD2x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y23efgEv,_ZTv0_n12_N3ccc7DD2x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y23abcEv,_ZTv0_n16_N3ccc7DD2x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y23pqrEv,_ZTv0_n20_N3ccc7DD2x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y2E[] = {
  {&(_ZTVN3ccc7DD2x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y2E[];
static VTBL_ENTRY alt_thunk_names930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y23pqrEv,_ZTv0_n20_N3ccc7DD2x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y23pqrEv,_ZThn4_N3ccc7DD2x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y23abcEv,_ZTv0_n16_N3ccc7DD2x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y23abcEv,_ZThn4_N3ccc7DD2x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y23efgEv,_ZTv0_n12_N3ccc7DD2x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y23efgEv,_ZThn4_N3ccc7DD2x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y2E = {  "_ZN3ccc7DD2x2y2E", // class name
  bases__ZN3ccc7DD2x2y2E, 2,
  &(vtc__ZN3ccc7DD2x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y2E),3, //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  CC2x2y3  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x2y33abcEv
  ~CC2x2y3(); // tgen
  CC2x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y3E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y33efgEv");}
void  ccc::CC2x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y33pqrEv");}
void  ccc::CC2x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y33abcEv");}
ccc::CC2x2y3 ::~CC2x2y3(){ note_dtor("_ZN3ccc7CC2x2y3E", this);} // tgen
ccc::CC2x2y3 ::CC2x2y3(){ note_ctor("_ZN3ccc7CC2x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y3E, buf);
    ::ccc::CC2x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y3E);
    dp->::ccc::CC2x2y3::~CC2x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y3E(Test__ZN3ccc7CC2x2y3E, "_ZN3ccc7CC2x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y3C1Ev();
extern void _ZN3ccc7CC2x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y3E[] = {
  NSPAIR(_ZN3ccc7CC2x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y3E[];
extern void _ZN3ccc7CC2x2y33efgEv();
extern void _ZN3ccc7CC2x2y33abcEv();
extern void _ZN3ccc7CC2x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y33efgEv,_ZTv0_n12_N3ccc7CC2x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33efgEv,_ZThn4_N3ccc7CC2x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y33abcEv,_ZTv0_n16_N3ccc7CC2x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33abcEv,_ZThn4_N3ccc7CC2x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y33pqrEv,_ZTv0_n20_N3ccc7CC2x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33pqrEv,_ZThn4_N3ccc7CC2x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y33efgEv,_ZTv0_n12_N3ccc7CC2x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y33abcEv,_ZTv0_n16_N3ccc7CC2x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y33pqrEv,_ZTv0_n20_N3ccc7CC2x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y3E[] = {
  {&(_ZTVN3ccc7CC2x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y3E[];
static VTBL_ENTRY alt_thunk_names931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y33pqrEv,_ZTv0_n20_N3ccc7CC2x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y33pqrEv,_ZThn4_N3ccc7CC2x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y33abcEv,_ZTv0_n16_N3ccc7CC2x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y33abcEv,_ZThn4_N3ccc7CC2x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y33efgEv,_ZTv0_n12_N3ccc7CC2x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y33efgEv,_ZThn4_N3ccc7CC2x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y3E = {  "_ZN3ccc7CC2x2y3E", // class name
  bases__ZN3ccc7CC2x2y3E, 2,
  &(vtc__ZN3ccc7CC2x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y3E),2, //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  DD2x2y3  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD2x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x2y33abcEv
  ~DD2x2y3(); // tgen
  DD2x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y33efgEv");}
void  ccc::DD2x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y33pqrEv");}
void  ccc::DD2x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y33abcEv");}
ccc::DD2x2y3 ::~DD2x2y3(){ note_dtor("_ZN3ccc7DD2x2y3E", this);} // tgen
ccc::DD2x2y3 ::DD2x2y3(){ note_ctor("_ZN3ccc7DD2x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y3E, buf);
    ::ccc::DD2x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y3E);
    dp->::ccc::DD2x2y3::~DD2x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y3E(Test__ZN3ccc7DD2x2y3E, "_ZN3ccc7DD2x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y3C1Ev();
extern void _ZN3ccc7DD2x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y3E[] = {
  NSPAIR(_ZN3ccc7DD2x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y3E[];
extern void _ZN3ccc7DD2x2y33efgEv();
extern void _ZN3ccc7DD2x2y33abcEv();
extern void _ZN3ccc7DD2x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y33efgEv,_ZTv0_n12_N3ccc7DD2x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y33efgEv,_ZThn4_N3ccc7DD2x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y33abcEv,_ZTv0_n16_N3ccc7DD2x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y33abcEv,_ZThn4_N3ccc7DD2x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y33pqrEv,_ZTv0_n20_N3ccc7DD2x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y33pqrEv,_ZThn4_N3ccc7DD2x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y33efgEv,_ZTv0_n12_N3ccc7DD2x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y33abcEv,_ZTv0_n16_N3ccc7DD2x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y33pqrEv,_ZTv0_n20_N3ccc7DD2x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y3E[] = {
  {&(_ZTVN3ccc7DD2x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y3E[];
static VTBL_ENTRY alt_thunk_names932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y33pqrEv,_ZTv0_n20_N3ccc7DD2x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y33pqrEv,_ZThn4_N3ccc7DD2x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y33abcEv,_ZTv0_n16_N3ccc7DD2x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y33abcEv,_ZThn4_N3ccc7DD2x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y33efgEv,_ZTv0_n12_N3ccc7DD2x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y33efgEv,_ZThn4_N3ccc7DD2x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y3E = {  "_ZN3ccc7DD2x2y3E", // class name
  bases__ZN3ccc7DD2x2y3E, 2,
  &(vtc__ZN3ccc7DD2x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y3E),3, //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  CC2x2y4  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC2x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y43efgEv
  ~CC2x2y4(); // tgen
  CC2x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y4E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y43pqrEv");}
void  ccc::CC2x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y43abcEv");}
void  ccc::CC2x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y43efgEv");}
ccc::CC2x2y4 ::~CC2x2y4(){ note_dtor("_ZN3ccc7CC2x2y4E", this);} // tgen
ccc::CC2x2y4 ::CC2x2y4(){ note_ctor("_ZN3ccc7CC2x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y4E, buf);
    ::ccc::CC2x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y4E);
    dp->::ccc::CC2x2y4::~CC2x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y4E(Test__ZN3ccc7CC2x2y4E, "_ZN3ccc7CC2x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y4C1Ev();
extern void _ZN3ccc7CC2x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y4E[] = {
  NSPAIR(_ZN3ccc7CC2x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y4E[];
extern void _ZN3ccc7CC2x2y43efgEv();
extern void _ZN3ccc7CC2x2y43abcEv();
extern void _ZN3ccc7CC2x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y43efgEv,_ZTv0_n12_N3ccc7CC2x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43efgEv,_ZThn4_N3ccc7CC2x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y43abcEv,_ZTv0_n16_N3ccc7CC2x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43abcEv,_ZThn4_N3ccc7CC2x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y43pqrEv,_ZTv0_n20_N3ccc7CC2x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43pqrEv,_ZThn4_N3ccc7CC2x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y43efgEv,_ZTv0_n12_N3ccc7CC2x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y43abcEv,_ZTv0_n16_N3ccc7CC2x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y43pqrEv,_ZTv0_n20_N3ccc7CC2x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y4E[] = {
  {&(_ZTVN3ccc7CC2x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y4E[];
static VTBL_ENTRY alt_thunk_names933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y43pqrEv,_ZTv0_n20_N3ccc7CC2x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y43pqrEv,_ZThn4_N3ccc7CC2x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y43abcEv,_ZTv0_n16_N3ccc7CC2x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y43abcEv,_ZThn4_N3ccc7CC2x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y43efgEv,_ZTv0_n12_N3ccc7CC2x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y43efgEv,_ZThn4_N3ccc7CC2x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y4E = {  "_ZN3ccc7CC2x2y4E", // class name
  bases__ZN3ccc7CC2x2y4E, 2,
  &(vtc__ZN3ccc7CC2x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y4E),2, //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  DD2x2y4  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD2x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x2y43efgEv
  ~DD2x2y4(); // tgen
  DD2x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y43pqrEv");}
void  ccc::DD2x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y43abcEv");}
void  ccc::DD2x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y43efgEv");}
ccc::DD2x2y4 ::~DD2x2y4(){ note_dtor("_ZN3ccc7DD2x2y4E", this);} // tgen
ccc::DD2x2y4 ::DD2x2y4(){ note_ctor("_ZN3ccc7DD2x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y4E, buf);
    ::ccc::DD2x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y4E);
    dp->::ccc::DD2x2y4::~DD2x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y4E(Test__ZN3ccc7DD2x2y4E, "_ZN3ccc7DD2x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y4C1Ev();
extern void _ZN3ccc7DD2x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y4E[] = {
  NSPAIR(_ZN3ccc7DD2x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y4E[];
extern void _ZN3ccc7DD2x2y43efgEv();
extern void _ZN3ccc7DD2x2y43abcEv();
extern void _ZN3ccc7DD2x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y43efgEv,_ZTv0_n12_N3ccc7DD2x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y43efgEv,_ZThn4_N3ccc7DD2x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y43abcEv,_ZTv0_n16_N3ccc7DD2x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y43abcEv,_ZThn4_N3ccc7DD2x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y43pqrEv,_ZTv0_n20_N3ccc7DD2x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y43pqrEv,_ZThn4_N3ccc7DD2x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y43efgEv,_ZTv0_n12_N3ccc7DD2x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y43abcEv,_ZTv0_n16_N3ccc7DD2x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y43pqrEv,_ZTv0_n20_N3ccc7DD2x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y4E[] = {
  {&(_ZTVN3ccc7DD2x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y4E[];
static VTBL_ENTRY alt_thunk_names934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y43pqrEv,_ZTv0_n20_N3ccc7DD2x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y43pqrEv,_ZThn4_N3ccc7DD2x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y43abcEv,_ZTv0_n16_N3ccc7DD2x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y43abcEv,_ZThn4_N3ccc7DD2x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y43efgEv,_ZTv0_n12_N3ccc7DD2x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y43efgEv,_ZThn4_N3ccc7DD2x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y4E = {  "_ZN3ccc7DD2x2y4E", // class name
  bases__ZN3ccc7DD2x2y4E, 2,
  &(vtc__ZN3ccc7DD2x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y4E),3, //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  CC2x2y5  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC2x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y53abcEv
  ~CC2x2y5(); // tgen
  CC2x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y5E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y53pqrEv");}
void  ccc::CC2x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y53efgEv");}
void  ccc::CC2x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y53abcEv");}
ccc::CC2x2y5 ::~CC2x2y5(){ note_dtor("_ZN3ccc7CC2x2y5E", this);} // tgen
ccc::CC2x2y5 ::CC2x2y5(){ note_ctor("_ZN3ccc7CC2x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y5E, buf);
    ::ccc::CC2x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y5E);
    dp->::ccc::CC2x2y5::~CC2x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y5E(Test__ZN3ccc7CC2x2y5E, "_ZN3ccc7CC2x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y5C1Ev();
extern void _ZN3ccc7CC2x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y5E[] = {
  NSPAIR(_ZN3ccc7CC2x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y5E[];
extern void _ZN3ccc7CC2x2y53efgEv();
extern void _ZN3ccc7CC2x2y53abcEv();
extern void _ZN3ccc7CC2x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y53efgEv,_ZTv0_n12_N3ccc7CC2x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53efgEv,_ZThn4_N3ccc7CC2x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y53abcEv,_ZTv0_n16_N3ccc7CC2x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53abcEv,_ZThn4_N3ccc7CC2x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y53pqrEv,_ZTv0_n20_N3ccc7CC2x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53pqrEv,_ZThn4_N3ccc7CC2x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y53efgEv,_ZTv0_n12_N3ccc7CC2x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y53abcEv,_ZTv0_n16_N3ccc7CC2x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y53pqrEv,_ZTv0_n20_N3ccc7CC2x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y5E[] = {
  {&(_ZTVN3ccc7CC2x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y5E[];
static VTBL_ENTRY alt_thunk_names935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y53pqrEv,_ZTv0_n20_N3ccc7CC2x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y53pqrEv,_ZThn4_N3ccc7CC2x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y53abcEv,_ZTv0_n16_N3ccc7CC2x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y53abcEv,_ZThn4_N3ccc7CC2x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y53efgEv,_ZTv0_n12_N3ccc7CC2x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y53efgEv,_ZThn4_N3ccc7CC2x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y5E = {  "_ZN3ccc7CC2x2y5E", // class name
  bases__ZN3ccc7CC2x2y5E, 2,
  &(vtc__ZN3ccc7CC2x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y5E),2, //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  DD2x2y5  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD2x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x2y53abcEv
  ~DD2x2y5(); // tgen
  DD2x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y53pqrEv");}
void  ccc::DD2x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y53efgEv");}
void  ccc::DD2x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y53abcEv");}
ccc::DD2x2y5 ::~DD2x2y5(){ note_dtor("_ZN3ccc7DD2x2y5E", this);} // tgen
ccc::DD2x2y5 ::DD2x2y5(){ note_ctor("_ZN3ccc7DD2x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y5E, buf);
    ::ccc::DD2x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y5E);
    dp->::ccc::DD2x2y5::~DD2x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y5E(Test__ZN3ccc7DD2x2y5E, "_ZN3ccc7DD2x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y5C1Ev();
extern void _ZN3ccc7DD2x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y5E[] = {
  NSPAIR(_ZN3ccc7DD2x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y5E[];
extern void _ZN3ccc7DD2x2y53efgEv();
extern void _ZN3ccc7DD2x2y53abcEv();
extern void _ZN3ccc7DD2x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y53efgEv,_ZTv0_n12_N3ccc7DD2x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y53efgEv,_ZThn4_N3ccc7DD2x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y53abcEv,_ZTv0_n16_N3ccc7DD2x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y53abcEv,_ZThn4_N3ccc7DD2x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y53pqrEv,_ZTv0_n20_N3ccc7DD2x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y53pqrEv,_ZThn4_N3ccc7DD2x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y53efgEv,_ZTv0_n12_N3ccc7DD2x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y53abcEv,_ZTv0_n16_N3ccc7DD2x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y53pqrEv,_ZTv0_n20_N3ccc7DD2x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y5E[] = {
  {&(_ZTVN3ccc7DD2x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y5E[];
static VTBL_ENTRY alt_thunk_names936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y53pqrEv,_ZTv0_n20_N3ccc7DD2x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y53pqrEv,_ZThn4_N3ccc7DD2x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y53abcEv,_ZTv0_n16_N3ccc7DD2x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y53abcEv,_ZThn4_N3ccc7DD2x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y53efgEv,_ZTv0_n12_N3ccc7DD2x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y53efgEv,_ZThn4_N3ccc7DD2x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y5E = {  "_ZN3ccc7DD2x2y5E", // class name
  bases__ZN3ccc7DD2x2y5E, 2,
  &(vtc__ZN3ccc7DD2x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y5E),3, //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  CC2x2y6  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y63efgEv
  ~CC2x2y6(); // tgen
  CC2x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y6E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y63abcEv");}
void  ccc::CC2x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y63efgEv");}
ccc::CC2x2y6 ::~CC2x2y6(){ note_dtor("_ZN3ccc7CC2x2y6E", this);} // tgen
ccc::CC2x2y6 ::CC2x2y6(){ note_ctor("_ZN3ccc7CC2x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y6E, buf);
    ::ccc::CC2x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y6E);
    dp->::ccc::CC2x2y6::~CC2x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y6E(Test__ZN3ccc7CC2x2y6E, "_ZN3ccc7CC2x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y6C1Ev();
extern void _ZN3ccc7CC2x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y6E[] = {
  NSPAIR(_ZN3ccc7CC2x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y6E[];
extern void _ZN3ccc7CC2x2y63efgEv();
extern void _ZN3ccc7CC2x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y63efgEv,_ZTv0_n12_N3ccc7CC2x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y63efgEv,_ZThn4_N3ccc7CC2x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y63abcEv,_ZTv0_n16_N3ccc7CC2x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y63abcEv,_ZThn4_N3ccc7CC2x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y63efgEv,_ZTv0_n12_N3ccc7CC2x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y63abcEv,_ZTv0_n16_N3ccc7CC2x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y6E[] = {
  {&(_ZTVN3ccc7CC2x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y6E[];
static VTBL_ENTRY alt_thunk_names937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y63abcEv,_ZTv0_n16_N3ccc7CC2x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y63abcEv,_ZThn4_N3ccc7CC2x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y63efgEv,_ZTv0_n12_N3ccc7CC2x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y63efgEv,_ZThn4_N3ccc7CC2x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y6E = {  "_ZN3ccc7CC2x2y6E", // class name
  bases__ZN3ccc7CC2x2y6E, 2,
  &(vtc__ZN3ccc7CC2x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y6E),2, //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  DD2x2y6  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD2x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x2y63efgEv
  ~DD2x2y6(); // tgen
  DD2x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y63abcEv");}
void  ccc::DD2x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y63efgEv");}
ccc::DD2x2y6 ::~DD2x2y6(){ note_dtor("_ZN3ccc7DD2x2y6E", this);} // tgen
ccc::DD2x2y6 ::DD2x2y6(){ note_ctor("_ZN3ccc7DD2x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y6E, buf);
    ::ccc::DD2x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y6E);
    dp->::ccc::DD2x2y6::~DD2x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y6E(Test__ZN3ccc7DD2x2y6E, "_ZN3ccc7DD2x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y6C1Ev();
extern void _ZN3ccc7DD2x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y6E[] = {
  NSPAIR(_ZN3ccc7DD2x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y6E[];
extern void _ZN3ccc7DD2x2y63efgEv();
extern void _ZN3ccc7DD2x2y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y63efgEv,_ZTv0_n12_N3ccc7DD2x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y63efgEv,_ZThn4_N3ccc7DD2x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y63abcEv,_ZTv0_n16_N3ccc7DD2x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y63abcEv,_ZThn4_N3ccc7DD2x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y63efgEv,_ZTv0_n12_N3ccc7DD2x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y63abcEv,_ZTv0_n16_N3ccc7DD2x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y6E[] = {
  {&(_ZTVN3ccc7DD2x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y6E[];
static VTBL_ENTRY alt_thunk_names938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y63abcEv,_ZTv0_n16_N3ccc7DD2x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y63abcEv,_ZThn4_N3ccc7DD2x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y63efgEv,_ZTv0_n12_N3ccc7DD2x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y63efgEv,_ZThn4_N3ccc7DD2x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y6E = {  "_ZN3ccc7DD2x2y6E", // class name
  bases__ZN3ccc7DD2x2y6E, 2,
  &(vtc__ZN3ccc7DD2x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y6E),3, //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  CC2x2y7  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y73pqrEv
  ~CC2x2y7(); // tgen
  CC2x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y7E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y73abcEv");}
void  ccc::CC2x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y73pqrEv");}
ccc::CC2x2y7 ::~CC2x2y7(){ note_dtor("_ZN3ccc7CC2x2y7E", this);} // tgen
ccc::CC2x2y7 ::CC2x2y7(){ note_ctor("_ZN3ccc7CC2x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y7E, buf);
    ::ccc::CC2x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y7E);
    dp->::ccc::CC2x2y7::~CC2x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y7E(Test__ZN3ccc7CC2x2y7E, "_ZN3ccc7CC2x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y7C1Ev();
extern void _ZN3ccc7CC2x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y7E[] = {
  NSPAIR(_ZN3ccc7CC2x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC2x2y73abcEv();
extern void _ZN3ccc7CC2x2y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y73abcEv,_ZTv0_n16_N3ccc7CC2x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y73abcEv,_ZThn4_N3ccc7CC2x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y73pqrEv,_ZTv0_n20_N3ccc7CC2x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y73pqrEv,_ZThn4_N3ccc7CC2x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y73abcEv,_ZTv0_n16_N3ccc7CC2x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y73pqrEv,_ZTv0_n20_N3ccc7CC2x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y7E[] = {
  {&(_ZTVN3ccc7CC2x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y7E[];
static VTBL_ENTRY alt_thunk_names939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y73pqrEv,_ZTv0_n20_N3ccc7CC2x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y73pqrEv,_ZThn4_N3ccc7CC2x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y73abcEv,_ZTv0_n16_N3ccc7CC2x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y73abcEv,_ZThn4_N3ccc7CC2x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y7E = {  "_ZN3ccc7CC2x2y7E", // class name
  bases__ZN3ccc7CC2x2y7E, 2,
  &(vtc__ZN3ccc7CC2x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y7E),2, //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  DD2x2y7  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD2x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y73pqrEv
  ~DD2x2y7(); // tgen
  DD2x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y73abcEv");}
void  ccc::DD2x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y73pqrEv");}
ccc::DD2x2y7 ::~DD2x2y7(){ note_dtor("_ZN3ccc7DD2x2y7E", this);} // tgen
ccc::DD2x2y7 ::DD2x2y7(){ note_ctor("_ZN3ccc7DD2x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y7E, buf);
    ::ccc::DD2x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y7E);
    dp->::ccc::DD2x2y7::~DD2x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y7E(Test__ZN3ccc7DD2x2y7E, "_ZN3ccc7DD2x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y7C1Ev();
extern void _ZN3ccc7DD2x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y7E[] = {
  NSPAIR(_ZN3ccc7DD2x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x2y73abcEv();
extern void _ZN3ccc7DD2x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y73abcEv,_ZTv0_n16_N3ccc7DD2x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y73abcEv,_ZThn4_N3ccc7DD2x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y73pqrEv,_ZTv0_n20_N3ccc7DD2x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y73pqrEv,_ZThn4_N3ccc7DD2x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y73abcEv,_ZTv0_n16_N3ccc7DD2x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y73pqrEv,_ZTv0_n20_N3ccc7DD2x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y7E[] = {
  {&(_ZTVN3ccc7DD2x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y7E[];
static VTBL_ENTRY alt_thunk_names940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y73pqrEv,_ZTv0_n20_N3ccc7DD2x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y73pqrEv,_ZThn4_N3ccc7DD2x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y73abcEv,_ZTv0_n16_N3ccc7DD2x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y73abcEv,_ZThn4_N3ccc7DD2x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y7E = {  "_ZN3ccc7DD2x2y7E", // class name
  bases__ZN3ccc7DD2x2y7E, 2,
  &(vtc__ZN3ccc7DD2x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y7E),3, //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  CC2x2y8  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y83abcEv
  ~CC2x2y8(); // tgen
  CC2x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y8E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y83efgEv");}
void  ccc::CC2x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y83abcEv");}
ccc::CC2x2y8 ::~CC2x2y8(){ note_dtor("_ZN3ccc7CC2x2y8E", this);} // tgen
ccc::CC2x2y8 ::CC2x2y8(){ note_ctor("_ZN3ccc7CC2x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y8E, buf);
    ::ccc::CC2x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y8E);
    dp->::ccc::CC2x2y8::~CC2x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y8E(Test__ZN3ccc7CC2x2y8E, "_ZN3ccc7CC2x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y8C1Ev();
extern void _ZN3ccc7CC2x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y8E[] = {
  NSPAIR(_ZN3ccc7CC2x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y8E[];
extern void _ZN3ccc7CC2x2y83efgEv();
extern void _ZN3ccc7CC2x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y83efgEv,_ZTv0_n12_N3ccc7CC2x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y83efgEv,_ZThn4_N3ccc7CC2x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x2y83abcEv,_ZTv0_n16_N3ccc7CC2x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y83abcEv,_ZThn4_N3ccc7CC2x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y83efgEv,_ZTv0_n12_N3ccc7CC2x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x2y83abcEv,_ZTv0_n16_N3ccc7CC2x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y8E[] = {
  {&(_ZTVN3ccc7CC2x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y8E[];
static VTBL_ENTRY alt_thunk_names941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x2y83abcEv,_ZTv0_n16_N3ccc7CC2x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y83abcEv,_ZThn4_N3ccc7CC2x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y83efgEv,_ZTv0_n12_N3ccc7CC2x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y83efgEv,_ZThn4_N3ccc7CC2x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y8E = {  "_ZN3ccc7CC2x2y8E", // class name
  bases__ZN3ccc7CC2x2y8E, 2,
  &(vtc__ZN3ccc7CC2x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y8E),2, //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  DD2x2y8  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD2x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x2y83abcEv
  ~DD2x2y8(); // tgen
  DD2x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y83efgEv");}
void  ccc::DD2x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x2y83abcEv");}
ccc::DD2x2y8 ::~DD2x2y8(){ note_dtor("_ZN3ccc7DD2x2y8E", this);} // tgen
ccc::DD2x2y8 ::DD2x2y8(){ note_ctor("_ZN3ccc7DD2x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y8E, buf);
    ::ccc::DD2x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y8E);
    dp->::ccc::DD2x2y8::~DD2x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y8E(Test__ZN3ccc7DD2x2y8E, "_ZN3ccc7DD2x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y8C1Ev();
extern void _ZN3ccc7DD2x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y8E[] = {
  NSPAIR(_ZN3ccc7DD2x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y8E[];
extern void _ZN3ccc7DD2x2y83efgEv();
extern void _ZN3ccc7DD2x2y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y83efgEv,_ZTv0_n12_N3ccc7DD2x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y83efgEv,_ZThn4_N3ccc7DD2x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x2y83abcEv,_ZTv0_n16_N3ccc7DD2x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y83abcEv,_ZThn4_N3ccc7DD2x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y83efgEv,_ZTv0_n12_N3ccc7DD2x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x2y83abcEv,_ZTv0_n16_N3ccc7DD2x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y8E[] = {
  {&(_ZTVN3ccc7DD2x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y8E[];
static VTBL_ENTRY alt_thunk_names942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x2y83abcEv,_ZTv0_n16_N3ccc7DD2x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y83abcEv,_ZThn4_N3ccc7DD2x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y83efgEv,_ZTv0_n12_N3ccc7DD2x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y83efgEv,_ZThn4_N3ccc7DD2x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y8E = {  "_ZN3ccc7DD2x2y8E", // class name
  bases__ZN3ccc7DD2x2y8E, 2,
  &(vtc__ZN3ccc7DD2x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y8E),3, //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  CC2x2y9  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y93pqrEv
  ~CC2x2y9(); // tgen
  CC2x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y9E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y93efgEv");}
void  ccc::CC2x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y93pqrEv");}
ccc::CC2x2y9 ::~CC2x2y9(){ note_dtor("_ZN3ccc7CC2x2y9E", this);} // tgen
ccc::CC2x2y9 ::CC2x2y9(){ note_ctor("_ZN3ccc7CC2x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y9E, buf);
    ::ccc::CC2x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC2x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y9E);
    dp->::ccc::CC2x2y9::~CC2x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y9E(Test__ZN3ccc7CC2x2y9E, "_ZN3ccc7CC2x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y9C1Ev();
extern void _ZN3ccc7CC2x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y9E[] = {
  NSPAIR(_ZN3ccc7CC2x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y9E[];
extern void _ZN3ccc7CC2x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC2x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x2y93efgEv,_ZTv0_n12_N3ccc7CC2x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y93efgEv,_ZThn4_N3ccc7CC2x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x2y93pqrEv,_ZTv0_n20_N3ccc7CC2x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y93pqrEv,_ZThn4_N3ccc7CC2x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x2y93efgEv,_ZTv0_n12_N3ccc7CC2x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x2y93pqrEv,_ZTv0_n20_N3ccc7CC2x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x2y9E[] = {
  {&(_ZTVN3ccc7CC2x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x2y9E[];
static VTBL_ENTRY alt_thunk_names943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x2y93pqrEv,_ZTv0_n20_N3ccc7CC2x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y93pqrEv,_ZThn4_N3ccc7CC2x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x2y93efgEv,_ZTv0_n12_N3ccc7CC2x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x2y93efgEv,_ZThn4_N3ccc7CC2x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x2y9E = {  "_ZN3ccc7CC2x2y9E", // class name
  bases__ZN3ccc7CC2x2y9E, 2,
  &(vtc__ZN3ccc7CC2x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x2y9E),2, //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  DD2x2y9  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD2x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x2y93pqrEv
  ~DD2x2y9(); // tgen
  DD2x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x2y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x2y93efgEv");}
void  ccc::DD2x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x2y93pqrEv");}
ccc::DD2x2y9 ::~DD2x2y9(){ note_dtor("_ZN3ccc7DD2x2y9E", this);} // tgen
ccc::DD2x2y9 ::DD2x2y9(){ note_ctor("_ZN3ccc7DD2x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x2y9E, buf);
    ::ccc::DD2x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x2y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD2x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x2y9E);
    dp->::ccc::DD2x2y9::~DD2x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x2y9E(Test__ZN3ccc7DD2x2y9E, "_ZN3ccc7DD2x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x2y9C1Ev();
extern void _ZN3ccc7DD2x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x2y9E[] = {
  NSPAIR(_ZN3ccc7DD2x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD2x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y9E[];
extern void _ZN3ccc7DD2x2y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x2y93efgEv,_ZTv0_n12_N3ccc7DD2x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y93efgEv,_ZThn4_N3ccc7DD2x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x2y93pqrEv,_ZTv0_n20_N3ccc7DD2x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x2y93pqrEv,_ZThn4_N3ccc7DD2x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x2y93efgEv,_ZTv0_n12_N3ccc7DD2x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x2y93pqrEv,_ZTv0_n20_N3ccc7DD2x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x2y9E[] = {
  {&(_ZTVN3ccc7DD2x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x2y9E[];
static VTBL_ENTRY alt_thunk_names944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x2y93pqrEv,_ZTv0_n20_N3ccc7DD2x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y93pqrEv,_ZThn4_N3ccc7DD2x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x2y93efgEv,_ZTv0_n12_N3ccc7DD2x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x2y93efgEv,_ZThn4_N3ccc7DD2x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x2y9E = {  "_ZN3ccc7DD2x2y9E", // class name
  bases__ZN3ccc7DD2x2y9E, 2,
  &(vtc__ZN3ccc7DD2x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x2y9E),3, //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  CC2x2y10  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x2y103abcEv
  ~CC2x2y10(); // tgen
  CC2x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y10E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y103pqrEv");}
void  ccc::CC2x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x2y103abcEv");}
ccc::CC2x2y10 ::~CC2x2y10(){ note_dtor("_ZN3ccc8CC2x2y10E", this);} // tgen
ccc::CC2x2y10 ::CC2x2y10(){ note_ctor("_ZN3ccc8CC2x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y10E, buf);
    ::ccc::CC2x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y10E);
    dp->::ccc::CC2x2y10::~CC2x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y10E(Test__ZN3ccc8CC2x2y10E, "_ZN3ccc8CC2x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y10C1Ev();
extern void _ZN3ccc8CC2x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y10E[] = {
  NSPAIR(_ZN3ccc8CC2x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC2x2y103abcEv();
extern void _ZN3ccc8CC2x2y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x2y103abcEv,_ZTv0_n16_N3ccc8CC2x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y103abcEv,_ZThn4_N3ccc8CC2x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x2y103pqrEv,_ZTv0_n20_N3ccc8CC2x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y103pqrEv,_ZThn4_N3ccc8CC2x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x2y103abcEv,_ZTv0_n16_N3ccc8CC2x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x2y103pqrEv,_ZTv0_n20_N3ccc8CC2x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y10E[] = {
  {&(_ZTVN3ccc8CC2x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y10E[];
static VTBL_ENTRY alt_thunk_names945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x2y103pqrEv,_ZTv0_n20_N3ccc8CC2x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y103pqrEv,_ZThn4_N3ccc8CC2x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x2y103abcEv,_ZTv0_n16_N3ccc8CC2x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y103abcEv,_ZThn4_N3ccc8CC2x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x2y10E = {  "_ZN3ccc8CC2x2y10E", // class name
  bases__ZN3ccc8CC2x2y10E, 2,
  &(vtc__ZN3ccc8CC2x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y10E),2, //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  DD2x2y10  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD2x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x2y103abcEv
  ~DD2x2y10(); // tgen
  DD2x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x2y103pqrEv");}
void  ccc::DD2x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x2y103abcEv");}
ccc::DD2x2y10 ::~DD2x2y10(){ note_dtor("_ZN3ccc8DD2x2y10E", this);} // tgen
ccc::DD2x2y10 ::DD2x2y10(){ note_ctor("_ZN3ccc8DD2x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y10E, buf);
    ::ccc::DD2x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y10E);
    dp->::ccc::DD2x2y10::~DD2x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y10E(Test__ZN3ccc8DD2x2y10E, "_ZN3ccc8DD2x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y10C1Ev();
extern void _ZN3ccc8DD2x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y10E[] = {
  NSPAIR(_ZN3ccc8DD2x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x2y103abcEv();
extern void _ZN3ccc8DD2x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x2y103abcEv,_ZTv0_n16_N3ccc8DD2x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y103abcEv,_ZThn4_N3ccc8DD2x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x2y103pqrEv,_ZTv0_n20_N3ccc8DD2x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y103pqrEv,_ZThn4_N3ccc8DD2x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x2y103abcEv,_ZTv0_n16_N3ccc8DD2x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x2y103pqrEv,_ZTv0_n20_N3ccc8DD2x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y10E[] = {
  {&(_ZTVN3ccc8DD2x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y10E[];
static VTBL_ENTRY alt_thunk_names946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x2y103pqrEv,_ZTv0_n20_N3ccc8DD2x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y103pqrEv,_ZThn4_N3ccc8DD2x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x2y103abcEv,_ZTv0_n16_N3ccc8DD2x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y103abcEv,_ZThn4_N3ccc8DD2x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x2y10E = {  "_ZN3ccc8DD2x2y10E", // class name
  bases__ZN3ccc8DD2x2y10E, 2,
  &(vtc__ZN3ccc8DD2x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y10E),3, //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  CC2x2y11  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x2y113efgEv
  ~CC2x2y11(); // tgen
  CC2x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y11E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y113pqrEv");}
void  ccc::CC2x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x2y113efgEv");}
ccc::CC2x2y11 ::~CC2x2y11(){ note_dtor("_ZN3ccc8CC2x2y11E", this);} // tgen
ccc::CC2x2y11 ::CC2x2y11(){ note_ctor("_ZN3ccc8CC2x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y11E, buf);
    ::ccc::CC2x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y11E);
    dp->::ccc::CC2x2y11::~CC2x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y11E(Test__ZN3ccc8CC2x2y11E, "_ZN3ccc8CC2x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y11C1Ev();
extern void _ZN3ccc8CC2x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y11E[] = {
  NSPAIR(_ZN3ccc8CC2x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y11E[];
extern void _ZN3ccc8CC2x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC2x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x2y113efgEv,_ZTv0_n12_N3ccc8CC2x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y113efgEv,_ZThn4_N3ccc8CC2x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x2y113pqrEv,_ZTv0_n20_N3ccc8CC2x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y113pqrEv,_ZThn4_N3ccc8CC2x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x2y113efgEv,_ZTv0_n12_N3ccc8CC2x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x2y113pqrEv,_ZTv0_n20_N3ccc8CC2x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y11E[] = {
  {&(_ZTVN3ccc8CC2x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y11E[];
static VTBL_ENTRY alt_thunk_names947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x2y113pqrEv,_ZTv0_n20_N3ccc8CC2x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y113pqrEv,_ZThn4_N3ccc8CC2x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x2y113efgEv,_ZTv0_n12_N3ccc8CC2x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y113efgEv,_ZThn4_N3ccc8CC2x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x2y11E = {  "_ZN3ccc8CC2x2y11E", // class name
  bases__ZN3ccc8CC2x2y11E, 2,
  &(vtc__ZN3ccc8CC2x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y11E),2, //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  DD2x2y11  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD2x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x2y113efgEv
  ~DD2x2y11(); // tgen
  DD2x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x2y113pqrEv");}
void  ccc::DD2x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x2y113efgEv");}
ccc::DD2x2y11 ::~DD2x2y11(){ note_dtor("_ZN3ccc8DD2x2y11E", this);} // tgen
ccc::DD2x2y11 ::DD2x2y11(){ note_ctor("_ZN3ccc8DD2x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y11E, buf);
    ::ccc::DD2x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y11E);
    dp->::ccc::DD2x2y11::~DD2x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y11E(Test__ZN3ccc8DD2x2y11E, "_ZN3ccc8DD2x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y11C1Ev();
extern void _ZN3ccc8DD2x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y11E[] = {
  NSPAIR(_ZN3ccc8DD2x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y11E[];
extern void _ZN3ccc8DD2x2y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x2y113efgEv,_ZTv0_n12_N3ccc8DD2x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y113efgEv,_ZThn4_N3ccc8DD2x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x2y113pqrEv,_ZTv0_n20_N3ccc8DD2x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y113pqrEv,_ZThn4_N3ccc8DD2x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x2y113efgEv,_ZTv0_n12_N3ccc8DD2x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x2y113pqrEv,_ZTv0_n20_N3ccc8DD2x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y11E[] = {
  {&(_ZTVN3ccc8DD2x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y11E[];
static VTBL_ENTRY alt_thunk_names948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x2y113pqrEv,_ZTv0_n20_N3ccc8DD2x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y113pqrEv,_ZThn4_N3ccc8DD2x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x2y113efgEv,_ZTv0_n12_N3ccc8DD2x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y113efgEv,_ZThn4_N3ccc8DD2x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x2y11E = {  "_ZN3ccc8DD2x2y11E", // class name
  bases__ZN3ccc8DD2x2y11E, 2,
  &(vtc__ZN3ccc8DD2x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y11E),3, //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  CC2x2y12  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC2x2y123abcEv
  ~CC2x2y12(); // tgen
  CC2x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x2y123abcEv");}
ccc::CC2x2y12 ::~CC2x2y12(){ note_dtor("_ZN3ccc8CC2x2y12E", this);} // tgen
ccc::CC2x2y12 ::CC2x2y12(){ note_ctor("_ZN3ccc8CC2x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y12E, buf);
    ::ccc::CC2x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y12E);
    dp->::ccc::CC2x2y12::~CC2x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y12E(Test__ZN3ccc8CC2x2y12E, "_ZN3ccc8CC2x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y12C1Ev();
extern void _ZN3ccc8CC2x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y12E[] = {
  NSPAIR(_ZN3ccc8CC2x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC2x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x2y123abcEv,_ZTv0_n16_N3ccc8CC2x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y123abcEv,_ZThn4_N3ccc8CC2x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x2y123abcEv,_ZTv0_n16_N3ccc8CC2x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y12E[] = {
  {&(_ZTVN3ccc8CC2x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y12E[];
static VTBL_ENTRY alt_thunk_names949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x2y123abcEv,_ZTv0_n16_N3ccc8CC2x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y123abcEv,_ZThn4_N3ccc8CC2x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x2y12E = {  "_ZN3ccc8CC2x2y12E", // class name
  bases__ZN3ccc8CC2x2y12E, 2,
  &(vtc__ZN3ccc8CC2x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y12E),2, //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  DD2x2y12  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD2x2y123abcEv
  ~DD2x2y12(); // tgen
  DD2x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x2y123abcEv");}
ccc::DD2x2y12 ::~DD2x2y12(){ note_dtor("_ZN3ccc8DD2x2y12E", this);} // tgen
ccc::DD2x2y12 ::DD2x2y12(){ note_ctor("_ZN3ccc8DD2x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y12E, buf);
    ::ccc::DD2x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y12E);
    dp->::ccc::DD2x2y12::~DD2x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y12E(Test__ZN3ccc8DD2x2y12E, "_ZN3ccc8DD2x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y12C1Ev();
extern void _ZN3ccc8DD2x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y12E[] = {
  NSPAIR(_ZN3ccc8DD2x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x2y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x2y123abcEv,_ZTv0_n16_N3ccc8DD2x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y123abcEv,_ZThn4_N3ccc8DD2x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x2y123abcEv,_ZTv0_n16_N3ccc8DD2x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y12E[] = {
  {&(_ZTVN3ccc8DD2x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y12E[];
static VTBL_ENTRY alt_thunk_names950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x2y123abcEv,_ZTv0_n16_N3ccc8DD2x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y123abcEv,_ZThn4_N3ccc8DD2x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x2y12E = {  "_ZN3ccc8DD2x2y12E", // class name
  bases__ZN3ccc8DD2x2y12E, 2,
  &(vtc__ZN3ccc8DD2x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y12E),3, //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  CC2x2y13  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC2x2y133efgEv
  ~CC2x2y13(); // tgen
  CC2x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x2y133efgEv");}
ccc::CC2x2y13 ::~CC2x2y13(){ note_dtor("_ZN3ccc8CC2x2y13E", this);} // tgen
ccc::CC2x2y13 ::CC2x2y13(){ note_ctor("_ZN3ccc8CC2x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y13E, buf);
    ::ccc::CC2x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y13E);
    dp->::ccc::CC2x2y13::~CC2x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y13E(Test__ZN3ccc8CC2x2y13E, "_ZN3ccc8CC2x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y13C1Ev();
extern void _ZN3ccc8CC2x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y13E[] = {
  NSPAIR(_ZN3ccc8CC2x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y13E[];
extern void _ZN3ccc8CC2x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x2y133efgEv,_ZTv0_n12_N3ccc8CC2x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y133efgEv,_ZThn4_N3ccc8CC2x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x2y133efgEv,_ZTv0_n12_N3ccc8CC2x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y13E[] = {
  {&(_ZTVN3ccc8CC2x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y13E[];
static VTBL_ENTRY alt_thunk_names951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x2y133efgEv,_ZTv0_n12_N3ccc8CC2x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y133efgEv,_ZThn4_N3ccc8CC2x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x2y13E = {  "_ZN3ccc8CC2x2y13E", // class name
  bases__ZN3ccc8CC2x2y13E, 2,
  &(vtc__ZN3ccc8CC2x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y13E),2, //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  DD2x2y13  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD2x2y133efgEv
  ~DD2x2y13(); // tgen
  DD2x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x2y133efgEv");}
ccc::DD2x2y13 ::~DD2x2y13(){ note_dtor("_ZN3ccc8DD2x2y13E", this);} // tgen
ccc::DD2x2y13 ::DD2x2y13(){ note_ctor("_ZN3ccc8DD2x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y13E, buf);
    ::ccc::DD2x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y13E);
    dp->::ccc::DD2x2y13::~DD2x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y13E(Test__ZN3ccc8DD2x2y13E, "_ZN3ccc8DD2x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y13C1Ev();
extern void _ZN3ccc8DD2x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y13E[] = {
  NSPAIR(_ZN3ccc8DD2x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y13E[];
extern void _ZN3ccc8DD2x2y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x2y133efgEv,_ZTv0_n12_N3ccc8DD2x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y133efgEv,_ZThn4_N3ccc8DD2x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x2y133efgEv,_ZTv0_n12_N3ccc8DD2x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y13E[] = {
  {&(_ZTVN3ccc8DD2x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y13E[];
static VTBL_ENTRY alt_thunk_names952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x2y133efgEv,_ZTv0_n12_N3ccc8DD2x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y133efgEv,_ZThn4_N3ccc8DD2x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x2y13E = {  "_ZN3ccc8DD2x2y13E", // class name
  bases__ZN3ccc8DD2x2y13E, 2,
  &(vtc__ZN3ccc8DD2x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y13E),3, //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  CC2x2y14  : virtual ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y143pqrEv
  ~CC2x2y14(); // tgen
  CC2x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y143pqrEv");}
ccc::CC2x2y14 ::~CC2x2y14(){ note_dtor("_ZN3ccc8CC2x2y14E", this);} // tgen
ccc::CC2x2y14 ::CC2x2y14(){ note_ctor("_ZN3ccc8CC2x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y14E, buf);
    ::ccc::CC2x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y14E);
    dp->::ccc::CC2x2y14::~CC2x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y14E(Test__ZN3ccc8CC2x2y14E, "_ZN3ccc8CC2x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y14C1Ev();
extern void _ZN3ccc8CC2x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y14E[] = {
  NSPAIR(_ZN3ccc8CC2x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC2x2y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x2y143pqrEv,_ZTv0_n20_N3ccc8CC2x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y143pqrEv,_ZThn4_N3ccc8CC2x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x2y143pqrEv,_ZTv0_n20_N3ccc8CC2x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y14E[] = {
  {&(_ZTVN3ccc8CC2x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y14E[];
static VTBL_ENTRY alt_thunk_names953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x2y143pqrEv,_ZTv0_n20_N3ccc8CC2x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x2y143pqrEv,_ZThn4_N3ccc8CC2x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x2y14E = {  "_ZN3ccc8CC2x2y14E", // class name
  bases__ZN3ccc8CC2x2y14E, 2,
  &(vtc__ZN3ccc8CC2x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y14E),2, //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  DD2x2y14  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD2x2y143pqrEv
  ~DD2x2y14(); // tgen
  DD2x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x2y143pqrEv");}
ccc::DD2x2y14 ::~DD2x2y14(){ note_dtor("_ZN3ccc8DD2x2y14E", this);} // tgen
ccc::DD2x2y14 ::DD2x2y14(){ note_ctor("_ZN3ccc8DD2x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y14E, buf);
    ::ccc::DD2x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y14E);
    dp->::ccc::DD2x2y14::~DD2x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y14E(Test__ZN3ccc8DD2x2y14E, "_ZN3ccc8DD2x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y14C1Ev();
extern void _ZN3ccc8DD2x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y14E[] = {
  NSPAIR(_ZN3ccc8DD2x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x2y143pqrEv,_ZTv0_n20_N3ccc8DD2x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x2y143pqrEv,_ZThn4_N3ccc8DD2x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x2y143pqrEv,_ZTv0_n20_N3ccc8DD2x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y14E[] = {
  {&(_ZTVN3ccc8DD2x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y14E[];
static VTBL_ENTRY alt_thunk_names954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x2y143pqrEv,_ZTv0_n20_N3ccc8DD2x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x2y143pqrEv,_ZThn4_N3ccc8DD2x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x2y14E = {  "_ZN3ccc8DD2x2y14E", // class name
  bases__ZN3ccc8DD2x2y14E, 2,
  &(vtc__ZN3ccc8DD2x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y14E),3, //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  CC2x2y15  : virtual ::ccc::AA2 , ::ccc::BB2 {
  ~CC2x2y15(); // tgen
  CC2x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x2y15 ::~CC2x2y15(){ note_dtor("_ZN3ccc8CC2x2y15E", this);} // tgen
ccc::CC2x2y15 ::CC2x2y15(){ note_ctor("_ZN3ccc8CC2x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y15E, buf);
    ::ccc::CC2x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC2x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y15E);
    dp->::ccc::CC2x2y15::~CC2x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y15E(Test__ZN3ccc8CC2x2y15E, "_ZN3ccc8CC2x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y15C1Ev();
extern void _ZN3ccc8CC2x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y15E[] = {
  NSPAIR(_ZN3ccc8CC2x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x2y15E[] = {
  {&(_ZTVN3ccc8CC2x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x2y15E[];
Class_Descriptor cd__ZN3ccc8CC2x2y15E = {  "_ZN3ccc8CC2x2y15E", // class name
  bases__ZN3ccc8CC2x2y15E, 2,
  &(vtc__ZN3ccc8CC2x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x2y15  : virtual ::ccc::AA2 , virtual ::ccc::BB2 {
  ~DD2x2y15(); // tgen
  DD2x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x2y15 ::~DD2x2y15(){ note_dtor("_ZN3ccc8DD2x2y15E", this);} // tgen
ccc::DD2x2y15 ::DD2x2y15(){ note_ctor("_ZN3ccc8DD2x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x2y15E, buf);
    ::ccc::DD2x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x2y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD2x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x2y15E);
    dp->::ccc::DD2x2y15::~DD2x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x2y15E(Test__ZN3ccc8DD2x2y15E, "_ZN3ccc8DD2x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x2y15C1Ev();
extern void _ZN3ccc8DD2x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x2y15E[] = {
  NSPAIR(_ZN3ccc8DD2x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD2x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x2y15E[] = {
  {&(_ZTVN3ccc8DD2x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x2y15E[];
Class_Descriptor cd__ZN3ccc8DD2x2y15E = {  "_ZN3ccc8DD2x2y15E", // class name
  bases__ZN3ccc8DD2x2y15E, 2,
  &(vtc__ZN3ccc8DD2x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y0  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y03pqrEv
  ~CC2x3y0(); // tgen
  CC2x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y0E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y03abcEv");}
void  ccc::CC2x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y03efgEv");}
void  ccc::CC2x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y03pqrEv");}
ccc::CC2x3y0 ::~CC2x3y0(){ note_dtor("_ZN3ccc7CC2x3y0E", this);} // tgen
ccc::CC2x3y0 ::CC2x3y0(){ note_ctor("_ZN3ccc7CC2x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y0E, buf);
    ::ccc::CC2x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y0E);
    dp->::ccc::CC2x3y0::~CC2x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y0E(Test__ZN3ccc7CC2x3y0E, "_ZN3ccc7CC2x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y0C1Ev();
extern void _ZN3ccc7CC2x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y0E[] = {
  NSPAIR(_ZN3ccc7CC2x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y0E[];
extern void _ZN3ccc7CC2x3y03efgEv();
extern void _ZN3ccc7CC2x3y03pqrEv();
extern void _ZN3ccc7CC2x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y03efgEv,_ZTv0_n12_N3ccc7CC2x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03efgEv,_ZThn4_N3ccc7CC2x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y03abcEv,_ZTv0_n16_N3ccc7CC2x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03abcEv,_ZThn4_N3ccc7CC2x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y03pqrEv,_ZTv0_n20_N3ccc7CC2x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03pqrEv,_ZThn4_N3ccc7CC2x3y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y03efgEv,_ZTv0_n12_N3ccc7CC2x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y03abcEv,_ZTv0_n16_N3ccc7CC2x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y03pqrEv,_ZTv0_n20_N3ccc7CC2x3y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y0E[] = {
  {&(_ZTVN3ccc7CC2x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y0E[];
static VTBL_ENTRY alt_thunk_names955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y03pqrEv,_ZTv0_n20_N3ccc7CC2x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y03pqrEv,_ZThn4_N3ccc7CC2x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y03abcEv,_ZTv0_n16_N3ccc7CC2x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y03abcEv,_ZThn4_N3ccc7CC2x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y03efgEv,_ZTv0_n12_N3ccc7CC2x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y03efgEv,_ZThn4_N3ccc7CC2x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y0E = {  "_ZN3ccc7CC2x3y0E", // class name
  bases__ZN3ccc7CC2x3y0E, 2,
  &(vtc__ZN3ccc7CC2x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y0E),2, //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  DD2x3y0  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD2x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y03pqrEv
  ~DD2x3y0(); // tgen
  DD2x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y03abcEv");}
void  ccc::DD2x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y03efgEv");}
void  ccc::DD2x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y03pqrEv");}
ccc::DD2x3y0 ::~DD2x3y0(){ note_dtor("_ZN3ccc7DD2x3y0E", this);} // tgen
ccc::DD2x3y0 ::DD2x3y0(){ note_ctor("_ZN3ccc7DD2x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y0E, buf);
    ::ccc::DD2x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y0E);
    dp->::ccc::DD2x3y0::~DD2x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y0E(Test__ZN3ccc7DD2x3y0E, "_ZN3ccc7DD2x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y0C1Ev();
extern void _ZN3ccc7DD2x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y0E[] = {
  NSPAIR(_ZN3ccc7DD2x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y0E[];
extern void _ZN3ccc7DD2x3y03efgEv();
extern void _ZN3ccc7DD2x3y03abcEv();
extern void _ZN3ccc7DD2x3y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y03efgEv,_ZTv0_n12_N3ccc7DD2x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y03efgEv,_ZThn4_N3ccc7DD2x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y03pqrEv,_ZTv0_n16_N3ccc7DD2x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y03pqrEv,_ZThn4_N3ccc7DD2x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y03abcEv,_ZTv0_n20_N3ccc7DD2x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y03abcEv,_ZThn4_N3ccc7DD2x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y03efgEv,_ZTv0_n12_N3ccc7DD2x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y03pqrEv,_ZTv0_n16_N3ccc7DD2x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y03abcEv,_ZTv0_n20_N3ccc7DD2x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y0E[] = {
  {&(_ZTVN3ccc7DD2x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y0E[];
static VTBL_ENTRY alt_thunk_names956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y03abcEv,_ZTv0_n20_N3ccc7DD2x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y03abcEv,_ZThn4_N3ccc7DD2x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y03pqrEv,_ZTv0_n16_N3ccc7DD2x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y03pqrEv,_ZThn4_N3ccc7DD2x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y03efgEv,_ZTv0_n12_N3ccc7DD2x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y03efgEv,_ZThn4_N3ccc7DD2x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y0E = {  "_ZN3ccc7DD2x3y0E", // class name
  bases__ZN3ccc7DD2x3y0E, 2,
  &(vtc__ZN3ccc7DD2x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y0E),3, //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  CC2x3y1  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x3y13efgEv
  ~CC2x3y1(); // tgen
  CC2x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y1E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y13abcEv");}
void  ccc::CC2x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y13pqrEv");}
void  ccc::CC2x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y13efgEv");}
ccc::CC2x3y1 ::~CC2x3y1(){ note_dtor("_ZN3ccc7CC2x3y1E", this);} // tgen
ccc::CC2x3y1 ::CC2x3y1(){ note_ctor("_ZN3ccc7CC2x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y1E, buf);
    ::ccc::CC2x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y1E);
    dp->::ccc::CC2x3y1::~CC2x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y1E(Test__ZN3ccc7CC2x3y1E, "_ZN3ccc7CC2x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y1C1Ev();
extern void _ZN3ccc7CC2x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y1E[] = {
  NSPAIR(_ZN3ccc7CC2x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y1E[];
extern void _ZN3ccc7CC2x3y13efgEv();
extern void _ZN3ccc7CC2x3y13pqrEv();
extern void _ZN3ccc7CC2x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y13efgEv,_ZTv0_n12_N3ccc7CC2x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13efgEv,_ZThn4_N3ccc7CC2x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y13abcEv,_ZTv0_n16_N3ccc7CC2x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13abcEv,_ZThn4_N3ccc7CC2x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y13pqrEv,_ZTv0_n20_N3ccc7CC2x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13pqrEv,_ZThn4_N3ccc7CC2x3y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y13efgEv,_ZTv0_n12_N3ccc7CC2x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y13abcEv,_ZTv0_n16_N3ccc7CC2x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y13pqrEv,_ZTv0_n20_N3ccc7CC2x3y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y1E[] = {
  {&(_ZTVN3ccc7CC2x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y1E[];
static VTBL_ENTRY alt_thunk_names957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y13pqrEv,_ZTv0_n20_N3ccc7CC2x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y13pqrEv,_ZThn4_N3ccc7CC2x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y13abcEv,_ZTv0_n16_N3ccc7CC2x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y13abcEv,_ZThn4_N3ccc7CC2x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y13efgEv,_ZTv0_n12_N3ccc7CC2x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y13efgEv,_ZThn4_N3ccc7CC2x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y1E = {  "_ZN3ccc7CC2x3y1E", // class name
  bases__ZN3ccc7CC2x3y1E, 2,
  &(vtc__ZN3ccc7CC2x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y1E),2, //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  DD2x3y1  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD2x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x3y13efgEv
  ~DD2x3y1(); // tgen
  DD2x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y13abcEv");}
void  ccc::DD2x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y13pqrEv");}
void  ccc::DD2x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y13efgEv");}
ccc::DD2x3y1 ::~DD2x3y1(){ note_dtor("_ZN3ccc7DD2x3y1E", this);} // tgen
ccc::DD2x3y1 ::DD2x3y1(){ note_ctor("_ZN3ccc7DD2x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y1E, buf);
    ::ccc::DD2x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y1E);
    dp->::ccc::DD2x3y1::~DD2x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y1E(Test__ZN3ccc7DD2x3y1E, "_ZN3ccc7DD2x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y1C1Ev();
extern void _ZN3ccc7DD2x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y1E[] = {
  NSPAIR(_ZN3ccc7DD2x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y1E[];
extern void _ZN3ccc7DD2x3y13efgEv();
extern void _ZN3ccc7DD2x3y13abcEv();
extern void _ZN3ccc7DD2x3y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y13efgEv,_ZTv0_n12_N3ccc7DD2x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y13efgEv,_ZThn4_N3ccc7DD2x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y13pqrEv,_ZTv0_n16_N3ccc7DD2x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y13pqrEv,_ZThn4_N3ccc7DD2x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y13abcEv,_ZTv0_n20_N3ccc7DD2x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y13abcEv,_ZThn4_N3ccc7DD2x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y13efgEv,_ZTv0_n12_N3ccc7DD2x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y13pqrEv,_ZTv0_n16_N3ccc7DD2x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y13abcEv,_ZTv0_n20_N3ccc7DD2x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y1E[] = {
  {&(_ZTVN3ccc7DD2x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y1E[];
static VTBL_ENTRY alt_thunk_names958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y13abcEv,_ZTv0_n20_N3ccc7DD2x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y13abcEv,_ZThn4_N3ccc7DD2x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y13pqrEv,_ZTv0_n16_N3ccc7DD2x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y13pqrEv,_ZThn4_N3ccc7DD2x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y13efgEv,_ZTv0_n12_N3ccc7DD2x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y13efgEv,_ZThn4_N3ccc7DD2x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y1E = {  "_ZN3ccc7DD2x3y1E", // class name
  bases__ZN3ccc7DD2x3y1E, 2,
  &(vtc__ZN3ccc7DD2x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y1E),3, //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  CC2x3y2  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y23pqrEv
  ~CC2x3y2(); // tgen
  CC2x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y2E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y23efgEv");}
void  ccc::CC2x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y23abcEv");}
void  ccc::CC2x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y23pqrEv");}
ccc::CC2x3y2 ::~CC2x3y2(){ note_dtor("_ZN3ccc7CC2x3y2E", this);} // tgen
ccc::CC2x3y2 ::CC2x3y2(){ note_ctor("_ZN3ccc7CC2x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y2E, buf);
    ::ccc::CC2x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y2E);
    dp->::ccc::CC2x3y2::~CC2x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y2E(Test__ZN3ccc7CC2x3y2E, "_ZN3ccc7CC2x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y2C1Ev();
extern void _ZN3ccc7CC2x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y2E[] = {
  NSPAIR(_ZN3ccc7CC2x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y2E[];
extern void _ZN3ccc7CC2x3y23efgEv();
extern void _ZN3ccc7CC2x3y23pqrEv();
extern void _ZN3ccc7CC2x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y23efgEv,_ZTv0_n12_N3ccc7CC2x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23efgEv,_ZThn4_N3ccc7CC2x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y23abcEv,_ZTv0_n16_N3ccc7CC2x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23abcEv,_ZThn4_N3ccc7CC2x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y23pqrEv,_ZTv0_n20_N3ccc7CC2x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23pqrEv,_ZThn4_N3ccc7CC2x3y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y23efgEv,_ZTv0_n12_N3ccc7CC2x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y23abcEv,_ZTv0_n16_N3ccc7CC2x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y23pqrEv,_ZTv0_n20_N3ccc7CC2x3y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y2E[] = {
  {&(_ZTVN3ccc7CC2x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y2E[];
static VTBL_ENTRY alt_thunk_names959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y23pqrEv,_ZTv0_n20_N3ccc7CC2x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y23pqrEv,_ZThn4_N3ccc7CC2x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y23abcEv,_ZTv0_n16_N3ccc7CC2x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y23abcEv,_ZThn4_N3ccc7CC2x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y23efgEv,_ZTv0_n12_N3ccc7CC2x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y23efgEv,_ZThn4_N3ccc7CC2x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y2E = {  "_ZN3ccc7CC2x3y2E", // class name
  bases__ZN3ccc7CC2x3y2E, 2,
  &(vtc__ZN3ccc7CC2x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y2E),2, //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  DD2x3y2  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD2x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y23pqrEv
  ~DD2x3y2(); // tgen
  DD2x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y23efgEv");}
void  ccc::DD2x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y23abcEv");}
void  ccc::DD2x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y23pqrEv");}
ccc::DD2x3y2 ::~DD2x3y2(){ note_dtor("_ZN3ccc7DD2x3y2E", this);} // tgen
ccc::DD2x3y2 ::DD2x3y2(){ note_ctor("_ZN3ccc7DD2x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y2E, buf);
    ::ccc::DD2x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y2E);
    dp->::ccc::DD2x3y2::~DD2x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y2E(Test__ZN3ccc7DD2x3y2E, "_ZN3ccc7DD2x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y2C1Ev();
extern void _ZN3ccc7DD2x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y2E[] = {
  NSPAIR(_ZN3ccc7DD2x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y2E[];
extern void _ZN3ccc7DD2x3y23efgEv();
extern void _ZN3ccc7DD2x3y23abcEv();
extern void _ZN3ccc7DD2x3y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y23efgEv,_ZTv0_n12_N3ccc7DD2x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y23efgEv,_ZThn4_N3ccc7DD2x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y23pqrEv,_ZTv0_n16_N3ccc7DD2x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y23pqrEv,_ZThn4_N3ccc7DD2x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y23abcEv,_ZTv0_n20_N3ccc7DD2x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y23abcEv,_ZThn4_N3ccc7DD2x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y23efgEv,_ZTv0_n12_N3ccc7DD2x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y23pqrEv,_ZTv0_n16_N3ccc7DD2x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y23abcEv,_ZTv0_n20_N3ccc7DD2x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y2E[] = {
  {&(_ZTVN3ccc7DD2x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y2E[];
static VTBL_ENTRY alt_thunk_names960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y23abcEv,_ZTv0_n20_N3ccc7DD2x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y23abcEv,_ZThn4_N3ccc7DD2x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y23pqrEv,_ZTv0_n16_N3ccc7DD2x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y23pqrEv,_ZThn4_N3ccc7DD2x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y23efgEv,_ZTv0_n12_N3ccc7DD2x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y23efgEv,_ZThn4_N3ccc7DD2x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y2E = {  "_ZN3ccc7DD2x3y2E", // class name
  bases__ZN3ccc7DD2x3y2E, 2,
  &(vtc__ZN3ccc7DD2x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y2E),3, //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  CC2x3y3  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x3y33abcEv
  ~CC2x3y3(); // tgen
  CC2x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y3E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y33efgEv");}
void  ccc::CC2x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y33pqrEv");}
void  ccc::CC2x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y33abcEv");}
ccc::CC2x3y3 ::~CC2x3y3(){ note_dtor("_ZN3ccc7CC2x3y3E", this);} // tgen
ccc::CC2x3y3 ::CC2x3y3(){ note_ctor("_ZN3ccc7CC2x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y3E, buf);
    ::ccc::CC2x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y3E);
    dp->::ccc::CC2x3y3::~CC2x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y3E(Test__ZN3ccc7CC2x3y3E, "_ZN3ccc7CC2x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y3C1Ev();
extern void _ZN3ccc7CC2x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y3E[] = {
  NSPAIR(_ZN3ccc7CC2x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y3E[];
extern void _ZN3ccc7CC2x3y33efgEv();
extern void _ZN3ccc7CC2x3y33pqrEv();
extern void _ZN3ccc7CC2x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y33efgEv,_ZTv0_n12_N3ccc7CC2x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33efgEv,_ZThn4_N3ccc7CC2x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y33abcEv,_ZTv0_n16_N3ccc7CC2x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33abcEv,_ZThn4_N3ccc7CC2x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y33pqrEv,_ZTv0_n20_N3ccc7CC2x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33pqrEv,_ZThn4_N3ccc7CC2x3y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y33efgEv,_ZTv0_n12_N3ccc7CC2x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y33abcEv,_ZTv0_n16_N3ccc7CC2x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y33pqrEv,_ZTv0_n20_N3ccc7CC2x3y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y3E[] = {
  {&(_ZTVN3ccc7CC2x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y3E[];
static VTBL_ENTRY alt_thunk_names961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y33pqrEv,_ZTv0_n20_N3ccc7CC2x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y33pqrEv,_ZThn4_N3ccc7CC2x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y33abcEv,_ZTv0_n16_N3ccc7CC2x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y33abcEv,_ZThn4_N3ccc7CC2x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y33efgEv,_ZTv0_n12_N3ccc7CC2x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y33efgEv,_ZThn4_N3ccc7CC2x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y3E = {  "_ZN3ccc7CC2x3y3E", // class name
  bases__ZN3ccc7CC2x3y3E, 2,
  &(vtc__ZN3ccc7CC2x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y3E),2, //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  DD2x3y3  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD2x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x3y33abcEv
  ~DD2x3y3(); // tgen
  DD2x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y33efgEv");}
void  ccc::DD2x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y33pqrEv");}
void  ccc::DD2x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y33abcEv");}
ccc::DD2x3y3 ::~DD2x3y3(){ note_dtor("_ZN3ccc7DD2x3y3E", this);} // tgen
ccc::DD2x3y3 ::DD2x3y3(){ note_ctor("_ZN3ccc7DD2x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y3E, buf);
    ::ccc::DD2x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y3E);
    dp->::ccc::DD2x3y3::~DD2x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y3E(Test__ZN3ccc7DD2x3y3E, "_ZN3ccc7DD2x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y3C1Ev();
extern void _ZN3ccc7DD2x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y3E[] = {
  NSPAIR(_ZN3ccc7DD2x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y3E[];
extern void _ZN3ccc7DD2x3y33efgEv();
extern void _ZN3ccc7DD2x3y33abcEv();
extern void _ZN3ccc7DD2x3y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y33efgEv,_ZTv0_n12_N3ccc7DD2x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y33efgEv,_ZThn4_N3ccc7DD2x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y33pqrEv,_ZTv0_n16_N3ccc7DD2x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y33pqrEv,_ZThn4_N3ccc7DD2x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y33abcEv,_ZTv0_n20_N3ccc7DD2x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y33abcEv,_ZThn4_N3ccc7DD2x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y33efgEv,_ZTv0_n12_N3ccc7DD2x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y33pqrEv,_ZTv0_n16_N3ccc7DD2x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y33abcEv,_ZTv0_n20_N3ccc7DD2x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y3E[] = {
  {&(_ZTVN3ccc7DD2x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y3E[];
static VTBL_ENTRY alt_thunk_names962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y33abcEv,_ZTv0_n20_N3ccc7DD2x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y33abcEv,_ZThn4_N3ccc7DD2x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y33pqrEv,_ZTv0_n16_N3ccc7DD2x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y33pqrEv,_ZThn4_N3ccc7DD2x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y33efgEv,_ZTv0_n12_N3ccc7DD2x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y33efgEv,_ZThn4_N3ccc7DD2x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y3E = {  "_ZN3ccc7DD2x3y3E", // class name
  bases__ZN3ccc7DD2x3y3E, 2,
  &(vtc__ZN3ccc7DD2x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y3E),3, //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  CC2x3y4  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC2x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y43efgEv
  ~CC2x3y4(); // tgen
  CC2x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y4E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y43pqrEv");}
void  ccc::CC2x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y43abcEv");}
void  ccc::CC2x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y43efgEv");}
ccc::CC2x3y4 ::~CC2x3y4(){ note_dtor("_ZN3ccc7CC2x3y4E", this);} // tgen
ccc::CC2x3y4 ::CC2x3y4(){ note_ctor("_ZN3ccc7CC2x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y4E, buf);
    ::ccc::CC2x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y4E);
    dp->::ccc::CC2x3y4::~CC2x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y4E(Test__ZN3ccc7CC2x3y4E, "_ZN3ccc7CC2x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y4C1Ev();
extern void _ZN3ccc7CC2x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y4E[] = {
  NSPAIR(_ZN3ccc7CC2x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y4E[];
extern void _ZN3ccc7CC2x3y43efgEv();
extern void _ZN3ccc7CC2x3y43pqrEv();
extern void _ZN3ccc7CC2x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y43efgEv,_ZTv0_n12_N3ccc7CC2x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43efgEv,_ZThn4_N3ccc7CC2x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y43abcEv,_ZTv0_n16_N3ccc7CC2x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43abcEv,_ZThn4_N3ccc7CC2x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y43pqrEv,_ZTv0_n20_N3ccc7CC2x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43pqrEv,_ZThn4_N3ccc7CC2x3y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y43efgEv,_ZTv0_n12_N3ccc7CC2x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y43abcEv,_ZTv0_n16_N3ccc7CC2x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y43pqrEv,_ZTv0_n20_N3ccc7CC2x3y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y4E[] = {
  {&(_ZTVN3ccc7CC2x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y4E[];
static VTBL_ENTRY alt_thunk_names963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y43pqrEv,_ZTv0_n20_N3ccc7CC2x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y43pqrEv,_ZThn4_N3ccc7CC2x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y43abcEv,_ZTv0_n16_N3ccc7CC2x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y43abcEv,_ZThn4_N3ccc7CC2x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y43efgEv,_ZTv0_n12_N3ccc7CC2x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y43efgEv,_ZThn4_N3ccc7CC2x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y4E = {  "_ZN3ccc7CC2x3y4E", // class name
  bases__ZN3ccc7CC2x3y4E, 2,
  &(vtc__ZN3ccc7CC2x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y4E),2, //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  DD2x3y4  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD2x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x3y43efgEv
  ~DD2x3y4(); // tgen
  DD2x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y43pqrEv");}
void  ccc::DD2x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y43abcEv");}
void  ccc::DD2x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y43efgEv");}
ccc::DD2x3y4 ::~DD2x3y4(){ note_dtor("_ZN3ccc7DD2x3y4E", this);} // tgen
ccc::DD2x3y4 ::DD2x3y4(){ note_ctor("_ZN3ccc7DD2x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y4E, buf);
    ::ccc::DD2x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y4E);
    dp->::ccc::DD2x3y4::~DD2x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y4E(Test__ZN3ccc7DD2x3y4E, "_ZN3ccc7DD2x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y4C1Ev();
extern void _ZN3ccc7DD2x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y4E[] = {
  NSPAIR(_ZN3ccc7DD2x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y4E[];
extern void _ZN3ccc7DD2x3y43efgEv();
extern void _ZN3ccc7DD2x3y43abcEv();
extern void _ZN3ccc7DD2x3y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y43efgEv,_ZTv0_n12_N3ccc7DD2x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y43efgEv,_ZThn4_N3ccc7DD2x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y43pqrEv,_ZTv0_n16_N3ccc7DD2x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y43pqrEv,_ZThn4_N3ccc7DD2x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y43abcEv,_ZTv0_n20_N3ccc7DD2x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y43abcEv,_ZThn4_N3ccc7DD2x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y43efgEv,_ZTv0_n12_N3ccc7DD2x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y43pqrEv,_ZTv0_n16_N3ccc7DD2x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y43abcEv,_ZTv0_n20_N3ccc7DD2x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y4E[] = {
  {&(_ZTVN3ccc7DD2x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y4E[];
static VTBL_ENTRY alt_thunk_names964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y43abcEv,_ZTv0_n20_N3ccc7DD2x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y43abcEv,_ZThn4_N3ccc7DD2x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y43pqrEv,_ZTv0_n16_N3ccc7DD2x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y43pqrEv,_ZThn4_N3ccc7DD2x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y43efgEv,_ZTv0_n12_N3ccc7DD2x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y43efgEv,_ZThn4_N3ccc7DD2x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y4E = {  "_ZN3ccc7DD2x3y4E", // class name
  bases__ZN3ccc7DD2x3y4E, 2,
  &(vtc__ZN3ccc7DD2x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y4E),3, //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  CC2x3y5  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC2x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y53abcEv
  ~CC2x3y5(); // tgen
  CC2x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y5E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y53pqrEv");}
void  ccc::CC2x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y53efgEv");}
void  ccc::CC2x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y53abcEv");}
ccc::CC2x3y5 ::~CC2x3y5(){ note_dtor("_ZN3ccc7CC2x3y5E", this);} // tgen
ccc::CC2x3y5 ::CC2x3y5(){ note_ctor("_ZN3ccc7CC2x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y5E, buf);
    ::ccc::CC2x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y5E);
    dp->::ccc::CC2x3y5::~CC2x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y5E(Test__ZN3ccc7CC2x3y5E, "_ZN3ccc7CC2x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y5C1Ev();
extern void _ZN3ccc7CC2x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y5E[] = {
  NSPAIR(_ZN3ccc7CC2x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y5E[];
extern void _ZN3ccc7CC2x3y53efgEv();
extern void _ZN3ccc7CC2x3y53pqrEv();
extern void _ZN3ccc7CC2x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y53efgEv,_ZTv0_n12_N3ccc7CC2x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53efgEv,_ZThn4_N3ccc7CC2x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y53abcEv,_ZTv0_n16_N3ccc7CC2x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53abcEv,_ZThn4_N3ccc7CC2x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y53pqrEv,_ZTv0_n20_N3ccc7CC2x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53pqrEv,_ZThn4_N3ccc7CC2x3y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y53efgEv,_ZTv0_n12_N3ccc7CC2x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y53abcEv,_ZTv0_n16_N3ccc7CC2x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y53pqrEv,_ZTv0_n20_N3ccc7CC2x3y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y5E[] = {
  {&(_ZTVN3ccc7CC2x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y5E[];
static VTBL_ENTRY alt_thunk_names965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y53pqrEv,_ZTv0_n20_N3ccc7CC2x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y53pqrEv,_ZThn4_N3ccc7CC2x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y53abcEv,_ZTv0_n16_N3ccc7CC2x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y53abcEv,_ZThn4_N3ccc7CC2x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y53efgEv,_ZTv0_n12_N3ccc7CC2x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y53efgEv,_ZThn4_N3ccc7CC2x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y5E = {  "_ZN3ccc7CC2x3y5E", // class name
  bases__ZN3ccc7CC2x3y5E, 2,
  &(vtc__ZN3ccc7CC2x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y5E),2, //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  DD2x3y5  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD2x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x3y53abcEv
  ~DD2x3y5(); // tgen
  DD2x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y53pqrEv");}
void  ccc::DD2x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y53efgEv");}
void  ccc::DD2x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y53abcEv");}
ccc::DD2x3y5 ::~DD2x3y5(){ note_dtor("_ZN3ccc7DD2x3y5E", this);} // tgen
ccc::DD2x3y5 ::DD2x3y5(){ note_ctor("_ZN3ccc7DD2x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y5E, buf);
    ::ccc::DD2x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y5E);
    dp->::ccc::DD2x3y5::~DD2x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y5E(Test__ZN3ccc7DD2x3y5E, "_ZN3ccc7DD2x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y5C1Ev();
extern void _ZN3ccc7DD2x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y5E[] = {
  NSPAIR(_ZN3ccc7DD2x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y5E[];
extern void _ZN3ccc7DD2x3y53efgEv();
extern void _ZN3ccc7DD2x3y53abcEv();
extern void _ZN3ccc7DD2x3y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y53efgEv,_ZTv0_n12_N3ccc7DD2x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y53efgEv,_ZThn4_N3ccc7DD2x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y53pqrEv,_ZTv0_n16_N3ccc7DD2x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y53pqrEv,_ZThn4_N3ccc7DD2x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y53abcEv,_ZTv0_n20_N3ccc7DD2x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y53abcEv,_ZThn4_N3ccc7DD2x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y53efgEv,_ZTv0_n12_N3ccc7DD2x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y53pqrEv,_ZTv0_n16_N3ccc7DD2x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y53abcEv,_ZTv0_n20_N3ccc7DD2x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y5E[] = {
  {&(_ZTVN3ccc7DD2x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y5E[];
static VTBL_ENTRY alt_thunk_names966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y53abcEv,_ZTv0_n20_N3ccc7DD2x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y53abcEv,_ZThn4_N3ccc7DD2x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y53pqrEv,_ZTv0_n16_N3ccc7DD2x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y53pqrEv,_ZThn4_N3ccc7DD2x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y53efgEv,_ZTv0_n12_N3ccc7DD2x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y53efgEv,_ZThn4_N3ccc7DD2x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y5E = {  "_ZN3ccc7DD2x3y5E", // class name
  bases__ZN3ccc7DD2x3y5E, 2,
  &(vtc__ZN3ccc7DD2x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y5E),3, //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  CC2x3y6  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y63efgEv
  ~CC2x3y6(); // tgen
  CC2x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y6E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y63abcEv");}
void  ccc::CC2x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y63efgEv");}
ccc::CC2x3y6 ::~CC2x3y6(){ note_dtor("_ZN3ccc7CC2x3y6E", this);} // tgen
ccc::CC2x3y6 ::CC2x3y6(){ note_ctor("_ZN3ccc7CC2x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y6E, buf);
    ::ccc::CC2x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y6E);
    dp->::ccc::CC2x3y6::~CC2x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y6E(Test__ZN3ccc7CC2x3y6E, "_ZN3ccc7CC2x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y6C1Ev();
extern void _ZN3ccc7CC2x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y6E[] = {
  NSPAIR(_ZN3ccc7CC2x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y6E[];
extern void _ZN3ccc7CC2x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC2x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y63efgEv,_ZTv0_n12_N3ccc7CC2x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y63efgEv,_ZThn4_N3ccc7CC2x3y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y63abcEv,_ZTv0_n16_N3ccc7CC2x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y63abcEv,_ZThn4_N3ccc7CC2x3y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y63efgEv,_ZTv0_n12_N3ccc7CC2x3y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y63abcEv,_ZTv0_n16_N3ccc7CC2x3y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y6E[] = {
  {&(_ZTVN3ccc7CC2x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y6E[];
static VTBL_ENTRY alt_thunk_names967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y63abcEv,_ZTv0_n16_N3ccc7CC2x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y63abcEv,_ZThn4_N3ccc7CC2x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y63efgEv,_ZTv0_n12_N3ccc7CC2x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y63efgEv,_ZThn4_N3ccc7CC2x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y6E = {  "_ZN3ccc7CC2x3y6E", // class name
  bases__ZN3ccc7CC2x3y6E, 2,
  &(vtc__ZN3ccc7CC2x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y6E),2, //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  DD2x3y6  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD2x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x3y63efgEv
  ~DD2x3y6(); // tgen
  DD2x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y63abcEv");}
void  ccc::DD2x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y63efgEv");}
ccc::DD2x3y6 ::~DD2x3y6(){ note_dtor("_ZN3ccc7DD2x3y6E", this);} // tgen
ccc::DD2x3y6 ::DD2x3y6(){ note_ctor("_ZN3ccc7DD2x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y6E, buf);
    ::ccc::DD2x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y6E);
    dp->::ccc::DD2x3y6::~DD2x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y6E(Test__ZN3ccc7DD2x3y6E, "_ZN3ccc7DD2x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y6C1Ev();
extern void _ZN3ccc7DD2x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y6E[] = {
  NSPAIR(_ZN3ccc7DD2x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y6E[];
extern void _ZN3ccc7DD2x3y63efgEv();
extern void _ZN3ccc7DD2x3y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y63efgEv,_ZTv0_n12_N3ccc7DD2x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y63efgEv,_ZThn4_N3ccc7DD2x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y63abcEv,_ZTv0_n20_N3ccc7DD2x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y63abcEv,_ZThn4_N3ccc7DD2x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y63efgEv,_ZTv0_n12_N3ccc7DD2x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y63abcEv,_ZTv0_n20_N3ccc7DD2x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y6E[] = {
  {&(_ZTVN3ccc7DD2x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y6E[];
static VTBL_ENTRY alt_thunk_names968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y63abcEv,_ZTv0_n20_N3ccc7DD2x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y63abcEv,_ZThn4_N3ccc7DD2x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y63efgEv,_ZTv0_n12_N3ccc7DD2x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y63efgEv,_ZThn4_N3ccc7DD2x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y6E = {  "_ZN3ccc7DD2x3y6E", // class name
  bases__ZN3ccc7DD2x3y6E, 2,
  &(vtc__ZN3ccc7DD2x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y6E),3, //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  CC2x3y7  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y73pqrEv
  ~CC2x3y7(); // tgen
  CC2x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y7E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y73abcEv");}
void  ccc::CC2x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y73pqrEv");}
ccc::CC2x3y7 ::~CC2x3y7(){ note_dtor("_ZN3ccc7CC2x3y7E", this);} // tgen
ccc::CC2x3y7 ::CC2x3y7(){ note_ctor("_ZN3ccc7CC2x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y7E, buf);
    ::ccc::CC2x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y7E);
    dp->::ccc::CC2x3y7::~CC2x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y7E(Test__ZN3ccc7CC2x3y7E, "_ZN3ccc7CC2x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y7C1Ev();
extern void _ZN3ccc7CC2x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y7E[] = {
  NSPAIR(_ZN3ccc7CC2x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC2x3y73pqrEv();
extern void _ZN3ccc7CC2x3y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y73abcEv,_ZTv0_n16_N3ccc7CC2x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y73abcEv,_ZThn4_N3ccc7CC2x3y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y73pqrEv,_ZTv0_n20_N3ccc7CC2x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y73pqrEv,_ZThn4_N3ccc7CC2x3y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y73abcEv,_ZTv0_n16_N3ccc7CC2x3y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y73pqrEv,_ZTv0_n20_N3ccc7CC2x3y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y7E[] = {
  {&(_ZTVN3ccc7CC2x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y7E[];
static VTBL_ENTRY alt_thunk_names969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y73pqrEv,_ZTv0_n20_N3ccc7CC2x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y73pqrEv,_ZThn4_N3ccc7CC2x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y73abcEv,_ZTv0_n16_N3ccc7CC2x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y73abcEv,_ZThn4_N3ccc7CC2x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y7E = {  "_ZN3ccc7CC2x3y7E", // class name
  bases__ZN3ccc7CC2x3y7E, 2,
  &(vtc__ZN3ccc7CC2x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y7E),2, //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  DD2x3y7  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD2x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y73pqrEv
  ~DD2x3y7(); // tgen
  DD2x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y73abcEv");}
void  ccc::DD2x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y73pqrEv");}
ccc::DD2x3y7 ::~DD2x3y7(){ note_dtor("_ZN3ccc7DD2x3y7E", this);} // tgen
ccc::DD2x3y7 ::DD2x3y7(){ note_ctor("_ZN3ccc7DD2x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y7E, buf);
    ::ccc::DD2x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y7E);
    dp->::ccc::DD2x3y7::~DD2x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y7E(Test__ZN3ccc7DD2x3y7E, "_ZN3ccc7DD2x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y7C1Ev();
extern void _ZN3ccc7DD2x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y7E[] = {
  NSPAIR(_ZN3ccc7DD2x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x3y73abcEv();
extern void _ZN3ccc7DD2x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y73pqrEv,_ZTv0_n16_N3ccc7DD2x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y73pqrEv,_ZThn4_N3ccc7DD2x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y73abcEv,_ZTv0_n20_N3ccc7DD2x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y73abcEv,_ZThn4_N3ccc7DD2x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y73pqrEv,_ZTv0_n16_N3ccc7DD2x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y73abcEv,_ZTv0_n20_N3ccc7DD2x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y7E[] = {
  {&(_ZTVN3ccc7DD2x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y7E[];
static VTBL_ENTRY alt_thunk_names970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y73abcEv,_ZTv0_n20_N3ccc7DD2x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y73abcEv,_ZThn4_N3ccc7DD2x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y73pqrEv,_ZTv0_n16_N3ccc7DD2x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y73pqrEv,_ZThn4_N3ccc7DD2x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y7E = {  "_ZN3ccc7DD2x3y7E", // class name
  bases__ZN3ccc7DD2x3y7E, 2,
  &(vtc__ZN3ccc7DD2x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y7E),3, //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  CC2x3y8  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y83abcEv
  ~CC2x3y8(); // tgen
  CC2x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y8E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y83efgEv");}
void  ccc::CC2x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y83abcEv");}
ccc::CC2x3y8 ::~CC2x3y8(){ note_dtor("_ZN3ccc7CC2x3y8E", this);} // tgen
ccc::CC2x3y8 ::CC2x3y8(){ note_ctor("_ZN3ccc7CC2x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y8E, buf);
    ::ccc::CC2x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y8E);
    dp->::ccc::CC2x3y8::~CC2x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y8E(Test__ZN3ccc7CC2x3y8E, "_ZN3ccc7CC2x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y8C1Ev();
extern void _ZN3ccc7CC2x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y8E[] = {
  NSPAIR(_ZN3ccc7CC2x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y8E[];
extern void _ZN3ccc7CC2x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC2x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y83efgEv,_ZTv0_n12_N3ccc7CC2x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y83efgEv,_ZThn4_N3ccc7CC2x3y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x3y83abcEv,_ZTv0_n16_N3ccc7CC2x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y83abcEv,_ZThn4_N3ccc7CC2x3y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y83efgEv,_ZTv0_n12_N3ccc7CC2x3y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x3y83abcEv,_ZTv0_n16_N3ccc7CC2x3y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y8E[] = {
  {&(_ZTVN3ccc7CC2x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y8E[];
static VTBL_ENTRY alt_thunk_names971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x3y83abcEv,_ZTv0_n16_N3ccc7CC2x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y83abcEv,_ZThn4_N3ccc7CC2x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y83efgEv,_ZTv0_n12_N3ccc7CC2x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y83efgEv,_ZThn4_N3ccc7CC2x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y8E = {  "_ZN3ccc7CC2x3y8E", // class name
  bases__ZN3ccc7CC2x3y8E, 2,
  &(vtc__ZN3ccc7CC2x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y8E),2, //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  DD2x3y8  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD2x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x3y83abcEv
  ~DD2x3y8(); // tgen
  DD2x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y83efgEv");}
void  ccc::DD2x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x3y83abcEv");}
ccc::DD2x3y8 ::~DD2x3y8(){ note_dtor("_ZN3ccc7DD2x3y8E", this);} // tgen
ccc::DD2x3y8 ::DD2x3y8(){ note_ctor("_ZN3ccc7DD2x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y8E, buf);
    ::ccc::DD2x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y8E);
    dp->::ccc::DD2x3y8::~DD2x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y8E(Test__ZN3ccc7DD2x3y8E, "_ZN3ccc7DD2x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y8C1Ev();
extern void _ZN3ccc7DD2x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y8E[] = {
  NSPAIR(_ZN3ccc7DD2x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y8E[];
extern void _ZN3ccc7DD2x3y83efgEv();
extern void _ZN3ccc7DD2x3y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y83efgEv,_ZTv0_n12_N3ccc7DD2x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y83efgEv,_ZThn4_N3ccc7DD2x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x3y83abcEv,_ZTv0_n20_N3ccc7DD2x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y83abcEv,_ZThn4_N3ccc7DD2x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y83efgEv,_ZTv0_n12_N3ccc7DD2x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x3y83abcEv,_ZTv0_n20_N3ccc7DD2x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y8E[] = {
  {&(_ZTVN3ccc7DD2x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y8E[];
static VTBL_ENTRY alt_thunk_names972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x3y83abcEv,_ZTv0_n20_N3ccc7DD2x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y83abcEv,_ZThn4_N3ccc7DD2x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y83efgEv,_ZTv0_n12_N3ccc7DD2x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y83efgEv,_ZThn4_N3ccc7DD2x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y8E = {  "_ZN3ccc7DD2x3y8E", // class name
  bases__ZN3ccc7DD2x3y8E, 2,
  &(vtc__ZN3ccc7DD2x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y8E),3, //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  CC2x3y9  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y93pqrEv
  ~CC2x3y9(); // tgen
  CC2x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y9E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y93efgEv");}
void  ccc::CC2x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y93pqrEv");}
ccc::CC2x3y9 ::~CC2x3y9(){ note_dtor("_ZN3ccc7CC2x3y9E", this);} // tgen
ccc::CC2x3y9 ::CC2x3y9(){ note_ctor("_ZN3ccc7CC2x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y9E, buf);
    ::ccc::CC2x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC2x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y9E);
    dp->::ccc::CC2x3y9::~CC2x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y9E(Test__ZN3ccc7CC2x3y9E, "_ZN3ccc7CC2x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y9C1Ev();
extern void _ZN3ccc7CC2x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y9E[] = {
  NSPAIR(_ZN3ccc7CC2x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y9E[];
extern void _ZN3ccc7CC2x3y93efgEv();
extern void _ZN3ccc7CC2x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x3y93efgEv,_ZTv0_n12_N3ccc7CC2x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y93efgEv,_ZThn4_N3ccc7CC2x3y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x3y93pqrEv,_ZTv0_n20_N3ccc7CC2x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y93pqrEv,_ZThn4_N3ccc7CC2x3y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x3y93efgEv,_ZTv0_n12_N3ccc7CC2x3y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x3y93pqrEv,_ZTv0_n20_N3ccc7CC2x3y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x3y9E[] = {
  {&(_ZTVN3ccc7CC2x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x3y9E[];
static VTBL_ENTRY alt_thunk_names973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x3y93pqrEv,_ZTv0_n20_N3ccc7CC2x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y93pqrEv,_ZThn4_N3ccc7CC2x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x3y93efgEv,_ZTv0_n12_N3ccc7CC2x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x3y93efgEv,_ZThn4_N3ccc7CC2x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x3y9E = {  "_ZN3ccc7CC2x3y9E", // class name
  bases__ZN3ccc7CC2x3y9E, 2,
  &(vtc__ZN3ccc7CC2x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x3y9E),2, //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  DD2x3y9  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD2x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x3y93pqrEv
  ~DD2x3y9(); // tgen
  DD2x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x3y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x3y93efgEv");}
void  ccc::DD2x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x3y93pqrEv");}
ccc::DD2x3y9 ::~DD2x3y9(){ note_dtor("_ZN3ccc7DD2x3y9E", this);} // tgen
ccc::DD2x3y9 ::DD2x3y9(){ note_ctor("_ZN3ccc7DD2x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x3y9E, buf);
    ::ccc::DD2x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x3y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD2x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x3y9E);
    dp->::ccc::DD2x3y9::~DD2x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x3y9E(Test__ZN3ccc7DD2x3y9E, "_ZN3ccc7DD2x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x3y9C1Ev();
extern void _ZN3ccc7DD2x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x3y9E[] = {
  NSPAIR(_ZN3ccc7DD2x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD2x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y9E[];
extern void _ZN3ccc7DD2x3y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x3y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x3y93efgEv,_ZTv0_n12_N3ccc7DD2x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y93efgEv,_ZThn4_N3ccc7DD2x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x3y93pqrEv,_ZTv0_n16_N3ccc7DD2x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x3y93pqrEv,_ZThn4_N3ccc7DD2x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x3y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x3y93efgEv,_ZTv0_n12_N3ccc7DD2x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x3y93pqrEv,_ZTv0_n16_N3ccc7DD2x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x3y9E[] = {
  {&(_ZTVN3ccc7DD2x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x3y9E[];
static VTBL_ENTRY alt_thunk_names974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x3y93pqrEv,_ZTv0_n16_N3ccc7DD2x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y93pqrEv,_ZThn4_N3ccc7DD2x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x3y93efgEv,_ZTv0_n12_N3ccc7DD2x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x3y93efgEv,_ZThn4_N3ccc7DD2x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x3y9E = {  "_ZN3ccc7DD2x3y9E", // class name
  bases__ZN3ccc7DD2x3y9E, 2,
  &(vtc__ZN3ccc7DD2x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x3y9E),3, //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  CC2x3y10  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x3y103abcEv
  ~CC2x3y10(); // tgen
  CC2x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y10E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y103pqrEv");}
void  ccc::CC2x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x3y103abcEv");}
ccc::CC2x3y10 ::~CC2x3y10(){ note_dtor("_ZN3ccc8CC2x3y10E", this);} // tgen
ccc::CC2x3y10 ::CC2x3y10(){ note_ctor("_ZN3ccc8CC2x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y10E, buf);
    ::ccc::CC2x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y10E);
    dp->::ccc::CC2x3y10::~CC2x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y10E(Test__ZN3ccc8CC2x3y10E, "_ZN3ccc8CC2x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y10C1Ev();
extern void _ZN3ccc8CC2x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y10E[] = {
  NSPAIR(_ZN3ccc8CC2x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC2x3y103pqrEv();
extern void _ZN3ccc8CC2x3y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x3y103abcEv,_ZTv0_n16_N3ccc8CC2x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y103abcEv,_ZThn4_N3ccc8CC2x3y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x3y103pqrEv,_ZTv0_n20_N3ccc8CC2x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y103pqrEv,_ZThn4_N3ccc8CC2x3y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x3y103abcEv,_ZTv0_n16_N3ccc8CC2x3y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x3y103pqrEv,_ZTv0_n20_N3ccc8CC2x3y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y10E[] = {
  {&(_ZTVN3ccc8CC2x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y10E[];
static VTBL_ENTRY alt_thunk_names975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x3y103pqrEv,_ZTv0_n20_N3ccc8CC2x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y103pqrEv,_ZThn4_N3ccc8CC2x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x3y103abcEv,_ZTv0_n16_N3ccc8CC2x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y103abcEv,_ZThn4_N3ccc8CC2x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x3y10E = {  "_ZN3ccc8CC2x3y10E", // class name
  bases__ZN3ccc8CC2x3y10E, 2,
  &(vtc__ZN3ccc8CC2x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y10E),2, //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  DD2x3y10  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD2x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x3y103abcEv
  ~DD2x3y10(); // tgen
  DD2x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x3y103pqrEv");}
void  ccc::DD2x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x3y103abcEv");}
ccc::DD2x3y10 ::~DD2x3y10(){ note_dtor("_ZN3ccc8DD2x3y10E", this);} // tgen
ccc::DD2x3y10 ::DD2x3y10(){ note_ctor("_ZN3ccc8DD2x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y10E, buf);
    ::ccc::DD2x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y10E);
    dp->::ccc::DD2x3y10::~DD2x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y10E(Test__ZN3ccc8DD2x3y10E, "_ZN3ccc8DD2x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y10C1Ev();
extern void _ZN3ccc8DD2x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y10E[] = {
  NSPAIR(_ZN3ccc8DD2x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x3y103abcEv();
extern void _ZN3ccc8DD2x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x3y103pqrEv,_ZTv0_n16_N3ccc8DD2x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y103pqrEv,_ZThn4_N3ccc8DD2x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x3y103abcEv,_ZTv0_n20_N3ccc8DD2x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y103abcEv,_ZThn4_N3ccc8DD2x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x3y103pqrEv,_ZTv0_n16_N3ccc8DD2x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x3y103abcEv,_ZTv0_n20_N3ccc8DD2x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y10E[] = {
  {&(_ZTVN3ccc8DD2x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y10E[];
static VTBL_ENTRY alt_thunk_names976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x3y103abcEv,_ZTv0_n20_N3ccc8DD2x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y103abcEv,_ZThn4_N3ccc8DD2x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x3y103pqrEv,_ZTv0_n16_N3ccc8DD2x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y103pqrEv,_ZThn4_N3ccc8DD2x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x3y10E = {  "_ZN3ccc8DD2x3y10E", // class name
  bases__ZN3ccc8DD2x3y10E, 2,
  &(vtc__ZN3ccc8DD2x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y10E),3, //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  CC2x3y11  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x3y113efgEv
  ~CC2x3y11(); // tgen
  CC2x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y11E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y113pqrEv");}
void  ccc::CC2x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x3y113efgEv");}
ccc::CC2x3y11 ::~CC2x3y11(){ note_dtor("_ZN3ccc8CC2x3y11E", this);} // tgen
ccc::CC2x3y11 ::CC2x3y11(){ note_ctor("_ZN3ccc8CC2x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y11E, buf);
    ::ccc::CC2x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y11E);
    dp->::ccc::CC2x3y11::~CC2x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y11E(Test__ZN3ccc8CC2x3y11E, "_ZN3ccc8CC2x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y11C1Ev();
extern void _ZN3ccc8CC2x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y11E[] = {
  NSPAIR(_ZN3ccc8CC2x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y11E[];
extern void _ZN3ccc8CC2x3y113efgEv();
extern void _ZN3ccc8CC2x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x3y113efgEv,_ZTv0_n12_N3ccc8CC2x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y113efgEv,_ZThn4_N3ccc8CC2x3y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x3y113pqrEv,_ZTv0_n20_N3ccc8CC2x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y113pqrEv,_ZThn4_N3ccc8CC2x3y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x3y113efgEv,_ZTv0_n12_N3ccc8CC2x3y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x3y113pqrEv,_ZTv0_n20_N3ccc8CC2x3y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y11E[] = {
  {&(_ZTVN3ccc8CC2x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y11E[];
static VTBL_ENTRY alt_thunk_names977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x3y113pqrEv,_ZTv0_n20_N3ccc8CC2x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y113pqrEv,_ZThn4_N3ccc8CC2x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x3y113efgEv,_ZTv0_n12_N3ccc8CC2x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y113efgEv,_ZThn4_N3ccc8CC2x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x3y11E = {  "_ZN3ccc8CC2x3y11E", // class name
  bases__ZN3ccc8CC2x3y11E, 2,
  &(vtc__ZN3ccc8CC2x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y11E),2, //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  DD2x3y11  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD2x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x3y113efgEv
  ~DD2x3y11(); // tgen
  DD2x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x3y113pqrEv");}
void  ccc::DD2x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x3y113efgEv");}
ccc::DD2x3y11 ::~DD2x3y11(){ note_dtor("_ZN3ccc8DD2x3y11E", this);} // tgen
ccc::DD2x3y11 ::DD2x3y11(){ note_ctor("_ZN3ccc8DD2x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y11E, buf);
    ::ccc::DD2x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y11E);
    dp->::ccc::DD2x3y11::~DD2x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y11E(Test__ZN3ccc8DD2x3y11E, "_ZN3ccc8DD2x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y11C1Ev();
extern void _ZN3ccc8DD2x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y11E[] = {
  NSPAIR(_ZN3ccc8DD2x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y11E[];
extern void _ZN3ccc8DD2x3y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x3y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x3y113efgEv,_ZTv0_n12_N3ccc8DD2x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y113efgEv,_ZThn4_N3ccc8DD2x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x3y113pqrEv,_ZTv0_n16_N3ccc8DD2x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y113pqrEv,_ZThn4_N3ccc8DD2x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x3y113efgEv,_ZTv0_n12_N3ccc8DD2x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x3y113pqrEv,_ZTv0_n16_N3ccc8DD2x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y11E[] = {
  {&(_ZTVN3ccc8DD2x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y11E[];
static VTBL_ENTRY alt_thunk_names978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x3y113pqrEv,_ZTv0_n16_N3ccc8DD2x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y113pqrEv,_ZThn4_N3ccc8DD2x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x3y113efgEv,_ZTv0_n12_N3ccc8DD2x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y113efgEv,_ZThn4_N3ccc8DD2x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x3y11E = {  "_ZN3ccc8DD2x3y11E", // class name
  bases__ZN3ccc8DD2x3y11E, 2,
  &(vtc__ZN3ccc8DD2x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y11E),3, //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  CC2x3y12  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC2x3y123abcEv
  ~CC2x3y12(); // tgen
  CC2x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x3y123abcEv");}
ccc::CC2x3y12 ::~CC2x3y12(){ note_dtor("_ZN3ccc8CC2x3y12E", this);} // tgen
ccc::CC2x3y12 ::CC2x3y12(){ note_ctor("_ZN3ccc8CC2x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y12E, buf);
    ::ccc::CC2x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y12E);
    dp->::ccc::CC2x3y12::~CC2x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y12E(Test__ZN3ccc8CC2x3y12E, "_ZN3ccc8CC2x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y12C1Ev();
extern void _ZN3ccc8CC2x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y12E[] = {
  NSPAIR(_ZN3ccc8CC2x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC2x3y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x3y123abcEv,_ZTv0_n16_N3ccc8CC2x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y123abcEv,_ZThn4_N3ccc8CC2x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x3y123abcEv,_ZTv0_n16_N3ccc8CC2x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y12E[] = {
  {&(_ZTVN3ccc8CC2x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y12E[];
static VTBL_ENTRY alt_thunk_names979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x3y123abcEv,_ZTv0_n16_N3ccc8CC2x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y123abcEv,_ZThn4_N3ccc8CC2x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x3y12E = {  "_ZN3ccc8CC2x3y12E", // class name
  bases__ZN3ccc8CC2x3y12E, 2,
  &(vtc__ZN3ccc8CC2x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y12E),2, //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  DD2x3y12  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD2x3y123abcEv
  ~DD2x3y12(); // tgen
  DD2x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x3y123abcEv");}
ccc::DD2x3y12 ::~DD2x3y12(){ note_dtor("_ZN3ccc8DD2x3y12E", this);} // tgen
ccc::DD2x3y12 ::DD2x3y12(){ note_ctor("_ZN3ccc8DD2x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y12E, buf);
    ::ccc::DD2x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y12E);
    dp->::ccc::DD2x3y12::~DD2x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y12E(Test__ZN3ccc8DD2x3y12E, "_ZN3ccc8DD2x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y12C1Ev();
extern void _ZN3ccc8DD2x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y12E[] = {
  NSPAIR(_ZN3ccc8DD2x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x3y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x3y123abcEv,_ZTv0_n20_N3ccc8DD2x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y123abcEv,_ZThn4_N3ccc8DD2x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x3y123abcEv,_ZTv0_n20_N3ccc8DD2x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y12E[] = {
  {&(_ZTVN3ccc8DD2x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y12E[];
static VTBL_ENTRY alt_thunk_names980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x3y123abcEv,_ZTv0_n20_N3ccc8DD2x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y123abcEv,_ZThn4_N3ccc8DD2x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x3y12E = {  "_ZN3ccc8DD2x3y12E", // class name
  bases__ZN3ccc8DD2x3y12E, 2,
  &(vtc__ZN3ccc8DD2x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y12E),3, //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  CC2x3y13  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC2x3y133efgEv
  ~CC2x3y13(); // tgen
  CC2x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x3y133efgEv");}
ccc::CC2x3y13 ::~CC2x3y13(){ note_dtor("_ZN3ccc8CC2x3y13E", this);} // tgen
ccc::CC2x3y13 ::CC2x3y13(){ note_ctor("_ZN3ccc8CC2x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y13E, buf);
    ::ccc::CC2x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y13E);
    dp->::ccc::CC2x3y13::~CC2x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y13E(Test__ZN3ccc8CC2x3y13E, "_ZN3ccc8CC2x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y13C1Ev();
extern void _ZN3ccc8CC2x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y13E[] = {
  NSPAIR(_ZN3ccc8CC2x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y13E[];
extern void _ZN3ccc8CC2x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x3y133efgEv,_ZTv0_n12_N3ccc8CC2x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y133efgEv,_ZThn4_N3ccc8CC2x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x3y133efgEv,_ZTv0_n12_N3ccc8CC2x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y13E[] = {
  {&(_ZTVN3ccc8CC2x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y13E[];
static VTBL_ENTRY alt_thunk_names981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x3y133efgEv,_ZTv0_n12_N3ccc8CC2x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y133efgEv,_ZThn4_N3ccc8CC2x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x3y13E = {  "_ZN3ccc8CC2x3y13E", // class name
  bases__ZN3ccc8CC2x3y13E, 2,
  &(vtc__ZN3ccc8CC2x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y13E),2, //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  DD2x3y13  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD2x3y133efgEv
  ~DD2x3y13(); // tgen
  DD2x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x3y133efgEv");}
ccc::DD2x3y13 ::~DD2x3y13(){ note_dtor("_ZN3ccc8DD2x3y13E", this);} // tgen
ccc::DD2x3y13 ::DD2x3y13(){ note_ctor("_ZN3ccc8DD2x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y13E, buf);
    ::ccc::DD2x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y13E);
    dp->::ccc::DD2x3y13::~DD2x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y13E(Test__ZN3ccc8DD2x3y13E, "_ZN3ccc8DD2x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y13C1Ev();
extern void _ZN3ccc8DD2x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y13E[] = {
  NSPAIR(_ZN3ccc8DD2x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y13E[];
extern void _ZN3ccc8DD2x3y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x3y133efgEv,_ZTv0_n12_N3ccc8DD2x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y133efgEv,_ZThn4_N3ccc8DD2x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x3y133efgEv,_ZTv0_n12_N3ccc8DD2x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y13E[] = {
  {&(_ZTVN3ccc8DD2x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y13E[];
static VTBL_ENTRY alt_thunk_names982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x3y133efgEv,_ZTv0_n12_N3ccc8DD2x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y133efgEv,_ZThn4_N3ccc8DD2x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x3y13E = {  "_ZN3ccc8DD2x3y13E", // class name
  bases__ZN3ccc8DD2x3y13E, 2,
  &(vtc__ZN3ccc8DD2x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y13E),3, //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  CC2x3y14  : virtual ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y143pqrEv
  ~CC2x3y14(); // tgen
  CC2x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y143pqrEv");}
ccc::CC2x3y14 ::~CC2x3y14(){ note_dtor("_ZN3ccc8CC2x3y14E", this);} // tgen
ccc::CC2x3y14 ::CC2x3y14(){ note_ctor("_ZN3ccc8CC2x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y14E, buf);
    ::ccc::CC2x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y14E);
    dp->::ccc::CC2x3y14::~CC2x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y14E(Test__ZN3ccc8CC2x3y14E, "_ZN3ccc8CC2x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y14C1Ev();
extern void _ZN3ccc8CC2x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y14E[] = {
  NSPAIR(_ZN3ccc8CC2x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC2x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x3y143pqrEv,_ZTv0_n20_N3ccc8CC2x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y143pqrEv,_ZThn4_N3ccc8CC2x3y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x3y143pqrEv,_ZTv0_n20_N3ccc8CC2x3y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y14E[] = {
  {&(_ZTVN3ccc8CC2x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y14E[];
static VTBL_ENTRY alt_thunk_names983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x3y143pqrEv,_ZTv0_n20_N3ccc8CC2x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x3y143pqrEv,_ZThn4_N3ccc8CC2x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x3y14E = {  "_ZN3ccc8CC2x3y14E", // class name
  bases__ZN3ccc8CC2x3y14E, 2,
  &(vtc__ZN3ccc8CC2x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y14E),2, //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  DD2x3y14  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD2x3y143pqrEv
  ~DD2x3y14(); // tgen
  DD2x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x3y143pqrEv");}
ccc::DD2x3y14 ::~DD2x3y14(){ note_dtor("_ZN3ccc8DD2x3y14E", this);} // tgen
ccc::DD2x3y14 ::DD2x3y14(){ note_ctor("_ZN3ccc8DD2x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y14E, buf);
    ::ccc::DD2x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y14E);
    dp->::ccc::DD2x3y14::~DD2x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y14E(Test__ZN3ccc8DD2x3y14E, "_ZN3ccc8DD2x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y14C1Ev();
extern void _ZN3ccc8DD2x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y14E[] = {
  NSPAIR(_ZN3ccc8DD2x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x3y143pqrEv,_ZTv0_n16_N3ccc8DD2x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x3y143pqrEv,_ZThn4_N3ccc8DD2x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x3y143pqrEv,_ZTv0_n16_N3ccc8DD2x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y14E[] = {
  {&(_ZTVN3ccc8DD2x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y14E[];
static VTBL_ENTRY alt_thunk_names984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x3y143pqrEv,_ZTv0_n16_N3ccc8DD2x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x3y143pqrEv,_ZThn4_N3ccc8DD2x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x3y14E = {  "_ZN3ccc8DD2x3y14E", // class name
  bases__ZN3ccc8DD2x3y14E, 2,
  &(vtc__ZN3ccc8DD2x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y14E),3, //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  CC2x3y15  : virtual ::ccc::AA2 , ::ccc::BB3 {
  ~CC2x3y15(); // tgen
  CC2x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x3y15 ::~CC2x3y15(){ note_dtor("_ZN3ccc8CC2x3y15E", this);} // tgen
ccc::CC2x3y15 ::CC2x3y15(){ note_ctor("_ZN3ccc8CC2x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y15E, buf);
    ::ccc::CC2x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC2x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y15E);
    dp->::ccc::CC2x3y15::~CC2x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y15E(Test__ZN3ccc8CC2x3y15E, "_ZN3ccc8CC2x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y15C1Ev();
extern void _ZN3ccc8CC2x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y15E[] = {
  NSPAIR(_ZN3ccc8CC2x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x3y15E[] = {
  {&(_ZTVN3ccc8CC2x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x3y15E[];
Class_Descriptor cd__ZN3ccc8CC2x3y15E = {  "_ZN3ccc8CC2x3y15E", // class name
  bases__ZN3ccc8CC2x3y15E, 2,
  &(vtc__ZN3ccc8CC2x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x3y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x3y15  : virtual ::ccc::AA2 , virtual ::ccc::BB3 {
  ~DD2x3y15(); // tgen
  DD2x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x3y15 ::~DD2x3y15(){ note_dtor("_ZN3ccc8DD2x3y15E", this);} // tgen
ccc::DD2x3y15 ::DD2x3y15(){ note_ctor("_ZN3ccc8DD2x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x3y15E, buf);
    ::ccc::DD2x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x3y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD2x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x3y15E);
    dp->::ccc::DD2x3y15::~DD2x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x3y15E(Test__ZN3ccc8DD2x3y15E, "_ZN3ccc8DD2x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x3y15C1Ev();
extern void _ZN3ccc8DD2x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x3y15E[] = {
  NSPAIR(_ZN3ccc8DD2x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD2x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x3y15E[] = {
  {&(_ZTVN3ccc8DD2x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x3y15E[];
Class_Descriptor cd__ZN3ccc8DD2x3y15E = {  "_ZN3ccc8DD2x3y15E", // class name
  bases__ZN3ccc8DD2x3y15E, 2,
  &(vtc__ZN3ccc8DD2x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x3y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y0  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y03pqrEv
  ~CC2x4y0(); // tgen
  CC2x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y0E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y03abcEv");}
void  ccc::CC2x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y03efgEv");}
void  ccc::CC2x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y03pqrEv");}
ccc::CC2x4y0 ::~CC2x4y0(){ note_dtor("_ZN3ccc7CC2x4y0E", this);} // tgen
ccc::CC2x4y0 ::CC2x4y0(){ note_ctor("_ZN3ccc7CC2x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y0E, buf);
    ::ccc::CC2x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y0E);
    dp->::ccc::CC2x4y0::~CC2x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y0E(Test__ZN3ccc7CC2x4y0E, "_ZN3ccc7CC2x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y0C1Ev();
extern void _ZN3ccc7CC2x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y0E[] = {
  NSPAIR(_ZN3ccc7CC2x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y0E[];
extern void _ZN3ccc7CC2x4y03pqrEv();
extern void _ZN3ccc7CC2x4y03abcEv();
extern void _ZN3ccc7CC2x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y03efgEv,_ZTv0_n12_N3ccc7CC2x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03efgEv,_ZThn4_N3ccc7CC2x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y03abcEv,_ZTv0_n16_N3ccc7CC2x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03abcEv,_ZThn4_N3ccc7CC2x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y03pqrEv,_ZTv0_n20_N3ccc7CC2x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03pqrEv,_ZThn4_N3ccc7CC2x4y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y03efgEv,_ZTv0_n12_N3ccc7CC2x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y03abcEv,_ZTv0_n16_N3ccc7CC2x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y03pqrEv,_ZTv0_n20_N3ccc7CC2x4y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y0E[] = {
  {&(_ZTVN3ccc7CC2x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y0E[];
static VTBL_ENTRY alt_thunk_names985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y03pqrEv,_ZTv0_n20_N3ccc7CC2x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y03pqrEv,_ZThn4_N3ccc7CC2x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y03abcEv,_ZTv0_n16_N3ccc7CC2x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y03abcEv,_ZThn4_N3ccc7CC2x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y03efgEv,_ZTv0_n12_N3ccc7CC2x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y03efgEv,_ZThn4_N3ccc7CC2x4y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y0E = {  "_ZN3ccc7CC2x4y0E", // class name
  bases__ZN3ccc7CC2x4y0E, 2,
  &(vtc__ZN3ccc7CC2x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y0E),2, //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  DD2x4y0  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD2x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y03pqrEv
  ~DD2x4y0(); // tgen
  DD2x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y03abcEv");}
void  ccc::DD2x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y03efgEv");}
void  ccc::DD2x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y03pqrEv");}
ccc::DD2x4y0 ::~DD2x4y0(){ note_dtor("_ZN3ccc7DD2x4y0E", this);} // tgen
ccc::DD2x4y0 ::DD2x4y0(){ note_ctor("_ZN3ccc7DD2x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y0E, buf);
    ::ccc::DD2x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y0E);
    dp->::ccc::DD2x4y0::~DD2x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y0E(Test__ZN3ccc7DD2x4y0E, "_ZN3ccc7DD2x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y0C1Ev();
extern void _ZN3ccc7DD2x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y0E[] = {
  NSPAIR(_ZN3ccc7DD2x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y0E[];
extern void _ZN3ccc7DD2x4y03efgEv();
extern void _ZN3ccc7DD2x4y03abcEv();
extern void _ZN3ccc7DD2x4y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y03pqrEv,_ZTv0_n12_N3ccc7DD2x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y03pqrEv,_ZThn4_N3ccc7DD2x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y03abcEv,_ZTv0_n16_N3ccc7DD2x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y03abcEv,_ZThn4_N3ccc7DD2x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y03efgEv,_ZTv0_n20_N3ccc7DD2x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y03efgEv,_ZThn4_N3ccc7DD2x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y03pqrEv,_ZTv0_n12_N3ccc7DD2x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y03abcEv,_ZTv0_n16_N3ccc7DD2x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y03efgEv,_ZTv0_n20_N3ccc7DD2x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y0E[] = {
  {&(_ZTVN3ccc7DD2x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y0E[];
static VTBL_ENTRY alt_thunk_names986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y03efgEv,_ZTv0_n20_N3ccc7DD2x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y03efgEv,_ZThn4_N3ccc7DD2x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y03abcEv,_ZTv0_n16_N3ccc7DD2x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y03abcEv,_ZThn4_N3ccc7DD2x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y03pqrEv,_ZTv0_n12_N3ccc7DD2x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y03pqrEv,_ZThn4_N3ccc7DD2x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y0E = {  "_ZN3ccc7DD2x4y0E", // class name
  bases__ZN3ccc7DD2x4y0E, 2,
  &(vtc__ZN3ccc7DD2x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y0E),3, //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  CC2x4y1  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x4y13efgEv
  ~CC2x4y1(); // tgen
  CC2x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y1E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y13abcEv");}
void  ccc::CC2x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y13pqrEv");}
void  ccc::CC2x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y13efgEv");}
ccc::CC2x4y1 ::~CC2x4y1(){ note_dtor("_ZN3ccc7CC2x4y1E", this);} // tgen
ccc::CC2x4y1 ::CC2x4y1(){ note_ctor("_ZN3ccc7CC2x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y1E, buf);
    ::ccc::CC2x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y1E);
    dp->::ccc::CC2x4y1::~CC2x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y1E(Test__ZN3ccc7CC2x4y1E, "_ZN3ccc7CC2x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y1C1Ev();
extern void _ZN3ccc7CC2x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y1E[] = {
  NSPAIR(_ZN3ccc7CC2x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y1E[];
extern void _ZN3ccc7CC2x4y13pqrEv();
extern void _ZN3ccc7CC2x4y13abcEv();
extern void _ZN3ccc7CC2x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y13efgEv,_ZTv0_n12_N3ccc7CC2x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13efgEv,_ZThn4_N3ccc7CC2x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y13abcEv,_ZTv0_n16_N3ccc7CC2x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13abcEv,_ZThn4_N3ccc7CC2x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y13pqrEv,_ZTv0_n20_N3ccc7CC2x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13pqrEv,_ZThn4_N3ccc7CC2x4y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y13efgEv,_ZTv0_n12_N3ccc7CC2x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y13abcEv,_ZTv0_n16_N3ccc7CC2x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y13pqrEv,_ZTv0_n20_N3ccc7CC2x4y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y1E[] = {
  {&(_ZTVN3ccc7CC2x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y1E[];
static VTBL_ENTRY alt_thunk_names987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y13pqrEv,_ZTv0_n20_N3ccc7CC2x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y13pqrEv,_ZThn4_N3ccc7CC2x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y13abcEv,_ZTv0_n16_N3ccc7CC2x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y13abcEv,_ZThn4_N3ccc7CC2x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y13efgEv,_ZTv0_n12_N3ccc7CC2x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y13efgEv,_ZThn4_N3ccc7CC2x4y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y1E = {  "_ZN3ccc7CC2x4y1E", // class name
  bases__ZN3ccc7CC2x4y1E, 2,
  &(vtc__ZN3ccc7CC2x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y1E),2, //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  DD2x4y1  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD2x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x4y13efgEv
  ~DD2x4y1(); // tgen
  DD2x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y13abcEv");}
void  ccc::DD2x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y13pqrEv");}
void  ccc::DD2x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y13efgEv");}
ccc::DD2x4y1 ::~DD2x4y1(){ note_dtor("_ZN3ccc7DD2x4y1E", this);} // tgen
ccc::DD2x4y1 ::DD2x4y1(){ note_ctor("_ZN3ccc7DD2x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y1E, buf);
    ::ccc::DD2x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y1E);
    dp->::ccc::DD2x4y1::~DD2x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y1E(Test__ZN3ccc7DD2x4y1E, "_ZN3ccc7DD2x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y1C1Ev();
extern void _ZN3ccc7DD2x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y1E[] = {
  NSPAIR(_ZN3ccc7DD2x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y1E[];
extern void _ZN3ccc7DD2x4y13efgEv();
extern void _ZN3ccc7DD2x4y13abcEv();
extern void _ZN3ccc7DD2x4y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y13pqrEv,_ZTv0_n12_N3ccc7DD2x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y13pqrEv,_ZThn4_N3ccc7DD2x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y13abcEv,_ZTv0_n16_N3ccc7DD2x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y13abcEv,_ZThn4_N3ccc7DD2x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y13efgEv,_ZTv0_n20_N3ccc7DD2x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y13efgEv,_ZThn4_N3ccc7DD2x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y13pqrEv,_ZTv0_n12_N3ccc7DD2x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y13abcEv,_ZTv0_n16_N3ccc7DD2x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y13efgEv,_ZTv0_n20_N3ccc7DD2x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y1E[] = {
  {&(_ZTVN3ccc7DD2x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y1E[];
static VTBL_ENTRY alt_thunk_names988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y13efgEv,_ZTv0_n20_N3ccc7DD2x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y13efgEv,_ZThn4_N3ccc7DD2x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y13abcEv,_ZTv0_n16_N3ccc7DD2x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y13abcEv,_ZThn4_N3ccc7DD2x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y13pqrEv,_ZTv0_n12_N3ccc7DD2x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y13pqrEv,_ZThn4_N3ccc7DD2x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y1E = {  "_ZN3ccc7DD2x4y1E", // class name
  bases__ZN3ccc7DD2x4y1E, 2,
  &(vtc__ZN3ccc7DD2x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y1E),3, //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  CC2x4y2  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y23pqrEv
  ~CC2x4y2(); // tgen
  CC2x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y2E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y23efgEv");}
void  ccc::CC2x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y23abcEv");}
void  ccc::CC2x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y23pqrEv");}
ccc::CC2x4y2 ::~CC2x4y2(){ note_dtor("_ZN3ccc7CC2x4y2E", this);} // tgen
ccc::CC2x4y2 ::CC2x4y2(){ note_ctor("_ZN3ccc7CC2x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y2E, buf);
    ::ccc::CC2x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y2E);
    dp->::ccc::CC2x4y2::~CC2x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y2E(Test__ZN3ccc7CC2x4y2E, "_ZN3ccc7CC2x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y2C1Ev();
extern void _ZN3ccc7CC2x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y2E[] = {
  NSPAIR(_ZN3ccc7CC2x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y2E[];
extern void _ZN3ccc7CC2x4y23pqrEv();
extern void _ZN3ccc7CC2x4y23abcEv();
extern void _ZN3ccc7CC2x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y23efgEv,_ZTv0_n12_N3ccc7CC2x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23efgEv,_ZThn4_N3ccc7CC2x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y23abcEv,_ZTv0_n16_N3ccc7CC2x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23abcEv,_ZThn4_N3ccc7CC2x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y23pqrEv,_ZTv0_n20_N3ccc7CC2x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23pqrEv,_ZThn4_N3ccc7CC2x4y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y23efgEv,_ZTv0_n12_N3ccc7CC2x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y23abcEv,_ZTv0_n16_N3ccc7CC2x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y23pqrEv,_ZTv0_n20_N3ccc7CC2x4y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y2E[] = {
  {&(_ZTVN3ccc7CC2x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y2E[];
static VTBL_ENTRY alt_thunk_names989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y23pqrEv,_ZTv0_n20_N3ccc7CC2x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y23pqrEv,_ZThn4_N3ccc7CC2x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y23abcEv,_ZTv0_n16_N3ccc7CC2x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y23abcEv,_ZThn4_N3ccc7CC2x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y23efgEv,_ZTv0_n12_N3ccc7CC2x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y23efgEv,_ZThn4_N3ccc7CC2x4y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y2E = {  "_ZN3ccc7CC2x4y2E", // class name
  bases__ZN3ccc7CC2x4y2E, 2,
  &(vtc__ZN3ccc7CC2x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y2E),2, //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  DD2x4y2  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD2x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y23pqrEv
  ~DD2x4y2(); // tgen
  DD2x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y23efgEv");}
void  ccc::DD2x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y23abcEv");}
void  ccc::DD2x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y23pqrEv");}
ccc::DD2x4y2 ::~DD2x4y2(){ note_dtor("_ZN3ccc7DD2x4y2E", this);} // tgen
ccc::DD2x4y2 ::DD2x4y2(){ note_ctor("_ZN3ccc7DD2x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y2E, buf);
    ::ccc::DD2x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y2E);
    dp->::ccc::DD2x4y2::~DD2x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y2E(Test__ZN3ccc7DD2x4y2E, "_ZN3ccc7DD2x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y2C1Ev();
extern void _ZN3ccc7DD2x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y2E[] = {
  NSPAIR(_ZN3ccc7DD2x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y2E[];
extern void _ZN3ccc7DD2x4y23efgEv();
extern void _ZN3ccc7DD2x4y23abcEv();
extern void _ZN3ccc7DD2x4y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y23pqrEv,_ZTv0_n12_N3ccc7DD2x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y23pqrEv,_ZThn4_N3ccc7DD2x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y23abcEv,_ZTv0_n16_N3ccc7DD2x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y23abcEv,_ZThn4_N3ccc7DD2x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y23efgEv,_ZTv0_n20_N3ccc7DD2x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y23efgEv,_ZThn4_N3ccc7DD2x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y23pqrEv,_ZTv0_n12_N3ccc7DD2x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y23abcEv,_ZTv0_n16_N3ccc7DD2x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y23efgEv,_ZTv0_n20_N3ccc7DD2x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y2E[] = {
  {&(_ZTVN3ccc7DD2x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y2E[];
static VTBL_ENTRY alt_thunk_names990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y23efgEv,_ZTv0_n20_N3ccc7DD2x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y23efgEv,_ZThn4_N3ccc7DD2x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y23abcEv,_ZTv0_n16_N3ccc7DD2x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y23abcEv,_ZThn4_N3ccc7DD2x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y23pqrEv,_ZTv0_n12_N3ccc7DD2x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y23pqrEv,_ZThn4_N3ccc7DD2x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y2E = {  "_ZN3ccc7DD2x4y2E", // class name
  bases__ZN3ccc7DD2x4y2E, 2,
  &(vtc__ZN3ccc7DD2x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y2E),3, //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  CC2x4y3  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x4y33abcEv
  ~CC2x4y3(); // tgen
  CC2x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y3E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y33efgEv");}
void  ccc::CC2x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y33pqrEv");}
void  ccc::CC2x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y33abcEv");}
ccc::CC2x4y3 ::~CC2x4y3(){ note_dtor("_ZN3ccc7CC2x4y3E", this);} // tgen
ccc::CC2x4y3 ::CC2x4y3(){ note_ctor("_ZN3ccc7CC2x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y3E, buf);
    ::ccc::CC2x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y3E);
    dp->::ccc::CC2x4y3::~CC2x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y3E(Test__ZN3ccc7CC2x4y3E, "_ZN3ccc7CC2x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y3C1Ev();
extern void _ZN3ccc7CC2x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y3E[] = {
  NSPAIR(_ZN3ccc7CC2x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y3E[];
extern void _ZN3ccc7CC2x4y33pqrEv();
extern void _ZN3ccc7CC2x4y33abcEv();
extern void _ZN3ccc7CC2x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y33efgEv,_ZTv0_n12_N3ccc7CC2x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33efgEv,_ZThn4_N3ccc7CC2x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y33abcEv,_ZTv0_n16_N3ccc7CC2x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33abcEv,_ZThn4_N3ccc7CC2x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y33pqrEv,_ZTv0_n20_N3ccc7CC2x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33pqrEv,_ZThn4_N3ccc7CC2x4y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y33efgEv,_ZTv0_n12_N3ccc7CC2x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y33abcEv,_ZTv0_n16_N3ccc7CC2x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y33pqrEv,_ZTv0_n20_N3ccc7CC2x4y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y3E[] = {
  {&(_ZTVN3ccc7CC2x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y3E[];
static VTBL_ENTRY alt_thunk_names991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y33pqrEv,_ZTv0_n20_N3ccc7CC2x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y33pqrEv,_ZThn4_N3ccc7CC2x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y33abcEv,_ZTv0_n16_N3ccc7CC2x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y33abcEv,_ZThn4_N3ccc7CC2x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y33efgEv,_ZTv0_n12_N3ccc7CC2x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y33efgEv,_ZThn4_N3ccc7CC2x4y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y3E = {  "_ZN3ccc7CC2x4y3E", // class name
  bases__ZN3ccc7CC2x4y3E, 2,
  &(vtc__ZN3ccc7CC2x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y3E),2, //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  DD2x4y3  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD2x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x4y33abcEv
  ~DD2x4y3(); // tgen
  DD2x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y33efgEv");}
void  ccc::DD2x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y33pqrEv");}
void  ccc::DD2x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y33abcEv");}
ccc::DD2x4y3 ::~DD2x4y3(){ note_dtor("_ZN3ccc7DD2x4y3E", this);} // tgen
ccc::DD2x4y3 ::DD2x4y3(){ note_ctor("_ZN3ccc7DD2x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y3E, buf);
    ::ccc::DD2x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y3E);
    dp->::ccc::DD2x4y3::~DD2x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y3E(Test__ZN3ccc7DD2x4y3E, "_ZN3ccc7DD2x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y3C1Ev();
extern void _ZN3ccc7DD2x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y3E[] = {
  NSPAIR(_ZN3ccc7DD2x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y3E[];
extern void _ZN3ccc7DD2x4y33efgEv();
extern void _ZN3ccc7DD2x4y33abcEv();
extern void _ZN3ccc7DD2x4y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y33pqrEv,_ZTv0_n12_N3ccc7DD2x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y33pqrEv,_ZThn4_N3ccc7DD2x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y33abcEv,_ZTv0_n16_N3ccc7DD2x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y33abcEv,_ZThn4_N3ccc7DD2x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y33efgEv,_ZTv0_n20_N3ccc7DD2x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y33efgEv,_ZThn4_N3ccc7DD2x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y33pqrEv,_ZTv0_n12_N3ccc7DD2x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y33abcEv,_ZTv0_n16_N3ccc7DD2x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y33efgEv,_ZTv0_n20_N3ccc7DD2x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y3E[] = {
  {&(_ZTVN3ccc7DD2x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y3E[];
static VTBL_ENTRY alt_thunk_names992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y33efgEv,_ZTv0_n20_N3ccc7DD2x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y33efgEv,_ZThn4_N3ccc7DD2x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y33abcEv,_ZTv0_n16_N3ccc7DD2x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y33abcEv,_ZThn4_N3ccc7DD2x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y33pqrEv,_ZTv0_n12_N3ccc7DD2x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y33pqrEv,_ZThn4_N3ccc7DD2x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y3E = {  "_ZN3ccc7DD2x4y3E", // class name
  bases__ZN3ccc7DD2x4y3E, 2,
  &(vtc__ZN3ccc7DD2x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y3E),3, //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  CC2x4y4  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC2x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y43efgEv
  ~CC2x4y4(); // tgen
  CC2x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y4E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y43pqrEv");}
void  ccc::CC2x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y43abcEv");}
void  ccc::CC2x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y43efgEv");}
ccc::CC2x4y4 ::~CC2x4y4(){ note_dtor("_ZN3ccc7CC2x4y4E", this);} // tgen
ccc::CC2x4y4 ::CC2x4y4(){ note_ctor("_ZN3ccc7CC2x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y4E, buf);
    ::ccc::CC2x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y4E);
    dp->::ccc::CC2x4y4::~CC2x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y4E(Test__ZN3ccc7CC2x4y4E, "_ZN3ccc7CC2x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y4C1Ev();
extern void _ZN3ccc7CC2x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y4E[] = {
  NSPAIR(_ZN3ccc7CC2x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y4E[];
extern void _ZN3ccc7CC2x4y43pqrEv();
extern void _ZN3ccc7CC2x4y43abcEv();
extern void _ZN3ccc7CC2x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y43efgEv,_ZTv0_n12_N3ccc7CC2x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43efgEv,_ZThn4_N3ccc7CC2x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y43abcEv,_ZTv0_n16_N3ccc7CC2x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43abcEv,_ZThn4_N3ccc7CC2x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y43pqrEv,_ZTv0_n20_N3ccc7CC2x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43pqrEv,_ZThn4_N3ccc7CC2x4y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y43efgEv,_ZTv0_n12_N3ccc7CC2x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y43abcEv,_ZTv0_n16_N3ccc7CC2x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y43pqrEv,_ZTv0_n20_N3ccc7CC2x4y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y4E[] = {
  {&(_ZTVN3ccc7CC2x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y4E[];
static VTBL_ENTRY alt_thunk_names993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y43pqrEv,_ZTv0_n20_N3ccc7CC2x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y43pqrEv,_ZThn4_N3ccc7CC2x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y43abcEv,_ZTv0_n16_N3ccc7CC2x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y43abcEv,_ZThn4_N3ccc7CC2x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y43efgEv,_ZTv0_n12_N3ccc7CC2x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y43efgEv,_ZThn4_N3ccc7CC2x4y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y4E = {  "_ZN3ccc7CC2x4y4E", // class name
  bases__ZN3ccc7CC2x4y4E, 2,
  &(vtc__ZN3ccc7CC2x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y4E),2, //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  DD2x4y4  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD2x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x4y43efgEv
  ~DD2x4y4(); // tgen
  DD2x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y43pqrEv");}
void  ccc::DD2x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y43abcEv");}
void  ccc::DD2x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y43efgEv");}
ccc::DD2x4y4 ::~DD2x4y4(){ note_dtor("_ZN3ccc7DD2x4y4E", this);} // tgen
ccc::DD2x4y4 ::DD2x4y4(){ note_ctor("_ZN3ccc7DD2x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y4E, buf);
    ::ccc::DD2x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y4E);
    dp->::ccc::DD2x4y4::~DD2x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y4E(Test__ZN3ccc7DD2x4y4E, "_ZN3ccc7DD2x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y4C1Ev();
extern void _ZN3ccc7DD2x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y4E[] = {
  NSPAIR(_ZN3ccc7DD2x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y4E[];
extern void _ZN3ccc7DD2x4y43efgEv();
extern void _ZN3ccc7DD2x4y43abcEv();
extern void _ZN3ccc7DD2x4y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y43pqrEv,_ZTv0_n12_N3ccc7DD2x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y43pqrEv,_ZThn4_N3ccc7DD2x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y43abcEv,_ZTv0_n16_N3ccc7DD2x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y43abcEv,_ZThn4_N3ccc7DD2x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y43efgEv,_ZTv0_n20_N3ccc7DD2x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y43efgEv,_ZThn4_N3ccc7DD2x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y43pqrEv,_ZTv0_n12_N3ccc7DD2x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y43abcEv,_ZTv0_n16_N3ccc7DD2x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y43efgEv,_ZTv0_n20_N3ccc7DD2x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y4E[] = {
  {&(_ZTVN3ccc7DD2x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y4E[];
static VTBL_ENTRY alt_thunk_names994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y43efgEv,_ZTv0_n20_N3ccc7DD2x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y43efgEv,_ZThn4_N3ccc7DD2x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y43abcEv,_ZTv0_n16_N3ccc7DD2x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y43abcEv,_ZThn4_N3ccc7DD2x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y43pqrEv,_ZTv0_n12_N3ccc7DD2x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y43pqrEv,_ZThn4_N3ccc7DD2x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y4E = {  "_ZN3ccc7DD2x4y4E", // class name
  bases__ZN3ccc7DD2x4y4E, 2,
  &(vtc__ZN3ccc7DD2x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y4E),3, //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  CC2x4y5  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC2x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y53abcEv
  ~CC2x4y5(); // tgen
  CC2x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y5E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y53pqrEv");}
void  ccc::CC2x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y53efgEv");}
void  ccc::CC2x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y53abcEv");}
ccc::CC2x4y5 ::~CC2x4y5(){ note_dtor("_ZN3ccc7CC2x4y5E", this);} // tgen
ccc::CC2x4y5 ::CC2x4y5(){ note_ctor("_ZN3ccc7CC2x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y5E, buf);
    ::ccc::CC2x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y5E);
    dp->::ccc::CC2x4y5::~CC2x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y5E(Test__ZN3ccc7CC2x4y5E, "_ZN3ccc7CC2x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y5C1Ev();
extern void _ZN3ccc7CC2x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y5E[] = {
  NSPAIR(_ZN3ccc7CC2x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y5E[];
extern void _ZN3ccc7CC2x4y53pqrEv();
extern void _ZN3ccc7CC2x4y53abcEv();
extern void _ZN3ccc7CC2x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y53efgEv,_ZTv0_n12_N3ccc7CC2x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53efgEv,_ZThn4_N3ccc7CC2x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y53abcEv,_ZTv0_n16_N3ccc7CC2x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53abcEv,_ZThn4_N3ccc7CC2x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y53pqrEv,_ZTv0_n20_N3ccc7CC2x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53pqrEv,_ZThn4_N3ccc7CC2x4y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y53efgEv,_ZTv0_n12_N3ccc7CC2x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y53abcEv,_ZTv0_n16_N3ccc7CC2x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y53pqrEv,_ZTv0_n20_N3ccc7CC2x4y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y5E[] = {
  {&(_ZTVN3ccc7CC2x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y5E[];
static VTBL_ENTRY alt_thunk_names995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y53pqrEv,_ZTv0_n20_N3ccc7CC2x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y53pqrEv,_ZThn4_N3ccc7CC2x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y53abcEv,_ZTv0_n16_N3ccc7CC2x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y53abcEv,_ZThn4_N3ccc7CC2x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y53efgEv,_ZTv0_n12_N3ccc7CC2x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y53efgEv,_ZThn4_N3ccc7CC2x4y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y5E = {  "_ZN3ccc7CC2x4y5E", // class name
  bases__ZN3ccc7CC2x4y5E, 2,
  &(vtc__ZN3ccc7CC2x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y5E),2, //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  DD2x4y5  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD2x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x4y53abcEv
  ~DD2x4y5(); // tgen
  DD2x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y53pqrEv");}
void  ccc::DD2x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y53efgEv");}
void  ccc::DD2x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y53abcEv");}
ccc::DD2x4y5 ::~DD2x4y5(){ note_dtor("_ZN3ccc7DD2x4y5E", this);} // tgen
ccc::DD2x4y5 ::DD2x4y5(){ note_ctor("_ZN3ccc7DD2x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y5E, buf);
    ::ccc::DD2x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y5E);
    dp->::ccc::DD2x4y5::~DD2x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y5E(Test__ZN3ccc7DD2x4y5E, "_ZN3ccc7DD2x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y5C1Ev();
extern void _ZN3ccc7DD2x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y5E[] = {
  NSPAIR(_ZN3ccc7DD2x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y5E[];
extern void _ZN3ccc7DD2x4y53efgEv();
extern void _ZN3ccc7DD2x4y53abcEv();
extern void _ZN3ccc7DD2x4y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y53pqrEv,_ZTv0_n12_N3ccc7DD2x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y53pqrEv,_ZThn4_N3ccc7DD2x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y53abcEv,_ZTv0_n16_N3ccc7DD2x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y53abcEv,_ZThn4_N3ccc7DD2x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y53efgEv,_ZTv0_n20_N3ccc7DD2x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y53efgEv,_ZThn4_N3ccc7DD2x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y53pqrEv,_ZTv0_n12_N3ccc7DD2x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y53abcEv,_ZTv0_n16_N3ccc7DD2x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y53efgEv,_ZTv0_n20_N3ccc7DD2x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y5E[] = {
  {&(_ZTVN3ccc7DD2x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y5E[];
static VTBL_ENTRY alt_thunk_names996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y53efgEv,_ZTv0_n20_N3ccc7DD2x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y53efgEv,_ZThn4_N3ccc7DD2x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y53abcEv,_ZTv0_n16_N3ccc7DD2x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y53abcEv,_ZThn4_N3ccc7DD2x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y53pqrEv,_ZTv0_n12_N3ccc7DD2x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y53pqrEv,_ZThn4_N3ccc7DD2x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y5E = {  "_ZN3ccc7DD2x4y5E", // class name
  bases__ZN3ccc7DD2x4y5E, 2,
  &(vtc__ZN3ccc7DD2x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y5E),3, //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  CC2x4y6  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y63efgEv
  ~CC2x4y6(); // tgen
  CC2x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y6E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y63abcEv");}
void  ccc::CC2x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y63efgEv");}
ccc::CC2x4y6 ::~CC2x4y6(){ note_dtor("_ZN3ccc7CC2x4y6E", this);} // tgen
ccc::CC2x4y6 ::CC2x4y6(){ note_ctor("_ZN3ccc7CC2x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y6E, buf);
    ::ccc::CC2x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y6E);
    dp->::ccc::CC2x4y6::~CC2x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y6E(Test__ZN3ccc7CC2x4y6E, "_ZN3ccc7CC2x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y6C1Ev();
extern void _ZN3ccc7CC2x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y6E[] = {
  NSPAIR(_ZN3ccc7CC2x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC2x4y63abcEv();
extern void _ZN3ccc7CC2x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y63efgEv,_ZTv0_n12_N3ccc7CC2x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y63efgEv,_ZThn4_N3ccc7CC2x4y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y63abcEv,_ZTv0_n16_N3ccc7CC2x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y63abcEv,_ZThn4_N3ccc7CC2x4y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y63efgEv,_ZTv0_n12_N3ccc7CC2x4y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y63abcEv,_ZTv0_n16_N3ccc7CC2x4y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y6E[] = {
  {&(_ZTVN3ccc7CC2x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y6E[];
static VTBL_ENTRY alt_thunk_names997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y63abcEv,_ZTv0_n16_N3ccc7CC2x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y63abcEv,_ZThn4_N3ccc7CC2x4y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y63efgEv,_ZTv0_n12_N3ccc7CC2x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y63efgEv,_ZThn4_N3ccc7CC2x4y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y6E = {  "_ZN3ccc7CC2x4y6E", // class name
  bases__ZN3ccc7CC2x4y6E, 2,
  &(vtc__ZN3ccc7CC2x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y6E),2, //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  DD2x4y6  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD2x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x4y63efgEv
  ~DD2x4y6(); // tgen
  DD2x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y63abcEv");}
void  ccc::DD2x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y63efgEv");}
ccc::DD2x4y6 ::~DD2x4y6(){ note_dtor("_ZN3ccc7DD2x4y6E", this);} // tgen
ccc::DD2x4y6 ::DD2x4y6(){ note_ctor("_ZN3ccc7DD2x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y6E, buf);
    ::ccc::DD2x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y6E);
    dp->::ccc::DD2x4y6::~DD2x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y6E(Test__ZN3ccc7DD2x4y6E, "_ZN3ccc7DD2x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y6C1Ev();
extern void _ZN3ccc7DD2x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y6E[] = {
  NSPAIR(_ZN3ccc7DD2x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y6E[];
extern void _ZN3ccc7DD2x4y63efgEv();
extern void _ZN3ccc7DD2x4y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y63abcEv,_ZTv0_n16_N3ccc7DD2x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y63abcEv,_ZThn4_N3ccc7DD2x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y63efgEv,_ZTv0_n20_N3ccc7DD2x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y63efgEv,_ZThn4_N3ccc7DD2x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y63abcEv,_ZTv0_n16_N3ccc7DD2x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y63efgEv,_ZTv0_n20_N3ccc7DD2x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y6E[] = {
  {&(_ZTVN3ccc7DD2x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y6E[];
static VTBL_ENTRY alt_thunk_names998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y63efgEv,_ZTv0_n20_N3ccc7DD2x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y63efgEv,_ZThn4_N3ccc7DD2x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y63abcEv,_ZTv0_n16_N3ccc7DD2x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y63abcEv,_ZThn4_N3ccc7DD2x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y6E = {  "_ZN3ccc7DD2x4y6E", // class name
  bases__ZN3ccc7DD2x4y6E, 2,
  &(vtc__ZN3ccc7DD2x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y6E),3, //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  CC2x4y7  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y73pqrEv
  ~CC2x4y7(); // tgen
  CC2x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y7E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y73abcEv");}
void  ccc::CC2x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y73pqrEv");}
ccc::CC2x4y7 ::~CC2x4y7(){ note_dtor("_ZN3ccc7CC2x4y7E", this);} // tgen
ccc::CC2x4y7 ::CC2x4y7(){ note_ctor("_ZN3ccc7CC2x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y7E, buf);
    ::ccc::CC2x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y7E);
    dp->::ccc::CC2x4y7::~CC2x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y7E(Test__ZN3ccc7CC2x4y7E, "_ZN3ccc7CC2x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y7C1Ev();
extern void _ZN3ccc7CC2x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y7E[] = {
  NSPAIR(_ZN3ccc7CC2x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y7E[];
extern void _ZN3ccc7CC2x4y73pqrEv();
extern void _ZN3ccc7CC2x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y73abcEv,_ZTv0_n16_N3ccc7CC2x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y73abcEv,_ZThn4_N3ccc7CC2x4y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y73pqrEv,_ZTv0_n20_N3ccc7CC2x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y73pqrEv,_ZThn4_N3ccc7CC2x4y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y73abcEv,_ZTv0_n16_N3ccc7CC2x4y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y73pqrEv,_ZTv0_n20_N3ccc7CC2x4y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y7E[] = {
  {&(_ZTVN3ccc7CC2x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y7E[];
static VTBL_ENTRY alt_thunk_names999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y73pqrEv,_ZTv0_n20_N3ccc7CC2x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y73pqrEv,_ZThn4_N3ccc7CC2x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y73abcEv,_ZTv0_n16_N3ccc7CC2x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y73abcEv,_ZThn4_N3ccc7CC2x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y7E = {  "_ZN3ccc7CC2x4y7E", // class name
  bases__ZN3ccc7CC2x4y7E, 2,
  &(vtc__ZN3ccc7CC2x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y7E),2, //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  DD2x4y7  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD2x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y73pqrEv
  ~DD2x4y7(); // tgen
  DD2x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y73abcEv");}
void  ccc::DD2x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y73pqrEv");}
ccc::DD2x4y7 ::~DD2x4y7(){ note_dtor("_ZN3ccc7DD2x4y7E", this);} // tgen
ccc::DD2x4y7 ::DD2x4y7(){ note_ctor("_ZN3ccc7DD2x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y7E, buf);
    ::ccc::DD2x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y7E);
    dp->::ccc::DD2x4y7::~DD2x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y7E(Test__ZN3ccc7DD2x4y7E, "_ZN3ccc7DD2x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y7C1Ev();
extern void _ZN3ccc7DD2x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y7E[] = {
  NSPAIR(_ZN3ccc7DD2x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x4y73abcEv();
extern void _ZN3ccc7DD2x4y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y73pqrEv,_ZTv0_n12_N3ccc7DD2x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y73pqrEv,_ZThn4_N3ccc7DD2x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y73abcEv,_ZTv0_n16_N3ccc7DD2x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y73abcEv,_ZThn4_N3ccc7DD2x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y73pqrEv,_ZTv0_n12_N3ccc7DD2x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y73abcEv,_ZTv0_n16_N3ccc7DD2x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y7E[] = {
  {&(_ZTVN3ccc7DD2x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y7E[];
static VTBL_ENTRY alt_thunk_names1000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y73abcEv,_ZTv0_n16_N3ccc7DD2x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y73abcEv,_ZThn4_N3ccc7DD2x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y73pqrEv,_ZTv0_n12_N3ccc7DD2x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y73pqrEv,_ZThn4_N3ccc7DD2x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y7E = {  "_ZN3ccc7DD2x4y7E", // class name
  bases__ZN3ccc7DD2x4y7E, 2,
  &(vtc__ZN3ccc7DD2x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y7E),3, //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  CC2x4y8  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y83abcEv
  ~CC2x4y8(); // tgen
  CC2x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y8E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y83efgEv");}
void  ccc::CC2x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y83abcEv");}
ccc::CC2x4y8 ::~CC2x4y8(){ note_dtor("_ZN3ccc7CC2x4y8E", this);} // tgen
ccc::CC2x4y8 ::CC2x4y8(){ note_ctor("_ZN3ccc7CC2x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y8E, buf);
    ::ccc::CC2x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y8E);
    dp->::ccc::CC2x4y8::~CC2x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y8E(Test__ZN3ccc7CC2x4y8E, "_ZN3ccc7CC2x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y8C1Ev();
extern void _ZN3ccc7CC2x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y8E[] = {
  NSPAIR(_ZN3ccc7CC2x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC2x4y83abcEv();
extern void _ZN3ccc7CC2x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y83efgEv,_ZTv0_n12_N3ccc7CC2x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y83efgEv,_ZThn4_N3ccc7CC2x4y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x4y83abcEv,_ZTv0_n16_N3ccc7CC2x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y83abcEv,_ZThn4_N3ccc7CC2x4y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y83efgEv,_ZTv0_n12_N3ccc7CC2x4y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x4y83abcEv,_ZTv0_n16_N3ccc7CC2x4y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y8E[] = {
  {&(_ZTVN3ccc7CC2x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y8E[];
static VTBL_ENTRY alt_thunk_names1001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x4y83abcEv,_ZTv0_n16_N3ccc7CC2x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y83abcEv,_ZThn4_N3ccc7CC2x4y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y83efgEv,_ZTv0_n12_N3ccc7CC2x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y83efgEv,_ZThn4_N3ccc7CC2x4y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y8E = {  "_ZN3ccc7CC2x4y8E", // class name
  bases__ZN3ccc7CC2x4y8E, 2,
  &(vtc__ZN3ccc7CC2x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y8E),2, //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  DD2x4y8  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD2x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x4y83abcEv
  ~DD2x4y8(); // tgen
  DD2x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y83efgEv");}
void  ccc::DD2x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x4y83abcEv");}
ccc::DD2x4y8 ::~DD2x4y8(){ note_dtor("_ZN3ccc7DD2x4y8E", this);} // tgen
ccc::DD2x4y8 ::DD2x4y8(){ note_ctor("_ZN3ccc7DD2x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y8E, buf);
    ::ccc::DD2x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y8E);
    dp->::ccc::DD2x4y8::~DD2x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y8E(Test__ZN3ccc7DD2x4y8E, "_ZN3ccc7DD2x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y8C1Ev();
extern void _ZN3ccc7DD2x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y8E[] = {
  NSPAIR(_ZN3ccc7DD2x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y8E[];
extern void _ZN3ccc7DD2x4y83efgEv();
extern void _ZN3ccc7DD2x4y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x4y83abcEv,_ZTv0_n16_N3ccc7DD2x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y83abcEv,_ZThn4_N3ccc7DD2x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y83efgEv,_ZTv0_n20_N3ccc7DD2x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y83efgEv,_ZThn4_N3ccc7DD2x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x4y83abcEv,_ZTv0_n16_N3ccc7DD2x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y83efgEv,_ZTv0_n20_N3ccc7DD2x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y8E[] = {
  {&(_ZTVN3ccc7DD2x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y8E[];
static VTBL_ENTRY alt_thunk_names1002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y83efgEv,_ZTv0_n20_N3ccc7DD2x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y83efgEv,_ZThn4_N3ccc7DD2x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x4y83abcEv,_ZTv0_n16_N3ccc7DD2x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y83abcEv,_ZThn4_N3ccc7DD2x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y8E = {  "_ZN3ccc7DD2x4y8E", // class name
  bases__ZN3ccc7DD2x4y8E, 2,
  &(vtc__ZN3ccc7DD2x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y8E),3, //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  CC2x4y9  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y93pqrEv
  ~CC2x4y9(); // tgen
  CC2x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y9E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y93efgEv");}
void  ccc::CC2x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y93pqrEv");}
ccc::CC2x4y9 ::~CC2x4y9(){ note_dtor("_ZN3ccc7CC2x4y9E", this);} // tgen
ccc::CC2x4y9 ::CC2x4y9(){ note_ctor("_ZN3ccc7CC2x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y9E, buf);
    ::ccc::CC2x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC2x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y9E);
    dp->::ccc::CC2x4y9::~CC2x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y9E(Test__ZN3ccc7CC2x4y9E, "_ZN3ccc7CC2x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y9C1Ev();
extern void _ZN3ccc7CC2x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y9E[] = {
  NSPAIR(_ZN3ccc7CC2x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y9E[];
extern void _ZN3ccc7CC2x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC2x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x4y93efgEv,_ZTv0_n12_N3ccc7CC2x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y93efgEv,_ZThn4_N3ccc7CC2x4y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x4y93pqrEv,_ZTv0_n20_N3ccc7CC2x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y93pqrEv,_ZThn4_N3ccc7CC2x4y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x4y93efgEv,_ZTv0_n12_N3ccc7CC2x4y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x4y93pqrEv,_ZTv0_n20_N3ccc7CC2x4y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x4y9E[] = {
  {&(_ZTVN3ccc7CC2x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x4y9E[];
static VTBL_ENTRY alt_thunk_names1003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x4y93pqrEv,_ZTv0_n20_N3ccc7CC2x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y93pqrEv,_ZThn4_N3ccc7CC2x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x4y93efgEv,_ZTv0_n12_N3ccc7CC2x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x4y93efgEv,_ZThn4_N3ccc7CC2x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x4y9E = {  "_ZN3ccc7CC2x4y9E", // class name
  bases__ZN3ccc7CC2x4y9E, 2,
  &(vtc__ZN3ccc7CC2x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x4y9E),2, //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  DD2x4y9  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD2x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x4y93pqrEv
  ~DD2x4y9(); // tgen
  DD2x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x4y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x4y93efgEv");}
void  ccc::DD2x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x4y93pqrEv");}
ccc::DD2x4y9 ::~DD2x4y9(){ note_dtor("_ZN3ccc7DD2x4y9E", this);} // tgen
ccc::DD2x4y9 ::DD2x4y9(){ note_ctor("_ZN3ccc7DD2x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x4y9E, buf);
    ::ccc::DD2x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x4y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD2x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x4y9E);
    dp->::ccc::DD2x4y9::~DD2x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x4y9E(Test__ZN3ccc7DD2x4y9E, "_ZN3ccc7DD2x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x4y9C1Ev();
extern void _ZN3ccc7DD2x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x4y9E[] = {
  NSPAIR(_ZN3ccc7DD2x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD2x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y9E[];
extern void _ZN3ccc7DD2x4y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x4y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x4y93pqrEv,_ZTv0_n12_N3ccc7DD2x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y93pqrEv,_ZThn4_N3ccc7DD2x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x4y93efgEv,_ZTv0_n20_N3ccc7DD2x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x4y93efgEv,_ZThn4_N3ccc7DD2x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x4y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x4y93pqrEv,_ZTv0_n12_N3ccc7DD2x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x4y93efgEv,_ZTv0_n20_N3ccc7DD2x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x4y9E[] = {
  {&(_ZTVN3ccc7DD2x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x4y9E[];
static VTBL_ENTRY alt_thunk_names1004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x4y93efgEv,_ZTv0_n20_N3ccc7DD2x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y93efgEv,_ZThn4_N3ccc7DD2x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x4y93pqrEv,_ZTv0_n12_N3ccc7DD2x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x4y93pqrEv,_ZThn4_N3ccc7DD2x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x4y9E = {  "_ZN3ccc7DD2x4y9E", // class name
  bases__ZN3ccc7DD2x4y9E, 2,
  &(vtc__ZN3ccc7DD2x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x4y9E),3, //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  CC2x4y10  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x4y103abcEv
  ~CC2x4y10(); // tgen
  CC2x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y10E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y103pqrEv");}
void  ccc::CC2x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x4y103abcEv");}
ccc::CC2x4y10 ::~CC2x4y10(){ note_dtor("_ZN3ccc8CC2x4y10E", this);} // tgen
ccc::CC2x4y10 ::CC2x4y10(){ note_ctor("_ZN3ccc8CC2x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y10E, buf);
    ::ccc::CC2x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y10E);
    dp->::ccc::CC2x4y10::~CC2x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y10E(Test__ZN3ccc8CC2x4y10E, "_ZN3ccc8CC2x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y10C1Ev();
extern void _ZN3ccc8CC2x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y10E[] = {
  NSPAIR(_ZN3ccc8CC2x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y10E[];
extern void _ZN3ccc8CC2x4y103pqrEv();
extern void _ZN3ccc8CC2x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x4y103abcEv,_ZTv0_n16_N3ccc8CC2x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y103abcEv,_ZThn4_N3ccc8CC2x4y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x4y103pqrEv,_ZTv0_n20_N3ccc8CC2x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y103pqrEv,_ZThn4_N3ccc8CC2x4y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x4y103abcEv,_ZTv0_n16_N3ccc8CC2x4y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x4y103pqrEv,_ZTv0_n20_N3ccc8CC2x4y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y10E[] = {
  {&(_ZTVN3ccc8CC2x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y10E[];
static VTBL_ENTRY alt_thunk_names1005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x4y103pqrEv,_ZTv0_n20_N3ccc8CC2x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y103pqrEv,_ZThn4_N3ccc8CC2x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x4y103abcEv,_ZTv0_n16_N3ccc8CC2x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y103abcEv,_ZThn4_N3ccc8CC2x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x4y10E = {  "_ZN3ccc8CC2x4y10E", // class name
  bases__ZN3ccc8CC2x4y10E, 2,
  &(vtc__ZN3ccc8CC2x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y10E),2, //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  DD2x4y10  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD2x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x4y103abcEv
  ~DD2x4y10(); // tgen
  DD2x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x4y103pqrEv");}
void  ccc::DD2x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x4y103abcEv");}
ccc::DD2x4y10 ::~DD2x4y10(){ note_dtor("_ZN3ccc8DD2x4y10E", this);} // tgen
ccc::DD2x4y10 ::DD2x4y10(){ note_ctor("_ZN3ccc8DD2x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y10E, buf);
    ::ccc::DD2x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y10E);
    dp->::ccc::DD2x4y10::~DD2x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y10E(Test__ZN3ccc8DD2x4y10E, "_ZN3ccc8DD2x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y10C1Ev();
extern void _ZN3ccc8DD2x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y10E[] = {
  NSPAIR(_ZN3ccc8DD2x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x4y103abcEv();
extern void _ZN3ccc8DD2x4y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x4y103pqrEv,_ZTv0_n12_N3ccc8DD2x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y103pqrEv,_ZThn4_N3ccc8DD2x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x4y103abcEv,_ZTv0_n16_N3ccc8DD2x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y103abcEv,_ZThn4_N3ccc8DD2x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x4y103pqrEv,_ZTv0_n12_N3ccc8DD2x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x4y103abcEv,_ZTv0_n16_N3ccc8DD2x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y10E[] = {
  {&(_ZTVN3ccc8DD2x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y10E[];
static VTBL_ENTRY alt_thunk_names1006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x4y103abcEv,_ZTv0_n16_N3ccc8DD2x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y103abcEv,_ZThn4_N3ccc8DD2x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x4y103pqrEv,_ZTv0_n12_N3ccc8DD2x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y103pqrEv,_ZThn4_N3ccc8DD2x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x4y10E = {  "_ZN3ccc8DD2x4y10E", // class name
  bases__ZN3ccc8DD2x4y10E, 2,
  &(vtc__ZN3ccc8DD2x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y10E),3, //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  CC2x4y11  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x4y113efgEv
  ~CC2x4y11(); // tgen
  CC2x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y11E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y113pqrEv");}
void  ccc::CC2x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x4y113efgEv");}
ccc::CC2x4y11 ::~CC2x4y11(){ note_dtor("_ZN3ccc8CC2x4y11E", this);} // tgen
ccc::CC2x4y11 ::CC2x4y11(){ note_ctor("_ZN3ccc8CC2x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y11E, buf);
    ::ccc::CC2x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y11E);
    dp->::ccc::CC2x4y11::~CC2x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y11E(Test__ZN3ccc8CC2x4y11E, "_ZN3ccc8CC2x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y11C1Ev();
extern void _ZN3ccc8CC2x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y11E[] = {
  NSPAIR(_ZN3ccc8CC2x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y11E[];
extern void _ZN3ccc8CC2x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC2x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x4y113efgEv,_ZTv0_n12_N3ccc8CC2x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y113efgEv,_ZThn4_N3ccc8CC2x4y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x4y113pqrEv,_ZTv0_n20_N3ccc8CC2x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y113pqrEv,_ZThn4_N3ccc8CC2x4y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x4y113efgEv,_ZTv0_n12_N3ccc8CC2x4y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x4y113pqrEv,_ZTv0_n20_N3ccc8CC2x4y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y11E[] = {
  {&(_ZTVN3ccc8CC2x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y11E[];
static VTBL_ENTRY alt_thunk_names1007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x4y113pqrEv,_ZTv0_n20_N3ccc8CC2x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y113pqrEv,_ZThn4_N3ccc8CC2x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x4y113efgEv,_ZTv0_n12_N3ccc8CC2x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y113efgEv,_ZThn4_N3ccc8CC2x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x4y11E = {  "_ZN3ccc8CC2x4y11E", // class name
  bases__ZN3ccc8CC2x4y11E, 2,
  &(vtc__ZN3ccc8CC2x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y11E),2, //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  DD2x4y11  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD2x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x4y113efgEv
  ~DD2x4y11(); // tgen
  DD2x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x4y113pqrEv");}
void  ccc::DD2x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x4y113efgEv");}
ccc::DD2x4y11 ::~DD2x4y11(){ note_dtor("_ZN3ccc8DD2x4y11E", this);} // tgen
ccc::DD2x4y11 ::DD2x4y11(){ note_ctor("_ZN3ccc8DD2x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y11E, buf);
    ::ccc::DD2x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y11E);
    dp->::ccc::DD2x4y11::~DD2x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y11E(Test__ZN3ccc8DD2x4y11E, "_ZN3ccc8DD2x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y11C1Ev();
extern void _ZN3ccc8DD2x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y11E[] = {
  NSPAIR(_ZN3ccc8DD2x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y11E[];
extern void _ZN3ccc8DD2x4y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x4y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x4y113pqrEv,_ZTv0_n12_N3ccc8DD2x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y113pqrEv,_ZThn4_N3ccc8DD2x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x4y113efgEv,_ZTv0_n20_N3ccc8DD2x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y113efgEv,_ZThn4_N3ccc8DD2x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x4y113pqrEv,_ZTv0_n12_N3ccc8DD2x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x4y113efgEv,_ZTv0_n20_N3ccc8DD2x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y11E[] = {
  {&(_ZTVN3ccc8DD2x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y11E[];
static VTBL_ENTRY alt_thunk_names1008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x4y113efgEv,_ZTv0_n20_N3ccc8DD2x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y113efgEv,_ZThn4_N3ccc8DD2x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x4y113pqrEv,_ZTv0_n12_N3ccc8DD2x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y113pqrEv,_ZThn4_N3ccc8DD2x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x4y11E = {  "_ZN3ccc8DD2x4y11E", // class name
  bases__ZN3ccc8DD2x4y11E, 2,
  &(vtc__ZN3ccc8DD2x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y11E),3, //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  CC2x4y12  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC2x4y123abcEv
  ~CC2x4y12(); // tgen
  CC2x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x4y123abcEv");}
ccc::CC2x4y12 ::~CC2x4y12(){ note_dtor("_ZN3ccc8CC2x4y12E", this);} // tgen
ccc::CC2x4y12 ::CC2x4y12(){ note_ctor("_ZN3ccc8CC2x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y12E, buf);
    ::ccc::CC2x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y12E);
    dp->::ccc::CC2x4y12::~CC2x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y12E(Test__ZN3ccc8CC2x4y12E, "_ZN3ccc8CC2x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y12C1Ev();
extern void _ZN3ccc8CC2x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y12E[] = {
  NSPAIR(_ZN3ccc8CC2x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC2x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x4y123abcEv,_ZTv0_n16_N3ccc8CC2x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y123abcEv,_ZThn4_N3ccc8CC2x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x4y123abcEv,_ZTv0_n16_N3ccc8CC2x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y12E[] = {
  {&(_ZTVN3ccc8CC2x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y12E[];
static VTBL_ENTRY alt_thunk_names1009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x4y123abcEv,_ZTv0_n16_N3ccc8CC2x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y123abcEv,_ZThn4_N3ccc8CC2x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x4y12E = {  "_ZN3ccc8CC2x4y12E", // class name
  bases__ZN3ccc8CC2x4y12E, 2,
  &(vtc__ZN3ccc8CC2x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y12E),2, //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  DD2x4y12  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD2x4y123abcEv
  ~DD2x4y12(); // tgen
  DD2x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x4y123abcEv");}
ccc::DD2x4y12 ::~DD2x4y12(){ note_dtor("_ZN3ccc8DD2x4y12E", this);} // tgen
ccc::DD2x4y12 ::DD2x4y12(){ note_ctor("_ZN3ccc8DD2x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y12E, buf);
    ::ccc::DD2x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y12E);
    dp->::ccc::DD2x4y12::~DD2x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y12E(Test__ZN3ccc8DD2x4y12E, "_ZN3ccc8DD2x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y12C1Ev();
extern void _ZN3ccc8DD2x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y12E[] = {
  NSPAIR(_ZN3ccc8DD2x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x4y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x4y123abcEv,_ZTv0_n16_N3ccc8DD2x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y123abcEv,_ZThn4_N3ccc8DD2x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x4y123abcEv,_ZTv0_n16_N3ccc8DD2x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y12E[] = {
  {&(_ZTVN3ccc8DD2x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y12E[];
static VTBL_ENTRY alt_thunk_names1010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x4y123abcEv,_ZTv0_n16_N3ccc8DD2x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y123abcEv,_ZThn4_N3ccc8DD2x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x4y12E = {  "_ZN3ccc8DD2x4y12E", // class name
  bases__ZN3ccc8DD2x4y12E, 2,
  &(vtc__ZN3ccc8DD2x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y12E),3, //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  CC2x4y13  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC2x4y133efgEv
  ~CC2x4y13(); // tgen
  CC2x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x4y133efgEv");}
ccc::CC2x4y13 ::~CC2x4y13(){ note_dtor("_ZN3ccc8CC2x4y13E", this);} // tgen
ccc::CC2x4y13 ::CC2x4y13(){ note_ctor("_ZN3ccc8CC2x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y13E, buf);
    ::ccc::CC2x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y13E);
    dp->::ccc::CC2x4y13::~CC2x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y13E(Test__ZN3ccc8CC2x4y13E, "_ZN3ccc8CC2x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y13C1Ev();
extern void _ZN3ccc8CC2x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y13E[] = {
  NSPAIR(_ZN3ccc8CC2x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC2x4y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x4y133efgEv,_ZTv0_n12_N3ccc8CC2x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y133efgEv,_ZThn4_N3ccc8CC2x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x4y133efgEv,_ZTv0_n12_N3ccc8CC2x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y13E[] = {
  {&(_ZTVN3ccc8CC2x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y13E[];
static VTBL_ENTRY alt_thunk_names1011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x4y133efgEv,_ZTv0_n12_N3ccc8CC2x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y133efgEv,_ZThn4_N3ccc8CC2x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x4y13E = {  "_ZN3ccc8CC2x4y13E", // class name
  bases__ZN3ccc8CC2x4y13E, 2,
  &(vtc__ZN3ccc8CC2x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y13E),2, //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  DD2x4y13  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD2x4y133efgEv
  ~DD2x4y13(); // tgen
  DD2x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x4y133efgEv");}
ccc::DD2x4y13 ::~DD2x4y13(){ note_dtor("_ZN3ccc8DD2x4y13E", this);} // tgen
ccc::DD2x4y13 ::DD2x4y13(){ note_ctor("_ZN3ccc8DD2x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y13E, buf);
    ::ccc::DD2x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y13E);
    dp->::ccc::DD2x4y13::~DD2x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y13E(Test__ZN3ccc8DD2x4y13E, "_ZN3ccc8DD2x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y13C1Ev();
extern void _ZN3ccc8DD2x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y13E[] = {
  NSPAIR(_ZN3ccc8DD2x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y13E[];
extern void _ZN3ccc8DD2x4y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x4y133efgEv,_ZTv0_n20_N3ccc8DD2x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y133efgEv,_ZThn4_N3ccc8DD2x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x4y133efgEv,_ZTv0_n20_N3ccc8DD2x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y13E[] = {
  {&(_ZTVN3ccc8DD2x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y13E[];
static VTBL_ENTRY alt_thunk_names1012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x4y133efgEv,_ZTv0_n20_N3ccc8DD2x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y133efgEv,_ZThn4_N3ccc8DD2x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x4y13E = {  "_ZN3ccc8DD2x4y13E", // class name
  bases__ZN3ccc8DD2x4y13E, 2,
  &(vtc__ZN3ccc8DD2x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y13E),3, //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  CC2x4y14  : virtual ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y143pqrEv
  ~CC2x4y14(); // tgen
  CC2x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y143pqrEv");}
ccc::CC2x4y14 ::~CC2x4y14(){ note_dtor("_ZN3ccc8CC2x4y14E", this);} // tgen
ccc::CC2x4y14 ::CC2x4y14(){ note_ctor("_ZN3ccc8CC2x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y14E, buf);
    ::ccc::CC2x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y14E);
    dp->::ccc::CC2x4y14::~CC2x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y14E(Test__ZN3ccc8CC2x4y14E, "_ZN3ccc8CC2x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y14C1Ev();
extern void _ZN3ccc8CC2x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y14E[] = {
  NSPAIR(_ZN3ccc8CC2x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y14E[];
extern void _ZN3ccc8CC2x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x4y143pqrEv,_ZTv0_n20_N3ccc8CC2x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y143pqrEv,_ZThn4_N3ccc8CC2x4y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x4y143pqrEv,_ZTv0_n20_N3ccc8CC2x4y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y14E[] = {
  {&(_ZTVN3ccc8CC2x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y14E[];
static VTBL_ENTRY alt_thunk_names1013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x4y143pqrEv,_ZTv0_n20_N3ccc8CC2x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x4y143pqrEv,_ZThn4_N3ccc8CC2x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x4y14E = {  "_ZN3ccc8CC2x4y14E", // class name
  bases__ZN3ccc8CC2x4y14E, 2,
  &(vtc__ZN3ccc8CC2x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y14E),2, //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  DD2x4y14  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD2x4y143pqrEv
  ~DD2x4y14(); // tgen
  DD2x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x4y143pqrEv");}
ccc::DD2x4y14 ::~DD2x4y14(){ note_dtor("_ZN3ccc8DD2x4y14E", this);} // tgen
ccc::DD2x4y14 ::DD2x4y14(){ note_ctor("_ZN3ccc8DD2x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y14E, buf);
    ::ccc::DD2x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y14E);
    dp->::ccc::DD2x4y14::~DD2x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y14E(Test__ZN3ccc8DD2x4y14E, "_ZN3ccc8DD2x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y14C1Ev();
extern void _ZN3ccc8DD2x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y14E[] = {
  NSPAIR(_ZN3ccc8DD2x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x4y143pqrEv,_ZTv0_n12_N3ccc8DD2x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x4y143pqrEv,_ZThn4_N3ccc8DD2x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x4y143pqrEv,_ZTv0_n12_N3ccc8DD2x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y14E[] = {
  {&(_ZTVN3ccc8DD2x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y14E[];
static VTBL_ENTRY alt_thunk_names1014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x4y143pqrEv,_ZTv0_n12_N3ccc8DD2x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x4y143pqrEv,_ZThn4_N3ccc8DD2x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x4y14E = {  "_ZN3ccc8DD2x4y14E", // class name
  bases__ZN3ccc8DD2x4y14E, 2,
  &(vtc__ZN3ccc8DD2x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y14E),3, //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  CC2x4y15  : virtual ::ccc::AA2 , ::ccc::BB4 {
  ~CC2x4y15(); // tgen
  CC2x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x4y15 ::~CC2x4y15(){ note_dtor("_ZN3ccc8CC2x4y15E", this);} // tgen
ccc::CC2x4y15 ::CC2x4y15(){ note_ctor("_ZN3ccc8CC2x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y15E, buf);
    ::ccc::CC2x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC2x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y15E);
    dp->::ccc::CC2x4y15::~CC2x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y15E(Test__ZN3ccc8CC2x4y15E, "_ZN3ccc8CC2x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y15C1Ev();
extern void _ZN3ccc8CC2x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y15E[] = {
  NSPAIR(_ZN3ccc8CC2x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x4y15E[] = {
  {&(_ZTVN3ccc8CC2x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x4y15E[];
Class_Descriptor cd__ZN3ccc8CC2x4y15E = {  "_ZN3ccc8CC2x4y15E", // class name
  bases__ZN3ccc8CC2x4y15E, 2,
  &(vtc__ZN3ccc8CC2x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x4y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x4y15  : virtual ::ccc::AA2 , virtual ::ccc::BB4 {
  ~DD2x4y15(); // tgen
  DD2x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x4y15 ::~DD2x4y15(){ note_dtor("_ZN3ccc8DD2x4y15E", this);} // tgen
ccc::DD2x4y15 ::DD2x4y15(){ note_ctor("_ZN3ccc8DD2x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x4y15E, buf);
    ::ccc::DD2x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x4y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD2x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x4y15E);
    dp->::ccc::DD2x4y15::~DD2x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x4y15E(Test__ZN3ccc8DD2x4y15E, "_ZN3ccc8DD2x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x4y15C1Ev();
extern void _ZN3ccc8DD2x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x4y15E[] = {
  NSPAIR(_ZN3ccc8DD2x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD2x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x4y15E[] = {
  {&(_ZTVN3ccc8DD2x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x4y15E[];
Class_Descriptor cd__ZN3ccc8DD2x4y15E = {  "_ZN3ccc8DD2x4y15E", // class name
  bases__ZN3ccc8DD2x4y15E, 2,
  &(vtc__ZN3ccc8DD2x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x4y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y0  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y03pqrEv
  ~CC2x5y0(); // tgen
  CC2x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y0E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y03abcEv");}
void  ccc::CC2x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y03efgEv");}
void  ccc::CC2x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y03pqrEv");}
ccc::CC2x5y0 ::~CC2x5y0(){ note_dtor("_ZN3ccc7CC2x5y0E", this);} // tgen
ccc::CC2x5y0 ::CC2x5y0(){ note_ctor("_ZN3ccc7CC2x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y0E, buf);
    ::ccc::CC2x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y0E);
    dp->::ccc::CC2x5y0::~CC2x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y0E(Test__ZN3ccc7CC2x5y0E, "_ZN3ccc7CC2x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y0C1Ev();
extern void _ZN3ccc7CC2x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y0E[] = {
  NSPAIR(_ZN3ccc7CC2x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y0E[];
extern void _ZN3ccc7CC2x5y03pqrEv();
extern void _ZN3ccc7CC2x5y03efgEv();
extern void _ZN3ccc7CC2x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y03efgEv,_ZTv0_n12_N3ccc7CC2x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03efgEv,_ZThn4_N3ccc7CC2x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y03abcEv,_ZTv0_n16_N3ccc7CC2x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03abcEv,_ZThn4_N3ccc7CC2x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y03pqrEv,_ZTv0_n20_N3ccc7CC2x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03pqrEv,_ZThn4_N3ccc7CC2x5y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y03efgEv,_ZTv0_n12_N3ccc7CC2x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y03abcEv,_ZTv0_n16_N3ccc7CC2x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y03pqrEv,_ZTv0_n20_N3ccc7CC2x5y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y0E[] = {
  {&(_ZTVN3ccc7CC2x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y0E[];
static VTBL_ENTRY alt_thunk_names1015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y03pqrEv,_ZTv0_n20_N3ccc7CC2x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y03pqrEv,_ZThn4_N3ccc7CC2x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y03abcEv,_ZTv0_n16_N3ccc7CC2x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y03abcEv,_ZThn4_N3ccc7CC2x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y03efgEv,_ZTv0_n12_N3ccc7CC2x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y03efgEv,_ZThn4_N3ccc7CC2x5y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y0E = {  "_ZN3ccc7CC2x5y0E", // class name
  bases__ZN3ccc7CC2x5y0E, 2,
  &(vtc__ZN3ccc7CC2x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y0E),2, //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  DD2x5y0  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD2x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y03pqrEv
  ~DD2x5y0(); // tgen
  DD2x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y03abcEv");}
void  ccc::DD2x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y03efgEv");}
void  ccc::DD2x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y03pqrEv");}
ccc::DD2x5y0 ::~DD2x5y0(){ note_dtor("_ZN3ccc7DD2x5y0E", this);} // tgen
ccc::DD2x5y0 ::DD2x5y0(){ note_ctor("_ZN3ccc7DD2x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y0E, buf);
    ::ccc::DD2x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y0E);
    dp->::ccc::DD2x5y0::~DD2x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y0E(Test__ZN3ccc7DD2x5y0E, "_ZN3ccc7DD2x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y0C1Ev();
extern void _ZN3ccc7DD2x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y0E[] = {
  NSPAIR(_ZN3ccc7DD2x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y0E[];
extern void _ZN3ccc7DD2x5y03efgEv();
extern void _ZN3ccc7DD2x5y03abcEv();
extern void _ZN3ccc7DD2x5y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y03pqrEv,_ZTv0_n12_N3ccc7DD2x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y03pqrEv,_ZThn4_N3ccc7DD2x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y03efgEv,_ZTv0_n16_N3ccc7DD2x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y03efgEv,_ZThn4_N3ccc7DD2x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y03abcEv,_ZTv0_n20_N3ccc7DD2x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y03abcEv,_ZThn4_N3ccc7DD2x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y03pqrEv,_ZTv0_n12_N3ccc7DD2x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y03efgEv,_ZTv0_n16_N3ccc7DD2x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y03abcEv,_ZTv0_n20_N3ccc7DD2x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y0E[] = {
  {&(_ZTVN3ccc7DD2x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y0E[];
static VTBL_ENTRY alt_thunk_names1016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y03abcEv,_ZTv0_n20_N3ccc7DD2x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y03abcEv,_ZThn4_N3ccc7DD2x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y03efgEv,_ZTv0_n16_N3ccc7DD2x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y03efgEv,_ZThn4_N3ccc7DD2x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y03pqrEv,_ZTv0_n12_N3ccc7DD2x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y03pqrEv,_ZThn4_N3ccc7DD2x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y0E = {  "_ZN3ccc7DD2x5y0E", // class name
  bases__ZN3ccc7DD2x5y0E, 2,
  &(vtc__ZN3ccc7DD2x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y0E),3, //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  CC2x5y1  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x5y13efgEv
  ~CC2x5y1(); // tgen
  CC2x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y1E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y13abcEv");}
void  ccc::CC2x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y13pqrEv");}
void  ccc::CC2x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y13efgEv");}
ccc::CC2x5y1 ::~CC2x5y1(){ note_dtor("_ZN3ccc7CC2x5y1E", this);} // tgen
ccc::CC2x5y1 ::CC2x5y1(){ note_ctor("_ZN3ccc7CC2x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y1E, buf);
    ::ccc::CC2x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y1E);
    dp->::ccc::CC2x5y1::~CC2x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y1E(Test__ZN3ccc7CC2x5y1E, "_ZN3ccc7CC2x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y1C1Ev();
extern void _ZN3ccc7CC2x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y1E[] = {
  NSPAIR(_ZN3ccc7CC2x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y1E[];
extern void _ZN3ccc7CC2x5y13pqrEv();
extern void _ZN3ccc7CC2x5y13efgEv();
extern void _ZN3ccc7CC2x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y13efgEv,_ZTv0_n12_N3ccc7CC2x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13efgEv,_ZThn4_N3ccc7CC2x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y13abcEv,_ZTv0_n16_N3ccc7CC2x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13abcEv,_ZThn4_N3ccc7CC2x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y13pqrEv,_ZTv0_n20_N3ccc7CC2x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13pqrEv,_ZThn4_N3ccc7CC2x5y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y13efgEv,_ZTv0_n12_N3ccc7CC2x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y13abcEv,_ZTv0_n16_N3ccc7CC2x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y13pqrEv,_ZTv0_n20_N3ccc7CC2x5y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y1E[] = {
  {&(_ZTVN3ccc7CC2x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y1E[];
static VTBL_ENTRY alt_thunk_names1017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y13pqrEv,_ZTv0_n20_N3ccc7CC2x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y13pqrEv,_ZThn4_N3ccc7CC2x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y13abcEv,_ZTv0_n16_N3ccc7CC2x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y13abcEv,_ZThn4_N3ccc7CC2x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y13efgEv,_ZTv0_n12_N3ccc7CC2x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y13efgEv,_ZThn4_N3ccc7CC2x5y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y1E = {  "_ZN3ccc7CC2x5y1E", // class name
  bases__ZN3ccc7CC2x5y1E, 2,
  &(vtc__ZN3ccc7CC2x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y1E),2, //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  DD2x5y1  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD2x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x5y13efgEv
  ~DD2x5y1(); // tgen
  DD2x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y13abcEv");}
void  ccc::DD2x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y13pqrEv");}
void  ccc::DD2x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y13efgEv");}
ccc::DD2x5y1 ::~DD2x5y1(){ note_dtor("_ZN3ccc7DD2x5y1E", this);} // tgen
ccc::DD2x5y1 ::DD2x5y1(){ note_ctor("_ZN3ccc7DD2x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y1E, buf);
    ::ccc::DD2x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y1E);
    dp->::ccc::DD2x5y1::~DD2x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y1E(Test__ZN3ccc7DD2x5y1E, "_ZN3ccc7DD2x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y1C1Ev();
extern void _ZN3ccc7DD2x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y1E[] = {
  NSPAIR(_ZN3ccc7DD2x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y1E[];
extern void _ZN3ccc7DD2x5y13efgEv();
extern void _ZN3ccc7DD2x5y13abcEv();
extern void _ZN3ccc7DD2x5y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y13pqrEv,_ZTv0_n12_N3ccc7DD2x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y13pqrEv,_ZThn4_N3ccc7DD2x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y13efgEv,_ZTv0_n16_N3ccc7DD2x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y13efgEv,_ZThn4_N3ccc7DD2x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y13abcEv,_ZTv0_n20_N3ccc7DD2x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y13abcEv,_ZThn4_N3ccc7DD2x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y13pqrEv,_ZTv0_n12_N3ccc7DD2x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y13efgEv,_ZTv0_n16_N3ccc7DD2x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y13abcEv,_ZTv0_n20_N3ccc7DD2x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y1E[] = {
  {&(_ZTVN3ccc7DD2x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y1E[];
static VTBL_ENTRY alt_thunk_names1018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y13abcEv,_ZTv0_n20_N3ccc7DD2x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y13abcEv,_ZThn4_N3ccc7DD2x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y13efgEv,_ZTv0_n16_N3ccc7DD2x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y13efgEv,_ZThn4_N3ccc7DD2x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y13pqrEv,_ZTv0_n12_N3ccc7DD2x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y13pqrEv,_ZThn4_N3ccc7DD2x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y1E = {  "_ZN3ccc7DD2x5y1E", // class name
  bases__ZN3ccc7DD2x5y1E, 2,
  &(vtc__ZN3ccc7DD2x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y1E),3, //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  CC2x5y2  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y23pqrEv
  ~CC2x5y2(); // tgen
  CC2x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y2E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y23efgEv");}
void  ccc::CC2x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y23abcEv");}
void  ccc::CC2x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y23pqrEv");}
ccc::CC2x5y2 ::~CC2x5y2(){ note_dtor("_ZN3ccc7CC2x5y2E", this);} // tgen
ccc::CC2x5y2 ::CC2x5y2(){ note_ctor("_ZN3ccc7CC2x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y2E, buf);
    ::ccc::CC2x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y2E);
    dp->::ccc::CC2x5y2::~CC2x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y2E(Test__ZN3ccc7CC2x5y2E, "_ZN3ccc7CC2x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y2C1Ev();
extern void _ZN3ccc7CC2x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y2E[] = {
  NSPAIR(_ZN3ccc7CC2x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y2E[];
extern void _ZN3ccc7CC2x5y23pqrEv();
extern void _ZN3ccc7CC2x5y23efgEv();
extern void _ZN3ccc7CC2x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y23efgEv,_ZTv0_n12_N3ccc7CC2x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23efgEv,_ZThn4_N3ccc7CC2x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y23abcEv,_ZTv0_n16_N3ccc7CC2x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23abcEv,_ZThn4_N3ccc7CC2x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y23pqrEv,_ZTv0_n20_N3ccc7CC2x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23pqrEv,_ZThn4_N3ccc7CC2x5y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y23efgEv,_ZTv0_n12_N3ccc7CC2x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y23abcEv,_ZTv0_n16_N3ccc7CC2x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y23pqrEv,_ZTv0_n20_N3ccc7CC2x5y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y2E[] = {
  {&(_ZTVN3ccc7CC2x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y2E[];
static VTBL_ENTRY alt_thunk_names1019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y23pqrEv,_ZTv0_n20_N3ccc7CC2x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y23pqrEv,_ZThn4_N3ccc7CC2x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y23abcEv,_ZTv0_n16_N3ccc7CC2x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y23abcEv,_ZThn4_N3ccc7CC2x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y23efgEv,_ZTv0_n12_N3ccc7CC2x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y23efgEv,_ZThn4_N3ccc7CC2x5y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y2E = {  "_ZN3ccc7CC2x5y2E", // class name
  bases__ZN3ccc7CC2x5y2E, 2,
  &(vtc__ZN3ccc7CC2x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y2E),2, //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  DD2x5y2  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD2x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y23pqrEv
  ~DD2x5y2(); // tgen
  DD2x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y23efgEv");}
void  ccc::DD2x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y23abcEv");}
void  ccc::DD2x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y23pqrEv");}
ccc::DD2x5y2 ::~DD2x5y2(){ note_dtor("_ZN3ccc7DD2x5y2E", this);} // tgen
ccc::DD2x5y2 ::DD2x5y2(){ note_ctor("_ZN3ccc7DD2x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y2E, buf);
    ::ccc::DD2x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y2E);
    dp->::ccc::DD2x5y2::~DD2x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y2E(Test__ZN3ccc7DD2x5y2E, "_ZN3ccc7DD2x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y2C1Ev();
extern void _ZN3ccc7DD2x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y2E[] = {
  NSPAIR(_ZN3ccc7DD2x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y2E[];
extern void _ZN3ccc7DD2x5y23efgEv();
extern void _ZN3ccc7DD2x5y23abcEv();
extern void _ZN3ccc7DD2x5y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y23pqrEv,_ZTv0_n12_N3ccc7DD2x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y23pqrEv,_ZThn4_N3ccc7DD2x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y23efgEv,_ZTv0_n16_N3ccc7DD2x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y23efgEv,_ZThn4_N3ccc7DD2x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y23abcEv,_ZTv0_n20_N3ccc7DD2x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y23abcEv,_ZThn4_N3ccc7DD2x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y23pqrEv,_ZTv0_n12_N3ccc7DD2x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y23efgEv,_ZTv0_n16_N3ccc7DD2x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y23abcEv,_ZTv0_n20_N3ccc7DD2x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y2E[] = {
  {&(_ZTVN3ccc7DD2x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y2E[];
static VTBL_ENTRY alt_thunk_names1020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y23abcEv,_ZTv0_n20_N3ccc7DD2x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y23abcEv,_ZThn4_N3ccc7DD2x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y23efgEv,_ZTv0_n16_N3ccc7DD2x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y23efgEv,_ZThn4_N3ccc7DD2x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y23pqrEv,_ZTv0_n12_N3ccc7DD2x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y23pqrEv,_ZThn4_N3ccc7DD2x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y2E = {  "_ZN3ccc7DD2x5y2E", // class name
  bases__ZN3ccc7DD2x5y2E, 2,
  &(vtc__ZN3ccc7DD2x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y2E),3, //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  CC2x5y3  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x5y33abcEv
  ~CC2x5y3(); // tgen
  CC2x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y3E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y33efgEv");}
void  ccc::CC2x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y33pqrEv");}
void  ccc::CC2x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y33abcEv");}
ccc::CC2x5y3 ::~CC2x5y3(){ note_dtor("_ZN3ccc7CC2x5y3E", this);} // tgen
ccc::CC2x5y3 ::CC2x5y3(){ note_ctor("_ZN3ccc7CC2x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y3E, buf);
    ::ccc::CC2x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y3E);
    dp->::ccc::CC2x5y3::~CC2x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y3E(Test__ZN3ccc7CC2x5y3E, "_ZN3ccc7CC2x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y3C1Ev();
extern void _ZN3ccc7CC2x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y3E[] = {
  NSPAIR(_ZN3ccc7CC2x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y3E[];
extern void _ZN3ccc7CC2x5y33pqrEv();
extern void _ZN3ccc7CC2x5y33efgEv();
extern void _ZN3ccc7CC2x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y33efgEv,_ZTv0_n12_N3ccc7CC2x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33efgEv,_ZThn4_N3ccc7CC2x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y33abcEv,_ZTv0_n16_N3ccc7CC2x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33abcEv,_ZThn4_N3ccc7CC2x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y33pqrEv,_ZTv0_n20_N3ccc7CC2x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33pqrEv,_ZThn4_N3ccc7CC2x5y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y33efgEv,_ZTv0_n12_N3ccc7CC2x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y33abcEv,_ZTv0_n16_N3ccc7CC2x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y33pqrEv,_ZTv0_n20_N3ccc7CC2x5y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y3E[] = {
  {&(_ZTVN3ccc7CC2x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y3E[];
static VTBL_ENTRY alt_thunk_names1021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y33pqrEv,_ZTv0_n20_N3ccc7CC2x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y33pqrEv,_ZThn4_N3ccc7CC2x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y33abcEv,_ZTv0_n16_N3ccc7CC2x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y33abcEv,_ZThn4_N3ccc7CC2x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y33efgEv,_ZTv0_n12_N3ccc7CC2x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y33efgEv,_ZThn4_N3ccc7CC2x5y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y3E = {  "_ZN3ccc7CC2x5y3E", // class name
  bases__ZN3ccc7CC2x5y3E, 2,
  &(vtc__ZN3ccc7CC2x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y3E),2, //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  DD2x5y3  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD2x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x5y33abcEv
  ~DD2x5y3(); // tgen
  DD2x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y33efgEv");}
void  ccc::DD2x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y33pqrEv");}
void  ccc::DD2x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y33abcEv");}
ccc::DD2x5y3 ::~DD2x5y3(){ note_dtor("_ZN3ccc7DD2x5y3E", this);} // tgen
ccc::DD2x5y3 ::DD2x5y3(){ note_ctor("_ZN3ccc7DD2x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y3E, buf);
    ::ccc::DD2x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y3E);
    dp->::ccc::DD2x5y3::~DD2x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y3E(Test__ZN3ccc7DD2x5y3E, "_ZN3ccc7DD2x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y3C1Ev();
extern void _ZN3ccc7DD2x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y3E[] = {
  NSPAIR(_ZN3ccc7DD2x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y3E[];
extern void _ZN3ccc7DD2x5y33efgEv();
extern void _ZN3ccc7DD2x5y33abcEv();
extern void _ZN3ccc7DD2x5y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y33pqrEv,_ZTv0_n12_N3ccc7DD2x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y33pqrEv,_ZThn4_N3ccc7DD2x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y33efgEv,_ZTv0_n16_N3ccc7DD2x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y33efgEv,_ZThn4_N3ccc7DD2x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y33abcEv,_ZTv0_n20_N3ccc7DD2x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y33abcEv,_ZThn4_N3ccc7DD2x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y33pqrEv,_ZTv0_n12_N3ccc7DD2x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y33efgEv,_ZTv0_n16_N3ccc7DD2x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y33abcEv,_ZTv0_n20_N3ccc7DD2x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y3E[] = {
  {&(_ZTVN3ccc7DD2x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y3E[];
static VTBL_ENTRY alt_thunk_names1022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y33abcEv,_ZTv0_n20_N3ccc7DD2x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y33abcEv,_ZThn4_N3ccc7DD2x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y33efgEv,_ZTv0_n16_N3ccc7DD2x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y33efgEv,_ZThn4_N3ccc7DD2x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y33pqrEv,_ZTv0_n12_N3ccc7DD2x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y33pqrEv,_ZThn4_N3ccc7DD2x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y3E = {  "_ZN3ccc7DD2x5y3E", // class name
  bases__ZN3ccc7DD2x5y3E, 2,
  &(vtc__ZN3ccc7DD2x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y3E),3, //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  CC2x5y4  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC2x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y43efgEv
  ~CC2x5y4(); // tgen
  CC2x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y4E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y43pqrEv");}
void  ccc::CC2x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y43abcEv");}
void  ccc::CC2x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y43efgEv");}
ccc::CC2x5y4 ::~CC2x5y4(){ note_dtor("_ZN3ccc7CC2x5y4E", this);} // tgen
ccc::CC2x5y4 ::CC2x5y4(){ note_ctor("_ZN3ccc7CC2x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y4E, buf);
    ::ccc::CC2x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y4E);
    dp->::ccc::CC2x5y4::~CC2x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y4E(Test__ZN3ccc7CC2x5y4E, "_ZN3ccc7CC2x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y4C1Ev();
extern void _ZN3ccc7CC2x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y4E[] = {
  NSPAIR(_ZN3ccc7CC2x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y4E[];
extern void _ZN3ccc7CC2x5y43pqrEv();
extern void _ZN3ccc7CC2x5y43efgEv();
extern void _ZN3ccc7CC2x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y43efgEv,_ZTv0_n12_N3ccc7CC2x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43efgEv,_ZThn4_N3ccc7CC2x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y43abcEv,_ZTv0_n16_N3ccc7CC2x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43abcEv,_ZThn4_N3ccc7CC2x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y43pqrEv,_ZTv0_n20_N3ccc7CC2x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43pqrEv,_ZThn4_N3ccc7CC2x5y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y43efgEv,_ZTv0_n12_N3ccc7CC2x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y43abcEv,_ZTv0_n16_N3ccc7CC2x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y43pqrEv,_ZTv0_n20_N3ccc7CC2x5y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y4E[] = {
  {&(_ZTVN3ccc7CC2x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y4E[];
static VTBL_ENTRY alt_thunk_names1023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y43pqrEv,_ZTv0_n20_N3ccc7CC2x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y43pqrEv,_ZThn4_N3ccc7CC2x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y43abcEv,_ZTv0_n16_N3ccc7CC2x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y43abcEv,_ZThn4_N3ccc7CC2x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y43efgEv,_ZTv0_n12_N3ccc7CC2x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y43efgEv,_ZThn4_N3ccc7CC2x5y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y4E = {  "_ZN3ccc7CC2x5y4E", // class name
  bases__ZN3ccc7CC2x5y4E, 2,
  &(vtc__ZN3ccc7CC2x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y4E),2, //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  DD2x5y4  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD2x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x5y43efgEv
  ~DD2x5y4(); // tgen
  DD2x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y43pqrEv");}
void  ccc::DD2x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y43abcEv");}
void  ccc::DD2x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y43efgEv");}
ccc::DD2x5y4 ::~DD2x5y4(){ note_dtor("_ZN3ccc7DD2x5y4E", this);} // tgen
ccc::DD2x5y4 ::DD2x5y4(){ note_ctor("_ZN3ccc7DD2x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y4E, buf);
    ::ccc::DD2x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y4E);
    dp->::ccc::DD2x5y4::~DD2x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y4E(Test__ZN3ccc7DD2x5y4E, "_ZN3ccc7DD2x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y4C1Ev();
extern void _ZN3ccc7DD2x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y4E[] = {
  NSPAIR(_ZN3ccc7DD2x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y4E[];
extern void _ZN3ccc7DD2x5y43efgEv();
extern void _ZN3ccc7DD2x5y43abcEv();
extern void _ZN3ccc7DD2x5y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y43pqrEv,_ZTv0_n12_N3ccc7DD2x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y43pqrEv,_ZThn4_N3ccc7DD2x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y43efgEv,_ZTv0_n16_N3ccc7DD2x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y43efgEv,_ZThn4_N3ccc7DD2x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y43abcEv,_ZTv0_n20_N3ccc7DD2x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y43abcEv,_ZThn4_N3ccc7DD2x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y43pqrEv,_ZTv0_n12_N3ccc7DD2x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y43efgEv,_ZTv0_n16_N3ccc7DD2x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y43abcEv,_ZTv0_n20_N3ccc7DD2x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y4E[] = {
  {&(_ZTVN3ccc7DD2x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y4E[];
static VTBL_ENTRY alt_thunk_names1024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y43abcEv,_ZTv0_n20_N3ccc7DD2x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y43abcEv,_ZThn4_N3ccc7DD2x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y43efgEv,_ZTv0_n16_N3ccc7DD2x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y43efgEv,_ZThn4_N3ccc7DD2x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y43pqrEv,_ZTv0_n12_N3ccc7DD2x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y43pqrEv,_ZThn4_N3ccc7DD2x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y4E = {  "_ZN3ccc7DD2x5y4E", // class name
  bases__ZN3ccc7DD2x5y4E, 2,
  &(vtc__ZN3ccc7DD2x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y4E),3, //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  CC2x5y5  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC2x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y53abcEv
  ~CC2x5y5(); // tgen
  CC2x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y5E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y53pqrEv");}
void  ccc::CC2x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y53efgEv");}
void  ccc::CC2x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y53abcEv");}
ccc::CC2x5y5 ::~CC2x5y5(){ note_dtor("_ZN3ccc7CC2x5y5E", this);} // tgen
ccc::CC2x5y5 ::CC2x5y5(){ note_ctor("_ZN3ccc7CC2x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y5E, buf);
    ::ccc::CC2x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y5E);
    dp->::ccc::CC2x5y5::~CC2x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y5E(Test__ZN3ccc7CC2x5y5E, "_ZN3ccc7CC2x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y5C1Ev();
extern void _ZN3ccc7CC2x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y5E[] = {
  NSPAIR(_ZN3ccc7CC2x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y5E[];
extern void _ZN3ccc7CC2x5y53pqrEv();
extern void _ZN3ccc7CC2x5y53efgEv();
extern void _ZN3ccc7CC2x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y53efgEv,_ZTv0_n12_N3ccc7CC2x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53efgEv,_ZThn4_N3ccc7CC2x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y53abcEv,_ZTv0_n16_N3ccc7CC2x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53abcEv,_ZThn4_N3ccc7CC2x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y53pqrEv,_ZTv0_n20_N3ccc7CC2x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53pqrEv,_ZThn4_N3ccc7CC2x5y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y53efgEv,_ZTv0_n12_N3ccc7CC2x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y53abcEv,_ZTv0_n16_N3ccc7CC2x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y53pqrEv,_ZTv0_n20_N3ccc7CC2x5y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y5E[] = {
  {&(_ZTVN3ccc7CC2x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y5E[];
static VTBL_ENTRY alt_thunk_names1025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y53pqrEv,_ZTv0_n20_N3ccc7CC2x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y53pqrEv,_ZThn4_N3ccc7CC2x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y53abcEv,_ZTv0_n16_N3ccc7CC2x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y53abcEv,_ZThn4_N3ccc7CC2x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y53efgEv,_ZTv0_n12_N3ccc7CC2x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y53efgEv,_ZThn4_N3ccc7CC2x5y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y5E = {  "_ZN3ccc7CC2x5y5E", // class name
  bases__ZN3ccc7CC2x5y5E, 2,
  &(vtc__ZN3ccc7CC2x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y5E),2, //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  DD2x5y5  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD2x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x5y53abcEv
  ~DD2x5y5(); // tgen
  DD2x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y53pqrEv");}
void  ccc::DD2x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y53efgEv");}
void  ccc::DD2x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y53abcEv");}
ccc::DD2x5y5 ::~DD2x5y5(){ note_dtor("_ZN3ccc7DD2x5y5E", this);} // tgen
ccc::DD2x5y5 ::DD2x5y5(){ note_ctor("_ZN3ccc7DD2x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y5E, buf);
    ::ccc::DD2x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y5E);
    dp->::ccc::DD2x5y5::~DD2x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y5E(Test__ZN3ccc7DD2x5y5E, "_ZN3ccc7DD2x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y5C1Ev();
extern void _ZN3ccc7DD2x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y5E[] = {
  NSPAIR(_ZN3ccc7DD2x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y5E[];
extern void _ZN3ccc7DD2x5y53efgEv();
extern void _ZN3ccc7DD2x5y53abcEv();
extern void _ZN3ccc7DD2x5y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y53pqrEv,_ZTv0_n12_N3ccc7DD2x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y53pqrEv,_ZThn4_N3ccc7DD2x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y53efgEv,_ZTv0_n16_N3ccc7DD2x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y53efgEv,_ZThn4_N3ccc7DD2x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y53abcEv,_ZTv0_n20_N3ccc7DD2x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y53abcEv,_ZThn4_N3ccc7DD2x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y53pqrEv,_ZTv0_n12_N3ccc7DD2x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y53efgEv,_ZTv0_n16_N3ccc7DD2x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y53abcEv,_ZTv0_n20_N3ccc7DD2x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y5E[] = {
  {&(_ZTVN3ccc7DD2x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y5E[];
static VTBL_ENTRY alt_thunk_names1026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y53abcEv,_ZTv0_n20_N3ccc7DD2x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y53abcEv,_ZThn4_N3ccc7DD2x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y53efgEv,_ZTv0_n16_N3ccc7DD2x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y53efgEv,_ZThn4_N3ccc7DD2x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y53pqrEv,_ZTv0_n12_N3ccc7DD2x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y53pqrEv,_ZThn4_N3ccc7DD2x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y5E = {  "_ZN3ccc7DD2x5y5E", // class name
  bases__ZN3ccc7DD2x5y5E, 2,
  &(vtc__ZN3ccc7DD2x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y5E),3, //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  CC2x5y6  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y63efgEv
  ~CC2x5y6(); // tgen
  CC2x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y6E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y63abcEv");}
void  ccc::CC2x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y63efgEv");}
ccc::CC2x5y6 ::~CC2x5y6(){ note_dtor("_ZN3ccc7CC2x5y6E", this);} // tgen
ccc::CC2x5y6 ::CC2x5y6(){ note_ctor("_ZN3ccc7CC2x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y6E, buf);
    ::ccc::CC2x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y6E);
    dp->::ccc::CC2x5y6::~CC2x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y6E(Test__ZN3ccc7CC2x5y6E, "_ZN3ccc7CC2x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y6C1Ev();
extern void _ZN3ccc7CC2x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y6E[] = {
  NSPAIR(_ZN3ccc7CC2x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC2x5y63efgEv();
extern void _ZN3ccc7CC2x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y63efgEv,_ZTv0_n12_N3ccc7CC2x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y63efgEv,_ZThn4_N3ccc7CC2x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y63abcEv,_ZTv0_n16_N3ccc7CC2x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y63abcEv,_ZThn4_N3ccc7CC2x5y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y63efgEv,_ZTv0_n12_N3ccc7CC2x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y63abcEv,_ZTv0_n16_N3ccc7CC2x5y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y6E[] = {
  {&(_ZTVN3ccc7CC2x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y6E[];
static VTBL_ENTRY alt_thunk_names1027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y63abcEv,_ZTv0_n16_N3ccc7CC2x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y63abcEv,_ZThn4_N3ccc7CC2x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y63efgEv,_ZTv0_n12_N3ccc7CC2x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y63efgEv,_ZThn4_N3ccc7CC2x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y6E = {  "_ZN3ccc7CC2x5y6E", // class name
  bases__ZN3ccc7CC2x5y6E, 2,
  &(vtc__ZN3ccc7CC2x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y6E),2, //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  DD2x5y6  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD2x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x5y63efgEv
  ~DD2x5y6(); // tgen
  DD2x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y63abcEv");}
void  ccc::DD2x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y63efgEv");}
ccc::DD2x5y6 ::~DD2x5y6(){ note_dtor("_ZN3ccc7DD2x5y6E", this);} // tgen
ccc::DD2x5y6 ::DD2x5y6(){ note_ctor("_ZN3ccc7DD2x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y6E, buf);
    ::ccc::DD2x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y6E);
    dp->::ccc::DD2x5y6::~DD2x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y6E(Test__ZN3ccc7DD2x5y6E, "_ZN3ccc7DD2x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y6C1Ev();
extern void _ZN3ccc7DD2x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y6E[] = {
  NSPAIR(_ZN3ccc7DD2x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y6E[];
extern void _ZN3ccc7DD2x5y63efgEv();
extern void _ZN3ccc7DD2x5y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y63efgEv,_ZTv0_n16_N3ccc7DD2x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y63efgEv,_ZThn4_N3ccc7DD2x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y63abcEv,_ZTv0_n20_N3ccc7DD2x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y63abcEv,_ZThn4_N3ccc7DD2x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y63efgEv,_ZTv0_n16_N3ccc7DD2x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y63abcEv,_ZTv0_n20_N3ccc7DD2x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y6E[] = {
  {&(_ZTVN3ccc7DD2x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y6E[];
static VTBL_ENTRY alt_thunk_names1028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y63abcEv,_ZTv0_n20_N3ccc7DD2x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y63abcEv,_ZThn4_N3ccc7DD2x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y63efgEv,_ZTv0_n16_N3ccc7DD2x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y63efgEv,_ZThn4_N3ccc7DD2x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y6E = {  "_ZN3ccc7DD2x5y6E", // class name
  bases__ZN3ccc7DD2x5y6E, 2,
  &(vtc__ZN3ccc7DD2x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y6E),3, //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  CC2x5y7  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y73pqrEv
  ~CC2x5y7(); // tgen
  CC2x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y7E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y73abcEv");}
void  ccc::CC2x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y73pqrEv");}
ccc::CC2x5y7 ::~CC2x5y7(){ note_dtor("_ZN3ccc7CC2x5y7E", this);} // tgen
ccc::CC2x5y7 ::CC2x5y7(){ note_ctor("_ZN3ccc7CC2x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y7E, buf);
    ::ccc::CC2x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y7E);
    dp->::ccc::CC2x5y7::~CC2x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y7E(Test__ZN3ccc7CC2x5y7E, "_ZN3ccc7CC2x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y7C1Ev();
extern void _ZN3ccc7CC2x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y7E[] = {
  NSPAIR(_ZN3ccc7CC2x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y7E[];
extern void _ZN3ccc7CC2x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC2x5y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y73abcEv,_ZTv0_n16_N3ccc7CC2x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y73abcEv,_ZThn4_N3ccc7CC2x5y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y73pqrEv,_ZTv0_n20_N3ccc7CC2x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y73pqrEv,_ZThn4_N3ccc7CC2x5y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y73abcEv,_ZTv0_n16_N3ccc7CC2x5y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y73pqrEv,_ZTv0_n20_N3ccc7CC2x5y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y7E[] = {
  {&(_ZTVN3ccc7CC2x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y7E[];
static VTBL_ENTRY alt_thunk_names1029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y73pqrEv,_ZTv0_n20_N3ccc7CC2x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y73pqrEv,_ZThn4_N3ccc7CC2x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y73abcEv,_ZTv0_n16_N3ccc7CC2x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y73abcEv,_ZThn4_N3ccc7CC2x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y7E = {  "_ZN3ccc7CC2x5y7E", // class name
  bases__ZN3ccc7CC2x5y7E, 2,
  &(vtc__ZN3ccc7CC2x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y7E),2, //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  DD2x5y7  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD2x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y73pqrEv
  ~DD2x5y7(); // tgen
  DD2x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y73abcEv");}
void  ccc::DD2x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y73pqrEv");}
ccc::DD2x5y7 ::~DD2x5y7(){ note_dtor("_ZN3ccc7DD2x5y7E", this);} // tgen
ccc::DD2x5y7 ::DD2x5y7(){ note_ctor("_ZN3ccc7DD2x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y7E, buf);
    ::ccc::DD2x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y7E);
    dp->::ccc::DD2x5y7::~DD2x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y7E(Test__ZN3ccc7DD2x5y7E, "_ZN3ccc7DD2x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y7C1Ev();
extern void _ZN3ccc7DD2x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y7E[] = {
  NSPAIR(_ZN3ccc7DD2x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x5y73abcEv();
extern void _ZN3ccc7DD2x5y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y73pqrEv,_ZTv0_n12_N3ccc7DD2x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y73pqrEv,_ZThn4_N3ccc7DD2x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y73abcEv,_ZTv0_n20_N3ccc7DD2x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y73abcEv,_ZThn4_N3ccc7DD2x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y73pqrEv,_ZTv0_n12_N3ccc7DD2x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y73abcEv,_ZTv0_n20_N3ccc7DD2x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y7E[] = {
  {&(_ZTVN3ccc7DD2x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y7E[];
static VTBL_ENTRY alt_thunk_names1030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y73abcEv,_ZTv0_n20_N3ccc7DD2x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y73abcEv,_ZThn4_N3ccc7DD2x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y73pqrEv,_ZTv0_n12_N3ccc7DD2x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y73pqrEv,_ZThn4_N3ccc7DD2x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y7E = {  "_ZN3ccc7DD2x5y7E", // class name
  bases__ZN3ccc7DD2x5y7E, 2,
  &(vtc__ZN3ccc7DD2x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y7E),3, //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  CC2x5y8  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y83abcEv
  ~CC2x5y8(); // tgen
  CC2x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y8E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y83efgEv");}
void  ccc::CC2x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y83abcEv");}
ccc::CC2x5y8 ::~CC2x5y8(){ note_dtor("_ZN3ccc7CC2x5y8E", this);} // tgen
ccc::CC2x5y8 ::CC2x5y8(){ note_ctor("_ZN3ccc7CC2x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y8E, buf);
    ::ccc::CC2x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y8E);
    dp->::ccc::CC2x5y8::~CC2x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y8E(Test__ZN3ccc7CC2x5y8E, "_ZN3ccc7CC2x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y8C1Ev();
extern void _ZN3ccc7CC2x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y8E[] = {
  NSPAIR(_ZN3ccc7CC2x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC2x5y83efgEv();
extern void _ZN3ccc7CC2x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y83efgEv,_ZTv0_n12_N3ccc7CC2x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y83efgEv,_ZThn4_N3ccc7CC2x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x5y83abcEv,_ZTv0_n16_N3ccc7CC2x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y83abcEv,_ZThn4_N3ccc7CC2x5y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y83efgEv,_ZTv0_n12_N3ccc7CC2x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x5y83abcEv,_ZTv0_n16_N3ccc7CC2x5y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y8E[] = {
  {&(_ZTVN3ccc7CC2x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y8E[];
static VTBL_ENTRY alt_thunk_names1031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x5y83abcEv,_ZTv0_n16_N3ccc7CC2x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y83abcEv,_ZThn4_N3ccc7CC2x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y83efgEv,_ZTv0_n12_N3ccc7CC2x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y83efgEv,_ZThn4_N3ccc7CC2x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y8E = {  "_ZN3ccc7CC2x5y8E", // class name
  bases__ZN3ccc7CC2x5y8E, 2,
  &(vtc__ZN3ccc7CC2x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y8E),2, //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  DD2x5y8  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD2x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x5y83abcEv
  ~DD2x5y8(); // tgen
  DD2x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y83efgEv");}
void  ccc::DD2x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x5y83abcEv");}
ccc::DD2x5y8 ::~DD2x5y8(){ note_dtor("_ZN3ccc7DD2x5y8E", this);} // tgen
ccc::DD2x5y8 ::DD2x5y8(){ note_ctor("_ZN3ccc7DD2x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y8E, buf);
    ::ccc::DD2x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y8E);
    dp->::ccc::DD2x5y8::~DD2x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y8E(Test__ZN3ccc7DD2x5y8E, "_ZN3ccc7DD2x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y8C1Ev();
extern void _ZN3ccc7DD2x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y8E[] = {
  NSPAIR(_ZN3ccc7DD2x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y8E[];
extern void _ZN3ccc7DD2x5y83efgEv();
extern void _ZN3ccc7DD2x5y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y83efgEv,_ZTv0_n16_N3ccc7DD2x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y83efgEv,_ZThn4_N3ccc7DD2x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD2x5y83abcEv,_ZTv0_n20_N3ccc7DD2x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y83abcEv,_ZThn4_N3ccc7DD2x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y83efgEv,_ZTv0_n16_N3ccc7DD2x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD2x5y83abcEv,_ZTv0_n20_N3ccc7DD2x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y8E[] = {
  {&(_ZTVN3ccc7DD2x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y8E[];
static VTBL_ENTRY alt_thunk_names1032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD2x5y83abcEv,_ZTv0_n20_N3ccc7DD2x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y83abcEv,_ZThn4_N3ccc7DD2x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y83efgEv,_ZTv0_n16_N3ccc7DD2x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y83efgEv,_ZThn4_N3ccc7DD2x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y8E = {  "_ZN3ccc7DD2x5y8E", // class name
  bases__ZN3ccc7DD2x5y8E, 2,
  &(vtc__ZN3ccc7DD2x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y8E),3, //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  CC2x5y9  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y93pqrEv
  ~CC2x5y9(); // tgen
  CC2x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y9E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y93efgEv");}
void  ccc::CC2x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y93pqrEv");}
ccc::CC2x5y9 ::~CC2x5y9(){ note_dtor("_ZN3ccc7CC2x5y9E", this);} // tgen
ccc::CC2x5y9 ::CC2x5y9(){ note_ctor("_ZN3ccc7CC2x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y9E, buf);
    ::ccc::CC2x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC2x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y9E);
    dp->::ccc::CC2x5y9::~CC2x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y9E(Test__ZN3ccc7CC2x5y9E, "_ZN3ccc7CC2x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y9C1Ev();
extern void _ZN3ccc7CC2x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y9E[] = {
  NSPAIR(_ZN3ccc7CC2x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y9E[];
extern void _ZN3ccc7CC2x5y93pqrEv();
extern void _ZN3ccc7CC2x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x5y93efgEv,_ZTv0_n12_N3ccc7CC2x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y93efgEv,_ZThn4_N3ccc7CC2x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x5y93pqrEv,_ZTv0_n20_N3ccc7CC2x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y93pqrEv,_ZThn4_N3ccc7CC2x5y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x5y93efgEv,_ZTv0_n12_N3ccc7CC2x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x5y93pqrEv,_ZTv0_n20_N3ccc7CC2x5y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x5y9E[] = {
  {&(_ZTVN3ccc7CC2x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x5y9E[];
static VTBL_ENTRY alt_thunk_names1033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x5y93pqrEv,_ZTv0_n20_N3ccc7CC2x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y93pqrEv,_ZThn4_N3ccc7CC2x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x5y93efgEv,_ZTv0_n12_N3ccc7CC2x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x5y93efgEv,_ZThn4_N3ccc7CC2x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x5y9E = {  "_ZN3ccc7CC2x5y9E", // class name
  bases__ZN3ccc7CC2x5y9E, 2,
  &(vtc__ZN3ccc7CC2x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x5y9E),2, //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  DD2x5y9  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD2x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x5y93pqrEv
  ~DD2x5y9(); // tgen
  DD2x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x5y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x5y93efgEv");}
void  ccc::DD2x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x5y93pqrEv");}
ccc::DD2x5y9 ::~DD2x5y9(){ note_dtor("_ZN3ccc7DD2x5y9E", this);} // tgen
ccc::DD2x5y9 ::DD2x5y9(){ note_ctor("_ZN3ccc7DD2x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x5y9E, buf);
    ::ccc::DD2x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x5y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD2x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x5y9E);
    dp->::ccc::DD2x5y9::~DD2x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x5y9E(Test__ZN3ccc7DD2x5y9E, "_ZN3ccc7DD2x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x5y9C1Ev();
extern void _ZN3ccc7DD2x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x5y9E[] = {
  NSPAIR(_ZN3ccc7DD2x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD2x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y9E[];
extern void _ZN3ccc7DD2x5y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x5y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x5y93pqrEv,_ZTv0_n12_N3ccc7DD2x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y93pqrEv,_ZThn4_N3ccc7DD2x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x5y93efgEv,_ZTv0_n16_N3ccc7DD2x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x5y93efgEv,_ZThn4_N3ccc7DD2x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x5y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x5y93pqrEv,_ZTv0_n12_N3ccc7DD2x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x5y93efgEv,_ZTv0_n16_N3ccc7DD2x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x5y9E[] = {
  {&(_ZTVN3ccc7DD2x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD2x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x5y9E[];
static VTBL_ENTRY alt_thunk_names1034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x5y93efgEv,_ZTv0_n16_N3ccc7DD2x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y93efgEv,_ZThn4_N3ccc7DD2x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x5y93pqrEv,_ZTv0_n12_N3ccc7DD2x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x5y93pqrEv,_ZThn4_N3ccc7DD2x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x5y9E = {  "_ZN3ccc7DD2x5y9E", // class name
  bases__ZN3ccc7DD2x5y9E, 2,
  &(vtc__ZN3ccc7DD2x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x5y9E),3, //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  CC2x5y10  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x5y103abcEv
  ~CC2x5y10(); // tgen
  CC2x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y10E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y103pqrEv");}
void  ccc::CC2x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x5y103abcEv");}
ccc::CC2x5y10 ::~CC2x5y10(){ note_dtor("_ZN3ccc8CC2x5y10E", this);} // tgen
ccc::CC2x5y10 ::CC2x5y10(){ note_ctor("_ZN3ccc8CC2x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y10E, buf);
    ::ccc::CC2x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y10E);
    dp->::ccc::CC2x5y10::~CC2x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y10E(Test__ZN3ccc8CC2x5y10E, "_ZN3ccc8CC2x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y10C1Ev();
extern void _ZN3ccc8CC2x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y10E[] = {
  NSPAIR(_ZN3ccc8CC2x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y10E[];
extern void _ZN3ccc8CC2x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC2x5y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x5y103abcEv,_ZTv0_n16_N3ccc8CC2x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y103abcEv,_ZThn4_N3ccc8CC2x5y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x5y103pqrEv,_ZTv0_n20_N3ccc8CC2x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y103pqrEv,_ZThn4_N3ccc8CC2x5y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x5y103abcEv,_ZTv0_n16_N3ccc8CC2x5y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x5y103pqrEv,_ZTv0_n20_N3ccc8CC2x5y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y10E[] = {
  {&(_ZTVN3ccc8CC2x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y10E[];
static VTBL_ENTRY alt_thunk_names1035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x5y103pqrEv,_ZTv0_n20_N3ccc8CC2x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y103pqrEv,_ZThn4_N3ccc8CC2x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x5y103abcEv,_ZTv0_n16_N3ccc8CC2x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y103abcEv,_ZThn4_N3ccc8CC2x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x5y10E = {  "_ZN3ccc8CC2x5y10E", // class name
  bases__ZN3ccc8CC2x5y10E, 2,
  &(vtc__ZN3ccc8CC2x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y10E),2, //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  DD2x5y10  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD2x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x5y103abcEv
  ~DD2x5y10(); // tgen
  DD2x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x5y103pqrEv");}
void  ccc::DD2x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x5y103abcEv");}
ccc::DD2x5y10 ::~DD2x5y10(){ note_dtor("_ZN3ccc8DD2x5y10E", this);} // tgen
ccc::DD2x5y10 ::DD2x5y10(){ note_ctor("_ZN3ccc8DD2x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y10E, buf);
    ::ccc::DD2x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y10E);
    dp->::ccc::DD2x5y10::~DD2x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y10E(Test__ZN3ccc8DD2x5y10E, "_ZN3ccc8DD2x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y10C1Ev();
extern void _ZN3ccc8DD2x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y10E[] = {
  NSPAIR(_ZN3ccc8DD2x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x5y103abcEv();
extern void _ZN3ccc8DD2x5y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x5y103pqrEv,_ZTv0_n12_N3ccc8DD2x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y103pqrEv,_ZThn4_N3ccc8DD2x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x5y103abcEv,_ZTv0_n20_N3ccc8DD2x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y103abcEv,_ZThn4_N3ccc8DD2x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x5y103pqrEv,_ZTv0_n12_N3ccc8DD2x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x5y103abcEv,_ZTv0_n20_N3ccc8DD2x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y10E[] = {
  {&(_ZTVN3ccc8DD2x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y10E[];
static VTBL_ENTRY alt_thunk_names1036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x5y103abcEv,_ZTv0_n20_N3ccc8DD2x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y103abcEv,_ZThn4_N3ccc8DD2x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x5y103pqrEv,_ZTv0_n12_N3ccc8DD2x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y103pqrEv,_ZThn4_N3ccc8DD2x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x5y10E = {  "_ZN3ccc8DD2x5y10E", // class name
  bases__ZN3ccc8DD2x5y10E, 2,
  &(vtc__ZN3ccc8DD2x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y10E),3, //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  CC2x5y11  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x5y113efgEv
  ~CC2x5y11(); // tgen
  CC2x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y11E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y113pqrEv");}
void  ccc::CC2x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x5y113efgEv");}
ccc::CC2x5y11 ::~CC2x5y11(){ note_dtor("_ZN3ccc8CC2x5y11E", this);} // tgen
ccc::CC2x5y11 ::CC2x5y11(){ note_ctor("_ZN3ccc8CC2x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y11E, buf);
    ::ccc::CC2x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y11E);
    dp->::ccc::CC2x5y11::~CC2x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y11E(Test__ZN3ccc8CC2x5y11E, "_ZN3ccc8CC2x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y11C1Ev();
extern void _ZN3ccc8CC2x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y11E[] = {
  NSPAIR(_ZN3ccc8CC2x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y11E[];
extern void _ZN3ccc8CC2x5y113pqrEv();
extern void _ZN3ccc8CC2x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x5y113efgEv,_ZTv0_n12_N3ccc8CC2x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y113efgEv,_ZThn4_N3ccc8CC2x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x5y113pqrEv,_ZTv0_n20_N3ccc8CC2x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y113pqrEv,_ZThn4_N3ccc8CC2x5y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x5y113efgEv,_ZTv0_n12_N3ccc8CC2x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x5y113pqrEv,_ZTv0_n20_N3ccc8CC2x5y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y11E[] = {
  {&(_ZTVN3ccc8CC2x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y11E[];
static VTBL_ENTRY alt_thunk_names1037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x5y113pqrEv,_ZTv0_n20_N3ccc8CC2x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y113pqrEv,_ZThn4_N3ccc8CC2x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x5y113efgEv,_ZTv0_n12_N3ccc8CC2x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y113efgEv,_ZThn4_N3ccc8CC2x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x5y11E = {  "_ZN3ccc8CC2x5y11E", // class name
  bases__ZN3ccc8CC2x5y11E, 2,
  &(vtc__ZN3ccc8CC2x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y11E),2, //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  DD2x5y11  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD2x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x5y113efgEv
  ~DD2x5y11(); // tgen
  DD2x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x5y113pqrEv");}
void  ccc::DD2x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x5y113efgEv");}
ccc::DD2x5y11 ::~DD2x5y11(){ note_dtor("_ZN3ccc8DD2x5y11E", this);} // tgen
ccc::DD2x5y11 ::DD2x5y11(){ note_ctor("_ZN3ccc8DD2x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y11E, buf);
    ::ccc::DD2x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y11E);
    dp->::ccc::DD2x5y11::~DD2x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y11E(Test__ZN3ccc8DD2x5y11E, "_ZN3ccc8DD2x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y11C1Ev();
extern void _ZN3ccc8DD2x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y11E[] = {
  NSPAIR(_ZN3ccc8DD2x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y11E[];
extern void _ZN3ccc8DD2x5y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x5y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x5y113pqrEv,_ZTv0_n12_N3ccc8DD2x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y113pqrEv,_ZThn4_N3ccc8DD2x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x5y113efgEv,_ZTv0_n16_N3ccc8DD2x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y113efgEv,_ZThn4_N3ccc8DD2x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x5y113pqrEv,_ZTv0_n12_N3ccc8DD2x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x5y113efgEv,_ZTv0_n16_N3ccc8DD2x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y11E[] = {
  {&(_ZTVN3ccc8DD2x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y11E[];
static VTBL_ENTRY alt_thunk_names1038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x5y113efgEv,_ZTv0_n16_N3ccc8DD2x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y113efgEv,_ZThn4_N3ccc8DD2x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x5y113pqrEv,_ZTv0_n12_N3ccc8DD2x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y113pqrEv,_ZThn4_N3ccc8DD2x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x5y11E = {  "_ZN3ccc8DD2x5y11E", // class name
  bases__ZN3ccc8DD2x5y11E, 2,
  &(vtc__ZN3ccc8DD2x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y11E),3, //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  CC2x5y12  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC2x5y123abcEv
  ~CC2x5y12(); // tgen
  CC2x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x5y123abcEv");}
ccc::CC2x5y12 ::~CC2x5y12(){ note_dtor("_ZN3ccc8CC2x5y12E", this);} // tgen
ccc::CC2x5y12 ::CC2x5y12(){ note_ctor("_ZN3ccc8CC2x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y12E, buf);
    ::ccc::CC2x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y12E);
    dp->::ccc::CC2x5y12::~CC2x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y12E(Test__ZN3ccc8CC2x5y12E, "_ZN3ccc8CC2x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y12C1Ev();
extern void _ZN3ccc8CC2x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y12E[] = {
  NSPAIR(_ZN3ccc8CC2x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC2x5y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x5y123abcEv,_ZTv0_n16_N3ccc8CC2x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y123abcEv,_ZThn4_N3ccc8CC2x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x5y123abcEv,_ZTv0_n16_N3ccc8CC2x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y12E[] = {
  {&(_ZTVN3ccc8CC2x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y12E[];
static VTBL_ENTRY alt_thunk_names1039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x5y123abcEv,_ZTv0_n16_N3ccc8CC2x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y123abcEv,_ZThn4_N3ccc8CC2x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x5y12E = {  "_ZN3ccc8CC2x5y12E", // class name
  bases__ZN3ccc8CC2x5y12E, 2,
  &(vtc__ZN3ccc8CC2x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y12E),2, //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  DD2x5y12  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD2x5y123abcEv
  ~DD2x5y12(); // tgen
  DD2x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD2x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x5y123abcEv");}
ccc::DD2x5y12 ::~DD2x5y12(){ note_dtor("_ZN3ccc8DD2x5y12E", this);} // tgen
ccc::DD2x5y12 ::DD2x5y12(){ note_ctor("_ZN3ccc8DD2x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y12E, buf);
    ::ccc::DD2x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y12E);
    dp->::ccc::DD2x5y12::~DD2x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y12E(Test__ZN3ccc8DD2x5y12E, "_ZN3ccc8DD2x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y12C1Ev();
extern void _ZN3ccc8DD2x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y12E[] = {
  NSPAIR(_ZN3ccc8DD2x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x5y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD2x5y123abcEv,_ZTv0_n20_N3ccc8DD2x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y123abcEv,_ZThn4_N3ccc8DD2x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD2x5y123abcEv,_ZTv0_n20_N3ccc8DD2x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y12E[] = {
  {&(_ZTVN3ccc8DD2x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y12E[];
static VTBL_ENTRY alt_thunk_names1040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD2x5y123abcEv,_ZTv0_n20_N3ccc8DD2x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y123abcEv,_ZThn4_N3ccc8DD2x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x5y12E = {  "_ZN3ccc8DD2x5y12E", // class name
  bases__ZN3ccc8DD2x5y12E, 2,
  &(vtc__ZN3ccc8DD2x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y12E),3, //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  CC2x5y13  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC2x5y133efgEv
  ~CC2x5y13(); // tgen
  CC2x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x5y133efgEv");}
ccc::CC2x5y13 ::~CC2x5y13(){ note_dtor("_ZN3ccc8CC2x5y13E", this);} // tgen
ccc::CC2x5y13 ::CC2x5y13(){ note_ctor("_ZN3ccc8CC2x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y13E, buf);
    ::ccc::CC2x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y13E);
    dp->::ccc::CC2x5y13::~CC2x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y13E(Test__ZN3ccc8CC2x5y13E, "_ZN3ccc8CC2x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y13C1Ev();
extern void _ZN3ccc8CC2x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y13E[] = {
  NSPAIR(_ZN3ccc8CC2x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC2x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x5y133efgEv,_ZTv0_n12_N3ccc8CC2x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y133efgEv,_ZThn4_N3ccc8CC2x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x5y133efgEv,_ZTv0_n12_N3ccc8CC2x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y13E[] = {
  {&(_ZTVN3ccc8CC2x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y13E[];
static VTBL_ENTRY alt_thunk_names1041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x5y133efgEv,_ZTv0_n12_N3ccc8CC2x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y133efgEv,_ZThn4_N3ccc8CC2x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x5y13E = {  "_ZN3ccc8CC2x5y13E", // class name
  bases__ZN3ccc8CC2x5y13E, 2,
  &(vtc__ZN3ccc8CC2x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y13E),2, //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  DD2x5y13  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD2x5y133efgEv
  ~DD2x5y13(); // tgen
  DD2x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD2x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x5y133efgEv");}
ccc::DD2x5y13 ::~DD2x5y13(){ note_dtor("_ZN3ccc8DD2x5y13E", this);} // tgen
ccc::DD2x5y13 ::DD2x5y13(){ note_ctor("_ZN3ccc8DD2x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y13E, buf);
    ::ccc::DD2x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y13E);
    dp->::ccc::DD2x5y13::~DD2x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y13E(Test__ZN3ccc8DD2x5y13E, "_ZN3ccc8DD2x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y13C1Ev();
extern void _ZN3ccc8DD2x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y13E[] = {
  NSPAIR(_ZN3ccc8DD2x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y13E[];
extern void _ZN3ccc8DD2x5y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x5y133efgEv,_ZTv0_n16_N3ccc8DD2x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y133efgEv,_ZThn4_N3ccc8DD2x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x5y133efgEv,_ZTv0_n16_N3ccc8DD2x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y13E[] = {
  {&(_ZTVN3ccc8DD2x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y13E[];
static VTBL_ENTRY alt_thunk_names1042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x5y133efgEv,_ZTv0_n16_N3ccc8DD2x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y133efgEv,_ZThn4_N3ccc8DD2x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x5y13E = {  "_ZN3ccc8DD2x5y13E", // class name
  bases__ZN3ccc8DD2x5y13E, 2,
  &(vtc__ZN3ccc8DD2x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y13E),3, //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  CC2x5y14  : virtual ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y143pqrEv
  ~CC2x5y14(); // tgen
  CC2x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y143pqrEv");}
ccc::CC2x5y14 ::~CC2x5y14(){ note_dtor("_ZN3ccc8CC2x5y14E", this);} // tgen
ccc::CC2x5y14 ::CC2x5y14(){ note_ctor("_ZN3ccc8CC2x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y14E, buf);
    ::ccc::CC2x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y14E);
    dp->::ccc::CC2x5y14::~CC2x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y14E(Test__ZN3ccc8CC2x5y14E, "_ZN3ccc8CC2x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y14C1Ev();
extern void _ZN3ccc8CC2x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y14E[] = {
  NSPAIR(_ZN3ccc8CC2x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y14E[];
extern void _ZN3ccc8CC2x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x5y143pqrEv,_ZTv0_n20_N3ccc8CC2x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y143pqrEv,_ZThn4_N3ccc8CC2x5y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x5y143pqrEv,_ZTv0_n20_N3ccc8CC2x5y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y14E[] = {
  {&(_ZTVN3ccc8CC2x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y14E[];
static VTBL_ENTRY alt_thunk_names1043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x5y143pqrEv,_ZTv0_n20_N3ccc8CC2x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x5y143pqrEv,_ZThn4_N3ccc8CC2x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x5y14E = {  "_ZN3ccc8CC2x5y14E", // class name
  bases__ZN3ccc8CC2x5y14E, 2,
  &(vtc__ZN3ccc8CC2x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y14E),2, //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  DD2x5y14  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD2x5y143pqrEv
  ~DD2x5y14(); // tgen
  DD2x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x5y143pqrEv");}
ccc::DD2x5y14 ::~DD2x5y14(){ note_dtor("_ZN3ccc8DD2x5y14E", this);} // tgen
ccc::DD2x5y14 ::DD2x5y14(){ note_ctor("_ZN3ccc8DD2x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y14E, buf);
    ::ccc::DD2x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y14E);
    dp->::ccc::DD2x5y14::~DD2x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y14E(Test__ZN3ccc8DD2x5y14E, "_ZN3ccc8DD2x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y14C1Ev();
extern void _ZN3ccc8DD2x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y14E[] = {
  NSPAIR(_ZN3ccc8DD2x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x5y143pqrEv,_ZTv0_n12_N3ccc8DD2x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x5y143pqrEv,_ZThn4_N3ccc8DD2x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x5y143pqrEv,_ZTv0_n12_N3ccc8DD2x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y14E[] = {
  {&(_ZTVN3ccc8DD2x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y14E[];
static VTBL_ENTRY alt_thunk_names1044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x5y143pqrEv,_ZTv0_n12_N3ccc8DD2x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x5y143pqrEv,_ZThn4_N3ccc8DD2x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x5y14E = {  "_ZN3ccc8DD2x5y14E", // class name
  bases__ZN3ccc8DD2x5y14E, 2,
  &(vtc__ZN3ccc8DD2x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y14E),3, //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  CC2x5y15  : virtual ::ccc::AA2 , ::ccc::BB5 {
  ~CC2x5y15(); // tgen
  CC2x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x5y15 ::~CC2x5y15(){ note_dtor("_ZN3ccc8CC2x5y15E", this);} // tgen
ccc::CC2x5y15 ::CC2x5y15(){ note_ctor("_ZN3ccc8CC2x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y15E, buf);
    ::ccc::CC2x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC2x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y15E);
    dp->::ccc::CC2x5y15::~CC2x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y15E(Test__ZN3ccc8CC2x5y15E, "_ZN3ccc8CC2x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y15C1Ev();
extern void _ZN3ccc8CC2x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y15E[] = {
  NSPAIR(_ZN3ccc8CC2x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x5y15E[] = {
  {&(_ZTVN3ccc8CC2x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x5y15E[];
Class_Descriptor cd__ZN3ccc8CC2x5y15E = {  "_ZN3ccc8CC2x5y15E", // class name
  bases__ZN3ccc8CC2x5y15E, 2,
  &(vtc__ZN3ccc8CC2x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x5y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x5y15  : virtual ::ccc::AA2 , virtual ::ccc::BB5 {
  ~DD2x5y15(); // tgen
  DD2x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD2x5y15 ::~DD2x5y15(){ note_dtor("_ZN3ccc8DD2x5y15E", this);} // tgen
ccc::DD2x5y15 ::DD2x5y15(){ note_ctor("_ZN3ccc8DD2x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x5y15E, buf);
    ::ccc::DD2x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x5y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD2x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x5y15E);
    dp->::ccc::DD2x5y15::~DD2x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x5y15E(Test__ZN3ccc8DD2x5y15E, "_ZN3ccc8DD2x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x5y15C1Ev();
extern void _ZN3ccc8DD2x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x5y15E[] = {
  NSPAIR(_ZN3ccc8DD2x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD2x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x5y15E[] = {
  {&(_ZTVN3ccc8DD2x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD2x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x5y15E[];
Class_Descriptor cd__ZN3ccc8DD2x5y15E = {  "_ZN3ccc8DD2x5y15E", // class name
  bases__ZN3ccc8DD2x5y15E, 2,
  &(vtc__ZN3ccc8DD2x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x5y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y0  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y03pqrEv
  ~CC2x6y0(); // tgen
  CC2x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y0E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y03abcEv");}
void  ccc::CC2x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y03efgEv");}
void  ccc::CC2x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y03pqrEv");}
ccc::CC2x6y0 ::~CC2x6y0(){ note_dtor("_ZN3ccc7CC2x6y0E", this);} // tgen
ccc::CC2x6y0 ::CC2x6y0(){ note_ctor("_ZN3ccc7CC2x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y0E, buf);
    ::ccc::CC2x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y0E);
    dp->::ccc::CC2x6y0::~CC2x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y0E(Test__ZN3ccc7CC2x6y0E, "_ZN3ccc7CC2x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y0C1Ev();
extern void _ZN3ccc7CC2x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y0E[] = {
  NSPAIR(_ZN3ccc7CC2x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y0E[];
extern void _ZN3ccc7CC2x6y03abcEv();
extern void _ZN3ccc7CC2x6y03efgEv();
extern void _ZN3ccc7CC2x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y03efgEv,_ZTv0_n12_N3ccc7CC2x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y03efgEv,_ZThn4_N3ccc7CC2x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y03abcEv,_ZTv0_n16_N3ccc7CC2x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y03abcEv,_ZThn4_N3ccc7CC2x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y03pqrEv,_ZTv0_n20_N3ccc7CC2x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y03pqrEv,_ZThn4_N3ccc7CC2x6y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y03efgEv,_ZTv0_n12_N3ccc7CC2x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y03abcEv,_ZTv0_n16_N3ccc7CC2x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y03pqrEv,_ZTv0_n20_N3ccc7CC2x6y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y0E[] = {
  {&(_ZTVN3ccc7CC2x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y0E[];
static VTBL_ENTRY alt_thunk_names1045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y03pqrEv,_ZTv0_n20_N3ccc7CC2x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y03pqrEv,_ZThn4_N3ccc7CC2x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y03abcEv,_ZTv0_n16_N3ccc7CC2x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y03abcEv,_ZThn4_N3ccc7CC2x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y03efgEv,_ZTv0_n12_N3ccc7CC2x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y03efgEv,_ZThn4_N3ccc7CC2x6y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y0E = {  "_ZN3ccc7CC2x6y0E", // class name
  bases__ZN3ccc7CC2x6y0E, 2,
  &(vtc__ZN3ccc7CC2x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y0E),2, //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  DD2x6y0  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD2x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y03pqrEv
  ~DD2x6y0(); // tgen
  DD2x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y03abcEv");}
void  ccc::DD2x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y03efgEv");}
void  ccc::DD2x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y03pqrEv");}
ccc::DD2x6y0 ::~DD2x6y0(){ note_dtor("_ZN3ccc7DD2x6y0E", this);} // tgen
ccc::DD2x6y0 ::DD2x6y0(){ note_ctor("_ZN3ccc7DD2x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y0E, buf);
    ::ccc::DD2x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y0E);
    dp->::ccc::DD2x6y0::~DD2x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y0E(Test__ZN3ccc7DD2x6y0E, "_ZN3ccc7DD2x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y0C1Ev();
extern void _ZN3ccc7DD2x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y0E[] = {
  NSPAIR(_ZN3ccc7DD2x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y0E[];
extern void _ZN3ccc7DD2x6y03efgEv();
extern void _ZN3ccc7DD2x6y03abcEv();
extern void _ZN3ccc7DD2x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y03abcEv,_ZTv0_n12_N3ccc7DD2x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y03abcEv,_ZThn4_N3ccc7DD2x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y03efgEv,_ZTv0_n16_N3ccc7DD2x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y03efgEv,_ZThn4_N3ccc7DD2x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y03abcEv,_ZTv0_n12_N3ccc7DD2x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y03efgEv,_ZTv0_n16_N3ccc7DD2x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y0E[] = {
  {&(_ZTVN3ccc7DD2x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y0E[];
static VTBL_ENTRY alt_thunk_names1046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y03efgEv,_ZTv0_n16_N3ccc7DD2x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y03efgEv,_ZThn4_N3ccc7DD2x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y03abcEv,_ZTv0_n12_N3ccc7DD2x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y03abcEv,_ZThn4_N3ccc7DD2x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y0E = {  "_ZN3ccc7DD2x6y0E", // class name
  bases__ZN3ccc7DD2x6y0E, 2,
  &(vtc__ZN3ccc7DD2x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y0E),3, //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  CC2x6y1  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x6y13efgEv
  ~CC2x6y1(); // tgen
  CC2x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y1E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y13abcEv");}
void  ccc::CC2x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y13pqrEv");}
void  ccc::CC2x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y13efgEv");}
ccc::CC2x6y1 ::~CC2x6y1(){ note_dtor("_ZN3ccc7CC2x6y1E", this);} // tgen
ccc::CC2x6y1 ::CC2x6y1(){ note_ctor("_ZN3ccc7CC2x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y1E, buf);
    ::ccc::CC2x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y1E);
    dp->::ccc::CC2x6y1::~CC2x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y1E(Test__ZN3ccc7CC2x6y1E, "_ZN3ccc7CC2x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y1C1Ev();
extern void _ZN3ccc7CC2x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y1E[] = {
  NSPAIR(_ZN3ccc7CC2x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y1E[];
extern void _ZN3ccc7CC2x6y13abcEv();
extern void _ZN3ccc7CC2x6y13efgEv();
extern void _ZN3ccc7CC2x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y13efgEv,_ZTv0_n12_N3ccc7CC2x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y13efgEv,_ZThn4_N3ccc7CC2x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y13abcEv,_ZTv0_n16_N3ccc7CC2x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y13abcEv,_ZThn4_N3ccc7CC2x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y13pqrEv,_ZTv0_n20_N3ccc7CC2x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y13pqrEv,_ZThn4_N3ccc7CC2x6y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y13efgEv,_ZTv0_n12_N3ccc7CC2x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y13abcEv,_ZTv0_n16_N3ccc7CC2x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y13pqrEv,_ZTv0_n20_N3ccc7CC2x6y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y1E[] = {
  {&(_ZTVN3ccc7CC2x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y1E[];
static VTBL_ENTRY alt_thunk_names1047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y13pqrEv,_ZTv0_n20_N3ccc7CC2x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y13pqrEv,_ZThn4_N3ccc7CC2x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y13abcEv,_ZTv0_n16_N3ccc7CC2x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y13abcEv,_ZThn4_N3ccc7CC2x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y13efgEv,_ZTv0_n12_N3ccc7CC2x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y13efgEv,_ZThn4_N3ccc7CC2x6y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y1E = {  "_ZN3ccc7CC2x6y1E", // class name
  bases__ZN3ccc7CC2x6y1E, 2,
  &(vtc__ZN3ccc7CC2x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y1E),2, //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  DD2x6y1  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD2x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x6y13efgEv
  ~DD2x6y1(); // tgen
  DD2x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y13abcEv");}
void  ccc::DD2x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y13pqrEv");}
void  ccc::DD2x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y13efgEv");}
ccc::DD2x6y1 ::~DD2x6y1(){ note_dtor("_ZN3ccc7DD2x6y1E", this);} // tgen
ccc::DD2x6y1 ::DD2x6y1(){ note_ctor("_ZN3ccc7DD2x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y1E, buf);
    ::ccc::DD2x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y1E);
    dp->::ccc::DD2x6y1::~DD2x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y1E(Test__ZN3ccc7DD2x6y1E, "_ZN3ccc7DD2x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y1C1Ev();
extern void _ZN3ccc7DD2x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y1E[] = {
  NSPAIR(_ZN3ccc7DD2x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y1E[];
extern void _ZN3ccc7DD2x6y13efgEv();
extern void _ZN3ccc7DD2x6y13abcEv();
extern void _ZN3ccc7DD2x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y13abcEv,_ZTv0_n12_N3ccc7DD2x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y13abcEv,_ZThn4_N3ccc7DD2x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y13efgEv,_ZTv0_n16_N3ccc7DD2x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y13efgEv,_ZThn4_N3ccc7DD2x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y13abcEv,_ZTv0_n12_N3ccc7DD2x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y13efgEv,_ZTv0_n16_N3ccc7DD2x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y1E[] = {
  {&(_ZTVN3ccc7DD2x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y1E[];
static VTBL_ENTRY alt_thunk_names1048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y13efgEv,_ZTv0_n16_N3ccc7DD2x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y13efgEv,_ZThn4_N3ccc7DD2x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y13abcEv,_ZTv0_n12_N3ccc7DD2x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y13abcEv,_ZThn4_N3ccc7DD2x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y1E = {  "_ZN3ccc7DD2x6y1E", // class name
  bases__ZN3ccc7DD2x6y1E, 2,
  &(vtc__ZN3ccc7DD2x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y1E),3, //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  CC2x6y2  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y23pqrEv
  ~CC2x6y2(); // tgen
  CC2x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y2E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y23efgEv");}
void  ccc::CC2x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y23abcEv");}
void  ccc::CC2x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y23pqrEv");}
ccc::CC2x6y2 ::~CC2x6y2(){ note_dtor("_ZN3ccc7CC2x6y2E", this);} // tgen
ccc::CC2x6y2 ::CC2x6y2(){ note_ctor("_ZN3ccc7CC2x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y2E, buf);
    ::ccc::CC2x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y2E);
    dp->::ccc::CC2x6y2::~CC2x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y2E(Test__ZN3ccc7CC2x6y2E, "_ZN3ccc7CC2x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y2C1Ev();
extern void _ZN3ccc7CC2x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y2E[] = {
  NSPAIR(_ZN3ccc7CC2x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y2E[];
extern void _ZN3ccc7CC2x6y23abcEv();
extern void _ZN3ccc7CC2x6y23efgEv();
extern void _ZN3ccc7CC2x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y23efgEv,_ZTv0_n12_N3ccc7CC2x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y23efgEv,_ZThn4_N3ccc7CC2x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y23abcEv,_ZTv0_n16_N3ccc7CC2x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y23abcEv,_ZThn4_N3ccc7CC2x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y23pqrEv,_ZTv0_n20_N3ccc7CC2x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y23pqrEv,_ZThn4_N3ccc7CC2x6y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y23efgEv,_ZTv0_n12_N3ccc7CC2x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y23abcEv,_ZTv0_n16_N3ccc7CC2x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y23pqrEv,_ZTv0_n20_N3ccc7CC2x6y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y2E[] = {
  {&(_ZTVN3ccc7CC2x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y2E[];
static VTBL_ENTRY alt_thunk_names1049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y23pqrEv,_ZTv0_n20_N3ccc7CC2x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y23pqrEv,_ZThn4_N3ccc7CC2x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y23abcEv,_ZTv0_n16_N3ccc7CC2x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y23abcEv,_ZThn4_N3ccc7CC2x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y23efgEv,_ZTv0_n12_N3ccc7CC2x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y23efgEv,_ZThn4_N3ccc7CC2x6y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y2E = {  "_ZN3ccc7CC2x6y2E", // class name
  bases__ZN3ccc7CC2x6y2E, 2,
  &(vtc__ZN3ccc7CC2x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y2E),2, //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  DD2x6y2  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD2x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y23pqrEv
  ~DD2x6y2(); // tgen
  DD2x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y23efgEv");}
void  ccc::DD2x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y23abcEv");}
void  ccc::DD2x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y23pqrEv");}
ccc::DD2x6y2 ::~DD2x6y2(){ note_dtor("_ZN3ccc7DD2x6y2E", this);} // tgen
ccc::DD2x6y2 ::DD2x6y2(){ note_ctor("_ZN3ccc7DD2x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y2E, buf);
    ::ccc::DD2x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y2E);
    dp->::ccc::DD2x6y2::~DD2x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y2E(Test__ZN3ccc7DD2x6y2E, "_ZN3ccc7DD2x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y2C1Ev();
extern void _ZN3ccc7DD2x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y2E[] = {
  NSPAIR(_ZN3ccc7DD2x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y2E[];
extern void _ZN3ccc7DD2x6y23efgEv();
extern void _ZN3ccc7DD2x6y23abcEv();
extern void _ZN3ccc7DD2x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y23abcEv,_ZTv0_n12_N3ccc7DD2x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y23abcEv,_ZThn4_N3ccc7DD2x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y23efgEv,_ZTv0_n16_N3ccc7DD2x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y23efgEv,_ZThn4_N3ccc7DD2x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y23abcEv,_ZTv0_n12_N3ccc7DD2x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y23efgEv,_ZTv0_n16_N3ccc7DD2x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y2E[] = {
  {&(_ZTVN3ccc7DD2x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y2E[];
static VTBL_ENTRY alt_thunk_names1050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y23efgEv,_ZTv0_n16_N3ccc7DD2x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y23efgEv,_ZThn4_N3ccc7DD2x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y23abcEv,_ZTv0_n12_N3ccc7DD2x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y23abcEv,_ZThn4_N3ccc7DD2x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y2E = {  "_ZN3ccc7DD2x6y2E", // class name
  bases__ZN3ccc7DD2x6y2E, 2,
  &(vtc__ZN3ccc7DD2x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y2E),3, //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  CC2x6y3  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x6y33abcEv
  ~CC2x6y3(); // tgen
  CC2x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y3E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y33efgEv");}
void  ccc::CC2x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y33pqrEv");}
void  ccc::CC2x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y33abcEv");}
ccc::CC2x6y3 ::~CC2x6y3(){ note_dtor("_ZN3ccc7CC2x6y3E", this);} // tgen
ccc::CC2x6y3 ::CC2x6y3(){ note_ctor("_ZN3ccc7CC2x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y3E, buf);
    ::ccc::CC2x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y3E);
    dp->::ccc::CC2x6y3::~CC2x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y3E(Test__ZN3ccc7CC2x6y3E, "_ZN3ccc7CC2x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y3C1Ev();
extern void _ZN3ccc7CC2x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y3E[] = {
  NSPAIR(_ZN3ccc7CC2x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y3E[];
extern void _ZN3ccc7CC2x6y33abcEv();
extern void _ZN3ccc7CC2x6y33efgEv();
extern void _ZN3ccc7CC2x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y33efgEv,_ZTv0_n12_N3ccc7CC2x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y33efgEv,_ZThn4_N3ccc7CC2x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y33abcEv,_ZTv0_n16_N3ccc7CC2x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y33abcEv,_ZThn4_N3ccc7CC2x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y33pqrEv,_ZTv0_n20_N3ccc7CC2x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y33pqrEv,_ZThn4_N3ccc7CC2x6y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y33efgEv,_ZTv0_n12_N3ccc7CC2x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y33abcEv,_ZTv0_n16_N3ccc7CC2x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y33pqrEv,_ZTv0_n20_N3ccc7CC2x6y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y3E[] = {
  {&(_ZTVN3ccc7CC2x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y3E[];
static VTBL_ENTRY alt_thunk_names1051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y33pqrEv,_ZTv0_n20_N3ccc7CC2x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y33pqrEv,_ZThn4_N3ccc7CC2x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y33abcEv,_ZTv0_n16_N3ccc7CC2x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y33abcEv,_ZThn4_N3ccc7CC2x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y33efgEv,_ZTv0_n12_N3ccc7CC2x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y33efgEv,_ZThn4_N3ccc7CC2x6y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y3E = {  "_ZN3ccc7CC2x6y3E", // class name
  bases__ZN3ccc7CC2x6y3E, 2,
  &(vtc__ZN3ccc7CC2x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y3E),2, //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  DD2x6y3  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD2x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x6y33abcEv
  ~DD2x6y3(); // tgen
  DD2x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y33efgEv");}
void  ccc::DD2x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y33pqrEv");}
void  ccc::DD2x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y33abcEv");}
ccc::DD2x6y3 ::~DD2x6y3(){ note_dtor("_ZN3ccc7DD2x6y3E", this);} // tgen
ccc::DD2x6y3 ::DD2x6y3(){ note_ctor("_ZN3ccc7DD2x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y3E, buf);
    ::ccc::DD2x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y3E);
    dp->::ccc::DD2x6y3::~DD2x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y3E(Test__ZN3ccc7DD2x6y3E, "_ZN3ccc7DD2x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y3C1Ev();
extern void _ZN3ccc7DD2x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y3E[] = {
  NSPAIR(_ZN3ccc7DD2x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y3E[];
extern void _ZN3ccc7DD2x6y33efgEv();
extern void _ZN3ccc7DD2x6y33abcEv();
extern void _ZN3ccc7DD2x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y33abcEv,_ZTv0_n12_N3ccc7DD2x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y33abcEv,_ZThn4_N3ccc7DD2x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y33efgEv,_ZTv0_n16_N3ccc7DD2x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y33efgEv,_ZThn4_N3ccc7DD2x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y33abcEv,_ZTv0_n12_N3ccc7DD2x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y33efgEv,_ZTv0_n16_N3ccc7DD2x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y3E[] = {
  {&(_ZTVN3ccc7DD2x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y3E[];
static VTBL_ENTRY alt_thunk_names1052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y33efgEv,_ZTv0_n16_N3ccc7DD2x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y33efgEv,_ZThn4_N3ccc7DD2x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y33abcEv,_ZTv0_n12_N3ccc7DD2x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y33abcEv,_ZThn4_N3ccc7DD2x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y3E = {  "_ZN3ccc7DD2x6y3E", // class name
  bases__ZN3ccc7DD2x6y3E, 2,
  &(vtc__ZN3ccc7DD2x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y3E),3, //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  CC2x6y4  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC2x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y43efgEv
  ~CC2x6y4(); // tgen
  CC2x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y4E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y43pqrEv");}
void  ccc::CC2x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y43abcEv");}
void  ccc::CC2x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y43efgEv");}
ccc::CC2x6y4 ::~CC2x6y4(){ note_dtor("_ZN3ccc7CC2x6y4E", this);} // tgen
ccc::CC2x6y4 ::CC2x6y4(){ note_ctor("_ZN3ccc7CC2x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y4E, buf);
    ::ccc::CC2x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y4E);
    dp->::ccc::CC2x6y4::~CC2x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y4E(Test__ZN3ccc7CC2x6y4E, "_ZN3ccc7CC2x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y4C1Ev();
extern void _ZN3ccc7CC2x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y4E[] = {
  NSPAIR(_ZN3ccc7CC2x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y4E[];
extern void _ZN3ccc7CC2x6y43abcEv();
extern void _ZN3ccc7CC2x6y43efgEv();
extern void _ZN3ccc7CC2x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y43efgEv,_ZTv0_n12_N3ccc7CC2x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y43efgEv,_ZThn4_N3ccc7CC2x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y43abcEv,_ZTv0_n16_N3ccc7CC2x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y43abcEv,_ZThn4_N3ccc7CC2x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y43pqrEv,_ZTv0_n20_N3ccc7CC2x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y43pqrEv,_ZThn4_N3ccc7CC2x6y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y43efgEv,_ZTv0_n12_N3ccc7CC2x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y43abcEv,_ZTv0_n16_N3ccc7CC2x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y43pqrEv,_ZTv0_n20_N3ccc7CC2x6y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y4E[] = {
  {&(_ZTVN3ccc7CC2x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y4E[];
static VTBL_ENTRY alt_thunk_names1053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y43pqrEv,_ZTv0_n20_N3ccc7CC2x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y43pqrEv,_ZThn4_N3ccc7CC2x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y43abcEv,_ZTv0_n16_N3ccc7CC2x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y43abcEv,_ZThn4_N3ccc7CC2x6y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y43efgEv,_ZTv0_n12_N3ccc7CC2x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y43efgEv,_ZThn4_N3ccc7CC2x6y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y4E = {  "_ZN3ccc7CC2x6y4E", // class name
  bases__ZN3ccc7CC2x6y4E, 2,
  &(vtc__ZN3ccc7CC2x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y4E),2, //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  DD2x6y4  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD2x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x6y43efgEv
  ~DD2x6y4(); // tgen
  DD2x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y43pqrEv");}
void  ccc::DD2x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y43abcEv");}
void  ccc::DD2x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y43efgEv");}
ccc::DD2x6y4 ::~DD2x6y4(){ note_dtor("_ZN3ccc7DD2x6y4E", this);} // tgen
ccc::DD2x6y4 ::DD2x6y4(){ note_ctor("_ZN3ccc7DD2x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y4E, buf);
    ::ccc::DD2x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y4E);
    dp->::ccc::DD2x6y4::~DD2x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y4E(Test__ZN3ccc7DD2x6y4E, "_ZN3ccc7DD2x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y4C1Ev();
extern void _ZN3ccc7DD2x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y4E[] = {
  NSPAIR(_ZN3ccc7DD2x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y4E[];
extern void _ZN3ccc7DD2x6y43efgEv();
extern void _ZN3ccc7DD2x6y43abcEv();
extern void _ZN3ccc7DD2x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y43abcEv,_ZTv0_n12_N3ccc7DD2x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y43abcEv,_ZThn4_N3ccc7DD2x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y43efgEv,_ZTv0_n16_N3ccc7DD2x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y43efgEv,_ZThn4_N3ccc7DD2x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y43abcEv,_ZTv0_n12_N3ccc7DD2x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y43efgEv,_ZTv0_n16_N3ccc7DD2x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y4E[] = {
  {&(_ZTVN3ccc7DD2x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y4E[];
static VTBL_ENTRY alt_thunk_names1054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y43efgEv,_ZTv0_n16_N3ccc7DD2x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y43efgEv,_ZThn4_N3ccc7DD2x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y43abcEv,_ZTv0_n12_N3ccc7DD2x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y43abcEv,_ZThn4_N3ccc7DD2x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y4E = {  "_ZN3ccc7DD2x6y4E", // class name
  bases__ZN3ccc7DD2x6y4E, 2,
  &(vtc__ZN3ccc7DD2x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y4E),3, //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  CC2x6y5  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC2x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y53abcEv
  ~CC2x6y5(); // tgen
  CC2x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y5E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y53pqrEv");}
void  ccc::CC2x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y53efgEv");}
void  ccc::CC2x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y53abcEv");}
ccc::CC2x6y5 ::~CC2x6y5(){ note_dtor("_ZN3ccc7CC2x6y5E", this);} // tgen
ccc::CC2x6y5 ::CC2x6y5(){ note_ctor("_ZN3ccc7CC2x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y5E, buf);
    ::ccc::CC2x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y5E);
    dp->::ccc::CC2x6y5::~CC2x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y5E(Test__ZN3ccc7CC2x6y5E, "_ZN3ccc7CC2x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y5C1Ev();
extern void _ZN3ccc7CC2x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y5E[] = {
  NSPAIR(_ZN3ccc7CC2x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y5E[];
extern void _ZN3ccc7CC2x6y53abcEv();
extern void _ZN3ccc7CC2x6y53efgEv();
extern void _ZN3ccc7CC2x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y53efgEv,_ZTv0_n12_N3ccc7CC2x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y53efgEv,_ZThn4_N3ccc7CC2x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y53abcEv,_ZTv0_n16_N3ccc7CC2x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y53abcEv,_ZThn4_N3ccc7CC2x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y53pqrEv,_ZTv0_n20_N3ccc7CC2x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y53pqrEv,_ZThn4_N3ccc7CC2x6y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y53efgEv,_ZTv0_n12_N3ccc7CC2x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y53abcEv,_ZTv0_n16_N3ccc7CC2x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y53pqrEv,_ZTv0_n20_N3ccc7CC2x6y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y5E[] = {
  {&(_ZTVN3ccc7CC2x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y5E[];
static VTBL_ENTRY alt_thunk_names1055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y53pqrEv,_ZTv0_n20_N3ccc7CC2x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y53pqrEv,_ZThn4_N3ccc7CC2x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y53abcEv,_ZTv0_n16_N3ccc7CC2x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y53abcEv,_ZThn4_N3ccc7CC2x6y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y53efgEv,_ZTv0_n12_N3ccc7CC2x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y53efgEv,_ZThn4_N3ccc7CC2x6y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y5E = {  "_ZN3ccc7CC2x6y5E", // class name
  bases__ZN3ccc7CC2x6y5E, 2,
  &(vtc__ZN3ccc7CC2x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y5E),2, //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  DD2x6y5  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD2x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x6y53abcEv
  ~DD2x6y5(); // tgen
  DD2x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y53pqrEv");}
void  ccc::DD2x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y53efgEv");}
void  ccc::DD2x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y53abcEv");}
ccc::DD2x6y5 ::~DD2x6y5(){ note_dtor("_ZN3ccc7DD2x6y5E", this);} // tgen
ccc::DD2x6y5 ::DD2x6y5(){ note_ctor("_ZN3ccc7DD2x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y5E, buf);
    ::ccc::DD2x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y5E);
    dp->::ccc::DD2x6y5::~DD2x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y5E(Test__ZN3ccc7DD2x6y5E, "_ZN3ccc7DD2x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y5C1Ev();
extern void _ZN3ccc7DD2x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y5E[] = {
  NSPAIR(_ZN3ccc7DD2x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y5E[];
extern void _ZN3ccc7DD2x6y53efgEv();
extern void _ZN3ccc7DD2x6y53abcEv();
extern void _ZN3ccc7DD2x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y53abcEv,_ZTv0_n12_N3ccc7DD2x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y53abcEv,_ZThn4_N3ccc7DD2x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y53efgEv,_ZTv0_n16_N3ccc7DD2x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y53efgEv,_ZThn4_N3ccc7DD2x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y53abcEv,_ZTv0_n12_N3ccc7DD2x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y53efgEv,_ZTv0_n16_N3ccc7DD2x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y5E[] = {
  {&(_ZTVN3ccc7DD2x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y5E[];
static VTBL_ENTRY alt_thunk_names1056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y53efgEv,_ZTv0_n16_N3ccc7DD2x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y53efgEv,_ZThn4_N3ccc7DD2x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y53abcEv,_ZTv0_n12_N3ccc7DD2x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y53abcEv,_ZThn4_N3ccc7DD2x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y5E = {  "_ZN3ccc7DD2x6y5E", // class name
  bases__ZN3ccc7DD2x6y5E, 2,
  &(vtc__ZN3ccc7DD2x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y5E),3, //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  CC2x6y6  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y63efgEv
  ~CC2x6y6(); // tgen
  CC2x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y6E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y63abcEv");}
void  ccc::CC2x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y63efgEv");}
ccc::CC2x6y6 ::~CC2x6y6(){ note_dtor("_ZN3ccc7CC2x6y6E", this);} // tgen
ccc::CC2x6y6 ::CC2x6y6(){ note_ctor("_ZN3ccc7CC2x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y6E, buf);
    ::ccc::CC2x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y6E);
    dp->::ccc::CC2x6y6::~CC2x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y6E(Test__ZN3ccc7CC2x6y6E, "_ZN3ccc7CC2x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y6C1Ev();
extern void _ZN3ccc7CC2x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y6E[] = {
  NSPAIR(_ZN3ccc7CC2x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y6E[];
extern void _ZN3ccc7CC2x6y63abcEv();
extern void _ZN3ccc7CC2x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y63efgEv,_ZTv0_n12_N3ccc7CC2x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y63efgEv,_ZThn4_N3ccc7CC2x6y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y63abcEv,_ZTv0_n16_N3ccc7CC2x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y63abcEv,_ZThn4_N3ccc7CC2x6y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y63efgEv,_ZTv0_n12_N3ccc7CC2x6y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y63abcEv,_ZTv0_n16_N3ccc7CC2x6y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y6E[] = {
  {&(_ZTVN3ccc7CC2x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y6E[];
static VTBL_ENTRY alt_thunk_names1057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y63abcEv,_ZTv0_n16_N3ccc7CC2x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y63abcEv,_ZThn4_N3ccc7CC2x6y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y63efgEv,_ZTv0_n12_N3ccc7CC2x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y63efgEv,_ZThn4_N3ccc7CC2x6y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y6E = {  "_ZN3ccc7CC2x6y6E", // class name
  bases__ZN3ccc7CC2x6y6E, 2,
  &(vtc__ZN3ccc7CC2x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y6E),2, //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  DD2x6y6  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD2x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x6y63efgEv
  ~DD2x6y6(); // tgen
  DD2x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y63abcEv");}
void  ccc::DD2x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y63efgEv");}
ccc::DD2x6y6 ::~DD2x6y6(){ note_dtor("_ZN3ccc7DD2x6y6E", this);} // tgen
ccc::DD2x6y6 ::DD2x6y6(){ note_ctor("_ZN3ccc7DD2x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y6E, buf);
    ::ccc::DD2x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y6E);
    dp->::ccc::DD2x6y6::~DD2x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y6E(Test__ZN3ccc7DD2x6y6E, "_ZN3ccc7DD2x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y6C1Ev();
extern void _ZN3ccc7DD2x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y6E[] = {
  NSPAIR(_ZN3ccc7DD2x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y6E[];
extern void _ZN3ccc7DD2x6y63efgEv();
extern void _ZN3ccc7DD2x6y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y63abcEv,_ZTv0_n12_N3ccc7DD2x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y63abcEv,_ZThn4_N3ccc7DD2x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y63efgEv,_ZTv0_n16_N3ccc7DD2x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y63efgEv,_ZThn4_N3ccc7DD2x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y63abcEv,_ZTv0_n12_N3ccc7DD2x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y63efgEv,_ZTv0_n16_N3ccc7DD2x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y6E[] = {
  {&(_ZTVN3ccc7DD2x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y6E[];
static VTBL_ENTRY alt_thunk_names1058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y63efgEv,_ZTv0_n16_N3ccc7DD2x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y63efgEv,_ZThn4_N3ccc7DD2x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y63abcEv,_ZTv0_n12_N3ccc7DD2x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y63abcEv,_ZThn4_N3ccc7DD2x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y6E = {  "_ZN3ccc7DD2x6y6E", // class name
  bases__ZN3ccc7DD2x6y6E, 2,
  &(vtc__ZN3ccc7DD2x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y6E),3, //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  CC2x6y7  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y73pqrEv
  ~CC2x6y7(); // tgen
  CC2x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y7E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y73abcEv");}
void  ccc::CC2x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y73pqrEv");}
ccc::CC2x6y7 ::~CC2x6y7(){ note_dtor("_ZN3ccc7CC2x6y7E", this);} // tgen
ccc::CC2x6y7 ::CC2x6y7(){ note_ctor("_ZN3ccc7CC2x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y7E, buf);
    ::ccc::CC2x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y7E);
    dp->::ccc::CC2x6y7::~CC2x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y7E(Test__ZN3ccc7CC2x6y7E, "_ZN3ccc7CC2x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y7C1Ev();
extern void _ZN3ccc7CC2x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y7E[] = {
  NSPAIR(_ZN3ccc7CC2x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y7E[];
extern void _ZN3ccc7CC2x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC2x6y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y73abcEv,_ZTv0_n16_N3ccc7CC2x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y73abcEv,_ZThn4_N3ccc7CC2x6y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y73pqrEv,_ZTv0_n20_N3ccc7CC2x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y73pqrEv,_ZThn4_N3ccc7CC2x6y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y73abcEv,_ZTv0_n16_N3ccc7CC2x6y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y73pqrEv,_ZTv0_n20_N3ccc7CC2x6y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y7E[] = {
  {&(_ZTVN3ccc7CC2x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y7E[];
static VTBL_ENTRY alt_thunk_names1059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y73pqrEv,_ZTv0_n20_N3ccc7CC2x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y73pqrEv,_ZThn4_N3ccc7CC2x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y73abcEv,_ZTv0_n16_N3ccc7CC2x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y73abcEv,_ZThn4_N3ccc7CC2x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y7E = {  "_ZN3ccc7CC2x6y7E", // class name
  bases__ZN3ccc7CC2x6y7E, 2,
  &(vtc__ZN3ccc7CC2x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y7E),2, //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  DD2x6y7  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD2x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y73pqrEv
  ~DD2x6y7(); // tgen
  DD2x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y73abcEv");}
void  ccc::DD2x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y73pqrEv");}
ccc::DD2x6y7 ::~DD2x6y7(){ note_dtor("_ZN3ccc7DD2x6y7E", this);} // tgen
ccc::DD2x6y7 ::DD2x6y7(){ note_ctor("_ZN3ccc7DD2x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y7E, buf);
    ::ccc::DD2x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y7E);
    dp->::ccc::DD2x6y7::~DD2x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y7E(Test__ZN3ccc7DD2x6y7E, "_ZN3ccc7DD2x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y7C1Ev();
extern void _ZN3ccc7DD2x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y7E[] = {
  NSPAIR(_ZN3ccc7DD2x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x6y73abcEv();
extern void _ZN3ccc7DD2x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y73abcEv,_ZTv0_n12_N3ccc7DD2x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y73abcEv,_ZThn4_N3ccc7DD2x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y73abcEv,_ZTv0_n12_N3ccc7DD2x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y7E[] = {
  {&(_ZTVN3ccc7DD2x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y7E[];
static VTBL_ENTRY alt_thunk_names1060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y73abcEv,_ZTv0_n12_N3ccc7DD2x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y73abcEv,_ZThn4_N3ccc7DD2x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y7E = {  "_ZN3ccc7DD2x6y7E", // class name
  bases__ZN3ccc7DD2x6y7E, 2,
  &(vtc__ZN3ccc7DD2x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y7E),3, //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  CC2x6y8  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y83abcEv
  ~CC2x6y8(); // tgen
  CC2x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y8E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y83efgEv");}
void  ccc::CC2x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y83abcEv");}
ccc::CC2x6y8 ::~CC2x6y8(){ note_dtor("_ZN3ccc7CC2x6y8E", this);} // tgen
ccc::CC2x6y8 ::CC2x6y8(){ note_ctor("_ZN3ccc7CC2x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y8E, buf);
    ::ccc::CC2x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y8E);
    dp->::ccc::CC2x6y8::~CC2x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y8E(Test__ZN3ccc7CC2x6y8E, "_ZN3ccc7CC2x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y8C1Ev();
extern void _ZN3ccc7CC2x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y8E[] = {
  NSPAIR(_ZN3ccc7CC2x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y8E[];
extern void _ZN3ccc7CC2x6y83abcEv();
extern void _ZN3ccc7CC2x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y83efgEv,_ZTv0_n12_N3ccc7CC2x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y83efgEv,_ZThn4_N3ccc7CC2x6y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x6y83abcEv,_ZTv0_n16_N3ccc7CC2x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y83abcEv,_ZThn4_N3ccc7CC2x6y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y83efgEv,_ZTv0_n12_N3ccc7CC2x6y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x6y83abcEv,_ZTv0_n16_N3ccc7CC2x6y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y8E[] = {
  {&(_ZTVN3ccc7CC2x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y8E[];
static VTBL_ENTRY alt_thunk_names1061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x6y83abcEv,_ZTv0_n16_N3ccc7CC2x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y83abcEv,_ZThn4_N3ccc7CC2x6y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y83efgEv,_ZTv0_n12_N3ccc7CC2x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y83efgEv,_ZThn4_N3ccc7CC2x6y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y8E = {  "_ZN3ccc7CC2x6y8E", // class name
  bases__ZN3ccc7CC2x6y8E, 2,
  &(vtc__ZN3ccc7CC2x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y8E),2, //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  DD2x6y8  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD2x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x6y83abcEv
  ~DD2x6y8(); // tgen
  DD2x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y83efgEv");}
void  ccc::DD2x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x6y83abcEv");}
ccc::DD2x6y8 ::~DD2x6y8(){ note_dtor("_ZN3ccc7DD2x6y8E", this);} // tgen
ccc::DD2x6y8 ::DD2x6y8(){ note_ctor("_ZN3ccc7DD2x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y8E, buf);
    ::ccc::DD2x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y8E);
    dp->::ccc::DD2x6y8::~DD2x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y8E(Test__ZN3ccc7DD2x6y8E, "_ZN3ccc7DD2x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y8C1Ev();
extern void _ZN3ccc7DD2x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y8E[] = {
  NSPAIR(_ZN3ccc7DD2x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y8E[];
extern void _ZN3ccc7DD2x6y83efgEv();
extern void _ZN3ccc7DD2x6y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x6y83abcEv,_ZTv0_n12_N3ccc7DD2x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y83abcEv,_ZThn4_N3ccc7DD2x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y83efgEv,_ZTv0_n16_N3ccc7DD2x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y83efgEv,_ZThn4_N3ccc7DD2x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x6y83abcEv,_ZTv0_n12_N3ccc7DD2x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y83efgEv,_ZTv0_n16_N3ccc7DD2x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y8E[] = {
  {&(_ZTVN3ccc7DD2x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y8E[];
static VTBL_ENTRY alt_thunk_names1062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y83efgEv,_ZTv0_n16_N3ccc7DD2x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y83efgEv,_ZThn4_N3ccc7DD2x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x6y83abcEv,_ZTv0_n12_N3ccc7DD2x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y83abcEv,_ZThn4_N3ccc7DD2x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y8E = {  "_ZN3ccc7DD2x6y8E", // class name
  bases__ZN3ccc7DD2x6y8E, 2,
  &(vtc__ZN3ccc7DD2x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y8E),3, //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  CC2x6y9  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y93pqrEv
  ~CC2x6y9(); // tgen
  CC2x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y9E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y93efgEv");}
void  ccc::CC2x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y93pqrEv");}
ccc::CC2x6y9 ::~CC2x6y9(){ note_dtor("_ZN3ccc7CC2x6y9E", this);} // tgen
ccc::CC2x6y9 ::CC2x6y9(){ note_ctor("_ZN3ccc7CC2x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y9E, buf);
    ::ccc::CC2x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC2x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y9E);
    dp->::ccc::CC2x6y9::~CC2x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y9E(Test__ZN3ccc7CC2x6y9E, "_ZN3ccc7CC2x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y9C1Ev();
extern void _ZN3ccc7CC2x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y9E[] = {
  NSPAIR(_ZN3ccc7CC2x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC2x6y93efgEv();
extern void _ZN3ccc7CC2x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x6y93efgEv,_ZTv0_n12_N3ccc7CC2x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y93efgEv,_ZThn4_N3ccc7CC2x6y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x6y93pqrEv,_ZTv0_n20_N3ccc7CC2x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y93pqrEv,_ZThn4_N3ccc7CC2x6y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x6y93efgEv,_ZTv0_n12_N3ccc7CC2x6y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x6y93pqrEv,_ZTv0_n20_N3ccc7CC2x6y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x6y9E[] = {
  {&(_ZTVN3ccc7CC2x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x6y9E[];
static VTBL_ENTRY alt_thunk_names1063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x6y93pqrEv,_ZTv0_n20_N3ccc7CC2x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y93pqrEv,_ZThn4_N3ccc7CC2x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x6y93efgEv,_ZTv0_n12_N3ccc7CC2x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x6y93efgEv,_ZThn4_N3ccc7CC2x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x6y9E = {  "_ZN3ccc7CC2x6y9E", // class name
  bases__ZN3ccc7CC2x6y9E, 2,
  &(vtc__ZN3ccc7CC2x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x6y9E),2, //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  DD2x6y9  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD2x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x6y93pqrEv
  ~DD2x6y9(); // tgen
  DD2x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x6y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x6y93efgEv");}
void  ccc::DD2x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x6y93pqrEv");}
ccc::DD2x6y9 ::~DD2x6y9(){ note_dtor("_ZN3ccc7DD2x6y9E", this);} // tgen
ccc::DD2x6y9 ::DD2x6y9(){ note_ctor("_ZN3ccc7DD2x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x6y9E, buf);
    ::ccc::DD2x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x6y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD2x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x6y9E);
    dp->::ccc::DD2x6y9::~DD2x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x6y9E(Test__ZN3ccc7DD2x6y9E, "_ZN3ccc7DD2x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x6y9C1Ev();
extern void _ZN3ccc7DD2x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x6y9E[] = {
  NSPAIR(_ZN3ccc7DD2x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD2x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y9E[];
extern void _ZN3ccc7DD2x6y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x6y93efgEv,_ZTv0_n16_N3ccc7DD2x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x6y93efgEv,_ZThn4_N3ccc7DD2x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x6y93efgEv,_ZTv0_n16_N3ccc7DD2x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x6y9E[] = {
  {&(_ZTVN3ccc7DD2x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x6y9E[];
static VTBL_ENTRY alt_thunk_names1064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x6y93efgEv,_ZTv0_n16_N3ccc7DD2x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x6y93efgEv,_ZThn4_N3ccc7DD2x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x6y9E = {  "_ZN3ccc7DD2x6y9E", // class name
  bases__ZN3ccc7DD2x6y9E, 2,
  &(vtc__ZN3ccc7DD2x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x6y9E),3, //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  CC2x6y10  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x6y103abcEv
  ~CC2x6y10(); // tgen
  CC2x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y10E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y103pqrEv");}
void  ccc::CC2x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x6y103abcEv");}
ccc::CC2x6y10 ::~CC2x6y10(){ note_dtor("_ZN3ccc8CC2x6y10E", this);} // tgen
ccc::CC2x6y10 ::CC2x6y10(){ note_ctor("_ZN3ccc8CC2x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y10E, buf);
    ::ccc::CC2x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y10E);
    dp->::ccc::CC2x6y10::~CC2x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y10E(Test__ZN3ccc8CC2x6y10E, "_ZN3ccc8CC2x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y10C1Ev();
extern void _ZN3ccc8CC2x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y10E[] = {
  NSPAIR(_ZN3ccc8CC2x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y10E[];
extern void _ZN3ccc8CC2x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC2x6y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x6y103abcEv,_ZTv0_n16_N3ccc8CC2x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y103abcEv,_ZThn4_N3ccc8CC2x6y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x6y103pqrEv,_ZTv0_n20_N3ccc8CC2x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y103pqrEv,_ZThn4_N3ccc8CC2x6y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x6y103abcEv,_ZTv0_n16_N3ccc8CC2x6y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x6y103pqrEv,_ZTv0_n20_N3ccc8CC2x6y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y10E[] = {
  {&(_ZTVN3ccc8CC2x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y10E[];
static VTBL_ENTRY alt_thunk_names1065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x6y103pqrEv,_ZTv0_n20_N3ccc8CC2x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y103pqrEv,_ZThn4_N3ccc8CC2x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x6y103abcEv,_ZTv0_n16_N3ccc8CC2x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y103abcEv,_ZThn4_N3ccc8CC2x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x6y10E = {  "_ZN3ccc8CC2x6y10E", // class name
  bases__ZN3ccc8CC2x6y10E, 2,
  &(vtc__ZN3ccc8CC2x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y10E),2, //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  DD2x6y10  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD2x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x6y103abcEv
  ~DD2x6y10(); // tgen
  DD2x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x6y103pqrEv");}
void  ccc::DD2x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x6y103abcEv");}
ccc::DD2x6y10 ::~DD2x6y10(){ note_dtor("_ZN3ccc8DD2x6y10E", this);} // tgen
ccc::DD2x6y10 ::DD2x6y10(){ note_ctor("_ZN3ccc8DD2x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y10E, buf);
    ::ccc::DD2x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y10E);
    dp->::ccc::DD2x6y10::~DD2x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y10E(Test__ZN3ccc8DD2x6y10E, "_ZN3ccc8DD2x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y10C1Ev();
extern void _ZN3ccc8DD2x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y10E[] = {
  NSPAIR(_ZN3ccc8DD2x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x6y103abcEv();
extern void _ZN3ccc8DD2x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x6y103abcEv,_ZTv0_n12_N3ccc8DD2x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x6y103abcEv,_ZThn4_N3ccc8DD2x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x6y103abcEv,_ZTv0_n12_N3ccc8DD2x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y10E[] = {
  {&(_ZTVN3ccc8DD2x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y10E[];
static VTBL_ENTRY alt_thunk_names1066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x6y103abcEv,_ZTv0_n12_N3ccc8DD2x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x6y103abcEv,_ZThn4_N3ccc8DD2x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x6y10E = {  "_ZN3ccc8DD2x6y10E", // class name
  bases__ZN3ccc8DD2x6y10E, 2,
  &(vtc__ZN3ccc8DD2x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y10E),3, //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  CC2x6y11  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x6y113efgEv
  ~CC2x6y11(); // tgen
  CC2x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y11E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y113pqrEv");}
void  ccc::CC2x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x6y113efgEv");}
ccc::CC2x6y11 ::~CC2x6y11(){ note_dtor("_ZN3ccc8CC2x6y11E", this);} // tgen
ccc::CC2x6y11 ::CC2x6y11(){ note_ctor("_ZN3ccc8CC2x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y11E, buf);
    ::ccc::CC2x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y11E);
    dp->::ccc::CC2x6y11::~CC2x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y11E(Test__ZN3ccc8CC2x6y11E, "_ZN3ccc8CC2x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y11C1Ev();
extern void _ZN3ccc8CC2x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y11E[] = {
  NSPAIR(_ZN3ccc8CC2x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC2x6y113efgEv();
extern void _ZN3ccc8CC2x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x6y113efgEv,_ZTv0_n12_N3ccc8CC2x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y113efgEv,_ZThn4_N3ccc8CC2x6y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x6y113pqrEv,_ZTv0_n20_N3ccc8CC2x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y113pqrEv,_ZThn4_N3ccc8CC2x6y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x6y113efgEv,_ZTv0_n12_N3ccc8CC2x6y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x6y113pqrEv,_ZTv0_n20_N3ccc8CC2x6y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y11E[] = {
  {&(_ZTVN3ccc8CC2x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y11E[];
static VTBL_ENTRY alt_thunk_names1067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x6y113pqrEv,_ZTv0_n20_N3ccc8CC2x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y113pqrEv,_ZThn4_N3ccc8CC2x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x6y113efgEv,_ZTv0_n12_N3ccc8CC2x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y113efgEv,_ZThn4_N3ccc8CC2x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x6y11E = {  "_ZN3ccc8CC2x6y11E", // class name
  bases__ZN3ccc8CC2x6y11E, 2,
  &(vtc__ZN3ccc8CC2x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y11E),2, //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  DD2x6y11  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD2x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x6y113efgEv
  ~DD2x6y11(); // tgen
  DD2x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x6y113pqrEv");}
void  ccc::DD2x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x6y113efgEv");}
ccc::DD2x6y11 ::~DD2x6y11(){ note_dtor("_ZN3ccc8DD2x6y11E", this);} // tgen
ccc::DD2x6y11 ::DD2x6y11(){ note_ctor("_ZN3ccc8DD2x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y11E, buf);
    ::ccc::DD2x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y11E);
    dp->::ccc::DD2x6y11::~DD2x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y11E(Test__ZN3ccc8DD2x6y11E, "_ZN3ccc8DD2x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y11C1Ev();
extern void _ZN3ccc8DD2x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y11E[] = {
  NSPAIR(_ZN3ccc8DD2x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y11E[];
extern void _ZN3ccc8DD2x6y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x6y113efgEv,_ZTv0_n16_N3ccc8DD2x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x6y113efgEv,_ZThn4_N3ccc8DD2x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x6y113efgEv,_ZTv0_n16_N3ccc8DD2x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y11E[] = {
  {&(_ZTVN3ccc8DD2x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y11E[];
static VTBL_ENTRY alt_thunk_names1068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x6y113efgEv,_ZTv0_n16_N3ccc8DD2x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x6y113efgEv,_ZThn4_N3ccc8DD2x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x6y11E = {  "_ZN3ccc8DD2x6y11E", // class name
  bases__ZN3ccc8DD2x6y11E, 2,
  &(vtc__ZN3ccc8DD2x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y11E),3, //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  CC2x6y12  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC2x6y123abcEv
  ~CC2x6y12(); // tgen
  CC2x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x6y123abcEv");}
ccc::CC2x6y12 ::~CC2x6y12(){ note_dtor("_ZN3ccc8CC2x6y12E", this);} // tgen
ccc::CC2x6y12 ::CC2x6y12(){ note_ctor("_ZN3ccc8CC2x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y12E, buf);
    ::ccc::CC2x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y12E);
    dp->::ccc::CC2x6y12::~CC2x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y12E(Test__ZN3ccc8CC2x6y12E, "_ZN3ccc8CC2x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y12C1Ev();
extern void _ZN3ccc8CC2x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y12E[] = {
  NSPAIR(_ZN3ccc8CC2x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y12E[];
extern void _ZN3ccc8CC2x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x6y123abcEv,_ZTv0_n16_N3ccc8CC2x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y123abcEv,_ZThn4_N3ccc8CC2x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x6y123abcEv,_ZTv0_n16_N3ccc8CC2x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y12E[] = {
  {&(_ZTVN3ccc8CC2x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y12E[];
static VTBL_ENTRY alt_thunk_names1069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x6y123abcEv,_ZTv0_n16_N3ccc8CC2x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y123abcEv,_ZThn4_N3ccc8CC2x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x6y12E = {  "_ZN3ccc8CC2x6y12E", // class name
  bases__ZN3ccc8CC2x6y12E, 2,
  &(vtc__ZN3ccc8CC2x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y12E),2, //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  DD2x6y12  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD2x6y123abcEv
  ~DD2x6y12(); // tgen
  DD2x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x6y123abcEv");}
ccc::DD2x6y12 ::~DD2x6y12(){ note_dtor("_ZN3ccc8DD2x6y12E", this);} // tgen
ccc::DD2x6y12 ::DD2x6y12(){ note_ctor("_ZN3ccc8DD2x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y12E, buf);
    ::ccc::DD2x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y12E);
    dp->::ccc::DD2x6y12::~DD2x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y12E(Test__ZN3ccc8DD2x6y12E, "_ZN3ccc8DD2x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y12C1Ev();
extern void _ZN3ccc8DD2x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y12E[] = {
  NSPAIR(_ZN3ccc8DD2x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x6y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x6y123abcEv,_ZTv0_n12_N3ccc8DD2x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x6y123abcEv,_ZThn4_N3ccc8DD2x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x6y123abcEv,_ZTv0_n12_N3ccc8DD2x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y12E[] = {
  {&(_ZTVN3ccc8DD2x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y12E[];
static VTBL_ENTRY alt_thunk_names1070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x6y123abcEv,_ZTv0_n12_N3ccc8DD2x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x6y123abcEv,_ZThn4_N3ccc8DD2x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x6y12E = {  "_ZN3ccc8DD2x6y12E", // class name
  bases__ZN3ccc8DD2x6y12E, 2,
  &(vtc__ZN3ccc8DD2x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y12E),3, //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  CC2x6y13  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC2x6y133efgEv
  ~CC2x6y13(); // tgen
  CC2x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x6y133efgEv");}
ccc::CC2x6y13 ::~CC2x6y13(){ note_dtor("_ZN3ccc8CC2x6y13E", this);} // tgen
ccc::CC2x6y13 ::CC2x6y13(){ note_ctor("_ZN3ccc8CC2x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y13E, buf);
    ::ccc::CC2x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y13E);
    dp->::ccc::CC2x6y13::~CC2x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y13E(Test__ZN3ccc8CC2x6y13E, "_ZN3ccc8CC2x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y13C1Ev();
extern void _ZN3ccc8CC2x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y13E[] = {
  NSPAIR(_ZN3ccc8CC2x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC2x6y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x6y133efgEv,_ZTv0_n12_N3ccc8CC2x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y133efgEv,_ZThn4_N3ccc8CC2x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x6y133efgEv,_ZTv0_n12_N3ccc8CC2x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y13E[] = {
  {&(_ZTVN3ccc8CC2x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y13E[];
static VTBL_ENTRY alt_thunk_names1071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x6y133efgEv,_ZTv0_n12_N3ccc8CC2x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y133efgEv,_ZThn4_N3ccc8CC2x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x6y13E = {  "_ZN3ccc8CC2x6y13E", // class name
  bases__ZN3ccc8CC2x6y13E, 2,
  &(vtc__ZN3ccc8CC2x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y13E),2, //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  DD2x6y13  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD2x6y133efgEv
  ~DD2x6y13(); // tgen
  DD2x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x6y133efgEv");}
ccc::DD2x6y13 ::~DD2x6y13(){ note_dtor("_ZN3ccc8DD2x6y13E", this);} // tgen
ccc::DD2x6y13 ::DD2x6y13(){ note_ctor("_ZN3ccc8DD2x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y13E, buf);
    ::ccc::DD2x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y13E);
    dp->::ccc::DD2x6y13::~DD2x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y13E(Test__ZN3ccc8DD2x6y13E, "_ZN3ccc8DD2x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y13C1Ev();
extern void _ZN3ccc8DD2x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y13E[] = {
  NSPAIR(_ZN3ccc8DD2x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y13E[];
extern void _ZN3ccc8DD2x6y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x6y133efgEv,_ZTv0_n16_N3ccc8DD2x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x6y133efgEv,_ZThn4_N3ccc8DD2x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x6y133efgEv,_ZTv0_n16_N3ccc8DD2x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y13E[] = {
  {&(_ZTVN3ccc8DD2x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y13E[];
static VTBL_ENTRY alt_thunk_names1072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x6y133efgEv,_ZTv0_n16_N3ccc8DD2x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x6y133efgEv,_ZThn4_N3ccc8DD2x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x6y13E = {  "_ZN3ccc8DD2x6y13E", // class name
  bases__ZN3ccc8DD2x6y13E, 2,
  &(vtc__ZN3ccc8DD2x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y13E),3, //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  CC2x6y14  : virtual ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y143pqrEv
  ~CC2x6y14(); // tgen
  CC2x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y143pqrEv");}
ccc::CC2x6y14 ::~CC2x6y14(){ note_dtor("_ZN3ccc8CC2x6y14E", this);} // tgen
ccc::CC2x6y14 ::CC2x6y14(){ note_ctor("_ZN3ccc8CC2x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y14E, buf);
    ::ccc::CC2x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y14E);
    dp->::ccc::CC2x6y14::~CC2x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y14E(Test__ZN3ccc8CC2x6y14E, "_ZN3ccc8CC2x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y14C1Ev();
extern void _ZN3ccc8CC2x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y14E[] = {
  NSPAIR(_ZN3ccc8CC2x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC2x6y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x6y143pqrEv,_ZTv0_n20_N3ccc8CC2x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y143pqrEv,_ZThn4_N3ccc8CC2x6y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x6y143pqrEv,_ZTv0_n20_N3ccc8CC2x6y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y14E[] = {
  {&(_ZTVN3ccc8CC2x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y14E[];
static VTBL_ENTRY alt_thunk_names1073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x6y143pqrEv,_ZTv0_n20_N3ccc8CC2x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x6y143pqrEv,_ZThn4_N3ccc8CC2x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x6y14E = {  "_ZN3ccc8CC2x6y14E", // class name
  bases__ZN3ccc8CC2x6y14E, 2,
  &(vtc__ZN3ccc8CC2x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y14E),2, //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  DD2x6y14  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD2x6y143pqrEv
  ~DD2x6y14(); // tgen
  DD2x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x6y143pqrEv");}
ccc::DD2x6y14 ::~DD2x6y14(){ note_dtor("_ZN3ccc8DD2x6y14E", this);} // tgen
ccc::DD2x6y14 ::DD2x6y14(){ note_ctor("_ZN3ccc8DD2x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y14E, buf);
    ::ccc::DD2x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y14E);
    dp->::ccc::DD2x6y14::~DD2x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y14E(Test__ZN3ccc8DD2x6y14E, "_ZN3ccc8DD2x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y14C1Ev();
extern void _ZN3ccc8DD2x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y14E[] = {
  NSPAIR(_ZN3ccc8DD2x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y14E[] = {
  {&(_ZTVN3ccc8DD2x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y14E[];
Class_Descriptor cd__ZN3ccc8DD2x6y14E = {  "_ZN3ccc8DD2x6y14E", // class name
  bases__ZN3ccc8DD2x6y14E, 2,
  &(vtc__ZN3ccc8DD2x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y15  : virtual ::ccc::AA2 , ::ccc::BB6 {
  ~CC2x6y15(); // tgen
  CC2x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x6y15 ::~CC2x6y15(){ note_dtor("_ZN3ccc8CC2x6y15E", this);} // tgen
ccc::CC2x6y15 ::CC2x6y15(){ note_ctor("_ZN3ccc8CC2x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y15E, buf);
    ::ccc::CC2x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC2x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y15E);
    dp->::ccc::CC2x6y15::~CC2x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y15E(Test__ZN3ccc8CC2x6y15E, "_ZN3ccc8CC2x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y15C1Ev();
extern void _ZN3ccc8CC2x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y15E[] = {
  NSPAIR(_ZN3ccc8CC2x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x6y15E[] = {
  {&(_ZTVN3ccc8CC2x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x6y15E[];
Class_Descriptor cd__ZN3ccc8CC2x6y15E = {  "_ZN3ccc8CC2x6y15E", // class name
  bases__ZN3ccc8CC2x6y15E, 2,
  &(vtc__ZN3ccc8CC2x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x6y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x6y15  : virtual ::ccc::AA2 , virtual ::ccc::BB6 {
  ~DD2x6y15(); // tgen
  DD2x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x6y15 ::~DD2x6y15(){ note_dtor("_ZN3ccc8DD2x6y15E", this);} // tgen
ccc::DD2x6y15 ::DD2x6y15(){ note_ctor("_ZN3ccc8DD2x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x6y15E, buf);
    ::ccc::DD2x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x6y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD2x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x6y15E);
    dp->::ccc::DD2x6y15::~DD2x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x6y15E(Test__ZN3ccc8DD2x6y15E, "_ZN3ccc8DD2x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x6y15C1Ev();
extern void _ZN3ccc8DD2x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x6y15E[] = {
  NSPAIR(_ZN3ccc8DD2x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD2x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x6y15E[] = {
  {&(_ZTVN3ccc8DD2x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x6y15E[];
Class_Descriptor cd__ZN3ccc8DD2x6y15E = {  "_ZN3ccc8DD2x6y15E", // class name
  bases__ZN3ccc8DD2x6y15E, 2,
  &(vtc__ZN3ccc8DD2x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x6y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y0  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y03pqrEv
  ~CC2x7y0(); // tgen
  CC2x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y0E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y03abcEv");}
void  ccc::CC2x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y03efgEv");}
void  ccc::CC2x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y03pqrEv");}
ccc::CC2x7y0 ::~CC2x7y0(){ note_dtor("_ZN3ccc7CC2x7y0E", this);} // tgen
ccc::CC2x7y0 ::CC2x7y0(){ note_ctor("_ZN3ccc7CC2x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y0E, buf);
    ::ccc::CC2x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y0E);
    dp->::ccc::CC2x7y0::~CC2x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y0E(Test__ZN3ccc7CC2x7y0E, "_ZN3ccc7CC2x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y0C1Ev();
extern void _ZN3ccc7CC2x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y0E[] = {
  NSPAIR(_ZN3ccc7CC2x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y0E[];
extern void _ZN3ccc7CC2x7y03abcEv();
extern void _ZN3ccc7CC2x7y03pqrEv();
extern void _ZN3ccc7CC2x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y03efgEv,_ZTv0_n12_N3ccc7CC2x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y03efgEv,_ZThn4_N3ccc7CC2x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y03abcEv,_ZTv0_n16_N3ccc7CC2x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y03abcEv,_ZThn4_N3ccc7CC2x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y03pqrEv,_ZTv0_n20_N3ccc7CC2x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y03pqrEv,_ZThn4_N3ccc7CC2x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y03efgEv,_ZTv0_n12_N3ccc7CC2x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y03abcEv,_ZTv0_n16_N3ccc7CC2x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y03pqrEv,_ZTv0_n20_N3ccc7CC2x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y0E[] = {
  {&(_ZTVN3ccc7CC2x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y0E[];
static VTBL_ENTRY alt_thunk_names1074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y03pqrEv,_ZTv0_n20_N3ccc7CC2x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y03pqrEv,_ZThn4_N3ccc7CC2x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y03abcEv,_ZTv0_n16_N3ccc7CC2x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y03abcEv,_ZThn4_N3ccc7CC2x7y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y03efgEv,_ZTv0_n12_N3ccc7CC2x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y03efgEv,_ZThn4_N3ccc7CC2x7y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y0E = {  "_ZN3ccc7CC2x7y0E", // class name
  bases__ZN3ccc7CC2x7y0E, 2,
  &(vtc__ZN3ccc7CC2x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y0E),2, //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  DD2x7y0  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD2x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y03pqrEv
  ~DD2x7y0(); // tgen
  DD2x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y03abcEv");}
void  ccc::DD2x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y03efgEv");}
void  ccc::DD2x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y03pqrEv");}
ccc::DD2x7y0 ::~DD2x7y0(){ note_dtor("_ZN3ccc7DD2x7y0E", this);} // tgen
ccc::DD2x7y0 ::DD2x7y0(){ note_ctor("_ZN3ccc7DD2x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y0E, buf);
    ::ccc::DD2x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y0E);
    dp->::ccc::DD2x7y0::~DD2x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y0E(Test__ZN3ccc7DD2x7y0E, "_ZN3ccc7DD2x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y0C1Ev();
extern void _ZN3ccc7DD2x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y0E[] = {
  NSPAIR(_ZN3ccc7DD2x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y0E[];
extern void _ZN3ccc7DD2x7y03efgEv();
extern void _ZN3ccc7DD2x7y03abcEv();
extern void _ZN3ccc7DD2x7y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y03abcEv,_ZTv0_n12_N3ccc7DD2x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y03abcEv,_ZThn4_N3ccc7DD2x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y03pqrEv,_ZTv0_n16_N3ccc7DD2x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y03pqrEv,_ZThn4_N3ccc7DD2x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y03abcEv,_ZTv0_n12_N3ccc7DD2x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y03pqrEv,_ZTv0_n16_N3ccc7DD2x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y0E[] = {
  {&(_ZTVN3ccc7DD2x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y0E[];
static VTBL_ENTRY alt_thunk_names1075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y03pqrEv,_ZTv0_n16_N3ccc7DD2x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y03pqrEv,_ZThn4_N3ccc7DD2x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y03abcEv,_ZTv0_n12_N3ccc7DD2x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y03abcEv,_ZThn4_N3ccc7DD2x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y0E = {  "_ZN3ccc7DD2x7y0E", // class name
  bases__ZN3ccc7DD2x7y0E, 2,
  &(vtc__ZN3ccc7DD2x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y0E),3, //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  CC2x7y1  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x7y13efgEv
  ~CC2x7y1(); // tgen
  CC2x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y1E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y13abcEv");}
void  ccc::CC2x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y13pqrEv");}
void  ccc::CC2x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y13efgEv");}
ccc::CC2x7y1 ::~CC2x7y1(){ note_dtor("_ZN3ccc7CC2x7y1E", this);} // tgen
ccc::CC2x7y1 ::CC2x7y1(){ note_ctor("_ZN3ccc7CC2x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y1E, buf);
    ::ccc::CC2x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y1E);
    dp->::ccc::CC2x7y1::~CC2x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y1E(Test__ZN3ccc7CC2x7y1E, "_ZN3ccc7CC2x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y1C1Ev();
extern void _ZN3ccc7CC2x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y1E[] = {
  NSPAIR(_ZN3ccc7CC2x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y1E[];
extern void _ZN3ccc7CC2x7y13abcEv();
extern void _ZN3ccc7CC2x7y13pqrEv();
extern void _ZN3ccc7CC2x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y13efgEv,_ZTv0_n12_N3ccc7CC2x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y13efgEv,_ZThn4_N3ccc7CC2x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y13abcEv,_ZTv0_n16_N3ccc7CC2x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y13abcEv,_ZThn4_N3ccc7CC2x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y13pqrEv,_ZTv0_n20_N3ccc7CC2x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y13pqrEv,_ZThn4_N3ccc7CC2x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y13efgEv,_ZTv0_n12_N3ccc7CC2x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y13abcEv,_ZTv0_n16_N3ccc7CC2x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y13pqrEv,_ZTv0_n20_N3ccc7CC2x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y1E[] = {
  {&(_ZTVN3ccc7CC2x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y1E[];
static VTBL_ENTRY alt_thunk_names1076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y13pqrEv,_ZTv0_n20_N3ccc7CC2x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y13pqrEv,_ZThn4_N3ccc7CC2x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y13abcEv,_ZTv0_n16_N3ccc7CC2x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y13abcEv,_ZThn4_N3ccc7CC2x7y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y13efgEv,_ZTv0_n12_N3ccc7CC2x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y13efgEv,_ZThn4_N3ccc7CC2x7y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y1E = {  "_ZN3ccc7CC2x7y1E", // class name
  bases__ZN3ccc7CC2x7y1E, 2,
  &(vtc__ZN3ccc7CC2x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y1E),2, //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  DD2x7y1  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD2x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x7y13efgEv
  ~DD2x7y1(); // tgen
  DD2x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y13abcEv");}
void  ccc::DD2x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y13pqrEv");}
void  ccc::DD2x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y13efgEv");}
ccc::DD2x7y1 ::~DD2x7y1(){ note_dtor("_ZN3ccc7DD2x7y1E", this);} // tgen
ccc::DD2x7y1 ::DD2x7y1(){ note_ctor("_ZN3ccc7DD2x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y1E, buf);
    ::ccc::DD2x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y1E);
    dp->::ccc::DD2x7y1::~DD2x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y1E(Test__ZN3ccc7DD2x7y1E, "_ZN3ccc7DD2x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y1C1Ev();
extern void _ZN3ccc7DD2x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y1E[] = {
  NSPAIR(_ZN3ccc7DD2x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y1E[];
extern void _ZN3ccc7DD2x7y13efgEv();
extern void _ZN3ccc7DD2x7y13abcEv();
extern void _ZN3ccc7DD2x7y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y13abcEv,_ZTv0_n12_N3ccc7DD2x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y13abcEv,_ZThn4_N3ccc7DD2x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y13pqrEv,_ZTv0_n16_N3ccc7DD2x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y13pqrEv,_ZThn4_N3ccc7DD2x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y13abcEv,_ZTv0_n12_N3ccc7DD2x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y13pqrEv,_ZTv0_n16_N3ccc7DD2x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y1E[] = {
  {&(_ZTVN3ccc7DD2x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y1E[];
static VTBL_ENTRY alt_thunk_names1077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y13pqrEv,_ZTv0_n16_N3ccc7DD2x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y13pqrEv,_ZThn4_N3ccc7DD2x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y13abcEv,_ZTv0_n12_N3ccc7DD2x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y13abcEv,_ZThn4_N3ccc7DD2x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y1E = {  "_ZN3ccc7DD2x7y1E", // class name
  bases__ZN3ccc7DD2x7y1E, 2,
  &(vtc__ZN3ccc7DD2x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y1E),3, //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  CC2x7y2  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y23pqrEv
  ~CC2x7y2(); // tgen
  CC2x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y2E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y23efgEv");}
void  ccc::CC2x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y23abcEv");}
void  ccc::CC2x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y23pqrEv");}
ccc::CC2x7y2 ::~CC2x7y2(){ note_dtor("_ZN3ccc7CC2x7y2E", this);} // tgen
ccc::CC2x7y2 ::CC2x7y2(){ note_ctor("_ZN3ccc7CC2x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y2E, buf);
    ::ccc::CC2x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y2E);
    dp->::ccc::CC2x7y2::~CC2x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y2E(Test__ZN3ccc7CC2x7y2E, "_ZN3ccc7CC2x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y2C1Ev();
extern void _ZN3ccc7CC2x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y2E[] = {
  NSPAIR(_ZN3ccc7CC2x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y2E[];
extern void _ZN3ccc7CC2x7y23abcEv();
extern void _ZN3ccc7CC2x7y23pqrEv();
extern void _ZN3ccc7CC2x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y23efgEv,_ZTv0_n12_N3ccc7CC2x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y23efgEv,_ZThn4_N3ccc7CC2x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y23abcEv,_ZTv0_n16_N3ccc7CC2x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y23abcEv,_ZThn4_N3ccc7CC2x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y23pqrEv,_ZTv0_n20_N3ccc7CC2x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y23pqrEv,_ZThn4_N3ccc7CC2x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y23efgEv,_ZTv0_n12_N3ccc7CC2x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y23abcEv,_ZTv0_n16_N3ccc7CC2x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y23pqrEv,_ZTv0_n20_N3ccc7CC2x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y2E[] = {
  {&(_ZTVN3ccc7CC2x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y2E[];
static VTBL_ENTRY alt_thunk_names1078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y23pqrEv,_ZTv0_n20_N3ccc7CC2x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y23pqrEv,_ZThn4_N3ccc7CC2x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y23abcEv,_ZTv0_n16_N3ccc7CC2x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y23abcEv,_ZThn4_N3ccc7CC2x7y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y23efgEv,_ZTv0_n12_N3ccc7CC2x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y23efgEv,_ZThn4_N3ccc7CC2x7y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y2E = {  "_ZN3ccc7CC2x7y2E", // class name
  bases__ZN3ccc7CC2x7y2E, 2,
  &(vtc__ZN3ccc7CC2x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y2E),2, //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  DD2x7y2  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD2x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y23pqrEv
  ~DD2x7y2(); // tgen
  DD2x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y23efgEv");}
void  ccc::DD2x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y23abcEv");}
void  ccc::DD2x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y23pqrEv");}
ccc::DD2x7y2 ::~DD2x7y2(){ note_dtor("_ZN3ccc7DD2x7y2E", this);} // tgen
ccc::DD2x7y2 ::DD2x7y2(){ note_ctor("_ZN3ccc7DD2x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y2E, buf);
    ::ccc::DD2x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y2E);
    dp->::ccc::DD2x7y2::~DD2x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y2E(Test__ZN3ccc7DD2x7y2E, "_ZN3ccc7DD2x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y2C1Ev();
extern void _ZN3ccc7DD2x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y2E[] = {
  NSPAIR(_ZN3ccc7DD2x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y2E[];
extern void _ZN3ccc7DD2x7y23efgEv();
extern void _ZN3ccc7DD2x7y23abcEv();
extern void _ZN3ccc7DD2x7y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y23abcEv,_ZTv0_n12_N3ccc7DD2x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y23abcEv,_ZThn4_N3ccc7DD2x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y23pqrEv,_ZTv0_n16_N3ccc7DD2x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y23pqrEv,_ZThn4_N3ccc7DD2x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y23abcEv,_ZTv0_n12_N3ccc7DD2x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y23pqrEv,_ZTv0_n16_N3ccc7DD2x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y2E[] = {
  {&(_ZTVN3ccc7DD2x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y2E[];
static VTBL_ENTRY alt_thunk_names1079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y23pqrEv,_ZTv0_n16_N3ccc7DD2x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y23pqrEv,_ZThn4_N3ccc7DD2x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y23abcEv,_ZTv0_n12_N3ccc7DD2x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y23abcEv,_ZThn4_N3ccc7DD2x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y2E = {  "_ZN3ccc7DD2x7y2E", // class name
  bases__ZN3ccc7DD2x7y2E, 2,
  &(vtc__ZN3ccc7DD2x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y2E),3, //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  CC2x7y3  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x7y33abcEv
  ~CC2x7y3(); // tgen
  CC2x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y3E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y33efgEv");}
void  ccc::CC2x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y33pqrEv");}
void  ccc::CC2x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y33abcEv");}
ccc::CC2x7y3 ::~CC2x7y3(){ note_dtor("_ZN3ccc7CC2x7y3E", this);} // tgen
ccc::CC2x7y3 ::CC2x7y3(){ note_ctor("_ZN3ccc7CC2x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y3E, buf);
    ::ccc::CC2x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y3E);
    dp->::ccc::CC2x7y3::~CC2x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y3E(Test__ZN3ccc7CC2x7y3E, "_ZN3ccc7CC2x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y3C1Ev();
extern void _ZN3ccc7CC2x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y3E[] = {
  NSPAIR(_ZN3ccc7CC2x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y3E[];
extern void _ZN3ccc7CC2x7y33abcEv();
extern void _ZN3ccc7CC2x7y33pqrEv();
extern void _ZN3ccc7CC2x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y33efgEv,_ZTv0_n12_N3ccc7CC2x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y33efgEv,_ZThn4_N3ccc7CC2x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y33abcEv,_ZTv0_n16_N3ccc7CC2x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y33abcEv,_ZThn4_N3ccc7CC2x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y33pqrEv,_ZTv0_n20_N3ccc7CC2x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y33pqrEv,_ZThn4_N3ccc7CC2x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y33efgEv,_ZTv0_n12_N3ccc7CC2x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y33abcEv,_ZTv0_n16_N3ccc7CC2x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y33pqrEv,_ZTv0_n20_N3ccc7CC2x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y3E[] = {
  {&(_ZTVN3ccc7CC2x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y3E[];
static VTBL_ENTRY alt_thunk_names1080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y33pqrEv,_ZTv0_n20_N3ccc7CC2x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y33pqrEv,_ZThn4_N3ccc7CC2x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y33abcEv,_ZTv0_n16_N3ccc7CC2x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y33abcEv,_ZThn4_N3ccc7CC2x7y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y33efgEv,_ZTv0_n12_N3ccc7CC2x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y33efgEv,_ZThn4_N3ccc7CC2x7y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y3E = {  "_ZN3ccc7CC2x7y3E", // class name
  bases__ZN3ccc7CC2x7y3E, 2,
  &(vtc__ZN3ccc7CC2x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y3E),2, //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  DD2x7y3  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD2x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x7y33abcEv
  ~DD2x7y3(); // tgen
  DD2x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y33efgEv");}
void  ccc::DD2x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y33pqrEv");}
void  ccc::DD2x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y33abcEv");}
ccc::DD2x7y3 ::~DD2x7y3(){ note_dtor("_ZN3ccc7DD2x7y3E", this);} // tgen
ccc::DD2x7y3 ::DD2x7y3(){ note_ctor("_ZN3ccc7DD2x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y3E, buf);
    ::ccc::DD2x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y3E);
    dp->::ccc::DD2x7y3::~DD2x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y3E(Test__ZN3ccc7DD2x7y3E, "_ZN3ccc7DD2x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y3C1Ev();
extern void _ZN3ccc7DD2x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y3E[] = {
  NSPAIR(_ZN3ccc7DD2x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y3E[];
extern void _ZN3ccc7DD2x7y33efgEv();
extern void _ZN3ccc7DD2x7y33abcEv();
extern void _ZN3ccc7DD2x7y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y33abcEv,_ZTv0_n12_N3ccc7DD2x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y33abcEv,_ZThn4_N3ccc7DD2x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y33pqrEv,_ZTv0_n16_N3ccc7DD2x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y33pqrEv,_ZThn4_N3ccc7DD2x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y33abcEv,_ZTv0_n12_N3ccc7DD2x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y33pqrEv,_ZTv0_n16_N3ccc7DD2x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y3E[] = {
  {&(_ZTVN3ccc7DD2x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y3E[];
static VTBL_ENTRY alt_thunk_names1081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y33pqrEv,_ZTv0_n16_N3ccc7DD2x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y33pqrEv,_ZThn4_N3ccc7DD2x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y33abcEv,_ZTv0_n12_N3ccc7DD2x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y33abcEv,_ZThn4_N3ccc7DD2x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y3E = {  "_ZN3ccc7DD2x7y3E", // class name
  bases__ZN3ccc7DD2x7y3E, 2,
  &(vtc__ZN3ccc7DD2x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y3E),3, //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  CC2x7y4  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC2x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y43efgEv
  ~CC2x7y4(); // tgen
  CC2x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y4E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y43pqrEv");}
void  ccc::CC2x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y43abcEv");}
void  ccc::CC2x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y43efgEv");}
ccc::CC2x7y4 ::~CC2x7y4(){ note_dtor("_ZN3ccc7CC2x7y4E", this);} // tgen
ccc::CC2x7y4 ::CC2x7y4(){ note_ctor("_ZN3ccc7CC2x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y4E, buf);
    ::ccc::CC2x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y4E);
    dp->::ccc::CC2x7y4::~CC2x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y4E(Test__ZN3ccc7CC2x7y4E, "_ZN3ccc7CC2x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y4C1Ev();
extern void _ZN3ccc7CC2x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y4E[] = {
  NSPAIR(_ZN3ccc7CC2x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y4E[];
extern void _ZN3ccc7CC2x7y43abcEv();
extern void _ZN3ccc7CC2x7y43pqrEv();
extern void _ZN3ccc7CC2x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y43efgEv,_ZTv0_n12_N3ccc7CC2x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y43efgEv,_ZThn4_N3ccc7CC2x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y43abcEv,_ZTv0_n16_N3ccc7CC2x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y43abcEv,_ZThn4_N3ccc7CC2x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y43pqrEv,_ZTv0_n20_N3ccc7CC2x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y43pqrEv,_ZThn4_N3ccc7CC2x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y43efgEv,_ZTv0_n12_N3ccc7CC2x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y43abcEv,_ZTv0_n16_N3ccc7CC2x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y43pqrEv,_ZTv0_n20_N3ccc7CC2x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y4E[] = {
  {&(_ZTVN3ccc7CC2x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y4E[];
static VTBL_ENTRY alt_thunk_names1082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y43pqrEv,_ZTv0_n20_N3ccc7CC2x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y43pqrEv,_ZThn4_N3ccc7CC2x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y43abcEv,_ZTv0_n16_N3ccc7CC2x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y43abcEv,_ZThn4_N3ccc7CC2x7y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y43efgEv,_ZTv0_n12_N3ccc7CC2x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y43efgEv,_ZThn4_N3ccc7CC2x7y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y4E = {  "_ZN3ccc7CC2x7y4E", // class name
  bases__ZN3ccc7CC2x7y4E, 2,
  &(vtc__ZN3ccc7CC2x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y4E),2, //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  DD2x7y4  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD2x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x7y43efgEv
  ~DD2x7y4(); // tgen
  DD2x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y43pqrEv");}
void  ccc::DD2x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y43abcEv");}
void  ccc::DD2x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y43efgEv");}
ccc::DD2x7y4 ::~DD2x7y4(){ note_dtor("_ZN3ccc7DD2x7y4E", this);} // tgen
ccc::DD2x7y4 ::DD2x7y4(){ note_ctor("_ZN3ccc7DD2x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y4E, buf);
    ::ccc::DD2x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y4E);
    dp->::ccc::DD2x7y4::~DD2x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y4E(Test__ZN3ccc7DD2x7y4E, "_ZN3ccc7DD2x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y4C1Ev();
extern void _ZN3ccc7DD2x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y4E[] = {
  NSPAIR(_ZN3ccc7DD2x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y4E[];
extern void _ZN3ccc7DD2x7y43efgEv();
extern void _ZN3ccc7DD2x7y43abcEv();
extern void _ZN3ccc7DD2x7y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y43abcEv,_ZTv0_n12_N3ccc7DD2x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y43abcEv,_ZThn4_N3ccc7DD2x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y43pqrEv,_ZTv0_n16_N3ccc7DD2x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y43pqrEv,_ZThn4_N3ccc7DD2x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y43abcEv,_ZTv0_n12_N3ccc7DD2x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y43pqrEv,_ZTv0_n16_N3ccc7DD2x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y4E[] = {
  {&(_ZTVN3ccc7DD2x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y4E[];
static VTBL_ENTRY alt_thunk_names1083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y43pqrEv,_ZTv0_n16_N3ccc7DD2x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y43pqrEv,_ZThn4_N3ccc7DD2x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y43abcEv,_ZTv0_n12_N3ccc7DD2x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y43abcEv,_ZThn4_N3ccc7DD2x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y4E = {  "_ZN3ccc7DD2x7y4E", // class name
  bases__ZN3ccc7DD2x7y4E, 2,
  &(vtc__ZN3ccc7DD2x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y4E),3, //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  CC2x7y5  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC2x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y53abcEv
  ~CC2x7y5(); // tgen
  CC2x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y5E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y53pqrEv");}
void  ccc::CC2x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y53efgEv");}
void  ccc::CC2x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y53abcEv");}
ccc::CC2x7y5 ::~CC2x7y5(){ note_dtor("_ZN3ccc7CC2x7y5E", this);} // tgen
ccc::CC2x7y5 ::CC2x7y5(){ note_ctor("_ZN3ccc7CC2x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y5E, buf);
    ::ccc::CC2x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y5E);
    dp->::ccc::CC2x7y5::~CC2x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y5E(Test__ZN3ccc7CC2x7y5E, "_ZN3ccc7CC2x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y5C1Ev();
extern void _ZN3ccc7CC2x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y5E[] = {
  NSPAIR(_ZN3ccc7CC2x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y5E[];
extern void _ZN3ccc7CC2x7y53abcEv();
extern void _ZN3ccc7CC2x7y53pqrEv();
extern void _ZN3ccc7CC2x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y53efgEv,_ZTv0_n12_N3ccc7CC2x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y53efgEv,_ZThn4_N3ccc7CC2x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y53abcEv,_ZTv0_n16_N3ccc7CC2x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y53abcEv,_ZThn4_N3ccc7CC2x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y53pqrEv,_ZTv0_n20_N3ccc7CC2x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y53pqrEv,_ZThn4_N3ccc7CC2x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y53efgEv,_ZTv0_n12_N3ccc7CC2x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y53abcEv,_ZTv0_n16_N3ccc7CC2x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y53pqrEv,_ZTv0_n20_N3ccc7CC2x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y5E[] = {
  {&(_ZTVN3ccc7CC2x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y5E[];
static VTBL_ENTRY alt_thunk_names1084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y53pqrEv,_ZTv0_n20_N3ccc7CC2x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y53pqrEv,_ZThn4_N3ccc7CC2x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y53abcEv,_ZTv0_n16_N3ccc7CC2x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y53abcEv,_ZThn4_N3ccc7CC2x7y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y53efgEv,_ZTv0_n12_N3ccc7CC2x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y53efgEv,_ZThn4_N3ccc7CC2x7y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y5E = {  "_ZN3ccc7CC2x7y5E", // class name
  bases__ZN3ccc7CC2x7y5E, 2,
  &(vtc__ZN3ccc7CC2x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y5E),2, //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  DD2x7y5  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD2x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x7y53abcEv
  ~DD2x7y5(); // tgen
  DD2x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y53pqrEv");}
void  ccc::DD2x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y53efgEv");}
void  ccc::DD2x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y53abcEv");}
ccc::DD2x7y5 ::~DD2x7y5(){ note_dtor("_ZN3ccc7DD2x7y5E", this);} // tgen
ccc::DD2x7y5 ::DD2x7y5(){ note_ctor("_ZN3ccc7DD2x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y5E, buf);
    ::ccc::DD2x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y5E);
    dp->::ccc::DD2x7y5::~DD2x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y5E(Test__ZN3ccc7DD2x7y5E, "_ZN3ccc7DD2x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y5C1Ev();
extern void _ZN3ccc7DD2x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y5E[] = {
  NSPAIR(_ZN3ccc7DD2x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y5E[];
extern void _ZN3ccc7DD2x7y53efgEv();
extern void _ZN3ccc7DD2x7y53abcEv();
extern void _ZN3ccc7DD2x7y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y53abcEv,_ZTv0_n12_N3ccc7DD2x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y53abcEv,_ZThn4_N3ccc7DD2x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y53pqrEv,_ZTv0_n16_N3ccc7DD2x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y53pqrEv,_ZThn4_N3ccc7DD2x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y53abcEv,_ZTv0_n12_N3ccc7DD2x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y53pqrEv,_ZTv0_n16_N3ccc7DD2x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y5E[] = {
  {&(_ZTVN3ccc7DD2x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y5E[];
static VTBL_ENTRY alt_thunk_names1085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y53pqrEv,_ZTv0_n16_N3ccc7DD2x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y53pqrEv,_ZThn4_N3ccc7DD2x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y53abcEv,_ZTv0_n12_N3ccc7DD2x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y53abcEv,_ZThn4_N3ccc7DD2x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y5E = {  "_ZN3ccc7DD2x7y5E", // class name
  bases__ZN3ccc7DD2x7y5E, 2,
  &(vtc__ZN3ccc7DD2x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y5E),3, //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  CC2x7y6  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y63efgEv
  ~CC2x7y6(); // tgen
  CC2x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y6E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y63abcEv");}
void  ccc::CC2x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y63efgEv");}
ccc::CC2x7y6 ::~CC2x7y6(){ note_dtor("_ZN3ccc7CC2x7y6E", this);} // tgen
ccc::CC2x7y6 ::CC2x7y6(){ note_ctor("_ZN3ccc7CC2x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y6E, buf);
    ::ccc::CC2x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y6E);
    dp->::ccc::CC2x7y6::~CC2x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y6E(Test__ZN3ccc7CC2x7y6E, "_ZN3ccc7CC2x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y6C1Ev();
extern void _ZN3ccc7CC2x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y6E[] = {
  NSPAIR(_ZN3ccc7CC2x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y6E[];
extern void _ZN3ccc7CC2x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC2x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y63efgEv,_ZTv0_n12_N3ccc7CC2x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y63efgEv,_ZThn4_N3ccc7CC2x7y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y63abcEv,_ZTv0_n16_N3ccc7CC2x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y63abcEv,_ZThn4_N3ccc7CC2x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y63efgEv,_ZTv0_n12_N3ccc7CC2x7y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y63abcEv,_ZTv0_n16_N3ccc7CC2x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y6E[] = {
  {&(_ZTVN3ccc7CC2x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y6E[];
static VTBL_ENTRY alt_thunk_names1086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y63abcEv,_ZTv0_n16_N3ccc7CC2x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y63abcEv,_ZThn4_N3ccc7CC2x7y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y63efgEv,_ZTv0_n12_N3ccc7CC2x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y63efgEv,_ZThn4_N3ccc7CC2x7y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y6E = {  "_ZN3ccc7CC2x7y6E", // class name
  bases__ZN3ccc7CC2x7y6E, 2,
  &(vtc__ZN3ccc7CC2x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y6E),2, //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  DD2x7y6  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD2x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x7y63efgEv
  ~DD2x7y6(); // tgen
  DD2x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y63abcEv");}
void  ccc::DD2x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y63efgEv");}
ccc::DD2x7y6 ::~DD2x7y6(){ note_dtor("_ZN3ccc7DD2x7y6E", this);} // tgen
ccc::DD2x7y6 ::DD2x7y6(){ note_ctor("_ZN3ccc7DD2x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y6E, buf);
    ::ccc::DD2x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y6E);
    dp->::ccc::DD2x7y6::~DD2x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y6E(Test__ZN3ccc7DD2x7y6E, "_ZN3ccc7DD2x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y6C1Ev();
extern void _ZN3ccc7DD2x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y6E[] = {
  NSPAIR(_ZN3ccc7DD2x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y6E[];
extern void _ZN3ccc7DD2x7y63efgEv();
extern void _ZN3ccc7DD2x7y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y63abcEv,_ZTv0_n12_N3ccc7DD2x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y63abcEv,_ZThn4_N3ccc7DD2x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y63abcEv,_ZTv0_n12_N3ccc7DD2x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y6E[] = {
  {&(_ZTVN3ccc7DD2x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y6E[];
static VTBL_ENTRY alt_thunk_names1087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y63abcEv,_ZTv0_n12_N3ccc7DD2x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y63abcEv,_ZThn4_N3ccc7DD2x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y6E = {  "_ZN3ccc7DD2x7y6E", // class name
  bases__ZN3ccc7DD2x7y6E, 2,
  &(vtc__ZN3ccc7DD2x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y6E),3, //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  CC2x7y7  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y73pqrEv
  ~CC2x7y7(); // tgen
  CC2x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y7E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y73abcEv");}
void  ccc::CC2x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y73pqrEv");}
ccc::CC2x7y7 ::~CC2x7y7(){ note_dtor("_ZN3ccc7CC2x7y7E", this);} // tgen
ccc::CC2x7y7 ::CC2x7y7(){ note_ctor("_ZN3ccc7CC2x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y7E, buf);
    ::ccc::CC2x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y7E);
    dp->::ccc::CC2x7y7::~CC2x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y7E(Test__ZN3ccc7CC2x7y7E, "_ZN3ccc7CC2x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y7C1Ev();
extern void _ZN3ccc7CC2x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y7E[] = {
  NSPAIR(_ZN3ccc7CC2x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y7E[];
extern void _ZN3ccc7CC2x7y73abcEv();
extern void _ZN3ccc7CC2x7y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y73abcEv,_ZTv0_n16_N3ccc7CC2x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y73abcEv,_ZThn4_N3ccc7CC2x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y73pqrEv,_ZTv0_n20_N3ccc7CC2x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y73pqrEv,_ZThn4_N3ccc7CC2x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y73abcEv,_ZTv0_n16_N3ccc7CC2x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y73pqrEv,_ZTv0_n20_N3ccc7CC2x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y7E[] = {
  {&(_ZTVN3ccc7CC2x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y7E[];
static VTBL_ENTRY alt_thunk_names1088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y73pqrEv,_ZTv0_n20_N3ccc7CC2x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y73pqrEv,_ZThn4_N3ccc7CC2x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y73abcEv,_ZTv0_n16_N3ccc7CC2x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y73abcEv,_ZThn4_N3ccc7CC2x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y7E = {  "_ZN3ccc7CC2x7y7E", // class name
  bases__ZN3ccc7CC2x7y7E, 2,
  &(vtc__ZN3ccc7CC2x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y7E),2, //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  DD2x7y7  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD2x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y73pqrEv
  ~DD2x7y7(); // tgen
  DD2x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y73abcEv");}
void  ccc::DD2x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y73pqrEv");}
ccc::DD2x7y7 ::~DD2x7y7(){ note_dtor("_ZN3ccc7DD2x7y7E", this);} // tgen
ccc::DD2x7y7 ::DD2x7y7(){ note_ctor("_ZN3ccc7DD2x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y7E, buf);
    ::ccc::DD2x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y7E);
    dp->::ccc::DD2x7y7::~DD2x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y7E(Test__ZN3ccc7DD2x7y7E, "_ZN3ccc7DD2x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y7C1Ev();
extern void _ZN3ccc7DD2x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y7E[] = {
  NSPAIR(_ZN3ccc7DD2x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x7y73abcEv();
extern void _ZN3ccc7DD2x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y73abcEv,_ZTv0_n12_N3ccc7DD2x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y73abcEv,_ZThn4_N3ccc7DD2x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y73pqrEv,_ZTv0_n16_N3ccc7DD2x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y73pqrEv,_ZThn4_N3ccc7DD2x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y73abcEv,_ZTv0_n12_N3ccc7DD2x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y73pqrEv,_ZTv0_n16_N3ccc7DD2x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y7E[] = {
  {&(_ZTVN3ccc7DD2x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y7E[];
static VTBL_ENTRY alt_thunk_names1089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y73pqrEv,_ZTv0_n16_N3ccc7DD2x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y73pqrEv,_ZThn4_N3ccc7DD2x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y73abcEv,_ZTv0_n12_N3ccc7DD2x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y73abcEv,_ZThn4_N3ccc7DD2x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y7E = {  "_ZN3ccc7DD2x7y7E", // class name
  bases__ZN3ccc7DD2x7y7E, 2,
  &(vtc__ZN3ccc7DD2x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y7E),3, //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  CC2x7y8  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y83abcEv
  ~CC2x7y8(); // tgen
  CC2x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y8E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y83efgEv");}
void  ccc::CC2x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y83abcEv");}
ccc::CC2x7y8 ::~CC2x7y8(){ note_dtor("_ZN3ccc7CC2x7y8E", this);} // tgen
ccc::CC2x7y8 ::CC2x7y8(){ note_ctor("_ZN3ccc7CC2x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y8E, buf);
    ::ccc::CC2x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y8E);
    dp->::ccc::CC2x7y8::~CC2x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y8E(Test__ZN3ccc7CC2x7y8E, "_ZN3ccc7CC2x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y8C1Ev();
extern void _ZN3ccc7CC2x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y8E[] = {
  NSPAIR(_ZN3ccc7CC2x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y8E[];
extern void _ZN3ccc7CC2x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC2x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y83efgEv,_ZTv0_n12_N3ccc7CC2x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y83efgEv,_ZThn4_N3ccc7CC2x7y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x7y83abcEv,_ZTv0_n16_N3ccc7CC2x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y83abcEv,_ZThn4_N3ccc7CC2x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y83efgEv,_ZTv0_n12_N3ccc7CC2x7y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x7y83abcEv,_ZTv0_n16_N3ccc7CC2x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y8E[] = {
  {&(_ZTVN3ccc7CC2x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y8E[];
static VTBL_ENTRY alt_thunk_names1090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x7y83abcEv,_ZTv0_n16_N3ccc7CC2x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y83abcEv,_ZThn4_N3ccc7CC2x7y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y83efgEv,_ZTv0_n12_N3ccc7CC2x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y83efgEv,_ZThn4_N3ccc7CC2x7y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y8E = {  "_ZN3ccc7CC2x7y8E", // class name
  bases__ZN3ccc7CC2x7y8E, 2,
  &(vtc__ZN3ccc7CC2x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y8E),2, //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  DD2x7y8  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD2x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x7y83abcEv
  ~DD2x7y8(); // tgen
  DD2x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y83efgEv");}
void  ccc::DD2x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x7y83abcEv");}
ccc::DD2x7y8 ::~DD2x7y8(){ note_dtor("_ZN3ccc7DD2x7y8E", this);} // tgen
ccc::DD2x7y8 ::DD2x7y8(){ note_ctor("_ZN3ccc7DD2x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y8E, buf);
    ::ccc::DD2x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y8E);
    dp->::ccc::DD2x7y8::~DD2x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y8E(Test__ZN3ccc7DD2x7y8E, "_ZN3ccc7DD2x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y8C1Ev();
extern void _ZN3ccc7DD2x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y8E[] = {
  NSPAIR(_ZN3ccc7DD2x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y8E[];
extern void _ZN3ccc7DD2x7y83efgEv();
extern void _ZN3ccc7DD2x7y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x7y83abcEv,_ZTv0_n12_N3ccc7DD2x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y83abcEv,_ZThn4_N3ccc7DD2x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x7y83abcEv,_ZTv0_n12_N3ccc7DD2x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y8E[] = {
  {&(_ZTVN3ccc7DD2x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y8E[];
static VTBL_ENTRY alt_thunk_names1091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x7y83abcEv,_ZTv0_n12_N3ccc7DD2x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y83abcEv,_ZThn4_N3ccc7DD2x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y8E = {  "_ZN3ccc7DD2x7y8E", // class name
  bases__ZN3ccc7DD2x7y8E, 2,
  &(vtc__ZN3ccc7DD2x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y8E),3, //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  CC2x7y9  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y93pqrEv
  ~CC2x7y9(); // tgen
  CC2x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y9E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y93efgEv");}
void  ccc::CC2x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y93pqrEv");}
ccc::CC2x7y9 ::~CC2x7y9(){ note_dtor("_ZN3ccc7CC2x7y9E", this);} // tgen
ccc::CC2x7y9 ::CC2x7y9(){ note_ctor("_ZN3ccc7CC2x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y9E, buf);
    ::ccc::CC2x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC2x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y9E);
    dp->::ccc::CC2x7y9::~CC2x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y9E(Test__ZN3ccc7CC2x7y9E, "_ZN3ccc7CC2x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y9C1Ev();
extern void _ZN3ccc7CC2x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y9E[] = {
  NSPAIR(_ZN3ccc7CC2x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC2x7y93pqrEv();
extern void _ZN3ccc7CC2x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x7y93efgEv,_ZTv0_n12_N3ccc7CC2x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y93efgEv,_ZThn4_N3ccc7CC2x7y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x7y93pqrEv,_ZTv0_n20_N3ccc7CC2x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y93pqrEv,_ZThn4_N3ccc7CC2x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x7y93efgEv,_ZTv0_n12_N3ccc7CC2x7y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x7y93pqrEv,_ZTv0_n20_N3ccc7CC2x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x7y9E[] = {
  {&(_ZTVN3ccc7CC2x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x7y9E[];
static VTBL_ENTRY alt_thunk_names1092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x7y93pqrEv,_ZTv0_n20_N3ccc7CC2x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y93pqrEv,_ZThn4_N3ccc7CC2x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x7y93efgEv,_ZTv0_n12_N3ccc7CC2x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x7y93efgEv,_ZThn4_N3ccc7CC2x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x7y9E = {  "_ZN3ccc7CC2x7y9E", // class name
  bases__ZN3ccc7CC2x7y9E, 2,
  &(vtc__ZN3ccc7CC2x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x7y9E),2, //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  DD2x7y9  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD2x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x7y93pqrEv
  ~DD2x7y9(); // tgen
  DD2x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x7y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x7y93efgEv");}
void  ccc::DD2x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x7y93pqrEv");}
ccc::DD2x7y9 ::~DD2x7y9(){ note_dtor("_ZN3ccc7DD2x7y9E", this);} // tgen
ccc::DD2x7y9 ::DD2x7y9(){ note_ctor("_ZN3ccc7DD2x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x7y9E, buf);
    ::ccc::DD2x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x7y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD2x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x7y9E);
    dp->::ccc::DD2x7y9::~DD2x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x7y9E(Test__ZN3ccc7DD2x7y9E, "_ZN3ccc7DD2x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x7y9C1Ev();
extern void _ZN3ccc7DD2x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x7y9E[] = {
  NSPAIR(_ZN3ccc7DD2x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD2x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y9E[];
extern void _ZN3ccc7DD2x7y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x7y93pqrEv,_ZTv0_n16_N3ccc7DD2x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x7y93pqrEv,_ZThn4_N3ccc7DD2x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x7y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x7y93pqrEv,_ZTv0_n16_N3ccc7DD2x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x7y9E[] = {
  {&(_ZTVN3ccc7DD2x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x7y9E[];
static VTBL_ENTRY alt_thunk_names1093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x7y93pqrEv,_ZTv0_n16_N3ccc7DD2x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x7y93pqrEv,_ZThn4_N3ccc7DD2x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x7y9E = {  "_ZN3ccc7DD2x7y9E", // class name
  bases__ZN3ccc7DD2x7y9E, 2,
  &(vtc__ZN3ccc7DD2x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x7y9E),3, //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  CC2x7y10  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x7y103abcEv
  ~CC2x7y10(); // tgen
  CC2x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y10E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y103pqrEv");}
void  ccc::CC2x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x7y103abcEv");}
ccc::CC2x7y10 ::~CC2x7y10(){ note_dtor("_ZN3ccc8CC2x7y10E", this);} // tgen
ccc::CC2x7y10 ::CC2x7y10(){ note_ctor("_ZN3ccc8CC2x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y10E, buf);
    ::ccc::CC2x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y10E);
    dp->::ccc::CC2x7y10::~CC2x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y10E(Test__ZN3ccc8CC2x7y10E, "_ZN3ccc8CC2x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y10C1Ev();
extern void _ZN3ccc8CC2x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y10E[] = {
  NSPAIR(_ZN3ccc8CC2x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y10E[];
extern void _ZN3ccc8CC2x7y103abcEv();
extern void _ZN3ccc8CC2x7y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x7y103abcEv,_ZTv0_n16_N3ccc8CC2x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y103abcEv,_ZThn4_N3ccc8CC2x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x7y103pqrEv,_ZTv0_n20_N3ccc8CC2x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y103pqrEv,_ZThn4_N3ccc8CC2x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x7y103abcEv,_ZTv0_n16_N3ccc8CC2x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x7y103pqrEv,_ZTv0_n20_N3ccc8CC2x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y10E[] = {
  {&(_ZTVN3ccc8CC2x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y10E[];
static VTBL_ENTRY alt_thunk_names1094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x7y103pqrEv,_ZTv0_n20_N3ccc8CC2x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y103pqrEv,_ZThn4_N3ccc8CC2x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x7y103abcEv,_ZTv0_n16_N3ccc8CC2x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y103abcEv,_ZThn4_N3ccc8CC2x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x7y10E = {  "_ZN3ccc8CC2x7y10E", // class name
  bases__ZN3ccc8CC2x7y10E, 2,
  &(vtc__ZN3ccc8CC2x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y10E),2, //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  DD2x7y10  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD2x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x7y103abcEv
  ~DD2x7y10(); // tgen
  DD2x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x7y103pqrEv");}
void  ccc::DD2x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x7y103abcEv");}
ccc::DD2x7y10 ::~DD2x7y10(){ note_dtor("_ZN3ccc8DD2x7y10E", this);} // tgen
ccc::DD2x7y10 ::DD2x7y10(){ note_ctor("_ZN3ccc8DD2x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y10E, buf);
    ::ccc::DD2x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y10E);
    dp->::ccc::DD2x7y10::~DD2x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y10E(Test__ZN3ccc8DD2x7y10E, "_ZN3ccc8DD2x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y10C1Ev();
extern void _ZN3ccc8DD2x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y10E[] = {
  NSPAIR(_ZN3ccc8DD2x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x7y103abcEv();
extern void _ZN3ccc8DD2x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x7y103abcEv,_ZTv0_n12_N3ccc8DD2x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x7y103abcEv,_ZThn4_N3ccc8DD2x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x7y103pqrEv,_ZTv0_n16_N3ccc8DD2x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x7y103pqrEv,_ZThn4_N3ccc8DD2x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x7y103abcEv,_ZTv0_n12_N3ccc8DD2x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x7y103pqrEv,_ZTv0_n16_N3ccc8DD2x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y10E[] = {
  {&(_ZTVN3ccc8DD2x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y10E[];
static VTBL_ENTRY alt_thunk_names1095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x7y103pqrEv,_ZTv0_n16_N3ccc8DD2x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x7y103pqrEv,_ZThn4_N3ccc8DD2x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x7y103abcEv,_ZTv0_n12_N3ccc8DD2x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x7y103abcEv,_ZThn4_N3ccc8DD2x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x7y10E = {  "_ZN3ccc8DD2x7y10E", // class name
  bases__ZN3ccc8DD2x7y10E, 2,
  &(vtc__ZN3ccc8DD2x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y10E),3, //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  CC2x7y11  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x7y113efgEv
  ~CC2x7y11(); // tgen
  CC2x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y11E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y113pqrEv");}
void  ccc::CC2x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x7y113efgEv");}
ccc::CC2x7y11 ::~CC2x7y11(){ note_dtor("_ZN3ccc8CC2x7y11E", this);} // tgen
ccc::CC2x7y11 ::CC2x7y11(){ note_ctor("_ZN3ccc8CC2x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y11E, buf);
    ::ccc::CC2x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y11E);
    dp->::ccc::CC2x7y11::~CC2x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y11E(Test__ZN3ccc8CC2x7y11E, "_ZN3ccc8CC2x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y11C1Ev();
extern void _ZN3ccc8CC2x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y11E[] = {
  NSPAIR(_ZN3ccc8CC2x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC2x7y113pqrEv();
extern void _ZN3ccc8CC2x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x7y113efgEv,_ZTv0_n12_N3ccc8CC2x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y113efgEv,_ZThn4_N3ccc8CC2x7y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x7y113pqrEv,_ZTv0_n20_N3ccc8CC2x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y113pqrEv,_ZThn4_N3ccc8CC2x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x7y113efgEv,_ZTv0_n12_N3ccc8CC2x7y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x7y113pqrEv,_ZTv0_n20_N3ccc8CC2x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y11E[] = {
  {&(_ZTVN3ccc8CC2x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y11E[];
static VTBL_ENTRY alt_thunk_names1096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x7y113pqrEv,_ZTv0_n20_N3ccc8CC2x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y113pqrEv,_ZThn4_N3ccc8CC2x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x7y113efgEv,_ZTv0_n12_N3ccc8CC2x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y113efgEv,_ZThn4_N3ccc8CC2x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x7y11E = {  "_ZN3ccc8CC2x7y11E", // class name
  bases__ZN3ccc8CC2x7y11E, 2,
  &(vtc__ZN3ccc8CC2x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y11E),2, //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  DD2x7y11  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD2x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x7y113efgEv
  ~DD2x7y11(); // tgen
  DD2x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x7y113pqrEv");}
void  ccc::DD2x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x7y113efgEv");}
ccc::DD2x7y11 ::~DD2x7y11(){ note_dtor("_ZN3ccc8DD2x7y11E", this);} // tgen
ccc::DD2x7y11 ::DD2x7y11(){ note_ctor("_ZN3ccc8DD2x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y11E, buf);
    ::ccc::DD2x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y11E);
    dp->::ccc::DD2x7y11::~DD2x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y11E(Test__ZN3ccc8DD2x7y11E, "_ZN3ccc8DD2x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y11C1Ev();
extern void _ZN3ccc8DD2x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y11E[] = {
  NSPAIR(_ZN3ccc8DD2x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y11E[];
extern void _ZN3ccc8DD2x7y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x7y113pqrEv,_ZTv0_n16_N3ccc8DD2x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x7y113pqrEv,_ZThn4_N3ccc8DD2x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x7y113pqrEv,_ZTv0_n16_N3ccc8DD2x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y11E[] = {
  {&(_ZTVN3ccc8DD2x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y11E[];
static VTBL_ENTRY alt_thunk_names1097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x7y113pqrEv,_ZTv0_n16_N3ccc8DD2x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x7y113pqrEv,_ZThn4_N3ccc8DD2x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x7y11E = {  "_ZN3ccc8DD2x7y11E", // class name
  bases__ZN3ccc8DD2x7y11E, 2,
  &(vtc__ZN3ccc8DD2x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y11E),3, //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  CC2x7y12  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC2x7y123abcEv
  ~CC2x7y12(); // tgen
  CC2x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x7y123abcEv");}
ccc::CC2x7y12 ::~CC2x7y12(){ note_dtor("_ZN3ccc8CC2x7y12E", this);} // tgen
ccc::CC2x7y12 ::CC2x7y12(){ note_ctor("_ZN3ccc8CC2x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y12E, buf);
    ::ccc::CC2x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y12E);
    dp->::ccc::CC2x7y12::~CC2x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y12E(Test__ZN3ccc8CC2x7y12E, "_ZN3ccc8CC2x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y12C1Ev();
extern void _ZN3ccc8CC2x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y12E[] = {
  NSPAIR(_ZN3ccc8CC2x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y12E[];
extern void _ZN3ccc8CC2x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x7y123abcEv,_ZTv0_n16_N3ccc8CC2x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y123abcEv,_ZThn4_N3ccc8CC2x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x7y123abcEv,_ZTv0_n16_N3ccc8CC2x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y12E[] = {
  {&(_ZTVN3ccc8CC2x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y12E[];
static VTBL_ENTRY alt_thunk_names1098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x7y123abcEv,_ZTv0_n16_N3ccc8CC2x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y123abcEv,_ZThn4_N3ccc8CC2x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x7y12E = {  "_ZN3ccc8CC2x7y12E", // class name
  bases__ZN3ccc8CC2x7y12E, 2,
  &(vtc__ZN3ccc8CC2x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y12E),2, //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  DD2x7y12  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD2x7y123abcEv
  ~DD2x7y12(); // tgen
  DD2x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x7y123abcEv");}
ccc::DD2x7y12 ::~DD2x7y12(){ note_dtor("_ZN3ccc8DD2x7y12E", this);} // tgen
ccc::DD2x7y12 ::DD2x7y12(){ note_ctor("_ZN3ccc8DD2x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y12E, buf);
    ::ccc::DD2x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y12E);
    dp->::ccc::DD2x7y12::~DD2x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y12E(Test__ZN3ccc8DD2x7y12E, "_ZN3ccc8DD2x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y12C1Ev();
extern void _ZN3ccc8DD2x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y12E[] = {
  NSPAIR(_ZN3ccc8DD2x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x7y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x7y123abcEv,_ZTv0_n12_N3ccc8DD2x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x7y123abcEv,_ZThn4_N3ccc8DD2x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x7y123abcEv,_ZTv0_n12_N3ccc8DD2x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y12E[] = {
  {&(_ZTVN3ccc8DD2x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y12E[];
static VTBL_ENTRY alt_thunk_names1099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x7y123abcEv,_ZTv0_n12_N3ccc8DD2x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x7y123abcEv,_ZThn4_N3ccc8DD2x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x7y12E = {  "_ZN3ccc8DD2x7y12E", // class name
  bases__ZN3ccc8DD2x7y12E, 2,
  &(vtc__ZN3ccc8DD2x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y12E),3, //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  CC2x7y13  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC2x7y133efgEv
  ~CC2x7y13(); // tgen
  CC2x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x7y133efgEv");}
ccc::CC2x7y13 ::~CC2x7y13(){ note_dtor("_ZN3ccc8CC2x7y13E", this);} // tgen
ccc::CC2x7y13 ::CC2x7y13(){ note_ctor("_ZN3ccc8CC2x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y13E, buf);
    ::ccc::CC2x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y13E);
    dp->::ccc::CC2x7y13::~CC2x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y13E(Test__ZN3ccc8CC2x7y13E, "_ZN3ccc8CC2x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y13C1Ev();
extern void _ZN3ccc8CC2x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y13E[] = {
  NSPAIR(_ZN3ccc8CC2x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC2x7y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x7y133efgEv,_ZTv0_n12_N3ccc8CC2x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y133efgEv,_ZThn4_N3ccc8CC2x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x7y133efgEv,_ZTv0_n12_N3ccc8CC2x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y13E[] = {
  {&(_ZTVN3ccc8CC2x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y13E[];
static VTBL_ENTRY alt_thunk_names1100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x7y133efgEv,_ZTv0_n12_N3ccc8CC2x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y133efgEv,_ZThn4_N3ccc8CC2x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x7y13E = {  "_ZN3ccc8CC2x7y13E", // class name
  bases__ZN3ccc8CC2x7y13E, 2,
  &(vtc__ZN3ccc8CC2x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y13E),2, //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  DD2x7y13  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD2x7y133efgEv
  ~DD2x7y13(); // tgen
  DD2x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x7y133efgEv");}
ccc::DD2x7y13 ::~DD2x7y13(){ note_dtor("_ZN3ccc8DD2x7y13E", this);} // tgen
ccc::DD2x7y13 ::DD2x7y13(){ note_ctor("_ZN3ccc8DD2x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y13E, buf);
    ::ccc::DD2x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y13E);
    dp->::ccc::DD2x7y13::~DD2x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y13E(Test__ZN3ccc8DD2x7y13E, "_ZN3ccc8DD2x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y13C1Ev();
extern void _ZN3ccc8DD2x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y13E[] = {
  NSPAIR(_ZN3ccc8DD2x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y13E[];
extern void _ZN3ccc8DD2x7y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y13E[] = {
  {&(_ZTVN3ccc8DD2x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y13E[];
Class_Descriptor cd__ZN3ccc8DD2x7y13E = {  "_ZN3ccc8DD2x7y13E", // class name
  bases__ZN3ccc8DD2x7y13E, 2,
  &(vtc__ZN3ccc8DD2x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y14  : virtual ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y143pqrEv
  ~CC2x7y14(); // tgen
  CC2x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y143pqrEv");}
ccc::CC2x7y14 ::~CC2x7y14(){ note_dtor("_ZN3ccc8CC2x7y14E", this);} // tgen
ccc::CC2x7y14 ::CC2x7y14(){ note_ctor("_ZN3ccc8CC2x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y14E, buf);
    ::ccc::CC2x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y14E);
    dp->::ccc::CC2x7y14::~CC2x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y14E(Test__ZN3ccc8CC2x7y14E, "_ZN3ccc8CC2x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y14C1Ev();
extern void _ZN3ccc8CC2x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y14E[] = {
  NSPAIR(_ZN3ccc8CC2x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC2x7y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x7y143pqrEv,_ZTv0_n20_N3ccc8CC2x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y143pqrEv,_ZThn4_N3ccc8CC2x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x7y143pqrEv,_ZTv0_n20_N3ccc8CC2x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y14E[] = {
  {&(_ZTVN3ccc8CC2x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y14E[];
static VTBL_ENTRY alt_thunk_names1101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x7y143pqrEv,_ZTv0_n20_N3ccc8CC2x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x7y143pqrEv,_ZThn4_N3ccc8CC2x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x7y14E = {  "_ZN3ccc8CC2x7y14E", // class name
  bases__ZN3ccc8CC2x7y14E, 2,
  &(vtc__ZN3ccc8CC2x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y14E),2, //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  DD2x7y14  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD2x7y143pqrEv
  ~DD2x7y14(); // tgen
  DD2x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x7y143pqrEv");}
ccc::DD2x7y14 ::~DD2x7y14(){ note_dtor("_ZN3ccc8DD2x7y14E", this);} // tgen
ccc::DD2x7y14 ::DD2x7y14(){ note_ctor("_ZN3ccc8DD2x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y14E, buf);
    ::ccc::DD2x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y14E);
    dp->::ccc::DD2x7y14::~DD2x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y14E(Test__ZN3ccc8DD2x7y14E, "_ZN3ccc8DD2x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y14C1Ev();
extern void _ZN3ccc8DD2x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y14E[] = {
  NSPAIR(_ZN3ccc8DD2x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x7y143pqrEv,_ZTv0_n16_N3ccc8DD2x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x7y143pqrEv,_ZThn4_N3ccc8DD2x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x7y143pqrEv,_ZTv0_n16_N3ccc8DD2x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y14E[] = {
  {&(_ZTVN3ccc8DD2x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y14E[];
static VTBL_ENTRY alt_thunk_names1102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x7y143pqrEv,_ZTv0_n16_N3ccc8DD2x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x7y143pqrEv,_ZThn4_N3ccc8DD2x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x7y14E = {  "_ZN3ccc8DD2x7y14E", // class name
  bases__ZN3ccc8DD2x7y14E, 2,
  &(vtc__ZN3ccc8DD2x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y14E),3, //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  CC2x7y15  : virtual ::ccc::AA2 , ::ccc::BB7 {
  ~CC2x7y15(); // tgen
  CC2x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x7y15 ::~CC2x7y15(){ note_dtor("_ZN3ccc8CC2x7y15E", this);} // tgen
ccc::CC2x7y15 ::CC2x7y15(){ note_ctor("_ZN3ccc8CC2x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y15E, buf);
    ::ccc::CC2x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC2x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y15E);
    dp->::ccc::CC2x7y15::~CC2x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y15E(Test__ZN3ccc8CC2x7y15E, "_ZN3ccc8CC2x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y15C1Ev();
extern void _ZN3ccc8CC2x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y15E[] = {
  NSPAIR(_ZN3ccc8CC2x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x7y15E[] = {
  {&(_ZTVN3ccc8CC2x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x7y15E[];
Class_Descriptor cd__ZN3ccc8CC2x7y15E = {  "_ZN3ccc8CC2x7y15E", // class name
  bases__ZN3ccc8CC2x7y15E, 2,
  &(vtc__ZN3ccc8CC2x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x7y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x7y15  : virtual ::ccc::AA2 , virtual ::ccc::BB7 {
  ~DD2x7y15(); // tgen
  DD2x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x7y15 ::~DD2x7y15(){ note_dtor("_ZN3ccc8DD2x7y15E", this);} // tgen
ccc::DD2x7y15 ::DD2x7y15(){ note_ctor("_ZN3ccc8DD2x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x7y15E, buf);
    ::ccc::DD2x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x7y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD2x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x7y15E);
    dp->::ccc::DD2x7y15::~DD2x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x7y15E(Test__ZN3ccc8DD2x7y15E, "_ZN3ccc8DD2x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x7y15C1Ev();
extern void _ZN3ccc8DD2x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x7y15E[] = {
  NSPAIR(_ZN3ccc8DD2x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD2x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x7y15E[] = {
  {&(_ZTVN3ccc8DD2x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x7y15E[];
Class_Descriptor cd__ZN3ccc8DD2x7y15E = {  "_ZN3ccc8DD2x7y15E", // class name
  bases__ZN3ccc8DD2x7y15E, 2,
  &(vtc__ZN3ccc8DD2x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x7y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y0  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y03pqrEv
  ~CC2x8y0(); // tgen
  CC2x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y0E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y03abcEv");}
void  ccc::CC2x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y03efgEv");}
void  ccc::CC2x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y03pqrEv");}
ccc::CC2x8y0 ::~CC2x8y0(){ note_dtor("_ZN3ccc7CC2x8y0E", this);} // tgen
ccc::CC2x8y0 ::CC2x8y0(){ note_ctor("_ZN3ccc7CC2x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y0E, buf);
    ::ccc::CC2x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y0E);
    dp->::ccc::CC2x8y0::~CC2x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y0E(Test__ZN3ccc7CC2x8y0E, "_ZN3ccc7CC2x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y0C1Ev();
extern void _ZN3ccc7CC2x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y0E[] = {
  NSPAIR(_ZN3ccc7CC2x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y0E[];
extern void _ZN3ccc7CC2x8y03efgEv();
extern void _ZN3ccc7CC2x8y03abcEv();
extern void _ZN3ccc7CC2x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y03efgEv,_ZTv0_n12_N3ccc7CC2x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y03efgEv,_ZThn4_N3ccc7CC2x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y03abcEv,_ZTv0_n16_N3ccc7CC2x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y03abcEv,_ZThn4_N3ccc7CC2x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y03pqrEv,_ZTv0_n20_N3ccc7CC2x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y03pqrEv,_ZThn4_N3ccc7CC2x8y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y03efgEv,_ZTv0_n12_N3ccc7CC2x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y03abcEv,_ZTv0_n16_N3ccc7CC2x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y03pqrEv,_ZTv0_n20_N3ccc7CC2x8y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y0E[] = {
  {&(_ZTVN3ccc7CC2x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y0E[];
static VTBL_ENTRY alt_thunk_names1103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y03pqrEv,_ZTv0_n20_N3ccc7CC2x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y03pqrEv,_ZThn4_N3ccc7CC2x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y03abcEv,_ZTv0_n16_N3ccc7CC2x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y03abcEv,_ZThn4_N3ccc7CC2x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y03efgEv,_ZTv0_n12_N3ccc7CC2x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y03efgEv,_ZThn4_N3ccc7CC2x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y0E = {  "_ZN3ccc7CC2x8y0E", // class name
  bases__ZN3ccc7CC2x8y0E, 2,
  &(vtc__ZN3ccc7CC2x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y0E),2, //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  DD2x8y0  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD2x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y03pqrEv
  ~DD2x8y0(); // tgen
  DD2x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y03abcEv");}
void  ccc::DD2x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y03efgEv");}
void  ccc::DD2x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y03pqrEv");}
ccc::DD2x8y0 ::~DD2x8y0(){ note_dtor("_ZN3ccc7DD2x8y0E", this);} // tgen
ccc::DD2x8y0 ::DD2x8y0(){ note_ctor("_ZN3ccc7DD2x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y0E, buf);
    ::ccc::DD2x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y0E);
    dp->::ccc::DD2x8y0::~DD2x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y0E(Test__ZN3ccc7DD2x8y0E, "_ZN3ccc7DD2x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y0C1Ev();
extern void _ZN3ccc7DD2x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y0E[] = {
  NSPAIR(_ZN3ccc7DD2x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y0E[];
extern void _ZN3ccc7DD2x8y03efgEv();
extern void _ZN3ccc7DD2x8y03abcEv();
extern void _ZN3ccc7DD2x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y03efgEv,_ZTv0_n12_N3ccc7DD2x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y03efgEv,_ZThn4_N3ccc7DD2x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y03abcEv,_ZTv0_n16_N3ccc7DD2x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y03abcEv,_ZThn4_N3ccc7DD2x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y03efgEv,_ZTv0_n12_N3ccc7DD2x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y03abcEv,_ZTv0_n16_N3ccc7DD2x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y0E[] = {
  {&(_ZTVN3ccc7DD2x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y0E[];
static VTBL_ENTRY alt_thunk_names1104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y03abcEv,_ZTv0_n16_N3ccc7DD2x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y03abcEv,_ZThn4_N3ccc7DD2x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y03efgEv,_ZTv0_n12_N3ccc7DD2x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y03efgEv,_ZThn4_N3ccc7DD2x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y0E = {  "_ZN3ccc7DD2x8y0E", // class name
  bases__ZN3ccc7DD2x8y0E, 2,
  &(vtc__ZN3ccc7DD2x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y0E),3, //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  CC2x8y1  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x8y13efgEv
  ~CC2x8y1(); // tgen
  CC2x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y1E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y13abcEv");}
void  ccc::CC2x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y13pqrEv");}
void  ccc::CC2x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y13efgEv");}
ccc::CC2x8y1 ::~CC2x8y1(){ note_dtor("_ZN3ccc7CC2x8y1E", this);} // tgen
ccc::CC2x8y1 ::CC2x8y1(){ note_ctor("_ZN3ccc7CC2x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y1E, buf);
    ::ccc::CC2x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y1E);
    dp->::ccc::CC2x8y1::~CC2x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y1E(Test__ZN3ccc7CC2x8y1E, "_ZN3ccc7CC2x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y1C1Ev();
extern void _ZN3ccc7CC2x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y1E[] = {
  NSPAIR(_ZN3ccc7CC2x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y1E[];
extern void _ZN3ccc7CC2x8y13efgEv();
extern void _ZN3ccc7CC2x8y13abcEv();
extern void _ZN3ccc7CC2x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y13efgEv,_ZTv0_n12_N3ccc7CC2x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y13efgEv,_ZThn4_N3ccc7CC2x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y13abcEv,_ZTv0_n16_N3ccc7CC2x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y13abcEv,_ZThn4_N3ccc7CC2x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y13pqrEv,_ZTv0_n20_N3ccc7CC2x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y13pqrEv,_ZThn4_N3ccc7CC2x8y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y13efgEv,_ZTv0_n12_N3ccc7CC2x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y13abcEv,_ZTv0_n16_N3ccc7CC2x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y13pqrEv,_ZTv0_n20_N3ccc7CC2x8y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y1E[] = {
  {&(_ZTVN3ccc7CC2x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y1E[];
static VTBL_ENTRY alt_thunk_names1105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y13pqrEv,_ZTv0_n20_N3ccc7CC2x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y13pqrEv,_ZThn4_N3ccc7CC2x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y13abcEv,_ZTv0_n16_N3ccc7CC2x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y13abcEv,_ZThn4_N3ccc7CC2x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y13efgEv,_ZTv0_n12_N3ccc7CC2x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y13efgEv,_ZThn4_N3ccc7CC2x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y1E = {  "_ZN3ccc7CC2x8y1E", // class name
  bases__ZN3ccc7CC2x8y1E, 2,
  &(vtc__ZN3ccc7CC2x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y1E),2, //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  DD2x8y1  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD2x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x8y13efgEv
  ~DD2x8y1(); // tgen
  DD2x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y13abcEv");}
void  ccc::DD2x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y13pqrEv");}
void  ccc::DD2x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y13efgEv");}
ccc::DD2x8y1 ::~DD2x8y1(){ note_dtor("_ZN3ccc7DD2x8y1E", this);} // tgen
ccc::DD2x8y1 ::DD2x8y1(){ note_ctor("_ZN3ccc7DD2x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y1E, buf);
    ::ccc::DD2x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y1E);
    dp->::ccc::DD2x8y1::~DD2x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y1E(Test__ZN3ccc7DD2x8y1E, "_ZN3ccc7DD2x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y1C1Ev();
extern void _ZN3ccc7DD2x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y1E[] = {
  NSPAIR(_ZN3ccc7DD2x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y1E[];
extern void _ZN3ccc7DD2x8y13efgEv();
extern void _ZN3ccc7DD2x8y13abcEv();
extern void _ZN3ccc7DD2x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y13efgEv,_ZTv0_n12_N3ccc7DD2x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y13efgEv,_ZThn4_N3ccc7DD2x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y13abcEv,_ZTv0_n16_N3ccc7DD2x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y13abcEv,_ZThn4_N3ccc7DD2x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y13efgEv,_ZTv0_n12_N3ccc7DD2x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y13abcEv,_ZTv0_n16_N3ccc7DD2x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y1E[] = {
  {&(_ZTVN3ccc7DD2x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y1E[];
static VTBL_ENTRY alt_thunk_names1106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y13abcEv,_ZTv0_n16_N3ccc7DD2x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y13abcEv,_ZThn4_N3ccc7DD2x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y13efgEv,_ZTv0_n12_N3ccc7DD2x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y13efgEv,_ZThn4_N3ccc7DD2x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y1E = {  "_ZN3ccc7DD2x8y1E", // class name
  bases__ZN3ccc7DD2x8y1E, 2,
  &(vtc__ZN3ccc7DD2x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y1E),3, //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  CC2x8y2  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y23pqrEv
  ~CC2x8y2(); // tgen
  CC2x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y2E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y23efgEv");}
void  ccc::CC2x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y23abcEv");}
void  ccc::CC2x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y23pqrEv");}
ccc::CC2x8y2 ::~CC2x8y2(){ note_dtor("_ZN3ccc7CC2x8y2E", this);} // tgen
ccc::CC2x8y2 ::CC2x8y2(){ note_ctor("_ZN3ccc7CC2x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y2E, buf);
    ::ccc::CC2x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y2E);
    dp->::ccc::CC2x8y2::~CC2x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y2E(Test__ZN3ccc7CC2x8y2E, "_ZN3ccc7CC2x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y2C1Ev();
extern void _ZN3ccc7CC2x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y2E[] = {
  NSPAIR(_ZN3ccc7CC2x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y2E[];
extern void _ZN3ccc7CC2x8y23efgEv();
extern void _ZN3ccc7CC2x8y23abcEv();
extern void _ZN3ccc7CC2x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y23efgEv,_ZTv0_n12_N3ccc7CC2x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y23efgEv,_ZThn4_N3ccc7CC2x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y23abcEv,_ZTv0_n16_N3ccc7CC2x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y23abcEv,_ZThn4_N3ccc7CC2x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y23pqrEv,_ZTv0_n20_N3ccc7CC2x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y23pqrEv,_ZThn4_N3ccc7CC2x8y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y23efgEv,_ZTv0_n12_N3ccc7CC2x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y23abcEv,_ZTv0_n16_N3ccc7CC2x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y23pqrEv,_ZTv0_n20_N3ccc7CC2x8y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y2E[] = {
  {&(_ZTVN3ccc7CC2x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y2E[];
static VTBL_ENTRY alt_thunk_names1107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y23pqrEv,_ZTv0_n20_N3ccc7CC2x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y23pqrEv,_ZThn4_N3ccc7CC2x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y23abcEv,_ZTv0_n16_N3ccc7CC2x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y23abcEv,_ZThn4_N3ccc7CC2x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y23efgEv,_ZTv0_n12_N3ccc7CC2x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y23efgEv,_ZThn4_N3ccc7CC2x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y2E = {  "_ZN3ccc7CC2x8y2E", // class name
  bases__ZN3ccc7CC2x8y2E, 2,
  &(vtc__ZN3ccc7CC2x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y2E),2, //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  DD2x8y2  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD2x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y23pqrEv
  ~DD2x8y2(); // tgen
  DD2x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y23efgEv");}
void  ccc::DD2x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y23abcEv");}
void  ccc::DD2x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y23pqrEv");}
ccc::DD2x8y2 ::~DD2x8y2(){ note_dtor("_ZN3ccc7DD2x8y2E", this);} // tgen
ccc::DD2x8y2 ::DD2x8y2(){ note_ctor("_ZN3ccc7DD2x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y2E, buf);
    ::ccc::DD2x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y2E);
    dp->::ccc::DD2x8y2::~DD2x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y2E(Test__ZN3ccc7DD2x8y2E, "_ZN3ccc7DD2x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y2C1Ev();
extern void _ZN3ccc7DD2x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y2E[] = {
  NSPAIR(_ZN3ccc7DD2x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y2E[];
extern void _ZN3ccc7DD2x8y23efgEv();
extern void _ZN3ccc7DD2x8y23abcEv();
extern void _ZN3ccc7DD2x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y23efgEv,_ZTv0_n12_N3ccc7DD2x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y23efgEv,_ZThn4_N3ccc7DD2x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y23abcEv,_ZTv0_n16_N3ccc7DD2x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y23abcEv,_ZThn4_N3ccc7DD2x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y23efgEv,_ZTv0_n12_N3ccc7DD2x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y23abcEv,_ZTv0_n16_N3ccc7DD2x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y2E[] = {
  {&(_ZTVN3ccc7DD2x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y2E[];
static VTBL_ENTRY alt_thunk_names1108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y23abcEv,_ZTv0_n16_N3ccc7DD2x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y23abcEv,_ZThn4_N3ccc7DD2x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y23efgEv,_ZTv0_n12_N3ccc7DD2x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y23efgEv,_ZThn4_N3ccc7DD2x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y2E = {  "_ZN3ccc7DD2x8y2E", // class name
  bases__ZN3ccc7DD2x8y2E, 2,
  &(vtc__ZN3ccc7DD2x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y2E),3, //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  CC2x8y3  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x8y33abcEv
  ~CC2x8y3(); // tgen
  CC2x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y3E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y33efgEv");}
void  ccc::CC2x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y33pqrEv");}
void  ccc::CC2x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y33abcEv");}
ccc::CC2x8y3 ::~CC2x8y3(){ note_dtor("_ZN3ccc7CC2x8y3E", this);} // tgen
ccc::CC2x8y3 ::CC2x8y3(){ note_ctor("_ZN3ccc7CC2x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y3E, buf);
    ::ccc::CC2x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y3E);
    dp->::ccc::CC2x8y3::~CC2x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y3E(Test__ZN3ccc7CC2x8y3E, "_ZN3ccc7CC2x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y3C1Ev();
extern void _ZN3ccc7CC2x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y3E[] = {
  NSPAIR(_ZN3ccc7CC2x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y3E[];
extern void _ZN3ccc7CC2x8y33efgEv();
extern void _ZN3ccc7CC2x8y33abcEv();
extern void _ZN3ccc7CC2x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y33efgEv,_ZTv0_n12_N3ccc7CC2x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y33efgEv,_ZThn4_N3ccc7CC2x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y33abcEv,_ZTv0_n16_N3ccc7CC2x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y33abcEv,_ZThn4_N3ccc7CC2x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y33pqrEv,_ZTv0_n20_N3ccc7CC2x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y33pqrEv,_ZThn4_N3ccc7CC2x8y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y33efgEv,_ZTv0_n12_N3ccc7CC2x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y33abcEv,_ZTv0_n16_N3ccc7CC2x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y33pqrEv,_ZTv0_n20_N3ccc7CC2x8y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y3E[] = {
  {&(_ZTVN3ccc7CC2x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y3E[];
static VTBL_ENTRY alt_thunk_names1109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y33pqrEv,_ZTv0_n20_N3ccc7CC2x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y33pqrEv,_ZThn4_N3ccc7CC2x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y33abcEv,_ZTv0_n16_N3ccc7CC2x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y33abcEv,_ZThn4_N3ccc7CC2x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y33efgEv,_ZTv0_n12_N3ccc7CC2x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y33efgEv,_ZThn4_N3ccc7CC2x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y3E = {  "_ZN3ccc7CC2x8y3E", // class name
  bases__ZN3ccc7CC2x8y3E, 2,
  &(vtc__ZN3ccc7CC2x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y3E),2, //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  DD2x8y3  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD2x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x8y33abcEv
  ~DD2x8y3(); // tgen
  DD2x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y33efgEv");}
void  ccc::DD2x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y33pqrEv");}
void  ccc::DD2x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y33abcEv");}
ccc::DD2x8y3 ::~DD2x8y3(){ note_dtor("_ZN3ccc7DD2x8y3E", this);} // tgen
ccc::DD2x8y3 ::DD2x8y3(){ note_ctor("_ZN3ccc7DD2x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y3E, buf);
    ::ccc::DD2x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y3E);
    dp->::ccc::DD2x8y3::~DD2x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y3E(Test__ZN3ccc7DD2x8y3E, "_ZN3ccc7DD2x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y3C1Ev();
extern void _ZN3ccc7DD2x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y3E[] = {
  NSPAIR(_ZN3ccc7DD2x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y3E[];
extern void _ZN3ccc7DD2x8y33efgEv();
extern void _ZN3ccc7DD2x8y33abcEv();
extern void _ZN3ccc7DD2x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y33efgEv,_ZTv0_n12_N3ccc7DD2x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y33efgEv,_ZThn4_N3ccc7DD2x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y33abcEv,_ZTv0_n16_N3ccc7DD2x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y33abcEv,_ZThn4_N3ccc7DD2x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y33efgEv,_ZTv0_n12_N3ccc7DD2x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y33abcEv,_ZTv0_n16_N3ccc7DD2x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y3E[] = {
  {&(_ZTVN3ccc7DD2x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y3E[];
static VTBL_ENTRY alt_thunk_names1110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y33abcEv,_ZTv0_n16_N3ccc7DD2x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y33abcEv,_ZThn4_N3ccc7DD2x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y33efgEv,_ZTv0_n12_N3ccc7DD2x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y33efgEv,_ZThn4_N3ccc7DD2x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y3E = {  "_ZN3ccc7DD2x8y3E", // class name
  bases__ZN3ccc7DD2x8y3E, 2,
  &(vtc__ZN3ccc7DD2x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y3E),3, //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  CC2x8y4  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC2x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y43efgEv
  ~CC2x8y4(); // tgen
  CC2x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y4E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y43pqrEv");}
void  ccc::CC2x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y43abcEv");}
void  ccc::CC2x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y43efgEv");}
ccc::CC2x8y4 ::~CC2x8y4(){ note_dtor("_ZN3ccc7CC2x8y4E", this);} // tgen
ccc::CC2x8y4 ::CC2x8y4(){ note_ctor("_ZN3ccc7CC2x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y4E, buf);
    ::ccc::CC2x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y4E);
    dp->::ccc::CC2x8y4::~CC2x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y4E(Test__ZN3ccc7CC2x8y4E, "_ZN3ccc7CC2x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y4C1Ev();
extern void _ZN3ccc7CC2x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y4E[] = {
  NSPAIR(_ZN3ccc7CC2x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y4E[];
extern void _ZN3ccc7CC2x8y43efgEv();
extern void _ZN3ccc7CC2x8y43abcEv();
extern void _ZN3ccc7CC2x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y43efgEv,_ZTv0_n12_N3ccc7CC2x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y43efgEv,_ZThn4_N3ccc7CC2x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y43abcEv,_ZTv0_n16_N3ccc7CC2x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y43abcEv,_ZThn4_N3ccc7CC2x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y43pqrEv,_ZTv0_n20_N3ccc7CC2x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y43pqrEv,_ZThn4_N3ccc7CC2x8y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y43efgEv,_ZTv0_n12_N3ccc7CC2x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y43abcEv,_ZTv0_n16_N3ccc7CC2x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y43pqrEv,_ZTv0_n20_N3ccc7CC2x8y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y4E[] = {
  {&(_ZTVN3ccc7CC2x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y4E[];
static VTBL_ENTRY alt_thunk_names1111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y43pqrEv,_ZTv0_n20_N3ccc7CC2x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y43pqrEv,_ZThn4_N3ccc7CC2x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y43abcEv,_ZTv0_n16_N3ccc7CC2x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y43abcEv,_ZThn4_N3ccc7CC2x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y43efgEv,_ZTv0_n12_N3ccc7CC2x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y43efgEv,_ZThn4_N3ccc7CC2x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y4E = {  "_ZN3ccc7CC2x8y4E", // class name
  bases__ZN3ccc7CC2x8y4E, 2,
  &(vtc__ZN3ccc7CC2x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y4E),2, //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  DD2x8y4  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD2x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x8y43efgEv
  ~DD2x8y4(); // tgen
  DD2x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y43pqrEv");}
void  ccc::DD2x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y43abcEv");}
void  ccc::DD2x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y43efgEv");}
ccc::DD2x8y4 ::~DD2x8y4(){ note_dtor("_ZN3ccc7DD2x8y4E", this);} // tgen
ccc::DD2x8y4 ::DD2x8y4(){ note_ctor("_ZN3ccc7DD2x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y4E, buf);
    ::ccc::DD2x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y4E);
    dp->::ccc::DD2x8y4::~DD2x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y4E(Test__ZN3ccc7DD2x8y4E, "_ZN3ccc7DD2x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y4C1Ev();
extern void _ZN3ccc7DD2x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y4E[] = {
  NSPAIR(_ZN3ccc7DD2x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y4E[];
extern void _ZN3ccc7DD2x8y43efgEv();
extern void _ZN3ccc7DD2x8y43abcEv();
extern void _ZN3ccc7DD2x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y43efgEv,_ZTv0_n12_N3ccc7DD2x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y43efgEv,_ZThn4_N3ccc7DD2x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y43abcEv,_ZTv0_n16_N3ccc7DD2x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y43abcEv,_ZThn4_N3ccc7DD2x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y43efgEv,_ZTv0_n12_N3ccc7DD2x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y43abcEv,_ZTv0_n16_N3ccc7DD2x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y4E[] = {
  {&(_ZTVN3ccc7DD2x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y4E[];
static VTBL_ENTRY alt_thunk_names1112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y43abcEv,_ZTv0_n16_N3ccc7DD2x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y43abcEv,_ZThn4_N3ccc7DD2x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y43efgEv,_ZTv0_n12_N3ccc7DD2x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y43efgEv,_ZThn4_N3ccc7DD2x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y4E = {  "_ZN3ccc7DD2x8y4E", // class name
  bases__ZN3ccc7DD2x8y4E, 2,
  &(vtc__ZN3ccc7DD2x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y4E),3, //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  CC2x8y5  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC2x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y53abcEv
  ~CC2x8y5(); // tgen
  CC2x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y5E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y53pqrEv");}
void  ccc::CC2x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y53efgEv");}
void  ccc::CC2x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y53abcEv");}
ccc::CC2x8y5 ::~CC2x8y5(){ note_dtor("_ZN3ccc7CC2x8y5E", this);} // tgen
ccc::CC2x8y5 ::CC2x8y5(){ note_ctor("_ZN3ccc7CC2x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y5E, buf);
    ::ccc::CC2x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y5E);
    dp->::ccc::CC2x8y5::~CC2x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y5E(Test__ZN3ccc7CC2x8y5E, "_ZN3ccc7CC2x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y5C1Ev();
extern void _ZN3ccc7CC2x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y5E[] = {
  NSPAIR(_ZN3ccc7CC2x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y5E[];
extern void _ZN3ccc7CC2x8y53efgEv();
extern void _ZN3ccc7CC2x8y53abcEv();
extern void _ZN3ccc7CC2x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y53efgEv,_ZTv0_n12_N3ccc7CC2x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y53efgEv,_ZThn4_N3ccc7CC2x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y53abcEv,_ZTv0_n16_N3ccc7CC2x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y53abcEv,_ZThn4_N3ccc7CC2x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y53pqrEv,_ZTv0_n20_N3ccc7CC2x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y53pqrEv,_ZThn4_N3ccc7CC2x8y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y53efgEv,_ZTv0_n12_N3ccc7CC2x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y53abcEv,_ZTv0_n16_N3ccc7CC2x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y53pqrEv,_ZTv0_n20_N3ccc7CC2x8y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y5E[] = {
  {&(_ZTVN3ccc7CC2x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y5E[];
static VTBL_ENTRY alt_thunk_names1113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y53pqrEv,_ZTv0_n20_N3ccc7CC2x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y53pqrEv,_ZThn4_N3ccc7CC2x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y53abcEv,_ZTv0_n16_N3ccc7CC2x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y53abcEv,_ZThn4_N3ccc7CC2x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y53efgEv,_ZTv0_n12_N3ccc7CC2x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y53efgEv,_ZThn4_N3ccc7CC2x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y5E = {  "_ZN3ccc7CC2x8y5E", // class name
  bases__ZN3ccc7CC2x8y5E, 2,
  &(vtc__ZN3ccc7CC2x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y5E),2, //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  DD2x8y5  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD2x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x8y53abcEv
  ~DD2x8y5(); // tgen
  DD2x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y53pqrEv");}
void  ccc::DD2x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y53efgEv");}
void  ccc::DD2x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y53abcEv");}
ccc::DD2x8y5 ::~DD2x8y5(){ note_dtor("_ZN3ccc7DD2x8y5E", this);} // tgen
ccc::DD2x8y5 ::DD2x8y5(){ note_ctor("_ZN3ccc7DD2x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y5E, buf);
    ::ccc::DD2x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y5E);
    dp->::ccc::DD2x8y5::~DD2x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y5E(Test__ZN3ccc7DD2x8y5E, "_ZN3ccc7DD2x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y5C1Ev();
extern void _ZN3ccc7DD2x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y5E[] = {
  NSPAIR(_ZN3ccc7DD2x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y5E[];
extern void _ZN3ccc7DD2x8y53efgEv();
extern void _ZN3ccc7DD2x8y53abcEv();
extern void _ZN3ccc7DD2x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y53efgEv,_ZTv0_n12_N3ccc7DD2x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y53efgEv,_ZThn4_N3ccc7DD2x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y53abcEv,_ZTv0_n16_N3ccc7DD2x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y53abcEv,_ZThn4_N3ccc7DD2x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y53efgEv,_ZTv0_n12_N3ccc7DD2x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y53abcEv,_ZTv0_n16_N3ccc7DD2x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y5E[] = {
  {&(_ZTVN3ccc7DD2x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y5E[];
static VTBL_ENTRY alt_thunk_names1114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y53abcEv,_ZTv0_n16_N3ccc7DD2x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y53abcEv,_ZThn4_N3ccc7DD2x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y53efgEv,_ZTv0_n12_N3ccc7DD2x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y53efgEv,_ZThn4_N3ccc7DD2x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y5E = {  "_ZN3ccc7DD2x8y5E", // class name
  bases__ZN3ccc7DD2x8y5E, 2,
  &(vtc__ZN3ccc7DD2x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y5E),3, //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  CC2x8y6  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y63efgEv
  ~CC2x8y6(); // tgen
  CC2x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y6E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y63abcEv");}
void  ccc::CC2x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y63efgEv");}
ccc::CC2x8y6 ::~CC2x8y6(){ note_dtor("_ZN3ccc7CC2x8y6E", this);} // tgen
ccc::CC2x8y6 ::CC2x8y6(){ note_ctor("_ZN3ccc7CC2x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y6E, buf);
    ::ccc::CC2x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y6E);
    dp->::ccc::CC2x8y6::~CC2x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y6E(Test__ZN3ccc7CC2x8y6E, "_ZN3ccc7CC2x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y6C1Ev();
extern void _ZN3ccc7CC2x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y6E[] = {
  NSPAIR(_ZN3ccc7CC2x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y6E[];
extern void _ZN3ccc7CC2x8y63efgEv();
extern void _ZN3ccc7CC2x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y63efgEv,_ZTv0_n12_N3ccc7CC2x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y63efgEv,_ZThn4_N3ccc7CC2x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y63abcEv,_ZTv0_n16_N3ccc7CC2x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y63abcEv,_ZThn4_N3ccc7CC2x8y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y63efgEv,_ZTv0_n12_N3ccc7CC2x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y63abcEv,_ZTv0_n16_N3ccc7CC2x8y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y6E[] = {
  {&(_ZTVN3ccc7CC2x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y6E[];
static VTBL_ENTRY alt_thunk_names1115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y63abcEv,_ZTv0_n16_N3ccc7CC2x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y63abcEv,_ZThn4_N3ccc7CC2x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y63efgEv,_ZTv0_n12_N3ccc7CC2x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y63efgEv,_ZThn4_N3ccc7CC2x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y6E = {  "_ZN3ccc7CC2x8y6E", // class name
  bases__ZN3ccc7CC2x8y6E, 2,
  &(vtc__ZN3ccc7CC2x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y6E),2, //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  DD2x8y6  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD2x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x8y63efgEv
  ~DD2x8y6(); // tgen
  DD2x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y63abcEv");}
void  ccc::DD2x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y63efgEv");}
ccc::DD2x8y6 ::~DD2x8y6(){ note_dtor("_ZN3ccc7DD2x8y6E", this);} // tgen
ccc::DD2x8y6 ::DD2x8y6(){ note_ctor("_ZN3ccc7DD2x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y6E, buf);
    ::ccc::DD2x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y6E);
    dp->::ccc::DD2x8y6::~DD2x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y6E(Test__ZN3ccc7DD2x8y6E, "_ZN3ccc7DD2x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y6C1Ev();
extern void _ZN3ccc7DD2x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y6E[] = {
  NSPAIR(_ZN3ccc7DD2x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y6E[];
extern void _ZN3ccc7DD2x8y63efgEv();
extern void _ZN3ccc7DD2x8y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y63efgEv,_ZTv0_n12_N3ccc7DD2x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y63efgEv,_ZThn4_N3ccc7DD2x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y63abcEv,_ZTv0_n16_N3ccc7DD2x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y63abcEv,_ZThn4_N3ccc7DD2x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y63efgEv,_ZTv0_n12_N3ccc7DD2x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y63abcEv,_ZTv0_n16_N3ccc7DD2x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y6E[] = {
  {&(_ZTVN3ccc7DD2x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y6E[];
static VTBL_ENTRY alt_thunk_names1116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y63abcEv,_ZTv0_n16_N3ccc7DD2x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y63abcEv,_ZThn4_N3ccc7DD2x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y63efgEv,_ZTv0_n12_N3ccc7DD2x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y63efgEv,_ZThn4_N3ccc7DD2x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y6E = {  "_ZN3ccc7DD2x8y6E", // class name
  bases__ZN3ccc7DD2x8y6E, 2,
  &(vtc__ZN3ccc7DD2x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y6E),3, //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  CC2x8y7  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y73pqrEv
  ~CC2x8y7(); // tgen
  CC2x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y7E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y73abcEv");}
void  ccc::CC2x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y73pqrEv");}
ccc::CC2x8y7 ::~CC2x8y7(){ note_dtor("_ZN3ccc7CC2x8y7E", this);} // tgen
ccc::CC2x8y7 ::CC2x8y7(){ note_ctor("_ZN3ccc7CC2x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y7E, buf);
    ::ccc::CC2x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y7E);
    dp->::ccc::CC2x8y7::~CC2x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y7E(Test__ZN3ccc7CC2x8y7E, "_ZN3ccc7CC2x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y7C1Ev();
extern void _ZN3ccc7CC2x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y7E[] = {
  NSPAIR(_ZN3ccc7CC2x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC2x8y73abcEv();
extern void _ZN3ccc7CC2x8y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y73abcEv,_ZTv0_n16_N3ccc7CC2x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y73abcEv,_ZThn4_N3ccc7CC2x8y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y73pqrEv,_ZTv0_n20_N3ccc7CC2x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y73pqrEv,_ZThn4_N3ccc7CC2x8y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y73abcEv,_ZTv0_n16_N3ccc7CC2x8y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y73pqrEv,_ZTv0_n20_N3ccc7CC2x8y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y7E[] = {
  {&(_ZTVN3ccc7CC2x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y7E[];
static VTBL_ENTRY alt_thunk_names1117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y73pqrEv,_ZTv0_n20_N3ccc7CC2x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y73pqrEv,_ZThn4_N3ccc7CC2x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y73abcEv,_ZTv0_n16_N3ccc7CC2x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y73abcEv,_ZThn4_N3ccc7CC2x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y7E = {  "_ZN3ccc7CC2x8y7E", // class name
  bases__ZN3ccc7CC2x8y7E, 2,
  &(vtc__ZN3ccc7CC2x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y7E),2, //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  DD2x8y7  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD2x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y73pqrEv
  ~DD2x8y7(); // tgen
  DD2x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y73abcEv");}
void  ccc::DD2x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y73pqrEv");}
ccc::DD2x8y7 ::~DD2x8y7(){ note_dtor("_ZN3ccc7DD2x8y7E", this);} // tgen
ccc::DD2x8y7 ::DD2x8y7(){ note_ctor("_ZN3ccc7DD2x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y7E, buf);
    ::ccc::DD2x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y7E);
    dp->::ccc::DD2x8y7::~DD2x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y7E(Test__ZN3ccc7DD2x8y7E, "_ZN3ccc7DD2x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y7C1Ev();
extern void _ZN3ccc7DD2x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y7E[] = {
  NSPAIR(_ZN3ccc7DD2x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x8y73abcEv();
extern void _ZN3ccc7DD2x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y73abcEv,_ZTv0_n16_N3ccc7DD2x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y73abcEv,_ZThn4_N3ccc7DD2x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y73abcEv,_ZTv0_n16_N3ccc7DD2x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y7E[] = {
  {&(_ZTVN3ccc7DD2x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y7E[];
static VTBL_ENTRY alt_thunk_names1118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y73abcEv,_ZTv0_n16_N3ccc7DD2x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y73abcEv,_ZThn4_N3ccc7DD2x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y7E = {  "_ZN3ccc7DD2x8y7E", // class name
  bases__ZN3ccc7DD2x8y7E, 2,
  &(vtc__ZN3ccc7DD2x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y7E),3, //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  CC2x8y8  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y83abcEv
  ~CC2x8y8(); // tgen
  CC2x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y8E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y83efgEv");}
void  ccc::CC2x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y83abcEv");}
ccc::CC2x8y8 ::~CC2x8y8(){ note_dtor("_ZN3ccc7CC2x8y8E", this);} // tgen
ccc::CC2x8y8 ::CC2x8y8(){ note_ctor("_ZN3ccc7CC2x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y8E, buf);
    ::ccc::CC2x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y8E);
    dp->::ccc::CC2x8y8::~CC2x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y8E(Test__ZN3ccc7CC2x8y8E, "_ZN3ccc7CC2x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y8C1Ev();
extern void _ZN3ccc7CC2x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y8E[] = {
  NSPAIR(_ZN3ccc7CC2x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y8E[];
extern void _ZN3ccc7CC2x8y83efgEv();
extern void _ZN3ccc7CC2x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y83efgEv,_ZTv0_n12_N3ccc7CC2x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y83efgEv,_ZThn4_N3ccc7CC2x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x8y83abcEv,_ZTv0_n16_N3ccc7CC2x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y83abcEv,_ZThn4_N3ccc7CC2x8y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y83efgEv,_ZTv0_n12_N3ccc7CC2x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x8y83abcEv,_ZTv0_n16_N3ccc7CC2x8y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y8E[] = {
  {&(_ZTVN3ccc7CC2x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y8E[];
static VTBL_ENTRY alt_thunk_names1119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x8y83abcEv,_ZTv0_n16_N3ccc7CC2x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y83abcEv,_ZThn4_N3ccc7CC2x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y83efgEv,_ZTv0_n12_N3ccc7CC2x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y83efgEv,_ZThn4_N3ccc7CC2x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y8E = {  "_ZN3ccc7CC2x8y8E", // class name
  bases__ZN3ccc7CC2x8y8E, 2,
  &(vtc__ZN3ccc7CC2x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y8E),2, //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  DD2x8y8  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD2x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x8y83abcEv
  ~DD2x8y8(); // tgen
  DD2x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y83efgEv");}
void  ccc::DD2x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x8y83abcEv");}
ccc::DD2x8y8 ::~DD2x8y8(){ note_dtor("_ZN3ccc7DD2x8y8E", this);} // tgen
ccc::DD2x8y8 ::DD2x8y8(){ note_ctor("_ZN3ccc7DD2x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y8E, buf);
    ::ccc::DD2x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y8E);
    dp->::ccc::DD2x8y8::~DD2x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y8E(Test__ZN3ccc7DD2x8y8E, "_ZN3ccc7DD2x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y8C1Ev();
extern void _ZN3ccc7DD2x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y8E[] = {
  NSPAIR(_ZN3ccc7DD2x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y8E[];
extern void _ZN3ccc7DD2x8y83efgEv();
extern void _ZN3ccc7DD2x8y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y83efgEv,_ZTv0_n12_N3ccc7DD2x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y83efgEv,_ZThn4_N3ccc7DD2x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x8y83abcEv,_ZTv0_n16_N3ccc7DD2x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y83abcEv,_ZThn4_N3ccc7DD2x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y83efgEv,_ZTv0_n12_N3ccc7DD2x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x8y83abcEv,_ZTv0_n16_N3ccc7DD2x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y8E[] = {
  {&(_ZTVN3ccc7DD2x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y8E[];
static VTBL_ENTRY alt_thunk_names1120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x8y83abcEv,_ZTv0_n16_N3ccc7DD2x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y83abcEv,_ZThn4_N3ccc7DD2x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y83efgEv,_ZTv0_n12_N3ccc7DD2x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y83efgEv,_ZThn4_N3ccc7DD2x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y8E = {  "_ZN3ccc7DD2x8y8E", // class name
  bases__ZN3ccc7DD2x8y8E, 2,
  &(vtc__ZN3ccc7DD2x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y8E),3, //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  CC2x8y9  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y93pqrEv
  ~CC2x8y9(); // tgen
  CC2x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y9E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y93efgEv");}
void  ccc::CC2x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y93pqrEv");}
ccc::CC2x8y9 ::~CC2x8y9(){ note_dtor("_ZN3ccc7CC2x8y9E", this);} // tgen
ccc::CC2x8y9 ::CC2x8y9(){ note_ctor("_ZN3ccc7CC2x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y9E, buf);
    ::ccc::CC2x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC2x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y9E);
    dp->::ccc::CC2x8y9::~CC2x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y9E(Test__ZN3ccc7CC2x8y9E, "_ZN3ccc7CC2x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y9C1Ev();
extern void _ZN3ccc7CC2x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y9E[] = {
  NSPAIR(_ZN3ccc7CC2x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y9E[];
extern void _ZN3ccc7CC2x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC2x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x8y93efgEv,_ZTv0_n12_N3ccc7CC2x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y93efgEv,_ZThn4_N3ccc7CC2x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x8y93pqrEv,_ZTv0_n20_N3ccc7CC2x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y93pqrEv,_ZThn4_N3ccc7CC2x8y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x8y93efgEv,_ZTv0_n12_N3ccc7CC2x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x8y93pqrEv,_ZTv0_n20_N3ccc7CC2x8y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x8y9E[] = {
  {&(_ZTVN3ccc7CC2x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x8y9E[];
static VTBL_ENTRY alt_thunk_names1121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x8y93pqrEv,_ZTv0_n20_N3ccc7CC2x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y93pqrEv,_ZThn4_N3ccc7CC2x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x8y93efgEv,_ZTv0_n12_N3ccc7CC2x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x8y93efgEv,_ZThn4_N3ccc7CC2x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x8y9E = {  "_ZN3ccc7CC2x8y9E", // class name
  bases__ZN3ccc7CC2x8y9E, 2,
  &(vtc__ZN3ccc7CC2x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x8y9E),2, //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  DD2x8y9  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD2x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x8y93pqrEv
  ~DD2x8y9(); // tgen
  DD2x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x8y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x8y93efgEv");}
void  ccc::DD2x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x8y93pqrEv");}
ccc::DD2x8y9 ::~DD2x8y9(){ note_dtor("_ZN3ccc7DD2x8y9E", this);} // tgen
ccc::DD2x8y9 ::DD2x8y9(){ note_ctor("_ZN3ccc7DD2x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x8y9E, buf);
    ::ccc::DD2x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x8y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD2x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x8y9E);
    dp->::ccc::DD2x8y9::~DD2x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x8y9E(Test__ZN3ccc7DD2x8y9E, "_ZN3ccc7DD2x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x8y9C1Ev();
extern void _ZN3ccc7DD2x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x8y9E[] = {
  NSPAIR(_ZN3ccc7DD2x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD2x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y9E[];
extern void _ZN3ccc7DD2x8y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x8y93efgEv,_ZTv0_n12_N3ccc7DD2x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x8y93efgEv,_ZThn4_N3ccc7DD2x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x8y93efgEv,_ZTv0_n12_N3ccc7DD2x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x8y9E[] = {
  {&(_ZTVN3ccc7DD2x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x8y9E[];
static VTBL_ENTRY alt_thunk_names1122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x8y93efgEv,_ZTv0_n12_N3ccc7DD2x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x8y93efgEv,_ZThn4_N3ccc7DD2x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x8y9E = {  "_ZN3ccc7DD2x8y9E", // class name
  bases__ZN3ccc7DD2x8y9E, 2,
  &(vtc__ZN3ccc7DD2x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x8y9E),3, //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  CC2x8y10  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x8y103abcEv
  ~CC2x8y10(); // tgen
  CC2x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y10E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y103pqrEv");}
void  ccc::CC2x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x8y103abcEv");}
ccc::CC2x8y10 ::~CC2x8y10(){ note_dtor("_ZN3ccc8CC2x8y10E", this);} // tgen
ccc::CC2x8y10 ::CC2x8y10(){ note_ctor("_ZN3ccc8CC2x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y10E, buf);
    ::ccc::CC2x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y10E);
    dp->::ccc::CC2x8y10::~CC2x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y10E(Test__ZN3ccc8CC2x8y10E, "_ZN3ccc8CC2x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y10C1Ev();
extern void _ZN3ccc8CC2x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y10E[] = {
  NSPAIR(_ZN3ccc8CC2x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC2x8y103abcEv();
extern void _ZN3ccc8CC2x8y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x8y103abcEv,_ZTv0_n16_N3ccc8CC2x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y103abcEv,_ZThn4_N3ccc8CC2x8y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x8y103pqrEv,_ZTv0_n20_N3ccc8CC2x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y103pqrEv,_ZThn4_N3ccc8CC2x8y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x8y103abcEv,_ZTv0_n16_N3ccc8CC2x8y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x8y103pqrEv,_ZTv0_n20_N3ccc8CC2x8y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y10E[] = {
  {&(_ZTVN3ccc8CC2x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y10E[];
static VTBL_ENTRY alt_thunk_names1123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x8y103pqrEv,_ZTv0_n20_N3ccc8CC2x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y103pqrEv,_ZThn4_N3ccc8CC2x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x8y103abcEv,_ZTv0_n16_N3ccc8CC2x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y103abcEv,_ZThn4_N3ccc8CC2x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x8y10E = {  "_ZN3ccc8CC2x8y10E", // class name
  bases__ZN3ccc8CC2x8y10E, 2,
  &(vtc__ZN3ccc8CC2x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y10E),2, //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  DD2x8y10  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD2x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x8y103abcEv
  ~DD2x8y10(); // tgen
  DD2x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x8y103pqrEv");}
void  ccc::DD2x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x8y103abcEv");}
ccc::DD2x8y10 ::~DD2x8y10(){ note_dtor("_ZN3ccc8DD2x8y10E", this);} // tgen
ccc::DD2x8y10 ::DD2x8y10(){ note_ctor("_ZN3ccc8DD2x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y10E, buf);
    ::ccc::DD2x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y10E);
    dp->::ccc::DD2x8y10::~DD2x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y10E(Test__ZN3ccc8DD2x8y10E, "_ZN3ccc8DD2x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y10C1Ev();
extern void _ZN3ccc8DD2x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y10E[] = {
  NSPAIR(_ZN3ccc8DD2x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x8y103abcEv();
extern void _ZN3ccc8DD2x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x8y103abcEv,_ZTv0_n16_N3ccc8DD2x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x8y103abcEv,_ZThn4_N3ccc8DD2x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x8y103abcEv,_ZTv0_n16_N3ccc8DD2x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y10E[] = {
  {&(_ZTVN3ccc8DD2x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y10E[];
static VTBL_ENTRY alt_thunk_names1124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x8y103abcEv,_ZTv0_n16_N3ccc8DD2x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x8y103abcEv,_ZThn4_N3ccc8DD2x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x8y10E = {  "_ZN3ccc8DD2x8y10E", // class name
  bases__ZN3ccc8DD2x8y10E, 2,
  &(vtc__ZN3ccc8DD2x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y10E),3, //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  CC2x8y11  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x8y113efgEv
  ~CC2x8y11(); // tgen
  CC2x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y11E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y113pqrEv");}
void  ccc::CC2x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x8y113efgEv");}
ccc::CC2x8y11 ::~CC2x8y11(){ note_dtor("_ZN3ccc8CC2x8y11E", this);} // tgen
ccc::CC2x8y11 ::CC2x8y11(){ note_ctor("_ZN3ccc8CC2x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y11E, buf);
    ::ccc::CC2x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y11E);
    dp->::ccc::CC2x8y11::~CC2x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y11E(Test__ZN3ccc8CC2x8y11E, "_ZN3ccc8CC2x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y11C1Ev();
extern void _ZN3ccc8CC2x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y11E[] = {
  NSPAIR(_ZN3ccc8CC2x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y11E[];
extern void _ZN3ccc8CC2x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC2x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x8y113efgEv,_ZTv0_n12_N3ccc8CC2x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y113efgEv,_ZThn4_N3ccc8CC2x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x8y113pqrEv,_ZTv0_n20_N3ccc8CC2x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y113pqrEv,_ZThn4_N3ccc8CC2x8y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x8y113efgEv,_ZTv0_n12_N3ccc8CC2x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x8y113pqrEv,_ZTv0_n20_N3ccc8CC2x8y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y11E[] = {
  {&(_ZTVN3ccc8CC2x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y11E[];
static VTBL_ENTRY alt_thunk_names1125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x8y113pqrEv,_ZTv0_n20_N3ccc8CC2x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y113pqrEv,_ZThn4_N3ccc8CC2x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x8y113efgEv,_ZTv0_n12_N3ccc8CC2x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y113efgEv,_ZThn4_N3ccc8CC2x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x8y11E = {  "_ZN3ccc8CC2x8y11E", // class name
  bases__ZN3ccc8CC2x8y11E, 2,
  &(vtc__ZN3ccc8CC2x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y11E),2, //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  DD2x8y11  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD2x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x8y113efgEv
  ~DD2x8y11(); // tgen
  DD2x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x8y113pqrEv");}
void  ccc::DD2x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x8y113efgEv");}
ccc::DD2x8y11 ::~DD2x8y11(){ note_dtor("_ZN3ccc8DD2x8y11E", this);} // tgen
ccc::DD2x8y11 ::DD2x8y11(){ note_ctor("_ZN3ccc8DD2x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y11E, buf);
    ::ccc::DD2x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y11E);
    dp->::ccc::DD2x8y11::~DD2x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y11E(Test__ZN3ccc8DD2x8y11E, "_ZN3ccc8DD2x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y11C1Ev();
extern void _ZN3ccc8DD2x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y11E[] = {
  NSPAIR(_ZN3ccc8DD2x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y11E[];
extern void _ZN3ccc8DD2x8y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x8y113efgEv,_ZTv0_n12_N3ccc8DD2x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x8y113efgEv,_ZThn4_N3ccc8DD2x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x8y113efgEv,_ZTv0_n12_N3ccc8DD2x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y11E[] = {
  {&(_ZTVN3ccc8DD2x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y11E[];
static VTBL_ENTRY alt_thunk_names1126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x8y113efgEv,_ZTv0_n12_N3ccc8DD2x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x8y113efgEv,_ZThn4_N3ccc8DD2x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x8y11E = {  "_ZN3ccc8DD2x8y11E", // class name
  bases__ZN3ccc8DD2x8y11E, 2,
  &(vtc__ZN3ccc8DD2x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y11E),3, //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  CC2x8y12  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC2x8y123abcEv
  ~CC2x8y12(); // tgen
  CC2x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x8y123abcEv");}
ccc::CC2x8y12 ::~CC2x8y12(){ note_dtor("_ZN3ccc8CC2x8y12E", this);} // tgen
ccc::CC2x8y12 ::CC2x8y12(){ note_ctor("_ZN3ccc8CC2x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y12E, buf);
    ::ccc::CC2x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y12E);
    dp->::ccc::CC2x8y12::~CC2x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y12E(Test__ZN3ccc8CC2x8y12E, "_ZN3ccc8CC2x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y12C1Ev();
extern void _ZN3ccc8CC2x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y12E[] = {
  NSPAIR(_ZN3ccc8CC2x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC2x8y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x8y123abcEv,_ZTv0_n16_N3ccc8CC2x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y123abcEv,_ZThn4_N3ccc8CC2x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x8y123abcEv,_ZTv0_n16_N3ccc8CC2x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y12E[] = {
  {&(_ZTVN3ccc8CC2x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y12E[];
static VTBL_ENTRY alt_thunk_names1127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x8y123abcEv,_ZTv0_n16_N3ccc8CC2x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y123abcEv,_ZThn4_N3ccc8CC2x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x8y12E = {  "_ZN3ccc8CC2x8y12E", // class name
  bases__ZN3ccc8CC2x8y12E, 2,
  &(vtc__ZN3ccc8CC2x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y12E),2, //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  DD2x8y12  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD2x8y123abcEv
  ~DD2x8y12(); // tgen
  DD2x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x8y123abcEv");}
ccc::DD2x8y12 ::~DD2x8y12(){ note_dtor("_ZN3ccc8DD2x8y12E", this);} // tgen
ccc::DD2x8y12 ::DD2x8y12(){ note_ctor("_ZN3ccc8DD2x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y12E, buf);
    ::ccc::DD2x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y12E);
    dp->::ccc::DD2x8y12::~DD2x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y12E(Test__ZN3ccc8DD2x8y12E, "_ZN3ccc8DD2x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y12C1Ev();
extern void _ZN3ccc8DD2x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y12E[] = {
  NSPAIR(_ZN3ccc8DD2x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x8y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x8y123abcEv,_ZTv0_n16_N3ccc8DD2x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x8y123abcEv,_ZThn4_N3ccc8DD2x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x8y123abcEv,_ZTv0_n16_N3ccc8DD2x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y12E[] = {
  {&(_ZTVN3ccc8DD2x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y12E[];
static VTBL_ENTRY alt_thunk_names1128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x8y123abcEv,_ZTv0_n16_N3ccc8DD2x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x8y123abcEv,_ZThn4_N3ccc8DD2x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x8y12E = {  "_ZN3ccc8DD2x8y12E", // class name
  bases__ZN3ccc8DD2x8y12E, 2,
  &(vtc__ZN3ccc8DD2x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y12E),3, //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  CC2x8y13  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC2x8y133efgEv
  ~CC2x8y13(); // tgen
  CC2x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x8y133efgEv");}
ccc::CC2x8y13 ::~CC2x8y13(){ note_dtor("_ZN3ccc8CC2x8y13E", this);} // tgen
ccc::CC2x8y13 ::CC2x8y13(){ note_ctor("_ZN3ccc8CC2x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y13E, buf);
    ::ccc::CC2x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y13E);
    dp->::ccc::CC2x8y13::~CC2x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y13E(Test__ZN3ccc8CC2x8y13E, "_ZN3ccc8CC2x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y13C1Ev();
extern void _ZN3ccc8CC2x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y13E[] = {
  NSPAIR(_ZN3ccc8CC2x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y13E[];
extern void _ZN3ccc8CC2x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x8y133efgEv,_ZTv0_n12_N3ccc8CC2x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y133efgEv,_ZThn4_N3ccc8CC2x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x8y133efgEv,_ZTv0_n12_N3ccc8CC2x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y13E[] = {
  {&(_ZTVN3ccc8CC2x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y13E[];
static VTBL_ENTRY alt_thunk_names1129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x8y133efgEv,_ZTv0_n12_N3ccc8CC2x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y133efgEv,_ZThn4_N3ccc8CC2x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x8y13E = {  "_ZN3ccc8CC2x8y13E", // class name
  bases__ZN3ccc8CC2x8y13E, 2,
  &(vtc__ZN3ccc8CC2x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y13E),2, //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  DD2x8y13  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD2x8y133efgEv
  ~DD2x8y13(); // tgen
  DD2x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x8y133efgEv");}
ccc::DD2x8y13 ::~DD2x8y13(){ note_dtor("_ZN3ccc8DD2x8y13E", this);} // tgen
ccc::DD2x8y13 ::DD2x8y13(){ note_ctor("_ZN3ccc8DD2x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y13E, buf);
    ::ccc::DD2x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y13E);
    dp->::ccc::DD2x8y13::~DD2x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y13E(Test__ZN3ccc8DD2x8y13E, "_ZN3ccc8DD2x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y13C1Ev();
extern void _ZN3ccc8DD2x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y13E[] = {
  NSPAIR(_ZN3ccc8DD2x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y13E[];
extern void _ZN3ccc8DD2x8y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x8y133efgEv,_ZTv0_n12_N3ccc8DD2x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x8y133efgEv,_ZThn4_N3ccc8DD2x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x8y133efgEv,_ZTv0_n12_N3ccc8DD2x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y13E[] = {
  {&(_ZTVN3ccc8DD2x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y13E[];
static VTBL_ENTRY alt_thunk_names1130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x8y133efgEv,_ZTv0_n12_N3ccc8DD2x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x8y133efgEv,_ZThn4_N3ccc8DD2x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x8y13E = {  "_ZN3ccc8DD2x8y13E", // class name
  bases__ZN3ccc8DD2x8y13E, 2,
  &(vtc__ZN3ccc8DD2x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y13E),3, //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  CC2x8y14  : virtual ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y143pqrEv
  ~CC2x8y14(); // tgen
  CC2x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y143pqrEv");}
ccc::CC2x8y14 ::~CC2x8y14(){ note_dtor("_ZN3ccc8CC2x8y14E", this);} // tgen
ccc::CC2x8y14 ::CC2x8y14(){ note_ctor("_ZN3ccc8CC2x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y14E, buf);
    ::ccc::CC2x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y14E);
    dp->::ccc::CC2x8y14::~CC2x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y14E(Test__ZN3ccc8CC2x8y14E, "_ZN3ccc8CC2x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y14C1Ev();
extern void _ZN3ccc8CC2x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y14E[] = {
  NSPAIR(_ZN3ccc8CC2x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC2x8y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x8y143pqrEv,_ZTv0_n20_N3ccc8CC2x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y143pqrEv,_ZThn4_N3ccc8CC2x8y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x8y143pqrEv,_ZTv0_n20_N3ccc8CC2x8y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y14E[] = {
  {&(_ZTVN3ccc8CC2x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y14E[];
static VTBL_ENTRY alt_thunk_names1131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x8y143pqrEv,_ZTv0_n20_N3ccc8CC2x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x8y143pqrEv,_ZThn4_N3ccc8CC2x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x8y14E = {  "_ZN3ccc8CC2x8y14E", // class name
  bases__ZN3ccc8CC2x8y14E, 2,
  &(vtc__ZN3ccc8CC2x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y14E),2, //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  DD2x8y14  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD2x8y143pqrEv
  ~DD2x8y14(); // tgen
  DD2x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x8y143pqrEv");}
ccc::DD2x8y14 ::~DD2x8y14(){ note_dtor("_ZN3ccc8DD2x8y14E", this);} // tgen
ccc::DD2x8y14 ::DD2x8y14(){ note_ctor("_ZN3ccc8DD2x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y14E, buf);
    ::ccc::DD2x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y14E);
    dp->::ccc::DD2x8y14::~DD2x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y14E(Test__ZN3ccc8DD2x8y14E, "_ZN3ccc8DD2x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y14C1Ev();
extern void _ZN3ccc8DD2x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y14E[] = {
  NSPAIR(_ZN3ccc8DD2x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y14E[] = {
  {&(_ZTVN3ccc8DD2x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y14E[];
Class_Descriptor cd__ZN3ccc8DD2x8y14E = {  "_ZN3ccc8DD2x8y14E", // class name
  bases__ZN3ccc8DD2x8y14E, 2,
  &(vtc__ZN3ccc8DD2x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y15  : virtual ::ccc::AA2 , ::ccc::BB8 {
  ~CC2x8y15(); // tgen
  CC2x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x8y15 ::~CC2x8y15(){ note_dtor("_ZN3ccc8CC2x8y15E", this);} // tgen
ccc::CC2x8y15 ::CC2x8y15(){ note_ctor("_ZN3ccc8CC2x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y15E, buf);
    ::ccc::CC2x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC2x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y15E);
    dp->::ccc::CC2x8y15::~CC2x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y15E(Test__ZN3ccc8CC2x8y15E, "_ZN3ccc8CC2x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y15C1Ev();
extern void _ZN3ccc8CC2x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y15E[] = {
  NSPAIR(_ZN3ccc8CC2x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x8y15E[] = {
  {&(_ZTVN3ccc8CC2x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x8y15E[];
Class_Descriptor cd__ZN3ccc8CC2x8y15E = {  "_ZN3ccc8CC2x8y15E", // class name
  bases__ZN3ccc8CC2x8y15E, 2,
  &(vtc__ZN3ccc8CC2x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x8y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x8y15  : virtual ::ccc::AA2 , virtual ::ccc::BB8 {
  ~DD2x8y15(); // tgen
  DD2x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x8y15 ::~DD2x8y15(){ note_dtor("_ZN3ccc8DD2x8y15E", this);} // tgen
ccc::DD2x8y15 ::DD2x8y15(){ note_ctor("_ZN3ccc8DD2x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x8y15E, buf);
    ::ccc::DD2x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x8y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD2x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x8y15E);
    dp->::ccc::DD2x8y15::~DD2x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x8y15E(Test__ZN3ccc8DD2x8y15E, "_ZN3ccc8DD2x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x8y15C1Ev();
extern void _ZN3ccc8DD2x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x8y15E[] = {
  NSPAIR(_ZN3ccc8DD2x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD2x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x8y15E[] = {
  {&(_ZTVN3ccc8DD2x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x8y15E[];
Class_Descriptor cd__ZN3ccc8DD2x8y15E = {  "_ZN3ccc8DD2x8y15E", // class name
  bases__ZN3ccc8DD2x8y15E, 2,
  &(vtc__ZN3ccc8DD2x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x8y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y0  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y03pqrEv
  ~CC2x9y0(); // tgen
  CC2x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y0E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y03abcEv");}
void  ccc::CC2x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y03efgEv");}
void  ccc::CC2x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y03pqrEv");}
ccc::CC2x9y0 ::~CC2x9y0(){ note_dtor("_ZN3ccc7CC2x9y0E", this);} // tgen
ccc::CC2x9y0 ::CC2x9y0(){ note_ctor("_ZN3ccc7CC2x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y0E, buf);
    ::ccc::CC2x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y0E);
    dp->::ccc::CC2x9y0::~CC2x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y0E(Test__ZN3ccc7CC2x9y0E, "_ZN3ccc7CC2x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y0C1Ev();
extern void _ZN3ccc7CC2x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y0E[] = {
  NSPAIR(_ZN3ccc7CC2x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y0E[];
extern void _ZN3ccc7CC2x9y03efgEv();
extern void _ZN3ccc7CC2x9y03pqrEv();
extern void _ZN3ccc7CC2x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y03efgEv,_ZTv0_n12_N3ccc7CC2x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y03efgEv,_ZThn4_N3ccc7CC2x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y03abcEv,_ZTv0_n16_N3ccc7CC2x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y03abcEv,_ZThn4_N3ccc7CC2x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y03pqrEv,_ZTv0_n20_N3ccc7CC2x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y03pqrEv,_ZThn4_N3ccc7CC2x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y03efgEv,_ZTv0_n12_N3ccc7CC2x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y03abcEv,_ZTv0_n16_N3ccc7CC2x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y03pqrEv,_ZTv0_n20_N3ccc7CC2x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y0E[] = {
  {&(_ZTVN3ccc7CC2x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y0E[];
static VTBL_ENTRY alt_thunk_names1132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y03pqrEv,_ZTv0_n20_N3ccc7CC2x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y03pqrEv,_ZThn4_N3ccc7CC2x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y03abcEv,_ZTv0_n16_N3ccc7CC2x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y03abcEv,_ZThn4_N3ccc7CC2x9y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y03efgEv,_ZTv0_n12_N3ccc7CC2x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y03efgEv,_ZThn4_N3ccc7CC2x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y0E = {  "_ZN3ccc7CC2x9y0E", // class name
  bases__ZN3ccc7CC2x9y0E, 2,
  &(vtc__ZN3ccc7CC2x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y0E),2, //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  DD2x9y0  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD2x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD2x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y03pqrEv
  ~DD2x9y0(); // tgen
  DD2x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y03abcEv");}
void  ccc::DD2x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y03efgEv");}
void  ccc::DD2x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y03pqrEv");}
ccc::DD2x9y0 ::~DD2x9y0(){ note_dtor("_ZN3ccc7DD2x9y0E", this);} // tgen
ccc::DD2x9y0 ::DD2x9y0(){ note_ctor("_ZN3ccc7DD2x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y0E, buf);
    ::ccc::DD2x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y0E);
    dp->::ccc::DD2x9y0::~DD2x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y0E(Test__ZN3ccc7DD2x9y0E, "_ZN3ccc7DD2x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y0C1Ev();
extern void _ZN3ccc7DD2x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y0E[] = {
  NSPAIR(_ZN3ccc7DD2x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y0E[];
extern void _ZN3ccc7DD2x9y03efgEv();
extern void _ZN3ccc7DD2x9y03abcEv();
extern void _ZN3ccc7DD2x9y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y03efgEv,_ZTv0_n12_N3ccc7DD2x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y03efgEv,_ZThn4_N3ccc7DD2x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y03pqrEv,_ZTv0_n16_N3ccc7DD2x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y03pqrEv,_ZThn4_N3ccc7DD2x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y03efgEv,_ZTv0_n12_N3ccc7DD2x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y03pqrEv,_ZTv0_n16_N3ccc7DD2x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y0E[] = {
  {&(_ZTVN3ccc7DD2x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y0E[];
static VTBL_ENTRY alt_thunk_names1133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y03pqrEv,_ZTv0_n16_N3ccc7DD2x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y03pqrEv,_ZThn4_N3ccc7DD2x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y03efgEv,_ZTv0_n12_N3ccc7DD2x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y03efgEv,_ZThn4_N3ccc7DD2x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y0E = {  "_ZN3ccc7DD2x9y0E", // class name
  bases__ZN3ccc7DD2x9y0E, 2,
  &(vtc__ZN3ccc7DD2x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y0E),3, //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  CC2x9y1  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x9y13efgEv
  ~CC2x9y1(); // tgen
  CC2x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y1E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y13abcEv");}
void  ccc::CC2x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y13pqrEv");}
void  ccc::CC2x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y13efgEv");}
ccc::CC2x9y1 ::~CC2x9y1(){ note_dtor("_ZN3ccc7CC2x9y1E", this);} // tgen
ccc::CC2x9y1 ::CC2x9y1(){ note_ctor("_ZN3ccc7CC2x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y1E, buf);
    ::ccc::CC2x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y1E);
    dp->::ccc::CC2x9y1::~CC2x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y1E(Test__ZN3ccc7CC2x9y1E, "_ZN3ccc7CC2x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y1C1Ev();
extern void _ZN3ccc7CC2x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y1E[] = {
  NSPAIR(_ZN3ccc7CC2x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y1E[];
extern void _ZN3ccc7CC2x9y13efgEv();
extern void _ZN3ccc7CC2x9y13pqrEv();
extern void _ZN3ccc7CC2x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y13efgEv,_ZTv0_n12_N3ccc7CC2x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y13efgEv,_ZThn4_N3ccc7CC2x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y13abcEv,_ZTv0_n16_N3ccc7CC2x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y13abcEv,_ZThn4_N3ccc7CC2x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y13pqrEv,_ZTv0_n20_N3ccc7CC2x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y13pqrEv,_ZThn4_N3ccc7CC2x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y13efgEv,_ZTv0_n12_N3ccc7CC2x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y13abcEv,_ZTv0_n16_N3ccc7CC2x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y13pqrEv,_ZTv0_n20_N3ccc7CC2x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y1E[] = {
  {&(_ZTVN3ccc7CC2x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y1E[];
static VTBL_ENTRY alt_thunk_names1134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y13pqrEv,_ZTv0_n20_N3ccc7CC2x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y13pqrEv,_ZThn4_N3ccc7CC2x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y13abcEv,_ZTv0_n16_N3ccc7CC2x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y13abcEv,_ZThn4_N3ccc7CC2x9y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y13efgEv,_ZTv0_n12_N3ccc7CC2x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y13efgEv,_ZThn4_N3ccc7CC2x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y1E = {  "_ZN3ccc7CC2x9y1E", // class name
  bases__ZN3ccc7CC2x9y1E, 2,
  &(vtc__ZN3ccc7CC2x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y1E),2, //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  DD2x9y1  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD2x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x9y13efgEv
  ~DD2x9y1(); // tgen
  DD2x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y13abcEv");}
void  ccc::DD2x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y13pqrEv");}
void  ccc::DD2x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y13efgEv");}
ccc::DD2x9y1 ::~DD2x9y1(){ note_dtor("_ZN3ccc7DD2x9y1E", this);} // tgen
ccc::DD2x9y1 ::DD2x9y1(){ note_ctor("_ZN3ccc7DD2x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y1E, buf);
    ::ccc::DD2x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y1E);
    dp->::ccc::DD2x9y1::~DD2x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y1E(Test__ZN3ccc7DD2x9y1E, "_ZN3ccc7DD2x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y1C1Ev();
extern void _ZN3ccc7DD2x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y1E[] = {
  NSPAIR(_ZN3ccc7DD2x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y1E[];
extern void _ZN3ccc7DD2x9y13efgEv();
extern void _ZN3ccc7DD2x9y13abcEv();
extern void _ZN3ccc7DD2x9y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y13efgEv,_ZTv0_n12_N3ccc7DD2x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y13efgEv,_ZThn4_N3ccc7DD2x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y13pqrEv,_ZTv0_n16_N3ccc7DD2x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y13pqrEv,_ZThn4_N3ccc7DD2x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y13efgEv,_ZTv0_n12_N3ccc7DD2x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y13pqrEv,_ZTv0_n16_N3ccc7DD2x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y1E[] = {
  {&(_ZTVN3ccc7DD2x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y1E[];
static VTBL_ENTRY alt_thunk_names1135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y13pqrEv,_ZTv0_n16_N3ccc7DD2x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y13pqrEv,_ZThn4_N3ccc7DD2x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y13efgEv,_ZTv0_n12_N3ccc7DD2x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y13efgEv,_ZThn4_N3ccc7DD2x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y1E = {  "_ZN3ccc7DD2x9y1E", // class name
  bases__ZN3ccc7DD2x9y1E, 2,
  &(vtc__ZN3ccc7DD2x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y1E),3, //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  CC2x9y2  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y23pqrEv
  ~CC2x9y2(); // tgen
  CC2x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y2E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y23efgEv");}
void  ccc::CC2x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y23abcEv");}
void  ccc::CC2x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y23pqrEv");}
ccc::CC2x9y2 ::~CC2x9y2(){ note_dtor("_ZN3ccc7CC2x9y2E", this);} // tgen
ccc::CC2x9y2 ::CC2x9y2(){ note_ctor("_ZN3ccc7CC2x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y2E, buf);
    ::ccc::CC2x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y2E);
    dp->::ccc::CC2x9y2::~CC2x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y2E(Test__ZN3ccc7CC2x9y2E, "_ZN3ccc7CC2x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y2C1Ev();
extern void _ZN3ccc7CC2x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y2E[] = {
  NSPAIR(_ZN3ccc7CC2x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y2E[];
extern void _ZN3ccc7CC2x9y23efgEv();
extern void _ZN3ccc7CC2x9y23pqrEv();
extern void _ZN3ccc7CC2x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y23efgEv,_ZTv0_n12_N3ccc7CC2x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y23efgEv,_ZThn4_N3ccc7CC2x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y23abcEv,_ZTv0_n16_N3ccc7CC2x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y23abcEv,_ZThn4_N3ccc7CC2x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y23pqrEv,_ZTv0_n20_N3ccc7CC2x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y23pqrEv,_ZThn4_N3ccc7CC2x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y23efgEv,_ZTv0_n12_N3ccc7CC2x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y23abcEv,_ZTv0_n16_N3ccc7CC2x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y23pqrEv,_ZTv0_n20_N3ccc7CC2x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y2E[] = {
  {&(_ZTVN3ccc7CC2x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y2E[];
static VTBL_ENTRY alt_thunk_names1136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y23pqrEv,_ZTv0_n20_N3ccc7CC2x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y23pqrEv,_ZThn4_N3ccc7CC2x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y23abcEv,_ZTv0_n16_N3ccc7CC2x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y23abcEv,_ZThn4_N3ccc7CC2x9y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y23efgEv,_ZTv0_n12_N3ccc7CC2x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y23efgEv,_ZThn4_N3ccc7CC2x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y2E = {  "_ZN3ccc7CC2x9y2E", // class name
  bases__ZN3ccc7CC2x9y2E, 2,
  &(vtc__ZN3ccc7CC2x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y2E),2, //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  DD2x9y2  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD2x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD2x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y23pqrEv
  ~DD2x9y2(); // tgen
  DD2x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y23efgEv");}
void  ccc::DD2x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y23abcEv");}
void  ccc::DD2x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y23pqrEv");}
ccc::DD2x9y2 ::~DD2x9y2(){ note_dtor("_ZN3ccc7DD2x9y2E", this);} // tgen
ccc::DD2x9y2 ::DD2x9y2(){ note_ctor("_ZN3ccc7DD2x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y2E, buf);
    ::ccc::DD2x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y2E);
    dp->::ccc::DD2x9y2::~DD2x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y2E(Test__ZN3ccc7DD2x9y2E, "_ZN3ccc7DD2x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y2C1Ev();
extern void _ZN3ccc7DD2x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y2E[] = {
  NSPAIR(_ZN3ccc7DD2x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y2E[];
extern void _ZN3ccc7DD2x9y23efgEv();
extern void _ZN3ccc7DD2x9y23abcEv();
extern void _ZN3ccc7DD2x9y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y23efgEv,_ZTv0_n12_N3ccc7DD2x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y23efgEv,_ZThn4_N3ccc7DD2x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y23pqrEv,_ZTv0_n16_N3ccc7DD2x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y23pqrEv,_ZThn4_N3ccc7DD2x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y23efgEv,_ZTv0_n12_N3ccc7DD2x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y23pqrEv,_ZTv0_n16_N3ccc7DD2x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y2E[] = {
  {&(_ZTVN3ccc7DD2x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y2E[];
static VTBL_ENTRY alt_thunk_names1137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y23pqrEv,_ZTv0_n16_N3ccc7DD2x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y23pqrEv,_ZThn4_N3ccc7DD2x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y23efgEv,_ZTv0_n12_N3ccc7DD2x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y23efgEv,_ZThn4_N3ccc7DD2x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y2E = {  "_ZN3ccc7DD2x9y2E", // class name
  bases__ZN3ccc7DD2x9y2E, 2,
  &(vtc__ZN3ccc7DD2x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y2E),3, //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  CC2x9y3  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x9y33abcEv
  ~CC2x9y3(); // tgen
  CC2x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y3E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y33efgEv");}
void  ccc::CC2x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y33pqrEv");}
void  ccc::CC2x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y33abcEv");}
ccc::CC2x9y3 ::~CC2x9y3(){ note_dtor("_ZN3ccc7CC2x9y3E", this);} // tgen
ccc::CC2x9y3 ::CC2x9y3(){ note_ctor("_ZN3ccc7CC2x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y3E, buf);
    ::ccc::CC2x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y3E);
    dp->::ccc::CC2x9y3::~CC2x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y3E(Test__ZN3ccc7CC2x9y3E, "_ZN3ccc7CC2x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y3C1Ev();
extern void _ZN3ccc7CC2x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y3E[] = {
  NSPAIR(_ZN3ccc7CC2x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y3E[];
extern void _ZN3ccc7CC2x9y33efgEv();
extern void _ZN3ccc7CC2x9y33pqrEv();
extern void _ZN3ccc7CC2x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y33efgEv,_ZTv0_n12_N3ccc7CC2x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y33efgEv,_ZThn4_N3ccc7CC2x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y33abcEv,_ZTv0_n16_N3ccc7CC2x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y33abcEv,_ZThn4_N3ccc7CC2x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y33pqrEv,_ZTv0_n20_N3ccc7CC2x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y33pqrEv,_ZThn4_N3ccc7CC2x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y33efgEv,_ZTv0_n12_N3ccc7CC2x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y33abcEv,_ZTv0_n16_N3ccc7CC2x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y33pqrEv,_ZTv0_n20_N3ccc7CC2x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y3E[] = {
  {&(_ZTVN3ccc7CC2x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y3E[];
static VTBL_ENTRY alt_thunk_names1138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y33pqrEv,_ZTv0_n20_N3ccc7CC2x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y33pqrEv,_ZThn4_N3ccc7CC2x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y33abcEv,_ZTv0_n16_N3ccc7CC2x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y33abcEv,_ZThn4_N3ccc7CC2x9y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y33efgEv,_ZTv0_n12_N3ccc7CC2x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y33efgEv,_ZThn4_N3ccc7CC2x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y3E = {  "_ZN3ccc7CC2x9y3E", // class name
  bases__ZN3ccc7CC2x9y3E, 2,
  &(vtc__ZN3ccc7CC2x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y3E),2, //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  DD2x9y3  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD2x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x9y33abcEv
  ~DD2x9y3(); // tgen
  DD2x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y33efgEv");}
void  ccc::DD2x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y33pqrEv");}
void  ccc::DD2x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y33abcEv");}
ccc::DD2x9y3 ::~DD2x9y3(){ note_dtor("_ZN3ccc7DD2x9y3E", this);} // tgen
ccc::DD2x9y3 ::DD2x9y3(){ note_ctor("_ZN3ccc7DD2x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y3E, buf);
    ::ccc::DD2x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y3E);
    dp->::ccc::DD2x9y3::~DD2x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y3E(Test__ZN3ccc7DD2x9y3E, "_ZN3ccc7DD2x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y3C1Ev();
extern void _ZN3ccc7DD2x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y3E[] = {
  NSPAIR(_ZN3ccc7DD2x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y3E[];
extern void _ZN3ccc7DD2x9y33efgEv();
extern void _ZN3ccc7DD2x9y33abcEv();
extern void _ZN3ccc7DD2x9y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y33efgEv,_ZTv0_n12_N3ccc7DD2x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y33efgEv,_ZThn4_N3ccc7DD2x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y33pqrEv,_ZTv0_n16_N3ccc7DD2x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y33pqrEv,_ZThn4_N3ccc7DD2x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y33efgEv,_ZTv0_n12_N3ccc7DD2x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y33pqrEv,_ZTv0_n16_N3ccc7DD2x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y3E[] = {
  {&(_ZTVN3ccc7DD2x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y3E[];
static VTBL_ENTRY alt_thunk_names1139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y33pqrEv,_ZTv0_n16_N3ccc7DD2x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y33pqrEv,_ZThn4_N3ccc7DD2x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y33efgEv,_ZTv0_n12_N3ccc7DD2x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y33efgEv,_ZThn4_N3ccc7DD2x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y3E = {  "_ZN3ccc7DD2x9y3E", // class name
  bases__ZN3ccc7DD2x9y3E, 2,
  &(vtc__ZN3ccc7DD2x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y3E),3, //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  CC2x9y4  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC2x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y43efgEv
  ~CC2x9y4(); // tgen
  CC2x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y4E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y43pqrEv");}
void  ccc::CC2x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y43abcEv");}
void  ccc::CC2x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y43efgEv");}
ccc::CC2x9y4 ::~CC2x9y4(){ note_dtor("_ZN3ccc7CC2x9y4E", this);} // tgen
ccc::CC2x9y4 ::CC2x9y4(){ note_ctor("_ZN3ccc7CC2x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y4E, buf);
    ::ccc::CC2x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y4E);
    dp->::ccc::CC2x9y4::~CC2x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y4E(Test__ZN3ccc7CC2x9y4E, "_ZN3ccc7CC2x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y4C1Ev();
extern void _ZN3ccc7CC2x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y4E[] = {
  NSPAIR(_ZN3ccc7CC2x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y4E[];
extern void _ZN3ccc7CC2x9y43efgEv();
extern void _ZN3ccc7CC2x9y43pqrEv();
extern void _ZN3ccc7CC2x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y43efgEv,_ZTv0_n12_N3ccc7CC2x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y43efgEv,_ZThn4_N3ccc7CC2x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y43abcEv,_ZTv0_n16_N3ccc7CC2x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y43abcEv,_ZThn4_N3ccc7CC2x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y43pqrEv,_ZTv0_n20_N3ccc7CC2x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y43pqrEv,_ZThn4_N3ccc7CC2x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y43efgEv,_ZTv0_n12_N3ccc7CC2x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y43abcEv,_ZTv0_n16_N3ccc7CC2x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y43pqrEv,_ZTv0_n20_N3ccc7CC2x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y4E[] = {
  {&(_ZTVN3ccc7CC2x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y4E[];
static VTBL_ENTRY alt_thunk_names1140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y43pqrEv,_ZTv0_n20_N3ccc7CC2x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y43pqrEv,_ZThn4_N3ccc7CC2x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y43abcEv,_ZTv0_n16_N3ccc7CC2x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y43abcEv,_ZThn4_N3ccc7CC2x9y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y43efgEv,_ZTv0_n12_N3ccc7CC2x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y43efgEv,_ZThn4_N3ccc7CC2x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y4E = {  "_ZN3ccc7CC2x9y4E", // class name
  bases__ZN3ccc7CC2x9y4E, 2,
  &(vtc__ZN3ccc7CC2x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y4E),2, //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  DD2x9y4  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD2x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD2x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD2x9y43efgEv
  ~DD2x9y4(); // tgen
  DD2x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y43pqrEv");}
void  ccc::DD2x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y43abcEv");}
void  ccc::DD2x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y43efgEv");}
ccc::DD2x9y4 ::~DD2x9y4(){ note_dtor("_ZN3ccc7DD2x9y4E", this);} // tgen
ccc::DD2x9y4 ::DD2x9y4(){ note_ctor("_ZN3ccc7DD2x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y4E, buf);
    ::ccc::DD2x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y4E);
    dp->::ccc::DD2x9y4::~DD2x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y4E(Test__ZN3ccc7DD2x9y4E, "_ZN3ccc7DD2x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y4C1Ev();
extern void _ZN3ccc7DD2x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y4E[] = {
  NSPAIR(_ZN3ccc7DD2x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y4E[];
extern void _ZN3ccc7DD2x9y43efgEv();
extern void _ZN3ccc7DD2x9y43abcEv();
extern void _ZN3ccc7DD2x9y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y43efgEv,_ZTv0_n12_N3ccc7DD2x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y43efgEv,_ZThn4_N3ccc7DD2x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y43pqrEv,_ZTv0_n16_N3ccc7DD2x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y43pqrEv,_ZThn4_N3ccc7DD2x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y43efgEv,_ZTv0_n12_N3ccc7DD2x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y43pqrEv,_ZTv0_n16_N3ccc7DD2x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y4E[] = {
  {&(_ZTVN3ccc7DD2x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y4E[];
static VTBL_ENTRY alt_thunk_names1141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y43pqrEv,_ZTv0_n16_N3ccc7DD2x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y43pqrEv,_ZThn4_N3ccc7DD2x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y43efgEv,_ZTv0_n12_N3ccc7DD2x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y43efgEv,_ZThn4_N3ccc7DD2x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y4E = {  "_ZN3ccc7DD2x9y4E", // class name
  bases__ZN3ccc7DD2x9y4E, 2,
  &(vtc__ZN3ccc7DD2x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y4E),3, //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  CC2x9y5  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC2x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y53abcEv
  ~CC2x9y5(); // tgen
  CC2x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y5E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y53pqrEv");}
void  ccc::CC2x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y53efgEv");}
void  ccc::CC2x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y53abcEv");}
ccc::CC2x9y5 ::~CC2x9y5(){ note_dtor("_ZN3ccc7CC2x9y5E", this);} // tgen
ccc::CC2x9y5 ::CC2x9y5(){ note_ctor("_ZN3ccc7CC2x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y5E, buf);
    ::ccc::CC2x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y5E);
    dp->::ccc::CC2x9y5::~CC2x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y5E(Test__ZN3ccc7CC2x9y5E, "_ZN3ccc7CC2x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y5C1Ev();
extern void _ZN3ccc7CC2x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y5E[] = {
  NSPAIR(_ZN3ccc7CC2x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y5E[];
extern void _ZN3ccc7CC2x9y53efgEv();
extern void _ZN3ccc7CC2x9y53pqrEv();
extern void _ZN3ccc7CC2x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y53efgEv,_ZTv0_n12_N3ccc7CC2x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y53efgEv,_ZThn4_N3ccc7CC2x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y53abcEv,_ZTv0_n16_N3ccc7CC2x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y53abcEv,_ZThn4_N3ccc7CC2x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y53pqrEv,_ZTv0_n20_N3ccc7CC2x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y53pqrEv,_ZThn4_N3ccc7CC2x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y53efgEv,_ZTv0_n12_N3ccc7CC2x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y53abcEv,_ZTv0_n16_N3ccc7CC2x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y53pqrEv,_ZTv0_n20_N3ccc7CC2x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y5E[] = {
  {&(_ZTVN3ccc7CC2x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y5E[];
static VTBL_ENTRY alt_thunk_names1142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y53pqrEv,_ZTv0_n20_N3ccc7CC2x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y53pqrEv,_ZThn4_N3ccc7CC2x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y53abcEv,_ZTv0_n16_N3ccc7CC2x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y53abcEv,_ZThn4_N3ccc7CC2x9y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y53efgEv,_ZTv0_n12_N3ccc7CC2x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y53efgEv,_ZThn4_N3ccc7CC2x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y5E = {  "_ZN3ccc7CC2x9y5E", // class name
  bases__ZN3ccc7CC2x9y5E, 2,
  &(vtc__ZN3ccc7CC2x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y5E),2, //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  DD2x9y5  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD2x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD2x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD2x9y53abcEv
  ~DD2x9y5(); // tgen
  DD2x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y53pqrEv");}
void  ccc::DD2x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y53efgEv");}
void  ccc::DD2x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y53abcEv");}
ccc::DD2x9y5 ::~DD2x9y5(){ note_dtor("_ZN3ccc7DD2x9y5E", this);} // tgen
ccc::DD2x9y5 ::DD2x9y5(){ note_ctor("_ZN3ccc7DD2x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y5E, buf);
    ::ccc::DD2x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y5E);
    dp->::ccc::DD2x9y5::~DD2x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y5E(Test__ZN3ccc7DD2x9y5E, "_ZN3ccc7DD2x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y5C1Ev();
extern void _ZN3ccc7DD2x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y5E[] = {
  NSPAIR(_ZN3ccc7DD2x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y5E[];
extern void _ZN3ccc7DD2x9y53efgEv();
extern void _ZN3ccc7DD2x9y53abcEv();
extern void _ZN3ccc7DD2x9y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y53efgEv,_ZTv0_n12_N3ccc7DD2x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y53efgEv,_ZThn4_N3ccc7DD2x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y53pqrEv,_ZTv0_n16_N3ccc7DD2x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y53pqrEv,_ZThn4_N3ccc7DD2x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y53efgEv,_ZTv0_n12_N3ccc7DD2x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y53pqrEv,_ZTv0_n16_N3ccc7DD2x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y5E[] = {
  {&(_ZTVN3ccc7DD2x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y5E[];
static VTBL_ENTRY alt_thunk_names1143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y53pqrEv,_ZTv0_n16_N3ccc7DD2x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y53pqrEv,_ZThn4_N3ccc7DD2x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y53efgEv,_ZTv0_n12_N3ccc7DD2x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y53efgEv,_ZThn4_N3ccc7DD2x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y5E = {  "_ZN3ccc7DD2x9y5E", // class name
  bases__ZN3ccc7DD2x9y5E, 2,
  &(vtc__ZN3ccc7DD2x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y5E),3, //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  CC2x9y6  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y63efgEv
  ~CC2x9y6(); // tgen
  CC2x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y6E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y63abcEv");}
void  ccc::CC2x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y63efgEv");}
ccc::CC2x9y6 ::~CC2x9y6(){ note_dtor("_ZN3ccc7CC2x9y6E", this);} // tgen
ccc::CC2x9y6 ::CC2x9y6(){ note_ctor("_ZN3ccc7CC2x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y6E, buf);
    ::ccc::CC2x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y6E);
    dp->::ccc::CC2x9y6::~CC2x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y6E(Test__ZN3ccc7CC2x9y6E, "_ZN3ccc7CC2x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y6C1Ev();
extern void _ZN3ccc7CC2x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y6E[] = {
  NSPAIR(_ZN3ccc7CC2x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y6E[];
extern void _ZN3ccc7CC2x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC2x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y63efgEv,_ZTv0_n12_N3ccc7CC2x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y63efgEv,_ZThn4_N3ccc7CC2x9y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y63abcEv,_ZTv0_n16_N3ccc7CC2x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y63abcEv,_ZThn4_N3ccc7CC2x9y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y63efgEv,_ZTv0_n12_N3ccc7CC2x9y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y63abcEv,_ZTv0_n16_N3ccc7CC2x9y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y6E[] = {
  {&(_ZTVN3ccc7CC2x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y6E[];
static VTBL_ENTRY alt_thunk_names1144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y63abcEv,_ZTv0_n16_N3ccc7CC2x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y63abcEv,_ZThn4_N3ccc7CC2x9y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y63efgEv,_ZTv0_n12_N3ccc7CC2x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y63efgEv,_ZThn4_N3ccc7CC2x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y6E = {  "_ZN3ccc7CC2x9y6E", // class name
  bases__ZN3ccc7CC2x9y6E, 2,
  &(vtc__ZN3ccc7CC2x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y6E),2, //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  DD2x9y6  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD2x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD2x9y63efgEv
  ~DD2x9y6(); // tgen
  DD2x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y63abcEv");}
void  ccc::DD2x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y63efgEv");}
ccc::DD2x9y6 ::~DD2x9y6(){ note_dtor("_ZN3ccc7DD2x9y6E", this);} // tgen
ccc::DD2x9y6 ::DD2x9y6(){ note_ctor("_ZN3ccc7DD2x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y6E, buf);
    ::ccc::DD2x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y6E);
    dp->::ccc::DD2x9y6::~DD2x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y6E(Test__ZN3ccc7DD2x9y6E, "_ZN3ccc7DD2x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y6C1Ev();
extern void _ZN3ccc7DD2x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y6E[] = {
  NSPAIR(_ZN3ccc7DD2x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y6E[];
extern void _ZN3ccc7DD2x9y63efgEv();
extern void _ZN3ccc7DD2x9y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y63efgEv,_ZTv0_n12_N3ccc7DD2x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y63efgEv,_ZThn4_N3ccc7DD2x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y63efgEv,_ZTv0_n12_N3ccc7DD2x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y6E[] = {
  {&(_ZTVN3ccc7DD2x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y6E[];
static VTBL_ENTRY alt_thunk_names1145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y63efgEv,_ZTv0_n12_N3ccc7DD2x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y63efgEv,_ZThn4_N3ccc7DD2x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y6E = {  "_ZN3ccc7DD2x9y6E", // class name
  bases__ZN3ccc7DD2x9y6E, 2,
  &(vtc__ZN3ccc7DD2x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y6E),3, //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  CC2x9y7  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y73pqrEv
  ~CC2x9y7(); // tgen
  CC2x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y7E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y73abcEv");}
void  ccc::CC2x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y73pqrEv");}
ccc::CC2x9y7 ::~CC2x9y7(){ note_dtor("_ZN3ccc7CC2x9y7E", this);} // tgen
ccc::CC2x9y7 ::CC2x9y7(){ note_ctor("_ZN3ccc7CC2x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y7E, buf);
    ::ccc::CC2x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y7E);
    dp->::ccc::CC2x9y7::~CC2x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y7E(Test__ZN3ccc7CC2x9y7E, "_ZN3ccc7CC2x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y7C1Ev();
extern void _ZN3ccc7CC2x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y7E[] = {
  NSPAIR(_ZN3ccc7CC2x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC2x9y73pqrEv();
extern void _ZN3ccc7CC2x9y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y73abcEv,_ZTv0_n16_N3ccc7CC2x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y73abcEv,_ZThn4_N3ccc7CC2x9y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y73pqrEv,_ZTv0_n20_N3ccc7CC2x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y73pqrEv,_ZThn4_N3ccc7CC2x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y73abcEv,_ZTv0_n16_N3ccc7CC2x9y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y73pqrEv,_ZTv0_n20_N3ccc7CC2x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y7E[] = {
  {&(_ZTVN3ccc7CC2x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y7E[];
static VTBL_ENTRY alt_thunk_names1146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y73pqrEv,_ZTv0_n20_N3ccc7CC2x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y73pqrEv,_ZThn4_N3ccc7CC2x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y73abcEv,_ZTv0_n16_N3ccc7CC2x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y73abcEv,_ZThn4_N3ccc7CC2x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y7E = {  "_ZN3ccc7CC2x9y7E", // class name
  bases__ZN3ccc7CC2x9y7E, 2,
  &(vtc__ZN3ccc7CC2x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y7E),2, //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  DD2x9y7  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD2x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y73pqrEv
  ~DD2x9y7(); // tgen
  DD2x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y73abcEv");}
void  ccc::DD2x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y73pqrEv");}
ccc::DD2x9y7 ::~DD2x9y7(){ note_dtor("_ZN3ccc7DD2x9y7E", this);} // tgen
ccc::DD2x9y7 ::DD2x9y7(){ note_ctor("_ZN3ccc7DD2x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y7E, buf);
    ::ccc::DD2x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y7E);
    dp->::ccc::DD2x9y7::~DD2x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y7E(Test__ZN3ccc7DD2x9y7E, "_ZN3ccc7DD2x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y7C1Ev();
extern void _ZN3ccc7DD2x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y7E[] = {
  NSPAIR(_ZN3ccc7DD2x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7DD2x9y73abcEv();
extern void _ZN3ccc7DD2x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y73pqrEv,_ZTv0_n16_N3ccc7DD2x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y73pqrEv,_ZThn4_N3ccc7DD2x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y73pqrEv,_ZTv0_n16_N3ccc7DD2x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y7E[] = {
  {&(_ZTVN3ccc7DD2x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y7E[];
static VTBL_ENTRY alt_thunk_names1147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y73pqrEv,_ZTv0_n16_N3ccc7DD2x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y73pqrEv,_ZThn4_N3ccc7DD2x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y7E = {  "_ZN3ccc7DD2x9y7E", // class name
  bases__ZN3ccc7DD2x9y7E, 2,
  &(vtc__ZN3ccc7DD2x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y7E),3, //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  CC2x9y8  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y83abcEv
  ~CC2x9y8(); // tgen
  CC2x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y8E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y83efgEv");}
void  ccc::CC2x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y83abcEv");}
ccc::CC2x9y8 ::~CC2x9y8(){ note_dtor("_ZN3ccc7CC2x9y8E", this);} // tgen
ccc::CC2x9y8 ::CC2x9y8(){ note_ctor("_ZN3ccc7CC2x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y8E, buf);
    ::ccc::CC2x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y8E);
    dp->::ccc::CC2x9y8::~CC2x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y8E(Test__ZN3ccc7CC2x9y8E, "_ZN3ccc7CC2x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y8C1Ev();
extern void _ZN3ccc7CC2x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y8E[] = {
  NSPAIR(_ZN3ccc7CC2x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y8E[];
extern void _ZN3ccc7CC2x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC2x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y83efgEv,_ZTv0_n12_N3ccc7CC2x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y83efgEv,_ZThn4_N3ccc7CC2x9y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC2x9y83abcEv,_ZTv0_n16_N3ccc7CC2x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y83abcEv,_ZThn4_N3ccc7CC2x9y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y83efgEv,_ZTv0_n12_N3ccc7CC2x9y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC2x9y83abcEv,_ZTv0_n16_N3ccc7CC2x9y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y8E[] = {
  {&(_ZTVN3ccc7CC2x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC2x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y8E[];
static VTBL_ENTRY alt_thunk_names1148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC2x9y83abcEv,_ZTv0_n16_N3ccc7CC2x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y83abcEv,_ZThn4_N3ccc7CC2x9y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y83efgEv,_ZTv0_n12_N3ccc7CC2x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y83efgEv,_ZThn4_N3ccc7CC2x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y8E = {  "_ZN3ccc7CC2x9y8E", // class name
  bases__ZN3ccc7CC2x9y8E, 2,
  &(vtc__ZN3ccc7CC2x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y8E),2, //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  DD2x9y8  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD2x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD2x9y83abcEv
  ~DD2x9y8(); // tgen
  DD2x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y83efgEv");}
void  ccc::DD2x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD2x9y83abcEv");}
ccc::DD2x9y8 ::~DD2x9y8(){ note_dtor("_ZN3ccc7DD2x9y8E", this);} // tgen
ccc::DD2x9y8 ::DD2x9y8(){ note_ctor("_ZN3ccc7DD2x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y8E, buf);
    ::ccc::DD2x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y8E);
    dp->::ccc::DD2x9y8::~DD2x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y8E(Test__ZN3ccc7DD2x9y8E, "_ZN3ccc7DD2x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y8C1Ev();
extern void _ZN3ccc7DD2x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y8E[] = {
  NSPAIR(_ZN3ccc7DD2x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y8E[];
extern void _ZN3ccc7DD2x9y83efgEv();
extern void _ZN3ccc7DD2x9y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y83efgEv,_ZTv0_n12_N3ccc7DD2x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y83efgEv,_ZThn4_N3ccc7DD2x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y83efgEv,_ZTv0_n12_N3ccc7DD2x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y8E[] = {
  {&(_ZTVN3ccc7DD2x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y8E[];
static VTBL_ENTRY alt_thunk_names1149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y83efgEv,_ZTv0_n12_N3ccc7DD2x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y83efgEv,_ZThn4_N3ccc7DD2x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y8E = {  "_ZN3ccc7DD2x9y8E", // class name
  bases__ZN3ccc7DD2x9y8E, 2,
  &(vtc__ZN3ccc7DD2x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y8E),3, //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  CC2x9y9  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y93pqrEv
  ~CC2x9y9(); // tgen
  CC2x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y9E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y93efgEv");}
void  ccc::CC2x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y93pqrEv");}
ccc::CC2x9y9 ::~CC2x9y9(){ note_dtor("_ZN3ccc7CC2x9y9E", this);} // tgen
ccc::CC2x9y9 ::CC2x9y9(){ note_ctor("_ZN3ccc7CC2x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y9E, buf);
    ::ccc::CC2x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc7CC2x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC2x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y9E);
    dp->::ccc::CC2x9y9::~CC2x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y9E(Test__ZN3ccc7CC2x9y9E, "_ZN3ccc7CC2x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y9C1Ev();
extern void _ZN3ccc7CC2x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y9E[] = {
  NSPAIR(_ZN3ccc7CC2x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y9E[];
extern void _ZN3ccc7CC2x9y93efgEv();
extern void _ZN3ccc7CC2x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC2x9y93efgEv,_ZTv0_n12_N3ccc7CC2x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y93efgEv,_ZThn4_N3ccc7CC2x9y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC2x9y93pqrEv,_ZTv0_n20_N3ccc7CC2x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y93pqrEv,_ZThn4_N3ccc7CC2x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC2x9y93efgEv,_ZTv0_n12_N3ccc7CC2x9y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC2x9y93pqrEv,_ZTv0_n20_N3ccc7CC2x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC2x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC2x9y9E[] = {
  {&(_ZTVN3ccc7CC2x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC2x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC2x9y9E[];
static VTBL_ENTRY alt_thunk_names1150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC2x9y93pqrEv,_ZTv0_n20_N3ccc7CC2x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y93pqrEv,_ZThn4_N3ccc7CC2x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC2x9y93efgEv,_ZTv0_n12_N3ccc7CC2x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC2x9y93efgEv,_ZThn4_N3ccc7CC2x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC2x9y9E = {  "_ZN3ccc7CC2x9y9E", // class name
  bases__ZN3ccc7CC2x9y9E, 2,
  &(vtc__ZN3ccc7CC2x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC2x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC2x9y9E),2, //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  DD2x9y9  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD2x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD2x9y93pqrEv
  ~DD2x9y9(); // tgen
  DD2x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD2x9y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD2x9y93efgEv");}
void  ccc::DD2x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD2x9y93pqrEv");}
ccc::DD2x9y9 ::~DD2x9y9(){ note_dtor("_ZN3ccc7DD2x9y9E", this);} // tgen
ccc::DD2x9y9 ::DD2x9y9(){ note_ctor("_ZN3ccc7DD2x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD2x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD2x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD2x9y9E, buf);
    ::ccc::DD2x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD2x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD2x9y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7DD2x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD2x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD2x9y9E);
    dp->::ccc::DD2x9y9::~DD2x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD2x9y9E(Test__ZN3ccc7DD2x9y9E, "_ZN3ccc7DD2x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD2x9y9C1Ev();
extern void _ZN3ccc7DD2x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD2x9y9E[] = {
  NSPAIR(_ZN3ccc7DD2x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD2x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD2x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y9E[];
extern void _ZN3ccc7DD2x9y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7DD2x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD2x9y93efgEv,_ZTv0_n12_N3ccc7DD2x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y93efgEv,_ZThn4_N3ccc7DD2x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD2x9y93pqrEv,_ZTv0_n16_N3ccc7DD2x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD2x9y93pqrEv,_ZThn4_N3ccc7DD2x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD2x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD2x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD2x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD2x9y93efgEv,_ZTv0_n12_N3ccc7DD2x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD2x9y93pqrEv,_ZTv0_n16_N3ccc7DD2x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD2x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD2x9y9E[] = {
  {&(_ZTVN3ccc7DD2x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD2x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD2x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD2x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD2x9y9E[];
static VTBL_ENTRY alt_thunk_names1151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD2x9y93pqrEv,_ZTv0_n16_N3ccc7DD2x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y93pqrEv,_ZThn4_N3ccc7DD2x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD2x9y93efgEv,_ZTv0_n12_N3ccc7DD2x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD2x9y93efgEv,_ZThn4_N3ccc7DD2x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD2x9y9E = {  "_ZN3ccc7DD2x9y9E", // class name
  bases__ZN3ccc7DD2x9y9E, 2,
  &(vtc__ZN3ccc7DD2x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD2x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD2x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD2x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD2x9y9E),3, //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  CC2x9y10  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x9y103abcEv
  ~CC2x9y10(); // tgen
  CC2x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y10E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y103pqrEv");}
void  ccc::CC2x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x9y103abcEv");}
ccc::CC2x9y10 ::~CC2x9y10(){ note_dtor("_ZN3ccc8CC2x9y10E", this);} // tgen
ccc::CC2x9y10 ::CC2x9y10(){ note_ctor("_ZN3ccc8CC2x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y10E, buf);
    ::ccc::CC2x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y10E);
    dp->::ccc::CC2x9y10::~CC2x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y10E(Test__ZN3ccc8CC2x9y10E, "_ZN3ccc8CC2x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y10C1Ev();
extern void _ZN3ccc8CC2x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y10E[] = {
  NSPAIR(_ZN3ccc8CC2x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC2x9y103pqrEv();
extern void _ZN3ccc8CC2x9y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x9y103abcEv,_ZTv0_n16_N3ccc8CC2x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y103abcEv,_ZThn4_N3ccc8CC2x9y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x9y103pqrEv,_ZTv0_n20_N3ccc8CC2x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y103pqrEv,_ZThn4_N3ccc8CC2x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x9y103abcEv,_ZTv0_n16_N3ccc8CC2x9y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x9y103pqrEv,_ZTv0_n20_N3ccc8CC2x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y10E[] = {
  {&(_ZTVN3ccc8CC2x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y10E[];
static VTBL_ENTRY alt_thunk_names1152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x9y103pqrEv,_ZTv0_n20_N3ccc8CC2x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y103pqrEv,_ZThn4_N3ccc8CC2x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x9y103abcEv,_ZTv0_n16_N3ccc8CC2x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y103abcEv,_ZThn4_N3ccc8CC2x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x9y10E = {  "_ZN3ccc8CC2x9y10E", // class name
  bases__ZN3ccc8CC2x9y10E, 2,
  &(vtc__ZN3ccc8CC2x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y10E),2, //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  DD2x9y10  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD2x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x9y103abcEv
  ~DD2x9y10(); // tgen
  DD2x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x9y103pqrEv");}
void  ccc::DD2x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x9y103abcEv");}
ccc::DD2x9y10 ::~DD2x9y10(){ note_dtor("_ZN3ccc8DD2x9y10E", this);} // tgen
ccc::DD2x9y10 ::DD2x9y10(){ note_ctor("_ZN3ccc8DD2x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y10E, buf);
    ::ccc::DD2x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y10E);
    dp->::ccc::DD2x9y10::~DD2x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y10E(Test__ZN3ccc8DD2x9y10E, "_ZN3ccc8DD2x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y10C1Ev();
extern void _ZN3ccc8DD2x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y10E[] = {
  NSPAIR(_ZN3ccc8DD2x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x9y103abcEv();
extern void _ZN3ccc8DD2x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x9y103pqrEv,_ZTv0_n16_N3ccc8DD2x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x9y103pqrEv,_ZThn4_N3ccc8DD2x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x9y103pqrEv,_ZTv0_n16_N3ccc8DD2x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y10E[] = {
  {&(_ZTVN3ccc8DD2x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y10E[];
static VTBL_ENTRY alt_thunk_names1153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x9y103pqrEv,_ZTv0_n16_N3ccc8DD2x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x9y103pqrEv,_ZThn4_N3ccc8DD2x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x9y10E = {  "_ZN3ccc8DD2x9y10E", // class name
  bases__ZN3ccc8DD2x9y10E, 2,
  &(vtc__ZN3ccc8DD2x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y10E),3, //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  CC2x9y11  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x9y113efgEv
  ~CC2x9y11(); // tgen
  CC2x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y11E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y113pqrEv");}
void  ccc::CC2x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x9y113efgEv");}
ccc::CC2x9y11 ::~CC2x9y11(){ note_dtor("_ZN3ccc8CC2x9y11E", this);} // tgen
ccc::CC2x9y11 ::CC2x9y11(){ note_ctor("_ZN3ccc8CC2x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y11E, buf);
    ::ccc::CC2x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y11E);
    dp->::ccc::CC2x9y11::~CC2x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y11E(Test__ZN3ccc8CC2x9y11E, "_ZN3ccc8CC2x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y11C1Ev();
extern void _ZN3ccc8CC2x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y11E[] = {
  NSPAIR(_ZN3ccc8CC2x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y11E[];
extern void _ZN3ccc8CC2x9y113efgEv();
extern void _ZN3ccc8CC2x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x9y113efgEv,_ZTv0_n12_N3ccc8CC2x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y113efgEv,_ZThn4_N3ccc8CC2x9y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x9y113pqrEv,_ZTv0_n20_N3ccc8CC2x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y113pqrEv,_ZThn4_N3ccc8CC2x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x9y113efgEv,_ZTv0_n12_N3ccc8CC2x9y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x9y113pqrEv,_ZTv0_n20_N3ccc8CC2x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y11E[] = {
  {&(_ZTVN3ccc8CC2x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y11E[];
static VTBL_ENTRY alt_thunk_names1154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x9y113pqrEv,_ZTv0_n20_N3ccc8CC2x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y113pqrEv,_ZThn4_N3ccc8CC2x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x9y113efgEv,_ZTv0_n12_N3ccc8CC2x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y113efgEv,_ZThn4_N3ccc8CC2x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x9y11E = {  "_ZN3ccc8CC2x9y11E", // class name
  bases__ZN3ccc8CC2x9y11E, 2,
  &(vtc__ZN3ccc8CC2x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y11E),2, //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  DD2x9y11  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD2x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x9y113efgEv
  ~DD2x9y11(); // tgen
  DD2x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x9y113pqrEv");}
void  ccc::DD2x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x9y113efgEv");}
ccc::DD2x9y11 ::~DD2x9y11(){ note_dtor("_ZN3ccc8DD2x9y11E", this);} // tgen
ccc::DD2x9y11 ::DD2x9y11(){ note_ctor("_ZN3ccc8DD2x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y11E, buf);
    ::ccc::DD2x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y11E);
    dp->::ccc::DD2x9y11::~DD2x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y11E(Test__ZN3ccc8DD2x9y11E, "_ZN3ccc8DD2x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y11C1Ev();
extern void _ZN3ccc8DD2x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y11E[] = {
  NSPAIR(_ZN3ccc8DD2x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y11E[];
extern void _ZN3ccc8DD2x9y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x9y113efgEv,_ZTv0_n12_N3ccc8DD2x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x9y113efgEv,_ZThn4_N3ccc8DD2x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x9y113pqrEv,_ZTv0_n16_N3ccc8DD2x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x9y113pqrEv,_ZThn4_N3ccc8DD2x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x9y113efgEv,_ZTv0_n12_N3ccc8DD2x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x9y113pqrEv,_ZTv0_n16_N3ccc8DD2x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y11E[] = {
  {&(_ZTVN3ccc8DD2x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y11E[];
static VTBL_ENTRY alt_thunk_names1155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x9y113pqrEv,_ZTv0_n16_N3ccc8DD2x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x9y113pqrEv,_ZThn4_N3ccc8DD2x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x9y113efgEv,_ZTv0_n12_N3ccc8DD2x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x9y113efgEv,_ZThn4_N3ccc8DD2x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x9y11E = {  "_ZN3ccc8DD2x9y11E", // class name
  bases__ZN3ccc8DD2x9y11E, 2,
  &(vtc__ZN3ccc8DD2x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y11E),3, //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  CC2x9y12  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC2x9y123abcEv
  ~CC2x9y12(); // tgen
  CC2x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x9y123abcEv");}
ccc::CC2x9y12 ::~CC2x9y12(){ note_dtor("_ZN3ccc8CC2x9y12E", this);} // tgen
ccc::CC2x9y12 ::CC2x9y12(){ note_ctor("_ZN3ccc8CC2x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y12E, buf);
    ::ccc::CC2x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y12E);
    dp->::ccc::CC2x9y12::~CC2x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y12E(Test__ZN3ccc8CC2x9y12E, "_ZN3ccc8CC2x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y12C1Ev();
extern void _ZN3ccc8CC2x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y12E[] = {
  NSPAIR(_ZN3ccc8CC2x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC2x9y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x9y123abcEv,_ZTv0_n16_N3ccc8CC2x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y123abcEv,_ZThn4_N3ccc8CC2x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x9y123abcEv,_ZTv0_n16_N3ccc8CC2x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y12E[] = {
  {&(_ZTVN3ccc8CC2x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y12E[];
static VTBL_ENTRY alt_thunk_names1156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x9y123abcEv,_ZTv0_n16_N3ccc8CC2x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y123abcEv,_ZThn4_N3ccc8CC2x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x9y12E = {  "_ZN3ccc8CC2x9y12E", // class name
  bases__ZN3ccc8CC2x9y12E, 2,
  &(vtc__ZN3ccc8CC2x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y12E),2, //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  DD2x9y12  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD2x9y123abcEv
  ~DD2x9y12(); // tgen
  DD2x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x9y123abcEv");}
ccc::DD2x9y12 ::~DD2x9y12(){ note_dtor("_ZN3ccc8DD2x9y12E", this);} // tgen
ccc::DD2x9y12 ::DD2x9y12(){ note_ctor("_ZN3ccc8DD2x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y12E, buf);
    ::ccc::DD2x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y12E);
    dp->::ccc::DD2x9y12::~DD2x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y12E(Test__ZN3ccc8DD2x9y12E, "_ZN3ccc8DD2x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y12C1Ev();
extern void _ZN3ccc8DD2x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y12E[] = {
  NSPAIR(_ZN3ccc8DD2x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x9y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y12E[] = {
  {&(_ZTVN3ccc8DD2x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y12E[];
Class_Descriptor cd__ZN3ccc8DD2x9y12E = {  "_ZN3ccc8DD2x9y12E", // class name
  bases__ZN3ccc8DD2x9y12E, 2,
  &(vtc__ZN3ccc8DD2x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y13  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC2x9y133efgEv
  ~CC2x9y13(); // tgen
  CC2x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x9y133efgEv");}
ccc::CC2x9y13 ::~CC2x9y13(){ note_dtor("_ZN3ccc8CC2x9y13E", this);} // tgen
ccc::CC2x9y13 ::CC2x9y13(){ note_ctor("_ZN3ccc8CC2x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y13E, buf);
    ::ccc::CC2x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y13E);
    dp->::ccc::CC2x9y13::~CC2x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y13E(Test__ZN3ccc8CC2x9y13E, "_ZN3ccc8CC2x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y13C1Ev();
extern void _ZN3ccc8CC2x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y13E[] = {
  NSPAIR(_ZN3ccc8CC2x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y13E[];
extern void _ZN3ccc8CC2x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x9y133efgEv,_ZTv0_n12_N3ccc8CC2x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y133efgEv,_ZThn4_N3ccc8CC2x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x9y133efgEv,_ZTv0_n12_N3ccc8CC2x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y13E[] = {
  {&(_ZTVN3ccc8CC2x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y13E[];
static VTBL_ENTRY alt_thunk_names1157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x9y133efgEv,_ZTv0_n12_N3ccc8CC2x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y133efgEv,_ZThn4_N3ccc8CC2x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x9y13E = {  "_ZN3ccc8CC2x9y13E", // class name
  bases__ZN3ccc8CC2x9y13E, 2,
  &(vtc__ZN3ccc8CC2x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y13E),2, //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  DD2x9y13  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD2x9y133efgEv
  ~DD2x9y13(); // tgen
  DD2x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x9y133efgEv");}
ccc::DD2x9y13 ::~DD2x9y13(){ note_dtor("_ZN3ccc8DD2x9y13E", this);} // tgen
ccc::DD2x9y13 ::DD2x9y13(){ note_ctor("_ZN3ccc8DD2x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y13E, buf);
    ::ccc::DD2x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y13E);
    dp->::ccc::DD2x9y13::~DD2x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y13E(Test__ZN3ccc8DD2x9y13E, "_ZN3ccc8DD2x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y13C1Ev();
extern void _ZN3ccc8DD2x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y13E[] = {
  NSPAIR(_ZN3ccc8DD2x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y13E[];
extern void _ZN3ccc8DD2x9y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x9y133efgEv,_ZTv0_n12_N3ccc8DD2x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x9y133efgEv,_ZThn4_N3ccc8DD2x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x9y133efgEv,_ZTv0_n12_N3ccc8DD2x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y13E[] = {
  {&(_ZTVN3ccc8DD2x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y13E[];
static VTBL_ENTRY alt_thunk_names1158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x9y133efgEv,_ZTv0_n12_N3ccc8DD2x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x9y133efgEv,_ZThn4_N3ccc8DD2x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x9y13E = {  "_ZN3ccc8DD2x9y13E", // class name
  bases__ZN3ccc8DD2x9y13E, 2,
  &(vtc__ZN3ccc8DD2x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y13E),3, //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  CC2x9y14  : virtual ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y143pqrEv
  ~CC2x9y14(); // tgen
  CC2x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y143pqrEv");}
ccc::CC2x9y14 ::~CC2x9y14(){ note_dtor("_ZN3ccc8CC2x9y14E", this);} // tgen
ccc::CC2x9y14 ::CC2x9y14(){ note_ctor("_ZN3ccc8CC2x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y14E, buf);
    ::ccc::CC2x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y14E);
    dp->::ccc::CC2x9y14::~CC2x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y14E(Test__ZN3ccc8CC2x9y14E, "_ZN3ccc8CC2x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y14C1Ev();
extern void _ZN3ccc8CC2x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y14E[] = {
  NSPAIR(_ZN3ccc8CC2x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC2x9y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x9y143pqrEv,_ZTv0_n20_N3ccc8CC2x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y143pqrEv,_ZThn4_N3ccc8CC2x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x9y143pqrEv,_ZTv0_n20_N3ccc8CC2x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y14E[] = {
  {&(_ZTVN3ccc8CC2x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y14E[];
static VTBL_ENTRY alt_thunk_names1159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x9y143pqrEv,_ZTv0_n20_N3ccc8CC2x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x9y143pqrEv,_ZThn4_N3ccc8CC2x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x9y14E = {  "_ZN3ccc8CC2x9y14E", // class name
  bases__ZN3ccc8CC2x9y14E, 2,
  &(vtc__ZN3ccc8CC2x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y14E),2, //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  DD2x9y14  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD2x9y143pqrEv
  ~DD2x9y14(); // tgen
  DD2x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x9y143pqrEv");}
ccc::DD2x9y14 ::~DD2x9y14(){ note_dtor("_ZN3ccc8DD2x9y14E", this);} // tgen
ccc::DD2x9y14 ::DD2x9y14(){ note_ctor("_ZN3ccc8DD2x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y14E, buf);
    ::ccc::DD2x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y14E);
    dp->::ccc::DD2x9y14::~DD2x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y14E(Test__ZN3ccc8DD2x9y14E, "_ZN3ccc8DD2x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y14C1Ev();
extern void _ZN3ccc8DD2x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y14E[] = {
  NSPAIR(_ZN3ccc8DD2x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x9y143pqrEv,_ZTv0_n16_N3ccc8DD2x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x9y143pqrEv,_ZThn4_N3ccc8DD2x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x9y143pqrEv,_ZTv0_n16_N3ccc8DD2x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y14E[] = {
  {&(_ZTVN3ccc8DD2x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y14E[];
static VTBL_ENTRY alt_thunk_names1160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x9y143pqrEv,_ZTv0_n16_N3ccc8DD2x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x9y143pqrEv,_ZThn4_N3ccc8DD2x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x9y14E = {  "_ZN3ccc8DD2x9y14E", // class name
  bases__ZN3ccc8DD2x9y14E, 2,
  &(vtc__ZN3ccc8DD2x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y14E),3, //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  CC2x9y15  : virtual ::ccc::AA2 , ::ccc::BB9 {
  ~CC2x9y15(); // tgen
  CC2x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x9y15 ::~CC2x9y15(){ note_dtor("_ZN3ccc8CC2x9y15E", this);} // tgen
ccc::CC2x9y15 ::CC2x9y15(){ note_ctor("_ZN3ccc8CC2x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y15E, buf);
    ::ccc::CC2x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC2x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y15E);
    dp->::ccc::CC2x9y15::~CC2x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y15E(Test__ZN3ccc8CC2x9y15E, "_ZN3ccc8CC2x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y15C1Ev();
extern void _ZN3ccc8CC2x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y15E[] = {
  NSPAIR(_ZN3ccc8CC2x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x9y15E[] = {
  {&(_ZTVN3ccc8CC2x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x9y15E[];
Class_Descriptor cd__ZN3ccc8CC2x9y15E = {  "_ZN3ccc8CC2x9y15E", // class name
  bases__ZN3ccc8CC2x9y15E, 2,
  &(vtc__ZN3ccc8CC2x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x9y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x9y15  : virtual ::ccc::AA2 , virtual ::ccc::BB9 {
  ~DD2x9y15(); // tgen
  DD2x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD2x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x9y15 ::~DD2x9y15(){ note_dtor("_ZN3ccc8DD2x9y15E", this);} // tgen
ccc::DD2x9y15 ::DD2x9y15(){ note_ctor("_ZN3ccc8DD2x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD2x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x9y15E, buf);
    ::ccc::DD2x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x9y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD2x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x9y15E);
    dp->::ccc::DD2x9y15::~DD2x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x9y15E(Test__ZN3ccc8DD2x9y15E, "_ZN3ccc8DD2x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x9y15C1Ev();
extern void _ZN3ccc8DD2x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD2x9y15E[] = {
  NSPAIR(_ZN3ccc8DD2x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD2x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD2x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x9y15E[] = {
  {&(_ZTVN3ccc8DD2x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x9y15E[];
Class_Descriptor cd__ZN3ccc8DD2x9y15E = {  "_ZN3ccc8DD2x9y15E", // class name
  bases__ZN3ccc8DD2x9y15E, 2,
  &(vtc__ZN3ccc8DD2x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x9y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y0  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y03pqrEv
  ~CC2x10y0(); // tgen
  CC2x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y0E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y03abcEv");}
void  ccc::CC2x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y03efgEv");}
void  ccc::CC2x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y03pqrEv");}
ccc::CC2x10y0 ::~CC2x10y0(){ note_dtor("_ZN3ccc8CC2x10y0E", this);} // tgen
ccc::CC2x10y0 ::CC2x10y0(){ note_ctor("_ZN3ccc8CC2x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y0E, buf);
    ::ccc::CC2x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y0E);
    dp->::ccc::CC2x10y0::~CC2x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y0E(Test__ZN3ccc8CC2x10y0E, "_ZN3ccc8CC2x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y0C1Ev();
extern void _ZN3ccc8CC2x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y0E[] = {
  NSPAIR(_ZN3ccc8CC2x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y0E[];
extern void _ZN3ccc8CC2x10y03pqrEv();
extern void _ZN3ccc8CC2x10y03abcEv();
extern void _ZN3ccc8CC2x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y03efgEv,_ZTv0_n12_N3ccc8CC2x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y03efgEv,_ZThn4_N3ccc8CC2x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y03abcEv,_ZTv0_n16_N3ccc8CC2x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y03abcEv,_ZThn4_N3ccc8CC2x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y03pqrEv,_ZTv0_n20_N3ccc8CC2x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y03pqrEv,_ZThn4_N3ccc8CC2x10y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y03efgEv,_ZTv0_n12_N3ccc8CC2x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y03abcEv,_ZTv0_n16_N3ccc8CC2x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y03pqrEv,_ZTv0_n20_N3ccc8CC2x10y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y0E[] = {
  {&(_ZTVN3ccc8CC2x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y0E[];
static VTBL_ENTRY alt_thunk_names1161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y03pqrEv,_ZTv0_n20_N3ccc8CC2x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y03pqrEv,_ZThn4_N3ccc8CC2x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y03abcEv,_ZTv0_n16_N3ccc8CC2x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y03abcEv,_ZThn4_N3ccc8CC2x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y03efgEv,_ZTv0_n12_N3ccc8CC2x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y03efgEv,_ZThn4_N3ccc8CC2x10y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y0E = {  "_ZN3ccc8CC2x10y0E", // class name
  bases__ZN3ccc8CC2x10y0E, 2,
  &(vtc__ZN3ccc8CC2x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y0E),2, //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  DD2x10y0  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD2x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y03pqrEv
  ~DD2x10y0(); // tgen
  DD2x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y03abcEv");}
void  ccc::DD2x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y03efgEv");}
void  ccc::DD2x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y03pqrEv");}
ccc::DD2x10y0 ::~DD2x10y0(){ note_dtor("_ZN3ccc8DD2x10y0E", this);} // tgen
ccc::DD2x10y0 ::DD2x10y0(){ note_ctor("_ZN3ccc8DD2x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y0E, buf);
    ::ccc::DD2x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y0E);
    dp->::ccc::DD2x10y0::~DD2x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y0E(Test__ZN3ccc8DD2x10y0E, "_ZN3ccc8DD2x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y0C1Ev();
extern void _ZN3ccc8DD2x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y0E[] = {
  NSPAIR(_ZN3ccc8DD2x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y0E[];
extern void _ZN3ccc8DD2x10y03efgEv();
extern void _ZN3ccc8DD2x10y03abcEv();
extern void _ZN3ccc8DD2x10y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y03pqrEv,_ZTv0_n12_N3ccc8DD2x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y03pqrEv,_ZThn4_N3ccc8DD2x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y03abcEv,_ZTv0_n16_N3ccc8DD2x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y03abcEv,_ZThn4_N3ccc8DD2x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y03pqrEv,_ZTv0_n12_N3ccc8DD2x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y03abcEv,_ZTv0_n16_N3ccc8DD2x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y0E[] = {
  {&(_ZTVN3ccc8DD2x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y0E[];
static VTBL_ENTRY alt_thunk_names1162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y03abcEv,_ZTv0_n16_N3ccc8DD2x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y03abcEv,_ZThn4_N3ccc8DD2x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y03pqrEv,_ZTv0_n12_N3ccc8DD2x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y03pqrEv,_ZThn4_N3ccc8DD2x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y0E = {  "_ZN3ccc8DD2x10y0E", // class name
  bases__ZN3ccc8DD2x10y0E, 2,
  &(vtc__ZN3ccc8DD2x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y0E),3, //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  CC2x10y1  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x10y13efgEv
  ~CC2x10y1(); // tgen
  CC2x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y1E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y13abcEv");}
void  ccc::CC2x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y13pqrEv");}
void  ccc::CC2x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y13efgEv");}
ccc::CC2x10y1 ::~CC2x10y1(){ note_dtor("_ZN3ccc8CC2x10y1E", this);} // tgen
ccc::CC2x10y1 ::CC2x10y1(){ note_ctor("_ZN3ccc8CC2x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y1E, buf);
    ::ccc::CC2x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y1E);
    dp->::ccc::CC2x10y1::~CC2x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y1E(Test__ZN3ccc8CC2x10y1E, "_ZN3ccc8CC2x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y1C1Ev();
extern void _ZN3ccc8CC2x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y1E[] = {
  NSPAIR(_ZN3ccc8CC2x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y1E[];
extern void _ZN3ccc8CC2x10y13pqrEv();
extern void _ZN3ccc8CC2x10y13abcEv();
extern void _ZN3ccc8CC2x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y13efgEv,_ZTv0_n12_N3ccc8CC2x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y13efgEv,_ZThn4_N3ccc8CC2x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y13abcEv,_ZTv0_n16_N3ccc8CC2x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y13abcEv,_ZThn4_N3ccc8CC2x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y13pqrEv,_ZTv0_n20_N3ccc8CC2x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y13pqrEv,_ZThn4_N3ccc8CC2x10y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y13efgEv,_ZTv0_n12_N3ccc8CC2x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y13abcEv,_ZTv0_n16_N3ccc8CC2x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y13pqrEv,_ZTv0_n20_N3ccc8CC2x10y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y1E[] = {
  {&(_ZTVN3ccc8CC2x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y1E[];
static VTBL_ENTRY alt_thunk_names1163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y13pqrEv,_ZTv0_n20_N3ccc8CC2x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y13pqrEv,_ZThn4_N3ccc8CC2x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y13abcEv,_ZTv0_n16_N3ccc8CC2x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y13abcEv,_ZThn4_N3ccc8CC2x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y13efgEv,_ZTv0_n12_N3ccc8CC2x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y13efgEv,_ZThn4_N3ccc8CC2x10y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y1E = {  "_ZN3ccc8CC2x10y1E", // class name
  bases__ZN3ccc8CC2x10y1E, 2,
  &(vtc__ZN3ccc8CC2x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y1E),2, //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  DD2x10y1  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD2x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x10y13efgEv
  ~DD2x10y1(); // tgen
  DD2x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y13abcEv");}
void  ccc::DD2x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y13pqrEv");}
void  ccc::DD2x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y13efgEv");}
ccc::DD2x10y1 ::~DD2x10y1(){ note_dtor("_ZN3ccc8DD2x10y1E", this);} // tgen
ccc::DD2x10y1 ::DD2x10y1(){ note_ctor("_ZN3ccc8DD2x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y1E, buf);
    ::ccc::DD2x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y1E);
    dp->::ccc::DD2x10y1::~DD2x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y1E(Test__ZN3ccc8DD2x10y1E, "_ZN3ccc8DD2x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y1C1Ev();
extern void _ZN3ccc8DD2x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y1E[] = {
  NSPAIR(_ZN3ccc8DD2x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y1E[];
extern void _ZN3ccc8DD2x10y13efgEv();
extern void _ZN3ccc8DD2x10y13abcEv();
extern void _ZN3ccc8DD2x10y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y13pqrEv,_ZTv0_n12_N3ccc8DD2x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y13pqrEv,_ZThn4_N3ccc8DD2x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y13abcEv,_ZTv0_n16_N3ccc8DD2x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y13abcEv,_ZThn4_N3ccc8DD2x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y13pqrEv,_ZTv0_n12_N3ccc8DD2x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y13abcEv,_ZTv0_n16_N3ccc8DD2x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y1E[] = {
  {&(_ZTVN3ccc8DD2x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y1E[];
static VTBL_ENTRY alt_thunk_names1164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y13abcEv,_ZTv0_n16_N3ccc8DD2x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y13abcEv,_ZThn4_N3ccc8DD2x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y13pqrEv,_ZTv0_n12_N3ccc8DD2x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y13pqrEv,_ZThn4_N3ccc8DD2x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y1E = {  "_ZN3ccc8DD2x10y1E", // class name
  bases__ZN3ccc8DD2x10y1E, 2,
  &(vtc__ZN3ccc8DD2x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y1E),3, //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  CC2x10y2  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y23pqrEv
  ~CC2x10y2(); // tgen
  CC2x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y2E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y23efgEv");}
void  ccc::CC2x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y23abcEv");}
void  ccc::CC2x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y23pqrEv");}
ccc::CC2x10y2 ::~CC2x10y2(){ note_dtor("_ZN3ccc8CC2x10y2E", this);} // tgen
ccc::CC2x10y2 ::CC2x10y2(){ note_ctor("_ZN3ccc8CC2x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y2E, buf);
    ::ccc::CC2x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y2E);
    dp->::ccc::CC2x10y2::~CC2x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y2E(Test__ZN3ccc8CC2x10y2E, "_ZN3ccc8CC2x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y2C1Ev();
extern void _ZN3ccc8CC2x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y2E[] = {
  NSPAIR(_ZN3ccc8CC2x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y2E[];
extern void _ZN3ccc8CC2x10y23pqrEv();
extern void _ZN3ccc8CC2x10y23abcEv();
extern void _ZN3ccc8CC2x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y23efgEv,_ZTv0_n12_N3ccc8CC2x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y23efgEv,_ZThn4_N3ccc8CC2x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y23abcEv,_ZTv0_n16_N3ccc8CC2x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y23abcEv,_ZThn4_N3ccc8CC2x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y23pqrEv,_ZTv0_n20_N3ccc8CC2x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y23pqrEv,_ZThn4_N3ccc8CC2x10y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y23efgEv,_ZTv0_n12_N3ccc8CC2x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y23abcEv,_ZTv0_n16_N3ccc8CC2x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y23pqrEv,_ZTv0_n20_N3ccc8CC2x10y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y2E[] = {
  {&(_ZTVN3ccc8CC2x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y2E[];
static VTBL_ENTRY alt_thunk_names1165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y23pqrEv,_ZTv0_n20_N3ccc8CC2x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y23pqrEv,_ZThn4_N3ccc8CC2x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y23abcEv,_ZTv0_n16_N3ccc8CC2x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y23abcEv,_ZThn4_N3ccc8CC2x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y23efgEv,_ZTv0_n12_N3ccc8CC2x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y23efgEv,_ZThn4_N3ccc8CC2x10y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y2E = {  "_ZN3ccc8CC2x10y2E", // class name
  bases__ZN3ccc8CC2x10y2E, 2,
  &(vtc__ZN3ccc8CC2x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y2E),2, //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  DD2x10y2  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD2x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y23pqrEv
  ~DD2x10y2(); // tgen
  DD2x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y23efgEv");}
void  ccc::DD2x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y23abcEv");}
void  ccc::DD2x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y23pqrEv");}
ccc::DD2x10y2 ::~DD2x10y2(){ note_dtor("_ZN3ccc8DD2x10y2E", this);} // tgen
ccc::DD2x10y2 ::DD2x10y2(){ note_ctor("_ZN3ccc8DD2x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y2E, buf);
    ::ccc::DD2x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y2E);
    dp->::ccc::DD2x10y2::~DD2x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y2E(Test__ZN3ccc8DD2x10y2E, "_ZN3ccc8DD2x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y2C1Ev();
extern void _ZN3ccc8DD2x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y2E[] = {
  NSPAIR(_ZN3ccc8DD2x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y2E[];
extern void _ZN3ccc8DD2x10y23efgEv();
extern void _ZN3ccc8DD2x10y23abcEv();
extern void _ZN3ccc8DD2x10y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y23pqrEv,_ZTv0_n12_N3ccc8DD2x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y23pqrEv,_ZThn4_N3ccc8DD2x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y23abcEv,_ZTv0_n16_N3ccc8DD2x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y23abcEv,_ZThn4_N3ccc8DD2x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y23pqrEv,_ZTv0_n12_N3ccc8DD2x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y23abcEv,_ZTv0_n16_N3ccc8DD2x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y2E[] = {
  {&(_ZTVN3ccc8DD2x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y2E[];
static VTBL_ENTRY alt_thunk_names1166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y23abcEv,_ZTv0_n16_N3ccc8DD2x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y23abcEv,_ZThn4_N3ccc8DD2x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y23pqrEv,_ZTv0_n12_N3ccc8DD2x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y23pqrEv,_ZThn4_N3ccc8DD2x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y2E = {  "_ZN3ccc8DD2x10y2E", // class name
  bases__ZN3ccc8DD2x10y2E, 2,
  &(vtc__ZN3ccc8DD2x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y2E),3, //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  CC2x10y3  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x10y33abcEv
  ~CC2x10y3(); // tgen
  CC2x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y3E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y33efgEv");}
void  ccc::CC2x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y33pqrEv");}
void  ccc::CC2x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y33abcEv");}
ccc::CC2x10y3 ::~CC2x10y3(){ note_dtor("_ZN3ccc8CC2x10y3E", this);} // tgen
ccc::CC2x10y3 ::CC2x10y3(){ note_ctor("_ZN3ccc8CC2x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y3E, buf);
    ::ccc::CC2x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y3E);
    dp->::ccc::CC2x10y3::~CC2x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y3E(Test__ZN3ccc8CC2x10y3E, "_ZN3ccc8CC2x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y3C1Ev();
extern void _ZN3ccc8CC2x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y3E[] = {
  NSPAIR(_ZN3ccc8CC2x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y3E[];
extern void _ZN3ccc8CC2x10y33pqrEv();
extern void _ZN3ccc8CC2x10y33abcEv();
extern void _ZN3ccc8CC2x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y33efgEv,_ZTv0_n12_N3ccc8CC2x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y33efgEv,_ZThn4_N3ccc8CC2x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y33abcEv,_ZTv0_n16_N3ccc8CC2x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y33abcEv,_ZThn4_N3ccc8CC2x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y33pqrEv,_ZTv0_n20_N3ccc8CC2x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y33pqrEv,_ZThn4_N3ccc8CC2x10y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y33efgEv,_ZTv0_n12_N3ccc8CC2x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y33abcEv,_ZTv0_n16_N3ccc8CC2x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y33pqrEv,_ZTv0_n20_N3ccc8CC2x10y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y3E[] = {
  {&(_ZTVN3ccc8CC2x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y3E[];
static VTBL_ENTRY alt_thunk_names1167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y33pqrEv,_ZTv0_n20_N3ccc8CC2x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y33pqrEv,_ZThn4_N3ccc8CC2x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y33abcEv,_ZTv0_n16_N3ccc8CC2x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y33abcEv,_ZThn4_N3ccc8CC2x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y33efgEv,_ZTv0_n12_N3ccc8CC2x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y33efgEv,_ZThn4_N3ccc8CC2x10y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y3E = {  "_ZN3ccc8CC2x10y3E", // class name
  bases__ZN3ccc8CC2x10y3E, 2,
  &(vtc__ZN3ccc8CC2x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y3E),2, //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  DD2x10y3  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD2x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x10y33abcEv
  ~DD2x10y3(); // tgen
  DD2x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y33efgEv");}
void  ccc::DD2x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y33pqrEv");}
void  ccc::DD2x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y33abcEv");}
ccc::DD2x10y3 ::~DD2x10y3(){ note_dtor("_ZN3ccc8DD2x10y3E", this);} // tgen
ccc::DD2x10y3 ::DD2x10y3(){ note_ctor("_ZN3ccc8DD2x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y3E, buf);
    ::ccc::DD2x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y3E);
    dp->::ccc::DD2x10y3::~DD2x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y3E(Test__ZN3ccc8DD2x10y3E, "_ZN3ccc8DD2x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y3C1Ev();
extern void _ZN3ccc8DD2x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y3E[] = {
  NSPAIR(_ZN3ccc8DD2x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y3E[];
extern void _ZN3ccc8DD2x10y33efgEv();
extern void _ZN3ccc8DD2x10y33abcEv();
extern void _ZN3ccc8DD2x10y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y33pqrEv,_ZTv0_n12_N3ccc8DD2x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y33pqrEv,_ZThn4_N3ccc8DD2x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y33abcEv,_ZTv0_n16_N3ccc8DD2x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y33abcEv,_ZThn4_N3ccc8DD2x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y33pqrEv,_ZTv0_n12_N3ccc8DD2x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y33abcEv,_ZTv0_n16_N3ccc8DD2x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y3E[] = {
  {&(_ZTVN3ccc8DD2x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y3E[];
static VTBL_ENTRY alt_thunk_names1168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y33abcEv,_ZTv0_n16_N3ccc8DD2x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y33abcEv,_ZThn4_N3ccc8DD2x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y33pqrEv,_ZTv0_n12_N3ccc8DD2x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y33pqrEv,_ZThn4_N3ccc8DD2x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y3E = {  "_ZN3ccc8DD2x10y3E", // class name
  bases__ZN3ccc8DD2x10y3E, 2,
  &(vtc__ZN3ccc8DD2x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y3E),3, //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  CC2x10y4  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC2x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y43efgEv
  ~CC2x10y4(); // tgen
  CC2x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y4E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y43pqrEv");}
void  ccc::CC2x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y43abcEv");}
void  ccc::CC2x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y43efgEv");}
ccc::CC2x10y4 ::~CC2x10y4(){ note_dtor("_ZN3ccc8CC2x10y4E", this);} // tgen
ccc::CC2x10y4 ::CC2x10y4(){ note_ctor("_ZN3ccc8CC2x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y4E, buf);
    ::ccc::CC2x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y4E);
    dp->::ccc::CC2x10y4::~CC2x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y4E(Test__ZN3ccc8CC2x10y4E, "_ZN3ccc8CC2x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y4C1Ev();
extern void _ZN3ccc8CC2x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y4E[] = {
  NSPAIR(_ZN3ccc8CC2x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y4E[];
extern void _ZN3ccc8CC2x10y43pqrEv();
extern void _ZN3ccc8CC2x10y43abcEv();
extern void _ZN3ccc8CC2x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y43efgEv,_ZTv0_n12_N3ccc8CC2x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y43efgEv,_ZThn4_N3ccc8CC2x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y43abcEv,_ZTv0_n16_N3ccc8CC2x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y43abcEv,_ZThn4_N3ccc8CC2x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y43pqrEv,_ZTv0_n20_N3ccc8CC2x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y43pqrEv,_ZThn4_N3ccc8CC2x10y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y43efgEv,_ZTv0_n12_N3ccc8CC2x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y43abcEv,_ZTv0_n16_N3ccc8CC2x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y43pqrEv,_ZTv0_n20_N3ccc8CC2x10y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y4E[] = {
  {&(_ZTVN3ccc8CC2x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y4E[];
static VTBL_ENTRY alt_thunk_names1169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y43pqrEv,_ZTv0_n20_N3ccc8CC2x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y43pqrEv,_ZThn4_N3ccc8CC2x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y43abcEv,_ZTv0_n16_N3ccc8CC2x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y43abcEv,_ZThn4_N3ccc8CC2x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y43efgEv,_ZTv0_n12_N3ccc8CC2x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y43efgEv,_ZThn4_N3ccc8CC2x10y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y4E = {  "_ZN3ccc8CC2x10y4E", // class name
  bases__ZN3ccc8CC2x10y4E, 2,
  &(vtc__ZN3ccc8CC2x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y4E),2, //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  DD2x10y4  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD2x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x10y43efgEv
  ~DD2x10y4(); // tgen
  DD2x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y43pqrEv");}
void  ccc::DD2x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y43abcEv");}
void  ccc::DD2x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y43efgEv");}
ccc::DD2x10y4 ::~DD2x10y4(){ note_dtor("_ZN3ccc8DD2x10y4E", this);} // tgen
ccc::DD2x10y4 ::DD2x10y4(){ note_ctor("_ZN3ccc8DD2x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y4E, buf);
    ::ccc::DD2x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y4E);
    dp->::ccc::DD2x10y4::~DD2x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y4E(Test__ZN3ccc8DD2x10y4E, "_ZN3ccc8DD2x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y4C1Ev();
extern void _ZN3ccc8DD2x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y4E[] = {
  NSPAIR(_ZN3ccc8DD2x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y4E[];
extern void _ZN3ccc8DD2x10y43efgEv();
extern void _ZN3ccc8DD2x10y43abcEv();
extern void _ZN3ccc8DD2x10y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y43pqrEv,_ZTv0_n12_N3ccc8DD2x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y43pqrEv,_ZThn4_N3ccc8DD2x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y43abcEv,_ZTv0_n16_N3ccc8DD2x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y43abcEv,_ZThn4_N3ccc8DD2x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y43pqrEv,_ZTv0_n12_N3ccc8DD2x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y43abcEv,_ZTv0_n16_N3ccc8DD2x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y4E[] = {
  {&(_ZTVN3ccc8DD2x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y4E[];
static VTBL_ENTRY alt_thunk_names1170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y43abcEv,_ZTv0_n16_N3ccc8DD2x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y43abcEv,_ZThn4_N3ccc8DD2x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y43pqrEv,_ZTv0_n12_N3ccc8DD2x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y43pqrEv,_ZThn4_N3ccc8DD2x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y4E = {  "_ZN3ccc8DD2x10y4E", // class name
  bases__ZN3ccc8DD2x10y4E, 2,
  &(vtc__ZN3ccc8DD2x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y4E),3, //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  CC2x10y5  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC2x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y53abcEv
  ~CC2x10y5(); // tgen
  CC2x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y5E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y53pqrEv");}
void  ccc::CC2x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y53efgEv");}
void  ccc::CC2x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y53abcEv");}
ccc::CC2x10y5 ::~CC2x10y5(){ note_dtor("_ZN3ccc8CC2x10y5E", this);} // tgen
ccc::CC2x10y5 ::CC2x10y5(){ note_ctor("_ZN3ccc8CC2x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y5E, buf);
    ::ccc::CC2x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y5E);
    dp->::ccc::CC2x10y5::~CC2x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y5E(Test__ZN3ccc8CC2x10y5E, "_ZN3ccc8CC2x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y5C1Ev();
extern void _ZN3ccc8CC2x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y5E[] = {
  NSPAIR(_ZN3ccc8CC2x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y5E[];
extern void _ZN3ccc8CC2x10y53pqrEv();
extern void _ZN3ccc8CC2x10y53abcEv();
extern void _ZN3ccc8CC2x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y53efgEv,_ZTv0_n12_N3ccc8CC2x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y53efgEv,_ZThn4_N3ccc8CC2x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y53abcEv,_ZTv0_n16_N3ccc8CC2x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y53abcEv,_ZThn4_N3ccc8CC2x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y53pqrEv,_ZTv0_n20_N3ccc8CC2x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y53pqrEv,_ZThn4_N3ccc8CC2x10y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y53efgEv,_ZTv0_n12_N3ccc8CC2x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y53abcEv,_ZTv0_n16_N3ccc8CC2x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y53pqrEv,_ZTv0_n20_N3ccc8CC2x10y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y5E[] = {
  {&(_ZTVN3ccc8CC2x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y5E[];
static VTBL_ENTRY alt_thunk_names1171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y53pqrEv,_ZTv0_n20_N3ccc8CC2x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y53pqrEv,_ZThn4_N3ccc8CC2x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y53abcEv,_ZTv0_n16_N3ccc8CC2x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y53abcEv,_ZThn4_N3ccc8CC2x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y53efgEv,_ZTv0_n12_N3ccc8CC2x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y53efgEv,_ZThn4_N3ccc8CC2x10y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y5E = {  "_ZN3ccc8CC2x10y5E", // class name
  bases__ZN3ccc8CC2x10y5E, 2,
  &(vtc__ZN3ccc8CC2x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y5E),2, //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  DD2x10y5  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD2x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x10y53abcEv
  ~DD2x10y5(); // tgen
  DD2x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y53pqrEv");}
void  ccc::DD2x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y53efgEv");}
void  ccc::DD2x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y53abcEv");}
ccc::DD2x10y5 ::~DD2x10y5(){ note_dtor("_ZN3ccc8DD2x10y5E", this);} // tgen
ccc::DD2x10y5 ::DD2x10y5(){ note_ctor("_ZN3ccc8DD2x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y5E, buf);
    ::ccc::DD2x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y5E);
    dp->::ccc::DD2x10y5::~DD2x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y5E(Test__ZN3ccc8DD2x10y5E, "_ZN3ccc8DD2x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y5C1Ev();
extern void _ZN3ccc8DD2x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y5E[] = {
  NSPAIR(_ZN3ccc8DD2x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y5E[];
extern void _ZN3ccc8DD2x10y53efgEv();
extern void _ZN3ccc8DD2x10y53abcEv();
extern void _ZN3ccc8DD2x10y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y53pqrEv,_ZTv0_n12_N3ccc8DD2x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y53pqrEv,_ZThn4_N3ccc8DD2x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y53abcEv,_ZTv0_n16_N3ccc8DD2x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y53abcEv,_ZThn4_N3ccc8DD2x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y53pqrEv,_ZTv0_n12_N3ccc8DD2x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y53abcEv,_ZTv0_n16_N3ccc8DD2x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y5E[] = {
  {&(_ZTVN3ccc8DD2x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y5E[];
static VTBL_ENTRY alt_thunk_names1172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y53abcEv,_ZTv0_n16_N3ccc8DD2x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y53abcEv,_ZThn4_N3ccc8DD2x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y53pqrEv,_ZTv0_n12_N3ccc8DD2x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y53pqrEv,_ZThn4_N3ccc8DD2x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y5E = {  "_ZN3ccc8DD2x10y5E", // class name
  bases__ZN3ccc8DD2x10y5E, 2,
  &(vtc__ZN3ccc8DD2x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y5E),3, //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  CC2x10y6  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y63efgEv
  ~CC2x10y6(); // tgen
  CC2x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y6E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y63abcEv");}
void  ccc::CC2x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y63efgEv");}
ccc::CC2x10y6 ::~CC2x10y6(){ note_dtor("_ZN3ccc8CC2x10y6E", this);} // tgen
ccc::CC2x10y6 ::CC2x10y6(){ note_ctor("_ZN3ccc8CC2x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y6E, buf);
    ::ccc::CC2x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y6E);
    dp->::ccc::CC2x10y6::~CC2x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y6E(Test__ZN3ccc8CC2x10y6E, "_ZN3ccc8CC2x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y6C1Ev();
extern void _ZN3ccc8CC2x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y6E[] = {
  NSPAIR(_ZN3ccc8CC2x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC2x10y63abcEv();
extern void _ZN3ccc8CC2x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y63efgEv,_ZTv0_n12_N3ccc8CC2x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y63efgEv,_ZThn4_N3ccc8CC2x10y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y63abcEv,_ZTv0_n16_N3ccc8CC2x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y63abcEv,_ZThn4_N3ccc8CC2x10y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y63efgEv,_ZTv0_n12_N3ccc8CC2x10y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y63abcEv,_ZTv0_n16_N3ccc8CC2x10y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y6E[] = {
  {&(_ZTVN3ccc8CC2x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y6E[];
static VTBL_ENTRY alt_thunk_names1173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y63abcEv,_ZTv0_n16_N3ccc8CC2x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y63abcEv,_ZThn4_N3ccc8CC2x10y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y63efgEv,_ZTv0_n12_N3ccc8CC2x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y63efgEv,_ZThn4_N3ccc8CC2x10y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y6E = {  "_ZN3ccc8CC2x10y6E", // class name
  bases__ZN3ccc8CC2x10y6E, 2,
  &(vtc__ZN3ccc8CC2x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y6E),2, //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  DD2x10y6  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD2x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x10y63efgEv
  ~DD2x10y6(); // tgen
  DD2x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y63abcEv");}
void  ccc::DD2x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y63efgEv");}
ccc::DD2x10y6 ::~DD2x10y6(){ note_dtor("_ZN3ccc8DD2x10y6E", this);} // tgen
ccc::DD2x10y6 ::DD2x10y6(){ note_ctor("_ZN3ccc8DD2x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y6E, buf);
    ::ccc::DD2x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y6E);
    dp->::ccc::DD2x10y6::~DD2x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y6E(Test__ZN3ccc8DD2x10y6E, "_ZN3ccc8DD2x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y6C1Ev();
extern void _ZN3ccc8DD2x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y6E[] = {
  NSPAIR(_ZN3ccc8DD2x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y6E[];
extern void _ZN3ccc8DD2x10y63efgEv();
extern void _ZN3ccc8DD2x10y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y63abcEv,_ZTv0_n16_N3ccc8DD2x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y63abcEv,_ZThn4_N3ccc8DD2x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y63abcEv,_ZTv0_n16_N3ccc8DD2x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y6E[] = {
  {&(_ZTVN3ccc8DD2x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y6E[];
static VTBL_ENTRY alt_thunk_names1174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y63abcEv,_ZTv0_n16_N3ccc8DD2x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y63abcEv,_ZThn4_N3ccc8DD2x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y6E = {  "_ZN3ccc8DD2x10y6E", // class name
  bases__ZN3ccc8DD2x10y6E, 2,
  &(vtc__ZN3ccc8DD2x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y6E),3, //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  CC2x10y7  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y73pqrEv
  ~CC2x10y7(); // tgen
  CC2x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y7E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y73abcEv");}
void  ccc::CC2x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y73pqrEv");}
ccc::CC2x10y7 ::~CC2x10y7(){ note_dtor("_ZN3ccc8CC2x10y7E", this);} // tgen
ccc::CC2x10y7 ::CC2x10y7(){ note_ctor("_ZN3ccc8CC2x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y7E, buf);
    ::ccc::CC2x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y7E);
    dp->::ccc::CC2x10y7::~CC2x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y7E(Test__ZN3ccc8CC2x10y7E, "_ZN3ccc8CC2x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y7C1Ev();
extern void _ZN3ccc8CC2x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y7E[] = {
  NSPAIR(_ZN3ccc8CC2x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y7E[];
extern void _ZN3ccc8CC2x10y73pqrEv();
extern void _ZN3ccc8CC2x10y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y73abcEv,_ZTv0_n16_N3ccc8CC2x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y73abcEv,_ZThn4_N3ccc8CC2x10y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y73pqrEv,_ZTv0_n20_N3ccc8CC2x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y73pqrEv,_ZThn4_N3ccc8CC2x10y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y73abcEv,_ZTv0_n16_N3ccc8CC2x10y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y73pqrEv,_ZTv0_n20_N3ccc8CC2x10y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y7E[] = {
  {&(_ZTVN3ccc8CC2x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y7E[];
static VTBL_ENTRY alt_thunk_names1175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y73pqrEv,_ZTv0_n20_N3ccc8CC2x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y73pqrEv,_ZThn4_N3ccc8CC2x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y73abcEv,_ZTv0_n16_N3ccc8CC2x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y73abcEv,_ZThn4_N3ccc8CC2x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y7E = {  "_ZN3ccc8CC2x10y7E", // class name
  bases__ZN3ccc8CC2x10y7E, 2,
  &(vtc__ZN3ccc8CC2x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y7E),2, //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  DD2x10y7  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD2x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y73pqrEv
  ~DD2x10y7(); // tgen
  DD2x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y73abcEv");}
void  ccc::DD2x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y73pqrEv");}
ccc::DD2x10y7 ::~DD2x10y7(){ note_dtor("_ZN3ccc8DD2x10y7E", this);} // tgen
ccc::DD2x10y7 ::DD2x10y7(){ note_ctor("_ZN3ccc8DD2x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y7E, buf);
    ::ccc::DD2x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y7E);
    dp->::ccc::DD2x10y7::~DD2x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y7E(Test__ZN3ccc8DD2x10y7E, "_ZN3ccc8DD2x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y7C1Ev();
extern void _ZN3ccc8DD2x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y7E[] = {
  NSPAIR(_ZN3ccc8DD2x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x10y73abcEv();
extern void _ZN3ccc8DD2x10y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y73pqrEv,_ZTv0_n12_N3ccc8DD2x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y73pqrEv,_ZThn4_N3ccc8DD2x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y73abcEv,_ZTv0_n16_N3ccc8DD2x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y73abcEv,_ZThn4_N3ccc8DD2x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y73pqrEv,_ZTv0_n12_N3ccc8DD2x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y73abcEv,_ZTv0_n16_N3ccc8DD2x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y7E[] = {
  {&(_ZTVN3ccc8DD2x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y7E[];
static VTBL_ENTRY alt_thunk_names1176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y73abcEv,_ZTv0_n16_N3ccc8DD2x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y73abcEv,_ZThn4_N3ccc8DD2x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y73pqrEv,_ZTv0_n12_N3ccc8DD2x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y73pqrEv,_ZThn4_N3ccc8DD2x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y7E = {  "_ZN3ccc8DD2x10y7E", // class name
  bases__ZN3ccc8DD2x10y7E, 2,
  &(vtc__ZN3ccc8DD2x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y7E),3, //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  CC2x10y8  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y83abcEv
  ~CC2x10y8(); // tgen
  CC2x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y8E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y83efgEv");}
void  ccc::CC2x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y83abcEv");}
ccc::CC2x10y8 ::~CC2x10y8(){ note_dtor("_ZN3ccc8CC2x10y8E", this);} // tgen
ccc::CC2x10y8 ::CC2x10y8(){ note_ctor("_ZN3ccc8CC2x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y8E, buf);
    ::ccc::CC2x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y8E);
    dp->::ccc::CC2x10y8::~CC2x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y8E(Test__ZN3ccc8CC2x10y8E, "_ZN3ccc8CC2x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y8C1Ev();
extern void _ZN3ccc8CC2x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y8E[] = {
  NSPAIR(_ZN3ccc8CC2x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC2x10y83abcEv();
extern void _ZN3ccc8CC2x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y83efgEv,_ZTv0_n12_N3ccc8CC2x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y83efgEv,_ZThn4_N3ccc8CC2x10y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x10y83abcEv,_ZTv0_n16_N3ccc8CC2x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y83abcEv,_ZThn4_N3ccc8CC2x10y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y83efgEv,_ZTv0_n12_N3ccc8CC2x10y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x10y83abcEv,_ZTv0_n16_N3ccc8CC2x10y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y8E[] = {
  {&(_ZTVN3ccc8CC2x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y8E[];
static VTBL_ENTRY alt_thunk_names1177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x10y83abcEv,_ZTv0_n16_N3ccc8CC2x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y83abcEv,_ZThn4_N3ccc8CC2x10y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y83efgEv,_ZTv0_n12_N3ccc8CC2x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y83efgEv,_ZThn4_N3ccc8CC2x10y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y8E = {  "_ZN3ccc8CC2x10y8E", // class name
  bases__ZN3ccc8CC2x10y8E, 2,
  &(vtc__ZN3ccc8CC2x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y8E),2, //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  DD2x10y8  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD2x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x10y83abcEv
  ~DD2x10y8(); // tgen
  DD2x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y83efgEv");}
void  ccc::DD2x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x10y83abcEv");}
ccc::DD2x10y8 ::~DD2x10y8(){ note_dtor("_ZN3ccc8DD2x10y8E", this);} // tgen
ccc::DD2x10y8 ::DD2x10y8(){ note_ctor("_ZN3ccc8DD2x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y8E, buf);
    ::ccc::DD2x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y8E);
    dp->::ccc::DD2x10y8::~DD2x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y8E(Test__ZN3ccc8DD2x10y8E, "_ZN3ccc8DD2x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y8C1Ev();
extern void _ZN3ccc8DD2x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y8E[] = {
  NSPAIR(_ZN3ccc8DD2x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y8E[];
extern void _ZN3ccc8DD2x10y83efgEv();
extern void _ZN3ccc8DD2x10y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x10y83abcEv,_ZTv0_n16_N3ccc8DD2x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y83abcEv,_ZThn4_N3ccc8DD2x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x10y83abcEv,_ZTv0_n16_N3ccc8DD2x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y8E[] = {
  {&(_ZTVN3ccc8DD2x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y8E[];
static VTBL_ENTRY alt_thunk_names1178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x10y83abcEv,_ZTv0_n16_N3ccc8DD2x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y83abcEv,_ZThn4_N3ccc8DD2x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y8E = {  "_ZN3ccc8DD2x10y8E", // class name
  bases__ZN3ccc8DD2x10y8E, 2,
  &(vtc__ZN3ccc8DD2x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y8E),3, //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  CC2x10y9  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y93pqrEv
  ~CC2x10y9(); // tgen
  CC2x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y9E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y93efgEv");}
void  ccc::CC2x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y93pqrEv");}
ccc::CC2x10y9 ::~CC2x10y9(){ note_dtor("_ZN3ccc8CC2x10y9E", this);} // tgen
ccc::CC2x10y9 ::CC2x10y9(){ note_ctor("_ZN3ccc8CC2x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y9E, buf);
    ::ccc::CC2x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC2x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y9E);
    dp->::ccc::CC2x10y9::~CC2x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y9E(Test__ZN3ccc8CC2x10y9E, "_ZN3ccc8CC2x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y9C1Ev();
extern void _ZN3ccc8CC2x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y9E[] = {
  NSPAIR(_ZN3ccc8CC2x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y9E[];
extern void _ZN3ccc8CC2x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC2x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x10y93efgEv,_ZTv0_n12_N3ccc8CC2x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y93efgEv,_ZThn4_N3ccc8CC2x10y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x10y93pqrEv,_ZTv0_n20_N3ccc8CC2x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y93pqrEv,_ZThn4_N3ccc8CC2x10y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x10y93efgEv,_ZTv0_n12_N3ccc8CC2x10y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x10y93pqrEv,_ZTv0_n20_N3ccc8CC2x10y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x10y9E[] = {
  {&(_ZTVN3ccc8CC2x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x10y9E[];
static VTBL_ENTRY alt_thunk_names1179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x10y93pqrEv,_ZTv0_n20_N3ccc8CC2x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y93pqrEv,_ZThn4_N3ccc8CC2x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x10y93efgEv,_ZTv0_n12_N3ccc8CC2x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x10y93efgEv,_ZThn4_N3ccc8CC2x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x10y9E = {  "_ZN3ccc8CC2x10y9E", // class name
  bases__ZN3ccc8CC2x10y9E, 2,
  &(vtc__ZN3ccc8CC2x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x10y9E),2, //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  DD2x10y9  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD2x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x10y93pqrEv
  ~DD2x10y9(); // tgen
  DD2x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x10y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x10y93efgEv");}
void  ccc::DD2x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x10y93pqrEv");}
ccc::DD2x10y9 ::~DD2x10y9(){ note_dtor("_ZN3ccc8DD2x10y9E", this);} // tgen
ccc::DD2x10y9 ::DD2x10y9(){ note_ctor("_ZN3ccc8DD2x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x10y9E, buf);
    ::ccc::DD2x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x10y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD2x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x10y9E);
    dp->::ccc::DD2x10y9::~DD2x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x10y9E(Test__ZN3ccc8DD2x10y9E, "_ZN3ccc8DD2x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x10y9C1Ev();
extern void _ZN3ccc8DD2x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x10y9E[] = {
  NSPAIR(_ZN3ccc8DD2x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD2x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y9E[];
extern void _ZN3ccc8DD2x10y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x10y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x10y93pqrEv,_ZTv0_n12_N3ccc8DD2x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x10y93pqrEv,_ZThn4_N3ccc8DD2x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x10y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x10y93pqrEv,_ZTv0_n12_N3ccc8DD2x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x10y9E[] = {
  {&(_ZTVN3ccc8DD2x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x10y9E[];
static VTBL_ENTRY alt_thunk_names1180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x10y93pqrEv,_ZTv0_n12_N3ccc8DD2x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x10y93pqrEv,_ZThn4_N3ccc8DD2x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x10y9E = {  "_ZN3ccc8DD2x10y9E", // class name
  bases__ZN3ccc8DD2x10y9E, 2,
  &(vtc__ZN3ccc8DD2x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x10y9E),3, //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  CC2x10y10  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x10y103abcEv
  ~CC2x10y10(); // tgen
  CC2x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y10E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y103pqrEv");}
void  ccc::CC2x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x10y103abcEv");}
ccc::CC2x10y10 ::~CC2x10y10(){ note_dtor("_ZN3ccc9CC2x10y10E", this);} // tgen
ccc::CC2x10y10 ::CC2x10y10(){ note_ctor("_ZN3ccc9CC2x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y10E, buf);
    ::ccc::CC2x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y10E);
    dp->::ccc::CC2x10y10::~CC2x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y10E(Test__ZN3ccc9CC2x10y10E, "_ZN3ccc9CC2x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y10C1Ev();
extern void _ZN3ccc9CC2x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y10E[] = {
  NSPAIR(_ZN3ccc9CC2x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y10E[];
extern void _ZN3ccc9CC2x10y103pqrEv();
extern void _ZN3ccc9CC2x10y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x10y103abcEv,_ZTv0_n16_N3ccc9CC2x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y103abcEv,_ZThn4_N3ccc9CC2x10y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x10y103pqrEv,_ZTv0_n20_N3ccc9CC2x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y103pqrEv,_ZThn4_N3ccc9CC2x10y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x10y103abcEv,_ZTv0_n16_N3ccc9CC2x10y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x10y103pqrEv,_ZTv0_n20_N3ccc9CC2x10y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y10E[] = {
  {&(_ZTVN3ccc9CC2x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y10E[];
static VTBL_ENTRY alt_thunk_names1181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x10y103pqrEv,_ZTv0_n20_N3ccc9CC2x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y103pqrEv,_ZThn4_N3ccc9CC2x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x10y103abcEv,_ZTv0_n16_N3ccc9CC2x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y103abcEv,_ZThn4_N3ccc9CC2x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x10y10E = {  "_ZN3ccc9CC2x10y10E", // class name
  bases__ZN3ccc9CC2x10y10E, 2,
  &(vtc__ZN3ccc9CC2x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y10E),2, //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  DD2x10y10  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD2x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x10y103abcEv
  ~DD2x10y10(); // tgen
  DD2x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x10y103pqrEv");}
void  ccc::DD2x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x10y103abcEv");}
ccc::DD2x10y10 ::~DD2x10y10(){ note_dtor("_ZN3ccc9DD2x10y10E", this);} // tgen
ccc::DD2x10y10 ::DD2x10y10(){ note_ctor("_ZN3ccc9DD2x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y10E, buf);
    ::ccc::DD2x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y10E);
    dp->::ccc::DD2x10y10::~DD2x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y10E(Test__ZN3ccc9DD2x10y10E, "_ZN3ccc9DD2x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y10C1Ev();
extern void _ZN3ccc9DD2x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y10E[] = {
  NSPAIR(_ZN3ccc9DD2x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x10y103abcEv();
extern void _ZN3ccc9DD2x10y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x10y103pqrEv,_ZTv0_n12_N3ccc9DD2x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x10y103pqrEv,_ZThn4_N3ccc9DD2x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD2x10y103abcEv,_ZTv0_n16_N3ccc9DD2x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x10y103abcEv,_ZThn4_N3ccc9DD2x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x10y103pqrEv,_ZTv0_n12_N3ccc9DD2x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD2x10y103abcEv,_ZTv0_n16_N3ccc9DD2x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y10E[] = {
  {&(_ZTVN3ccc9DD2x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y10E[];
static VTBL_ENTRY alt_thunk_names1182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD2x10y103abcEv,_ZTv0_n16_N3ccc9DD2x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x10y103abcEv,_ZThn4_N3ccc9DD2x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x10y103pqrEv,_ZTv0_n12_N3ccc9DD2x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x10y103pqrEv,_ZThn4_N3ccc9DD2x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x10y10E = {  "_ZN3ccc9DD2x10y10E", // class name
  bases__ZN3ccc9DD2x10y10E, 2,
  &(vtc__ZN3ccc9DD2x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y10E),3, //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  CC2x10y11  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x10y113efgEv
  ~CC2x10y11(); // tgen
  CC2x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y11E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y113pqrEv");}
void  ccc::CC2x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x10y113efgEv");}
ccc::CC2x10y11 ::~CC2x10y11(){ note_dtor("_ZN3ccc9CC2x10y11E", this);} // tgen
ccc::CC2x10y11 ::CC2x10y11(){ note_ctor("_ZN3ccc9CC2x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y11E, buf);
    ::ccc::CC2x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y11E);
    dp->::ccc::CC2x10y11::~CC2x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y11E(Test__ZN3ccc9CC2x10y11E, "_ZN3ccc9CC2x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y11C1Ev();
extern void _ZN3ccc9CC2x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y11E[] = {
  NSPAIR(_ZN3ccc9CC2x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y11E[];
extern void _ZN3ccc9CC2x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC2x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x10y113efgEv,_ZTv0_n12_N3ccc9CC2x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y113efgEv,_ZThn4_N3ccc9CC2x10y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x10y113pqrEv,_ZTv0_n20_N3ccc9CC2x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y113pqrEv,_ZThn4_N3ccc9CC2x10y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x10y113efgEv,_ZTv0_n12_N3ccc9CC2x10y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x10y113pqrEv,_ZTv0_n20_N3ccc9CC2x10y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y11E[] = {
  {&(_ZTVN3ccc9CC2x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y11E[];
static VTBL_ENTRY alt_thunk_names1183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x10y113pqrEv,_ZTv0_n20_N3ccc9CC2x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y113pqrEv,_ZThn4_N3ccc9CC2x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x10y113efgEv,_ZTv0_n12_N3ccc9CC2x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y113efgEv,_ZThn4_N3ccc9CC2x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x10y11E = {  "_ZN3ccc9CC2x10y11E", // class name
  bases__ZN3ccc9CC2x10y11E, 2,
  &(vtc__ZN3ccc9CC2x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y11E),2, //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  DD2x10y11  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD2x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x10y113efgEv
  ~DD2x10y11(); // tgen
  DD2x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x10y113pqrEv");}
void  ccc::DD2x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x10y113efgEv");}
ccc::DD2x10y11 ::~DD2x10y11(){ note_dtor("_ZN3ccc9DD2x10y11E", this);} // tgen
ccc::DD2x10y11 ::DD2x10y11(){ note_ctor("_ZN3ccc9DD2x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y11E, buf);
    ::ccc::DD2x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y11E);
    dp->::ccc::DD2x10y11::~DD2x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y11E(Test__ZN3ccc9DD2x10y11E, "_ZN3ccc9DD2x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y11C1Ev();
extern void _ZN3ccc9DD2x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y11E[] = {
  NSPAIR(_ZN3ccc9DD2x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y11E[];
extern void _ZN3ccc9DD2x10y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x10y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x10y113pqrEv,_ZTv0_n12_N3ccc9DD2x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x10y113pqrEv,_ZThn4_N3ccc9DD2x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x10y113pqrEv,_ZTv0_n12_N3ccc9DD2x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y11E[] = {
  {&(_ZTVN3ccc9DD2x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y11E[];
static VTBL_ENTRY alt_thunk_names1184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x10y113pqrEv,_ZTv0_n12_N3ccc9DD2x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x10y113pqrEv,_ZThn4_N3ccc9DD2x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x10y11E = {  "_ZN3ccc9DD2x10y11E", // class name
  bases__ZN3ccc9DD2x10y11E, 2,
  &(vtc__ZN3ccc9DD2x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y11E),3, //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  CC2x10y12  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC2x10y123abcEv
  ~CC2x10y12(); // tgen
  CC2x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x10y123abcEv");}
ccc::CC2x10y12 ::~CC2x10y12(){ note_dtor("_ZN3ccc9CC2x10y12E", this);} // tgen
ccc::CC2x10y12 ::CC2x10y12(){ note_ctor("_ZN3ccc9CC2x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y12E, buf);
    ::ccc::CC2x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y12E);
    dp->::ccc::CC2x10y12::~CC2x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y12E(Test__ZN3ccc9CC2x10y12E, "_ZN3ccc9CC2x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y12C1Ev();
extern void _ZN3ccc9CC2x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y12E[] = {
  NSPAIR(_ZN3ccc9CC2x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC2x10y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x10y123abcEv,_ZTv0_n16_N3ccc9CC2x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y123abcEv,_ZThn4_N3ccc9CC2x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x10y123abcEv,_ZTv0_n16_N3ccc9CC2x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y12E[] = {
  {&(_ZTVN3ccc9CC2x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y12E[];
static VTBL_ENTRY alt_thunk_names1185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x10y123abcEv,_ZTv0_n16_N3ccc9CC2x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y123abcEv,_ZThn4_N3ccc9CC2x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x10y12E = {  "_ZN3ccc9CC2x10y12E", // class name
  bases__ZN3ccc9CC2x10y12E, 2,
  &(vtc__ZN3ccc9CC2x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y12E),2, //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  DD2x10y12  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD2x10y123abcEv
  ~DD2x10y12(); // tgen
  DD2x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x10y123abcEv");}
ccc::DD2x10y12 ::~DD2x10y12(){ note_dtor("_ZN3ccc9DD2x10y12E", this);} // tgen
ccc::DD2x10y12 ::DD2x10y12(){ note_ctor("_ZN3ccc9DD2x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y12E, buf);
    ::ccc::DD2x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y12E);
    dp->::ccc::DD2x10y12::~DD2x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y12E(Test__ZN3ccc9DD2x10y12E, "_ZN3ccc9DD2x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y12C1Ev();
extern void _ZN3ccc9DD2x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y12E[] = {
  NSPAIR(_ZN3ccc9DD2x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x10y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD2x10y123abcEv,_ZTv0_n16_N3ccc9DD2x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x10y123abcEv,_ZThn4_N3ccc9DD2x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD2x10y123abcEv,_ZTv0_n16_N3ccc9DD2x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y12E[] = {
  {&(_ZTVN3ccc9DD2x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y12E[];
static VTBL_ENTRY alt_thunk_names1186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD2x10y123abcEv,_ZTv0_n16_N3ccc9DD2x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x10y123abcEv,_ZThn4_N3ccc9DD2x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x10y12E = {  "_ZN3ccc9DD2x10y12E", // class name
  bases__ZN3ccc9DD2x10y12E, 2,
  &(vtc__ZN3ccc9DD2x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y12E),3, //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  CC2x10y13  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC2x10y133efgEv
  ~CC2x10y13(); // tgen
  CC2x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x10y133efgEv");}
ccc::CC2x10y13 ::~CC2x10y13(){ note_dtor("_ZN3ccc9CC2x10y13E", this);} // tgen
ccc::CC2x10y13 ::CC2x10y13(){ note_ctor("_ZN3ccc9CC2x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y13E, buf);
    ::ccc::CC2x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y13E);
    dp->::ccc::CC2x10y13::~CC2x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y13E(Test__ZN3ccc9CC2x10y13E, "_ZN3ccc9CC2x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y13C1Ev();
extern void _ZN3ccc9CC2x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y13E[] = {
  NSPAIR(_ZN3ccc9CC2x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC2x10y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x10y133efgEv,_ZTv0_n12_N3ccc9CC2x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y133efgEv,_ZThn4_N3ccc9CC2x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x10y133efgEv,_ZTv0_n12_N3ccc9CC2x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y13E[] = {
  {&(_ZTVN3ccc9CC2x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y13E[];
static VTBL_ENTRY alt_thunk_names1187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x10y133efgEv,_ZTv0_n12_N3ccc9CC2x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y133efgEv,_ZThn4_N3ccc9CC2x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x10y13E = {  "_ZN3ccc9CC2x10y13E", // class name
  bases__ZN3ccc9CC2x10y13E, 2,
  &(vtc__ZN3ccc9CC2x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y13E),2, //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  DD2x10y13  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD2x10y133efgEv
  ~DD2x10y13(); // tgen
  DD2x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x10y133efgEv");}
ccc::DD2x10y13 ::~DD2x10y13(){ note_dtor("_ZN3ccc9DD2x10y13E", this);} // tgen
ccc::DD2x10y13 ::DD2x10y13(){ note_ctor("_ZN3ccc9DD2x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y13E, buf);
    ::ccc::DD2x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y13E);
    dp->::ccc::DD2x10y13::~DD2x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y13E(Test__ZN3ccc9DD2x10y13E, "_ZN3ccc9DD2x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y13C1Ev();
extern void _ZN3ccc9DD2x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y13E[] = {
  NSPAIR(_ZN3ccc9DD2x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y13E[];
extern void _ZN3ccc9DD2x10y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y13E[] = {
  {&(_ZTVN3ccc9DD2x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y13E[];
Class_Descriptor cd__ZN3ccc9DD2x10y13E = {  "_ZN3ccc9DD2x10y13E", // class name
  bases__ZN3ccc9DD2x10y13E, 2,
  &(vtc__ZN3ccc9DD2x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y14  : virtual ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y143pqrEv
  ~CC2x10y14(); // tgen
  CC2x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y143pqrEv");}
ccc::CC2x10y14 ::~CC2x10y14(){ note_dtor("_ZN3ccc9CC2x10y14E", this);} // tgen
ccc::CC2x10y14 ::CC2x10y14(){ note_ctor("_ZN3ccc9CC2x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y14E, buf);
    ::ccc::CC2x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y14E);
    dp->::ccc::CC2x10y14::~CC2x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y14E(Test__ZN3ccc9CC2x10y14E, "_ZN3ccc9CC2x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y14C1Ev();
extern void _ZN3ccc9CC2x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y14E[] = {
  NSPAIR(_ZN3ccc9CC2x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y14E[];
extern void _ZN3ccc9CC2x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x10y143pqrEv,_ZTv0_n20_N3ccc9CC2x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y143pqrEv,_ZThn4_N3ccc9CC2x10y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x10y143pqrEv,_ZTv0_n20_N3ccc9CC2x10y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y14E[] = {
  {&(_ZTVN3ccc9CC2x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y14E[];
static VTBL_ENTRY alt_thunk_names1188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x10y143pqrEv,_ZTv0_n20_N3ccc9CC2x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x10y143pqrEv,_ZThn4_N3ccc9CC2x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x10y14E = {  "_ZN3ccc9CC2x10y14E", // class name
  bases__ZN3ccc9CC2x10y14E, 2,
  &(vtc__ZN3ccc9CC2x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y14E),2, //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  DD2x10y14  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD2x10y143pqrEv
  ~DD2x10y14(); // tgen
  DD2x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x10y143pqrEv");}
ccc::DD2x10y14 ::~DD2x10y14(){ note_dtor("_ZN3ccc9DD2x10y14E", this);} // tgen
ccc::DD2x10y14 ::DD2x10y14(){ note_ctor("_ZN3ccc9DD2x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y14E, buf);
    ::ccc::DD2x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y14E);
    dp->::ccc::DD2x10y14::~DD2x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y14E(Test__ZN3ccc9DD2x10y14E, "_ZN3ccc9DD2x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y14C1Ev();
extern void _ZN3ccc9DD2x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y14E[] = {
  NSPAIR(_ZN3ccc9DD2x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x10y143pqrEv,_ZTv0_n12_N3ccc9DD2x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x10y143pqrEv,_ZThn4_N3ccc9DD2x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x10y143pqrEv,_ZTv0_n12_N3ccc9DD2x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y14E[] = {
  {&(_ZTVN3ccc9DD2x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y14E[];
static VTBL_ENTRY alt_thunk_names1189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x10y143pqrEv,_ZTv0_n12_N3ccc9DD2x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x10y143pqrEv,_ZThn4_N3ccc9DD2x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x10y14E = {  "_ZN3ccc9DD2x10y14E", // class name
  bases__ZN3ccc9DD2x10y14E, 2,
  &(vtc__ZN3ccc9DD2x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y14E),3, //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  CC2x10y15  : virtual ::ccc::AA2 , ::ccc::BB10 {
  ~CC2x10y15(); // tgen
  CC2x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x10y15 ::~CC2x10y15(){ note_dtor("_ZN3ccc9CC2x10y15E", this);} // tgen
ccc::CC2x10y15 ::CC2x10y15(){ note_ctor("_ZN3ccc9CC2x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y15E, buf);
    ::ccc::CC2x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC2x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y15E);
    dp->::ccc::CC2x10y15::~CC2x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y15E(Test__ZN3ccc9CC2x10y15E, "_ZN3ccc9CC2x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y15C1Ev();
extern void _ZN3ccc9CC2x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y15E[] = {
  NSPAIR(_ZN3ccc9CC2x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x10y15E[] = {
  {&(_ZTVN3ccc9CC2x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x10y15E[];
Class_Descriptor cd__ZN3ccc9CC2x10y15E = {  "_ZN3ccc9CC2x10y15E", // class name
  bases__ZN3ccc9CC2x10y15E, 2,
  &(vtc__ZN3ccc9CC2x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x10y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x10y15  : virtual ::ccc::AA2 , virtual ::ccc::BB10 {
  ~DD2x10y15(); // tgen
  DD2x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x10y15 ::~DD2x10y15(){ note_dtor("_ZN3ccc9DD2x10y15E", this);} // tgen
ccc::DD2x10y15 ::DD2x10y15(){ note_ctor("_ZN3ccc9DD2x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x10y15E, buf);
    ::ccc::DD2x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x10y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD2x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x10y15E);
    dp->::ccc::DD2x10y15::~DD2x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x10y15E(Test__ZN3ccc9DD2x10y15E, "_ZN3ccc9DD2x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x10y15C1Ev();
extern void _ZN3ccc9DD2x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x10y15E[] = {
  NSPAIR(_ZN3ccc9DD2x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD2x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x10y15E[] = {
  {&(_ZTVN3ccc9DD2x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x10y15E[];
Class_Descriptor cd__ZN3ccc9DD2x10y15E = {  "_ZN3ccc9DD2x10y15E", // class name
  bases__ZN3ccc9DD2x10y15E, 2,
  &(vtc__ZN3ccc9DD2x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x10y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y0  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y03pqrEv
  ~CC2x11y0(); // tgen
  CC2x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y0E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y03abcEv");}
void  ccc::CC2x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y03efgEv");}
void  ccc::CC2x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y03pqrEv");}
ccc::CC2x11y0 ::~CC2x11y0(){ note_dtor("_ZN3ccc8CC2x11y0E", this);} // tgen
ccc::CC2x11y0 ::CC2x11y0(){ note_ctor("_ZN3ccc8CC2x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y0E, buf);
    ::ccc::CC2x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y0E);
    dp->::ccc::CC2x11y0::~CC2x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y0E(Test__ZN3ccc8CC2x11y0E, "_ZN3ccc8CC2x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y0C1Ev();
extern void _ZN3ccc8CC2x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y0E[] = {
  NSPAIR(_ZN3ccc8CC2x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y0E[];
extern void _ZN3ccc8CC2x11y03pqrEv();
extern void _ZN3ccc8CC2x11y03efgEv();
extern void _ZN3ccc8CC2x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y03efgEv,_ZTv0_n12_N3ccc8CC2x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y03efgEv,_ZThn4_N3ccc8CC2x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y03abcEv,_ZTv0_n16_N3ccc8CC2x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y03abcEv,_ZThn4_N3ccc8CC2x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y03pqrEv,_ZTv0_n20_N3ccc8CC2x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y03pqrEv,_ZThn4_N3ccc8CC2x11y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y03efgEv,_ZTv0_n12_N3ccc8CC2x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y03abcEv,_ZTv0_n16_N3ccc8CC2x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y03pqrEv,_ZTv0_n20_N3ccc8CC2x11y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y0E[] = {
  {&(_ZTVN3ccc8CC2x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y0E[];
static VTBL_ENTRY alt_thunk_names1190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y03pqrEv,_ZTv0_n20_N3ccc8CC2x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y03pqrEv,_ZThn4_N3ccc8CC2x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y03abcEv,_ZTv0_n16_N3ccc8CC2x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y03abcEv,_ZThn4_N3ccc8CC2x11y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y03efgEv,_ZTv0_n12_N3ccc8CC2x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y03efgEv,_ZThn4_N3ccc8CC2x11y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y0E = {  "_ZN3ccc8CC2x11y0E", // class name
  bases__ZN3ccc8CC2x11y0E, 2,
  &(vtc__ZN3ccc8CC2x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y0E),2, //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  DD2x11y0  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD2x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y03pqrEv
  ~DD2x11y0(); // tgen
  DD2x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y03abcEv");}
void  ccc::DD2x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y03efgEv");}
void  ccc::DD2x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y03pqrEv");}
ccc::DD2x11y0 ::~DD2x11y0(){ note_dtor("_ZN3ccc8DD2x11y0E", this);} // tgen
ccc::DD2x11y0 ::DD2x11y0(){ note_ctor("_ZN3ccc8DD2x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y0E, buf);
    ::ccc::DD2x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y0E);
    dp->::ccc::DD2x11y0::~DD2x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y0E(Test__ZN3ccc8DD2x11y0E, "_ZN3ccc8DD2x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y0C1Ev();
extern void _ZN3ccc8DD2x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y0E[] = {
  NSPAIR(_ZN3ccc8DD2x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y0E[];
extern void _ZN3ccc8DD2x11y03efgEv();
extern void _ZN3ccc8DD2x11y03abcEv();
extern void _ZN3ccc8DD2x11y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y03pqrEv,_ZTv0_n12_N3ccc8DD2x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y03pqrEv,_ZThn4_N3ccc8DD2x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y03efgEv,_ZTv0_n16_N3ccc8DD2x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y03efgEv,_ZThn4_N3ccc8DD2x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y03pqrEv,_ZTv0_n12_N3ccc8DD2x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y03efgEv,_ZTv0_n16_N3ccc8DD2x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y0E[] = {
  {&(_ZTVN3ccc8DD2x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y0E[];
static VTBL_ENTRY alt_thunk_names1191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y03efgEv,_ZTv0_n16_N3ccc8DD2x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y03efgEv,_ZThn4_N3ccc8DD2x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y03pqrEv,_ZTv0_n12_N3ccc8DD2x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y03pqrEv,_ZThn4_N3ccc8DD2x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y0E = {  "_ZN3ccc8DD2x11y0E", // class name
  bases__ZN3ccc8DD2x11y0E, 2,
  &(vtc__ZN3ccc8DD2x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y0E),3, //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  CC2x11y1  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x11y13efgEv
  ~CC2x11y1(); // tgen
  CC2x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y1E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y13abcEv");}
void  ccc::CC2x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y13pqrEv");}
void  ccc::CC2x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y13efgEv");}
ccc::CC2x11y1 ::~CC2x11y1(){ note_dtor("_ZN3ccc8CC2x11y1E", this);} // tgen
ccc::CC2x11y1 ::CC2x11y1(){ note_ctor("_ZN3ccc8CC2x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y1E, buf);
    ::ccc::CC2x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y1E);
    dp->::ccc::CC2x11y1::~CC2x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y1E(Test__ZN3ccc8CC2x11y1E, "_ZN3ccc8CC2x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y1C1Ev();
extern void _ZN3ccc8CC2x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y1E[] = {
  NSPAIR(_ZN3ccc8CC2x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y1E[];
extern void _ZN3ccc8CC2x11y13pqrEv();
extern void _ZN3ccc8CC2x11y13efgEv();
extern void _ZN3ccc8CC2x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y13efgEv,_ZTv0_n12_N3ccc8CC2x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y13efgEv,_ZThn4_N3ccc8CC2x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y13abcEv,_ZTv0_n16_N3ccc8CC2x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y13abcEv,_ZThn4_N3ccc8CC2x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y13pqrEv,_ZTv0_n20_N3ccc8CC2x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y13pqrEv,_ZThn4_N3ccc8CC2x11y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y13efgEv,_ZTv0_n12_N3ccc8CC2x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y13abcEv,_ZTv0_n16_N3ccc8CC2x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y13pqrEv,_ZTv0_n20_N3ccc8CC2x11y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y1E[] = {
  {&(_ZTVN3ccc8CC2x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y1E[];
static VTBL_ENTRY alt_thunk_names1192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y13pqrEv,_ZTv0_n20_N3ccc8CC2x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y13pqrEv,_ZThn4_N3ccc8CC2x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y13abcEv,_ZTv0_n16_N3ccc8CC2x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y13abcEv,_ZThn4_N3ccc8CC2x11y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y13efgEv,_ZTv0_n12_N3ccc8CC2x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y13efgEv,_ZThn4_N3ccc8CC2x11y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y1E = {  "_ZN3ccc8CC2x11y1E", // class name
  bases__ZN3ccc8CC2x11y1E, 2,
  &(vtc__ZN3ccc8CC2x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y1E),2, //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  DD2x11y1  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD2x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x11y13efgEv
  ~DD2x11y1(); // tgen
  DD2x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y13abcEv");}
void  ccc::DD2x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y13pqrEv");}
void  ccc::DD2x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y13efgEv");}
ccc::DD2x11y1 ::~DD2x11y1(){ note_dtor("_ZN3ccc8DD2x11y1E", this);} // tgen
ccc::DD2x11y1 ::DD2x11y1(){ note_ctor("_ZN3ccc8DD2x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y1E, buf);
    ::ccc::DD2x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y1E);
    dp->::ccc::DD2x11y1::~DD2x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y1E(Test__ZN3ccc8DD2x11y1E, "_ZN3ccc8DD2x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y1C1Ev();
extern void _ZN3ccc8DD2x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y1E[] = {
  NSPAIR(_ZN3ccc8DD2x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y1E[];
extern void _ZN3ccc8DD2x11y13efgEv();
extern void _ZN3ccc8DD2x11y13abcEv();
extern void _ZN3ccc8DD2x11y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y13pqrEv,_ZTv0_n12_N3ccc8DD2x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y13pqrEv,_ZThn4_N3ccc8DD2x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y13efgEv,_ZTv0_n16_N3ccc8DD2x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y13efgEv,_ZThn4_N3ccc8DD2x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y13pqrEv,_ZTv0_n12_N3ccc8DD2x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y13efgEv,_ZTv0_n16_N3ccc8DD2x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y1E[] = {
  {&(_ZTVN3ccc8DD2x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y1E[];
static VTBL_ENTRY alt_thunk_names1193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y13efgEv,_ZTv0_n16_N3ccc8DD2x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y13efgEv,_ZThn4_N3ccc8DD2x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y13pqrEv,_ZTv0_n12_N3ccc8DD2x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y13pqrEv,_ZThn4_N3ccc8DD2x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y1E = {  "_ZN3ccc8DD2x11y1E", // class name
  bases__ZN3ccc8DD2x11y1E, 2,
  &(vtc__ZN3ccc8DD2x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y1E),3, //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  CC2x11y2  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y23pqrEv
  ~CC2x11y2(); // tgen
  CC2x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y2E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y23efgEv");}
void  ccc::CC2x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y23abcEv");}
void  ccc::CC2x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y23pqrEv");}
ccc::CC2x11y2 ::~CC2x11y2(){ note_dtor("_ZN3ccc8CC2x11y2E", this);} // tgen
ccc::CC2x11y2 ::CC2x11y2(){ note_ctor("_ZN3ccc8CC2x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y2E, buf);
    ::ccc::CC2x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y2E);
    dp->::ccc::CC2x11y2::~CC2x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y2E(Test__ZN3ccc8CC2x11y2E, "_ZN3ccc8CC2x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y2C1Ev();
extern void _ZN3ccc8CC2x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y2E[] = {
  NSPAIR(_ZN3ccc8CC2x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y2E[];
extern void _ZN3ccc8CC2x11y23pqrEv();
extern void _ZN3ccc8CC2x11y23efgEv();
extern void _ZN3ccc8CC2x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y23efgEv,_ZTv0_n12_N3ccc8CC2x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y23efgEv,_ZThn4_N3ccc8CC2x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y23abcEv,_ZTv0_n16_N3ccc8CC2x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y23abcEv,_ZThn4_N3ccc8CC2x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y23pqrEv,_ZTv0_n20_N3ccc8CC2x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y23pqrEv,_ZThn4_N3ccc8CC2x11y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y23efgEv,_ZTv0_n12_N3ccc8CC2x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y23abcEv,_ZTv0_n16_N3ccc8CC2x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y23pqrEv,_ZTv0_n20_N3ccc8CC2x11y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y2E[] = {
  {&(_ZTVN3ccc8CC2x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y2E[];
static VTBL_ENTRY alt_thunk_names1194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y23pqrEv,_ZTv0_n20_N3ccc8CC2x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y23pqrEv,_ZThn4_N3ccc8CC2x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y23abcEv,_ZTv0_n16_N3ccc8CC2x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y23abcEv,_ZThn4_N3ccc8CC2x11y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y23efgEv,_ZTv0_n12_N3ccc8CC2x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y23efgEv,_ZThn4_N3ccc8CC2x11y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y2E = {  "_ZN3ccc8CC2x11y2E", // class name
  bases__ZN3ccc8CC2x11y2E, 2,
  &(vtc__ZN3ccc8CC2x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y2E),2, //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  DD2x11y2  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD2x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y23pqrEv
  ~DD2x11y2(); // tgen
  DD2x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y23efgEv");}
void  ccc::DD2x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y23abcEv");}
void  ccc::DD2x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y23pqrEv");}
ccc::DD2x11y2 ::~DD2x11y2(){ note_dtor("_ZN3ccc8DD2x11y2E", this);} // tgen
ccc::DD2x11y2 ::DD2x11y2(){ note_ctor("_ZN3ccc8DD2x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y2E, buf);
    ::ccc::DD2x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y2E);
    dp->::ccc::DD2x11y2::~DD2x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y2E(Test__ZN3ccc8DD2x11y2E, "_ZN3ccc8DD2x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y2C1Ev();
extern void _ZN3ccc8DD2x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y2E[] = {
  NSPAIR(_ZN3ccc8DD2x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y2E[];
extern void _ZN3ccc8DD2x11y23efgEv();
extern void _ZN3ccc8DD2x11y23abcEv();
extern void _ZN3ccc8DD2x11y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y23pqrEv,_ZTv0_n12_N3ccc8DD2x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y23pqrEv,_ZThn4_N3ccc8DD2x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y23efgEv,_ZTv0_n16_N3ccc8DD2x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y23efgEv,_ZThn4_N3ccc8DD2x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y23pqrEv,_ZTv0_n12_N3ccc8DD2x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y23efgEv,_ZTv0_n16_N3ccc8DD2x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y2E[] = {
  {&(_ZTVN3ccc8DD2x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y2E[];
static VTBL_ENTRY alt_thunk_names1195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y23efgEv,_ZTv0_n16_N3ccc8DD2x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y23efgEv,_ZThn4_N3ccc8DD2x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y23pqrEv,_ZTv0_n12_N3ccc8DD2x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y23pqrEv,_ZThn4_N3ccc8DD2x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y2E = {  "_ZN3ccc8DD2x11y2E", // class name
  bases__ZN3ccc8DD2x11y2E, 2,
  &(vtc__ZN3ccc8DD2x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y2E),3, //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  CC2x11y3  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x11y33abcEv
  ~CC2x11y3(); // tgen
  CC2x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y3E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y33efgEv");}
void  ccc::CC2x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y33pqrEv");}
void  ccc::CC2x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y33abcEv");}
ccc::CC2x11y3 ::~CC2x11y3(){ note_dtor("_ZN3ccc8CC2x11y3E", this);} // tgen
ccc::CC2x11y3 ::CC2x11y3(){ note_ctor("_ZN3ccc8CC2x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y3E, buf);
    ::ccc::CC2x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y3E);
    dp->::ccc::CC2x11y3::~CC2x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y3E(Test__ZN3ccc8CC2x11y3E, "_ZN3ccc8CC2x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y3C1Ev();
extern void _ZN3ccc8CC2x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y3E[] = {
  NSPAIR(_ZN3ccc8CC2x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y3E[];
extern void _ZN3ccc8CC2x11y33pqrEv();
extern void _ZN3ccc8CC2x11y33efgEv();
extern void _ZN3ccc8CC2x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y33efgEv,_ZTv0_n12_N3ccc8CC2x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y33efgEv,_ZThn4_N3ccc8CC2x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y33abcEv,_ZTv0_n16_N3ccc8CC2x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y33abcEv,_ZThn4_N3ccc8CC2x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y33pqrEv,_ZTv0_n20_N3ccc8CC2x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y33pqrEv,_ZThn4_N3ccc8CC2x11y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y33efgEv,_ZTv0_n12_N3ccc8CC2x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y33abcEv,_ZTv0_n16_N3ccc8CC2x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y33pqrEv,_ZTv0_n20_N3ccc8CC2x11y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y3E[] = {
  {&(_ZTVN3ccc8CC2x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y3E[];
static VTBL_ENTRY alt_thunk_names1196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y33pqrEv,_ZTv0_n20_N3ccc8CC2x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y33pqrEv,_ZThn4_N3ccc8CC2x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y33abcEv,_ZTv0_n16_N3ccc8CC2x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y33abcEv,_ZThn4_N3ccc8CC2x11y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y33efgEv,_ZTv0_n12_N3ccc8CC2x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y33efgEv,_ZThn4_N3ccc8CC2x11y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y3E = {  "_ZN3ccc8CC2x11y3E", // class name
  bases__ZN3ccc8CC2x11y3E, 2,
  &(vtc__ZN3ccc8CC2x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y3E),2, //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  DD2x11y3  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD2x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x11y33abcEv
  ~DD2x11y3(); // tgen
  DD2x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y33efgEv");}
void  ccc::DD2x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y33pqrEv");}
void  ccc::DD2x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y33abcEv");}
ccc::DD2x11y3 ::~DD2x11y3(){ note_dtor("_ZN3ccc8DD2x11y3E", this);} // tgen
ccc::DD2x11y3 ::DD2x11y3(){ note_ctor("_ZN3ccc8DD2x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y3E, buf);
    ::ccc::DD2x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y3E);
    dp->::ccc::DD2x11y3::~DD2x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y3E(Test__ZN3ccc8DD2x11y3E, "_ZN3ccc8DD2x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y3C1Ev();
extern void _ZN3ccc8DD2x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y3E[] = {
  NSPAIR(_ZN3ccc8DD2x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y3E[];
extern void _ZN3ccc8DD2x11y33efgEv();
extern void _ZN3ccc8DD2x11y33abcEv();
extern void _ZN3ccc8DD2x11y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y33pqrEv,_ZTv0_n12_N3ccc8DD2x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y33pqrEv,_ZThn4_N3ccc8DD2x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y33efgEv,_ZTv0_n16_N3ccc8DD2x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y33efgEv,_ZThn4_N3ccc8DD2x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y33pqrEv,_ZTv0_n12_N3ccc8DD2x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y33efgEv,_ZTv0_n16_N3ccc8DD2x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y3E[] = {
  {&(_ZTVN3ccc8DD2x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y3E[];
static VTBL_ENTRY alt_thunk_names1197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y33efgEv,_ZTv0_n16_N3ccc8DD2x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y33efgEv,_ZThn4_N3ccc8DD2x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y33pqrEv,_ZTv0_n12_N3ccc8DD2x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y33pqrEv,_ZThn4_N3ccc8DD2x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y3E = {  "_ZN3ccc8DD2x11y3E", // class name
  bases__ZN3ccc8DD2x11y3E, 2,
  &(vtc__ZN3ccc8DD2x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y3E),3, //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  CC2x11y4  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC2x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y43efgEv
  ~CC2x11y4(); // tgen
  CC2x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y4E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y43pqrEv");}
void  ccc::CC2x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y43abcEv");}
void  ccc::CC2x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y43efgEv");}
ccc::CC2x11y4 ::~CC2x11y4(){ note_dtor("_ZN3ccc8CC2x11y4E", this);} // tgen
ccc::CC2x11y4 ::CC2x11y4(){ note_ctor("_ZN3ccc8CC2x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y4E, buf);
    ::ccc::CC2x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y4E);
    dp->::ccc::CC2x11y4::~CC2x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y4E(Test__ZN3ccc8CC2x11y4E, "_ZN3ccc8CC2x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y4C1Ev();
extern void _ZN3ccc8CC2x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y4E[] = {
  NSPAIR(_ZN3ccc8CC2x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y4E[];
extern void _ZN3ccc8CC2x11y43pqrEv();
extern void _ZN3ccc8CC2x11y43efgEv();
extern void _ZN3ccc8CC2x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y43efgEv,_ZTv0_n12_N3ccc8CC2x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y43efgEv,_ZThn4_N3ccc8CC2x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y43abcEv,_ZTv0_n16_N3ccc8CC2x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y43abcEv,_ZThn4_N3ccc8CC2x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y43pqrEv,_ZTv0_n20_N3ccc8CC2x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y43pqrEv,_ZThn4_N3ccc8CC2x11y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y43efgEv,_ZTv0_n12_N3ccc8CC2x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y43abcEv,_ZTv0_n16_N3ccc8CC2x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y43pqrEv,_ZTv0_n20_N3ccc8CC2x11y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y4E[] = {
  {&(_ZTVN3ccc8CC2x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y4E[];
static VTBL_ENTRY alt_thunk_names1198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y43pqrEv,_ZTv0_n20_N3ccc8CC2x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y43pqrEv,_ZThn4_N3ccc8CC2x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y43abcEv,_ZTv0_n16_N3ccc8CC2x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y43abcEv,_ZThn4_N3ccc8CC2x11y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y43efgEv,_ZTv0_n12_N3ccc8CC2x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y43efgEv,_ZThn4_N3ccc8CC2x11y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y4E = {  "_ZN3ccc8CC2x11y4E", // class name
  bases__ZN3ccc8CC2x11y4E, 2,
  &(vtc__ZN3ccc8CC2x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y4E),2, //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  DD2x11y4  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD2x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x11y43efgEv
  ~DD2x11y4(); // tgen
  DD2x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y43pqrEv");}
void  ccc::DD2x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y43abcEv");}
void  ccc::DD2x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y43efgEv");}
ccc::DD2x11y4 ::~DD2x11y4(){ note_dtor("_ZN3ccc8DD2x11y4E", this);} // tgen
ccc::DD2x11y4 ::DD2x11y4(){ note_ctor("_ZN3ccc8DD2x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y4E, buf);
    ::ccc::DD2x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y4E);
    dp->::ccc::DD2x11y4::~DD2x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y4E(Test__ZN3ccc8DD2x11y4E, "_ZN3ccc8DD2x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y4C1Ev();
extern void _ZN3ccc8DD2x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y4E[] = {
  NSPAIR(_ZN3ccc8DD2x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y4E[];
extern void _ZN3ccc8DD2x11y43efgEv();
extern void _ZN3ccc8DD2x11y43abcEv();
extern void _ZN3ccc8DD2x11y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y43pqrEv,_ZTv0_n12_N3ccc8DD2x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y43pqrEv,_ZThn4_N3ccc8DD2x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y43efgEv,_ZTv0_n16_N3ccc8DD2x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y43efgEv,_ZThn4_N3ccc8DD2x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y43pqrEv,_ZTv0_n12_N3ccc8DD2x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y43efgEv,_ZTv0_n16_N3ccc8DD2x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y4E[] = {
  {&(_ZTVN3ccc8DD2x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y4E[];
static VTBL_ENTRY alt_thunk_names1199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y43efgEv,_ZTv0_n16_N3ccc8DD2x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y43efgEv,_ZThn4_N3ccc8DD2x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y43pqrEv,_ZTv0_n12_N3ccc8DD2x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y43pqrEv,_ZThn4_N3ccc8DD2x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y4E = {  "_ZN3ccc8DD2x11y4E", // class name
  bases__ZN3ccc8DD2x11y4E, 2,
  &(vtc__ZN3ccc8DD2x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y4E),3, //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  CC2x11y5  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC2x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y53abcEv
  ~CC2x11y5(); // tgen
  CC2x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y5E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y53pqrEv");}
void  ccc::CC2x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y53efgEv");}
void  ccc::CC2x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y53abcEv");}
ccc::CC2x11y5 ::~CC2x11y5(){ note_dtor("_ZN3ccc8CC2x11y5E", this);} // tgen
ccc::CC2x11y5 ::CC2x11y5(){ note_ctor("_ZN3ccc8CC2x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y5E, buf);
    ::ccc::CC2x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y5E);
    dp->::ccc::CC2x11y5::~CC2x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y5E(Test__ZN3ccc8CC2x11y5E, "_ZN3ccc8CC2x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y5C1Ev();
extern void _ZN3ccc8CC2x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y5E[] = {
  NSPAIR(_ZN3ccc8CC2x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y5E[];
extern void _ZN3ccc8CC2x11y53pqrEv();
extern void _ZN3ccc8CC2x11y53efgEv();
extern void _ZN3ccc8CC2x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y53efgEv,_ZTv0_n12_N3ccc8CC2x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y53efgEv,_ZThn4_N3ccc8CC2x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y53abcEv,_ZTv0_n16_N3ccc8CC2x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y53abcEv,_ZThn4_N3ccc8CC2x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y53pqrEv,_ZTv0_n20_N3ccc8CC2x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y53pqrEv,_ZThn4_N3ccc8CC2x11y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y53efgEv,_ZTv0_n12_N3ccc8CC2x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y53abcEv,_ZTv0_n16_N3ccc8CC2x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y53pqrEv,_ZTv0_n20_N3ccc8CC2x11y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y5E[] = {
  {&(_ZTVN3ccc8CC2x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y5E[];
static VTBL_ENTRY alt_thunk_names1200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y53pqrEv,_ZTv0_n20_N3ccc8CC2x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y53pqrEv,_ZThn4_N3ccc8CC2x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y53abcEv,_ZTv0_n16_N3ccc8CC2x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y53abcEv,_ZThn4_N3ccc8CC2x11y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y53efgEv,_ZTv0_n12_N3ccc8CC2x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y53efgEv,_ZThn4_N3ccc8CC2x11y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y5E = {  "_ZN3ccc8CC2x11y5E", // class name
  bases__ZN3ccc8CC2x11y5E, 2,
  &(vtc__ZN3ccc8CC2x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y5E),2, //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  DD2x11y5  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD2x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x11y53abcEv
  ~DD2x11y5(); // tgen
  DD2x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y53pqrEv");}
void  ccc::DD2x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y53efgEv");}
void  ccc::DD2x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y53abcEv");}
ccc::DD2x11y5 ::~DD2x11y5(){ note_dtor("_ZN3ccc8DD2x11y5E", this);} // tgen
ccc::DD2x11y5 ::DD2x11y5(){ note_ctor("_ZN3ccc8DD2x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y5E, buf);
    ::ccc::DD2x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y5E);
    dp->::ccc::DD2x11y5::~DD2x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y5E(Test__ZN3ccc8DD2x11y5E, "_ZN3ccc8DD2x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y5C1Ev();
extern void _ZN3ccc8DD2x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y5E[] = {
  NSPAIR(_ZN3ccc8DD2x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y5E[];
extern void _ZN3ccc8DD2x11y53efgEv();
extern void _ZN3ccc8DD2x11y53abcEv();
extern void _ZN3ccc8DD2x11y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y53pqrEv,_ZTv0_n12_N3ccc8DD2x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y53pqrEv,_ZThn4_N3ccc8DD2x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y53efgEv,_ZTv0_n16_N3ccc8DD2x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y53efgEv,_ZThn4_N3ccc8DD2x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y53pqrEv,_ZTv0_n12_N3ccc8DD2x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y53efgEv,_ZTv0_n16_N3ccc8DD2x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y5E[] = {
  {&(_ZTVN3ccc8DD2x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y5E[];
static VTBL_ENTRY alt_thunk_names1201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y53efgEv,_ZTv0_n16_N3ccc8DD2x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y53efgEv,_ZThn4_N3ccc8DD2x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y53pqrEv,_ZTv0_n12_N3ccc8DD2x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y53pqrEv,_ZThn4_N3ccc8DD2x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y5E = {  "_ZN3ccc8DD2x11y5E", // class name
  bases__ZN3ccc8DD2x11y5E, 2,
  &(vtc__ZN3ccc8DD2x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y6  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y63efgEv
  ~CC2x11y6(); // tgen
  CC2x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y6E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y63abcEv");}
void  ccc::CC2x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y63efgEv");}
ccc::CC2x11y6 ::~CC2x11y6(){ note_dtor("_ZN3ccc8CC2x11y6E", this);} // tgen
ccc::CC2x11y6 ::CC2x11y6(){ note_ctor("_ZN3ccc8CC2x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y6E, buf);
    ::ccc::CC2x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y6E);
    dp->::ccc::CC2x11y6::~CC2x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y6E(Test__ZN3ccc8CC2x11y6E, "_ZN3ccc8CC2x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y6C1Ev();
extern void _ZN3ccc8CC2x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y6E[] = {
  NSPAIR(_ZN3ccc8CC2x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC2x11y63efgEv();
extern void _ZN3ccc8CC2x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y63efgEv,_ZTv0_n12_N3ccc8CC2x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y63efgEv,_ZThn4_N3ccc8CC2x11y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y63abcEv,_ZTv0_n16_N3ccc8CC2x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y63abcEv,_ZThn4_N3ccc8CC2x11y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y63efgEv,_ZTv0_n12_N3ccc8CC2x11y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y63abcEv,_ZTv0_n16_N3ccc8CC2x11y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y6E[] = {
  {&(_ZTVN3ccc8CC2x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y6E[];
static VTBL_ENTRY alt_thunk_names1202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y63abcEv,_ZTv0_n16_N3ccc8CC2x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y63abcEv,_ZThn4_N3ccc8CC2x11y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y63efgEv,_ZTv0_n12_N3ccc8CC2x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y63efgEv,_ZThn4_N3ccc8CC2x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y6E = {  "_ZN3ccc8CC2x11y6E", // class name
  bases__ZN3ccc8CC2x11y6E, 2,
  &(vtc__ZN3ccc8CC2x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1202,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y6  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD2x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x11y63efgEv
  ~DD2x11y6(); // tgen
  DD2x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y63abcEv");}
void  ccc::DD2x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y63efgEv");}
ccc::DD2x11y6 ::~DD2x11y6(){ note_dtor("_ZN3ccc8DD2x11y6E", this);} // tgen
ccc::DD2x11y6 ::DD2x11y6(){ note_ctor("_ZN3ccc8DD2x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y6E, buf);
    ::ccc::DD2x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y6E);
    dp->::ccc::DD2x11y6::~DD2x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y6E(Test__ZN3ccc8DD2x11y6E, "_ZN3ccc8DD2x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y6C1Ev();
extern void _ZN3ccc8DD2x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y6E[] = {
  NSPAIR(_ZN3ccc8DD2x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y6E[];
extern void _ZN3ccc8DD2x11y63efgEv();
extern void _ZN3ccc8DD2x11y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y63efgEv,_ZTv0_n16_N3ccc8DD2x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y63efgEv,_ZThn4_N3ccc8DD2x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y63efgEv,_ZTv0_n16_N3ccc8DD2x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y6E[] = {
  {&(_ZTVN3ccc8DD2x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y6E[];
static VTBL_ENTRY alt_thunk_names1203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y63efgEv,_ZTv0_n16_N3ccc8DD2x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y63efgEv,_ZThn4_N3ccc8DD2x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y6E = {  "_ZN3ccc8DD2x11y6E", // class name
  bases__ZN3ccc8DD2x11y6E, 2,
  &(vtc__ZN3ccc8DD2x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1203,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y7  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y73pqrEv
  ~CC2x11y7(); // tgen
  CC2x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y7E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y73abcEv");}
void  ccc::CC2x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y73pqrEv");}
ccc::CC2x11y7 ::~CC2x11y7(){ note_dtor("_ZN3ccc8CC2x11y7E", this);} // tgen
ccc::CC2x11y7 ::CC2x11y7(){ note_ctor("_ZN3ccc8CC2x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y7E, buf);
    ::ccc::CC2x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y7E);
    dp->::ccc::CC2x11y7::~CC2x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y7E(Test__ZN3ccc8CC2x11y7E, "_ZN3ccc8CC2x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y7C1Ev();
extern void _ZN3ccc8CC2x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y7E[] = {
  NSPAIR(_ZN3ccc8CC2x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y7E[];
extern void _ZN3ccc8CC2x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC2x11y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y73abcEv,_ZTv0_n16_N3ccc8CC2x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y73abcEv,_ZThn4_N3ccc8CC2x11y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y73pqrEv,_ZTv0_n20_N3ccc8CC2x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y73pqrEv,_ZThn4_N3ccc8CC2x11y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y73abcEv,_ZTv0_n16_N3ccc8CC2x11y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y73pqrEv,_ZTv0_n20_N3ccc8CC2x11y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y7E[] = {
  {&(_ZTVN3ccc8CC2x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y7E[];
static VTBL_ENTRY alt_thunk_names1204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y73pqrEv,_ZTv0_n20_N3ccc8CC2x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y73pqrEv,_ZThn4_N3ccc8CC2x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y73abcEv,_ZTv0_n16_N3ccc8CC2x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y73abcEv,_ZThn4_N3ccc8CC2x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y7E = {  "_ZN3ccc8CC2x11y7E", // class name
  bases__ZN3ccc8CC2x11y7E, 2,
  &(vtc__ZN3ccc8CC2x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1204,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y7  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD2x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y73pqrEv
  ~DD2x11y7(); // tgen
  DD2x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y73abcEv");}
void  ccc::DD2x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y73pqrEv");}
ccc::DD2x11y7 ::~DD2x11y7(){ note_dtor("_ZN3ccc8DD2x11y7E", this);} // tgen
ccc::DD2x11y7 ::DD2x11y7(){ note_ctor("_ZN3ccc8DD2x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y7E, buf);
    ::ccc::DD2x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y7E);
    dp->::ccc::DD2x11y7::~DD2x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y7E(Test__ZN3ccc8DD2x11y7E, "_ZN3ccc8DD2x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y7C1Ev();
extern void _ZN3ccc8DD2x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y7E[] = {
  NSPAIR(_ZN3ccc8DD2x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x11y73abcEv();
extern void _ZN3ccc8DD2x11y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y73pqrEv,_ZTv0_n12_N3ccc8DD2x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y73pqrEv,_ZThn4_N3ccc8DD2x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y73pqrEv,_ZTv0_n12_N3ccc8DD2x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y7E[] = {
  {&(_ZTVN3ccc8DD2x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y7E[];
static VTBL_ENTRY alt_thunk_names1205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y73pqrEv,_ZTv0_n12_N3ccc8DD2x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y73pqrEv,_ZThn4_N3ccc8DD2x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y7E = {  "_ZN3ccc8DD2x11y7E", // class name
  bases__ZN3ccc8DD2x11y7E, 2,
  &(vtc__ZN3ccc8DD2x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1205,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y8  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y83abcEv
  ~CC2x11y8(); // tgen
  CC2x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y8E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y83efgEv");}
void  ccc::CC2x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y83abcEv");}
ccc::CC2x11y8 ::~CC2x11y8(){ note_dtor("_ZN3ccc8CC2x11y8E", this);} // tgen
ccc::CC2x11y8 ::CC2x11y8(){ note_ctor("_ZN3ccc8CC2x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y8E, buf);
    ::ccc::CC2x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y8E);
    dp->::ccc::CC2x11y8::~CC2x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y8E(Test__ZN3ccc8CC2x11y8E, "_ZN3ccc8CC2x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y8C1Ev();
extern void _ZN3ccc8CC2x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y8E[] = {
  NSPAIR(_ZN3ccc8CC2x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC2x11y83efgEv();
extern void _ZN3ccc8CC2x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y83efgEv,_ZTv0_n12_N3ccc8CC2x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y83efgEv,_ZThn4_N3ccc8CC2x11y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x11y83abcEv,_ZTv0_n16_N3ccc8CC2x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y83abcEv,_ZThn4_N3ccc8CC2x11y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y83efgEv,_ZTv0_n12_N3ccc8CC2x11y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x11y83abcEv,_ZTv0_n16_N3ccc8CC2x11y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y8E[] = {
  {&(_ZTVN3ccc8CC2x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y8E[];
static VTBL_ENTRY alt_thunk_names1206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x11y83abcEv,_ZTv0_n16_N3ccc8CC2x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y83abcEv,_ZThn4_N3ccc8CC2x11y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y83efgEv,_ZTv0_n12_N3ccc8CC2x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y83efgEv,_ZThn4_N3ccc8CC2x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y8E = {  "_ZN3ccc8CC2x11y8E", // class name
  bases__ZN3ccc8CC2x11y8E, 2,
  &(vtc__ZN3ccc8CC2x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y8  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD2x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x11y83abcEv
  ~DD2x11y8(); // tgen
  DD2x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y83efgEv");}
void  ccc::DD2x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x11y83abcEv");}
ccc::DD2x11y8 ::~DD2x11y8(){ note_dtor("_ZN3ccc8DD2x11y8E", this);} // tgen
ccc::DD2x11y8 ::DD2x11y8(){ note_ctor("_ZN3ccc8DD2x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y8E, buf);
    ::ccc::DD2x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y8E);
    dp->::ccc::DD2x11y8::~DD2x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y8E(Test__ZN3ccc8DD2x11y8E, "_ZN3ccc8DD2x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y8C1Ev();
extern void _ZN3ccc8DD2x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y8E[] = {
  NSPAIR(_ZN3ccc8DD2x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y8E[];
extern void _ZN3ccc8DD2x11y83efgEv();
extern void _ZN3ccc8DD2x11y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y83efgEv,_ZTv0_n16_N3ccc8DD2x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y83efgEv,_ZThn4_N3ccc8DD2x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y83efgEv,_ZTv0_n16_N3ccc8DD2x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y8E[] = {
  {&(_ZTVN3ccc8DD2x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y8E[];
static VTBL_ENTRY alt_thunk_names1207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y83efgEv,_ZTv0_n16_N3ccc8DD2x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y83efgEv,_ZThn4_N3ccc8DD2x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y8E = {  "_ZN3ccc8DD2x11y8E", // class name
  bases__ZN3ccc8DD2x11y8E, 2,
  &(vtc__ZN3ccc8DD2x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y9  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y93pqrEv
  ~CC2x11y9(); // tgen
  CC2x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y9E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y93efgEv");}
void  ccc::CC2x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y93pqrEv");}
ccc::CC2x11y9 ::~CC2x11y9(){ note_dtor("_ZN3ccc8CC2x11y9E", this);} // tgen
ccc::CC2x11y9 ::CC2x11y9(){ note_ctor("_ZN3ccc8CC2x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y9E, buf);
    ::ccc::CC2x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC2x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y9E);
    dp->::ccc::CC2x11y9::~CC2x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y9E(Test__ZN3ccc8CC2x11y9E, "_ZN3ccc8CC2x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y9C1Ev();
extern void _ZN3ccc8CC2x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y9E[] = {
  NSPAIR(_ZN3ccc8CC2x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y9E[];
extern void _ZN3ccc8CC2x11y93pqrEv();
extern void _ZN3ccc8CC2x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x11y93efgEv,_ZTv0_n12_N3ccc8CC2x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y93efgEv,_ZThn4_N3ccc8CC2x11y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x11y93pqrEv,_ZTv0_n20_N3ccc8CC2x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y93pqrEv,_ZThn4_N3ccc8CC2x11y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x11y93efgEv,_ZTv0_n12_N3ccc8CC2x11y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x11y93pqrEv,_ZTv0_n20_N3ccc8CC2x11y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x11y9E[] = {
  {&(_ZTVN3ccc8CC2x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x11y9E[];
static VTBL_ENTRY alt_thunk_names1208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x11y93pqrEv,_ZTv0_n20_N3ccc8CC2x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y93pqrEv,_ZThn4_N3ccc8CC2x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x11y93efgEv,_ZTv0_n12_N3ccc8CC2x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x11y93efgEv,_ZThn4_N3ccc8CC2x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x11y9E = {  "_ZN3ccc8CC2x11y9E", // class name
  bases__ZN3ccc8CC2x11y9E, 2,
  &(vtc__ZN3ccc8CC2x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x11y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y9  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD2x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x11y93pqrEv
  ~DD2x11y9(); // tgen
  DD2x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x11y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x11y93efgEv");}
void  ccc::DD2x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x11y93pqrEv");}
ccc::DD2x11y9 ::~DD2x11y9(){ note_dtor("_ZN3ccc8DD2x11y9E", this);} // tgen
ccc::DD2x11y9 ::DD2x11y9(){ note_ctor("_ZN3ccc8DD2x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x11y9E, buf);
    ::ccc::DD2x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x11y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD2x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x11y9E);
    dp->::ccc::DD2x11y9::~DD2x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x11y9E(Test__ZN3ccc8DD2x11y9E, "_ZN3ccc8DD2x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x11y9C1Ev();
extern void _ZN3ccc8DD2x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x11y9E[] = {
  NSPAIR(_ZN3ccc8DD2x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD2x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y9E[];
extern void _ZN3ccc8DD2x11y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x11y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x11y93pqrEv,_ZTv0_n12_N3ccc8DD2x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y93pqrEv,_ZThn4_N3ccc8DD2x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD2x11y93efgEv,_ZTv0_n16_N3ccc8DD2x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x11y93efgEv,_ZThn4_N3ccc8DD2x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x11y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x11y93pqrEv,_ZTv0_n12_N3ccc8DD2x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD2x11y93efgEv,_ZTv0_n16_N3ccc8DD2x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x11y9E[] = {
  {&(_ZTVN3ccc8DD2x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD2x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x11y9E[];
static VTBL_ENTRY alt_thunk_names1209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD2x11y93efgEv,_ZTv0_n16_N3ccc8DD2x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y93efgEv,_ZThn4_N3ccc8DD2x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x11y93pqrEv,_ZTv0_n12_N3ccc8DD2x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x11y93pqrEv,_ZThn4_N3ccc8DD2x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x11y9E = {  "_ZN3ccc8DD2x11y9E", // class name
  bases__ZN3ccc8DD2x11y9E, 2,
  &(vtc__ZN3ccc8DD2x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x11y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y10  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x11y103abcEv
  ~CC2x11y10(); // tgen
  CC2x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y10E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y103pqrEv");}
void  ccc::CC2x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x11y103abcEv");}
ccc::CC2x11y10 ::~CC2x11y10(){ note_dtor("_ZN3ccc9CC2x11y10E", this);} // tgen
ccc::CC2x11y10 ::CC2x11y10(){ note_ctor("_ZN3ccc9CC2x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y10E, buf);
    ::ccc::CC2x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y10E);
    dp->::ccc::CC2x11y10::~CC2x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y10E(Test__ZN3ccc9CC2x11y10E, "_ZN3ccc9CC2x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y10C1Ev();
extern void _ZN3ccc9CC2x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y10E[] = {
  NSPAIR(_ZN3ccc9CC2x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y10E[];
extern void _ZN3ccc9CC2x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC2x11y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x11y103abcEv,_ZTv0_n16_N3ccc9CC2x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y103abcEv,_ZThn4_N3ccc9CC2x11y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x11y103pqrEv,_ZTv0_n20_N3ccc9CC2x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y103pqrEv,_ZThn4_N3ccc9CC2x11y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x11y103abcEv,_ZTv0_n16_N3ccc9CC2x11y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x11y103pqrEv,_ZTv0_n20_N3ccc9CC2x11y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y10E[] = {
  {&(_ZTVN3ccc9CC2x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y10E[];
static VTBL_ENTRY alt_thunk_names1210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x11y103pqrEv,_ZTv0_n20_N3ccc9CC2x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y103pqrEv,_ZThn4_N3ccc9CC2x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x11y103abcEv,_ZTv0_n16_N3ccc9CC2x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y103abcEv,_ZThn4_N3ccc9CC2x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x11y10E = {  "_ZN3ccc9CC2x11y10E", // class name
  bases__ZN3ccc9CC2x11y10E, 2,
  &(vtc__ZN3ccc9CC2x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y10  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD2x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x11y103abcEv
  ~DD2x11y10(); // tgen
  DD2x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x11y103pqrEv");}
void  ccc::DD2x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x11y103abcEv");}
ccc::DD2x11y10 ::~DD2x11y10(){ note_dtor("_ZN3ccc9DD2x11y10E", this);} // tgen
ccc::DD2x11y10 ::DD2x11y10(){ note_ctor("_ZN3ccc9DD2x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y10E, buf);
    ::ccc::DD2x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y10E);
    dp->::ccc::DD2x11y10::~DD2x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y10E(Test__ZN3ccc9DD2x11y10E, "_ZN3ccc9DD2x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y10C1Ev();
extern void _ZN3ccc9DD2x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y10E[] = {
  NSPAIR(_ZN3ccc9DD2x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x11y103abcEv();
extern void _ZN3ccc9DD2x11y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x11y103pqrEv,_ZTv0_n12_N3ccc9DD2x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x11y103pqrEv,_ZThn4_N3ccc9DD2x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x11y103pqrEv,_ZTv0_n12_N3ccc9DD2x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y10E[] = {
  {&(_ZTVN3ccc9DD2x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y10E[];
static VTBL_ENTRY alt_thunk_names1211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x11y103pqrEv,_ZTv0_n12_N3ccc9DD2x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x11y103pqrEv,_ZThn4_N3ccc9DD2x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x11y10E = {  "_ZN3ccc9DD2x11y10E", // class name
  bases__ZN3ccc9DD2x11y10E, 2,
  &(vtc__ZN3ccc9DD2x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y11  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x11y113efgEv
  ~CC2x11y11(); // tgen
  CC2x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y11E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y113pqrEv");}
void  ccc::CC2x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x11y113efgEv");}
ccc::CC2x11y11 ::~CC2x11y11(){ note_dtor("_ZN3ccc9CC2x11y11E", this);} // tgen
ccc::CC2x11y11 ::CC2x11y11(){ note_ctor("_ZN3ccc9CC2x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y11E, buf);
    ::ccc::CC2x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y11E);
    dp->::ccc::CC2x11y11::~CC2x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y11E(Test__ZN3ccc9CC2x11y11E, "_ZN3ccc9CC2x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y11C1Ev();
extern void _ZN3ccc9CC2x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y11E[] = {
  NSPAIR(_ZN3ccc9CC2x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y11E[];
extern void _ZN3ccc9CC2x11y113pqrEv();
extern void _ZN3ccc9CC2x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x11y113efgEv,_ZTv0_n12_N3ccc9CC2x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y113efgEv,_ZThn4_N3ccc9CC2x11y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x11y113pqrEv,_ZTv0_n20_N3ccc9CC2x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y113pqrEv,_ZThn4_N3ccc9CC2x11y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x11y113efgEv,_ZTv0_n12_N3ccc9CC2x11y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x11y113pqrEv,_ZTv0_n20_N3ccc9CC2x11y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y11E[] = {
  {&(_ZTVN3ccc9CC2x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y11E[];
static VTBL_ENTRY alt_thunk_names1212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x11y113pqrEv,_ZTv0_n20_N3ccc9CC2x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y113pqrEv,_ZThn4_N3ccc9CC2x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x11y113efgEv,_ZTv0_n12_N3ccc9CC2x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y113efgEv,_ZThn4_N3ccc9CC2x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x11y11E = {  "_ZN3ccc9CC2x11y11E", // class name
  bases__ZN3ccc9CC2x11y11E, 2,
  &(vtc__ZN3ccc9CC2x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y11  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD2x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x11y113efgEv
  ~DD2x11y11(); // tgen
  DD2x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x11y113pqrEv");}
void  ccc::DD2x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x11y113efgEv");}
ccc::DD2x11y11 ::~DD2x11y11(){ note_dtor("_ZN3ccc9DD2x11y11E", this);} // tgen
ccc::DD2x11y11 ::DD2x11y11(){ note_ctor("_ZN3ccc9DD2x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y11E, buf);
    ::ccc::DD2x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y11E);
    dp->::ccc::DD2x11y11::~DD2x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y11E(Test__ZN3ccc9DD2x11y11E, "_ZN3ccc9DD2x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y11C1Ev();
extern void _ZN3ccc9DD2x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y11E[] = {
  NSPAIR(_ZN3ccc9DD2x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y11E[];
extern void _ZN3ccc9DD2x11y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x11y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x11y113pqrEv,_ZTv0_n12_N3ccc9DD2x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x11y113pqrEv,_ZThn4_N3ccc9DD2x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD2x11y113efgEv,_ZTv0_n16_N3ccc9DD2x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x11y113efgEv,_ZThn4_N3ccc9DD2x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x11y113pqrEv,_ZTv0_n12_N3ccc9DD2x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD2x11y113efgEv,_ZTv0_n16_N3ccc9DD2x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y11E[] = {
  {&(_ZTVN3ccc9DD2x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y11E[];
static VTBL_ENTRY alt_thunk_names1213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD2x11y113efgEv,_ZTv0_n16_N3ccc9DD2x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x11y113efgEv,_ZThn4_N3ccc9DD2x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x11y113pqrEv,_ZTv0_n12_N3ccc9DD2x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x11y113pqrEv,_ZThn4_N3ccc9DD2x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x11y11E = {  "_ZN3ccc9DD2x11y11E", // class name
  bases__ZN3ccc9DD2x11y11E, 2,
  &(vtc__ZN3ccc9DD2x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y12  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC2x11y123abcEv
  ~CC2x11y12(); // tgen
  CC2x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x11y123abcEv");}
ccc::CC2x11y12 ::~CC2x11y12(){ note_dtor("_ZN3ccc9CC2x11y12E", this);} // tgen
ccc::CC2x11y12 ::CC2x11y12(){ note_ctor("_ZN3ccc9CC2x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y12E, buf);
    ::ccc::CC2x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y12E);
    dp->::ccc::CC2x11y12::~CC2x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y12E(Test__ZN3ccc9CC2x11y12E, "_ZN3ccc9CC2x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y12C1Ev();
extern void _ZN3ccc9CC2x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y12E[] = {
  NSPAIR(_ZN3ccc9CC2x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC2x11y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x11y123abcEv,_ZTv0_n16_N3ccc9CC2x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y123abcEv,_ZThn4_N3ccc9CC2x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x11y123abcEv,_ZTv0_n16_N3ccc9CC2x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y12E[] = {
  {&(_ZTVN3ccc9CC2x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y12E[];
static VTBL_ENTRY alt_thunk_names1214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x11y123abcEv,_ZTv0_n16_N3ccc9CC2x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y123abcEv,_ZThn4_N3ccc9CC2x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x11y12E = {  "_ZN3ccc9CC2x11y12E", // class name
  bases__ZN3ccc9CC2x11y12E, 2,
  &(vtc__ZN3ccc9CC2x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y12  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD2x11y123abcEv
  ~DD2x11y12(); // tgen
  DD2x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD2x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x11y123abcEv");}
ccc::DD2x11y12 ::~DD2x11y12(){ note_dtor("_ZN3ccc9DD2x11y12E", this);} // tgen
ccc::DD2x11y12 ::DD2x11y12(){ note_ctor("_ZN3ccc9DD2x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y12E, buf);
    ::ccc::DD2x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y12E);
    dp->::ccc::DD2x11y12::~DD2x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y12E(Test__ZN3ccc9DD2x11y12E, "_ZN3ccc9DD2x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y12C1Ev();
extern void _ZN3ccc9DD2x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y12E[] = {
  NSPAIR(_ZN3ccc9DD2x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x11y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y12E[] = {
  {&(_ZTVN3ccc9DD2x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y12E[];
Class_Descriptor cd__ZN3ccc9DD2x11y12E = {  "_ZN3ccc9DD2x11y12E", // class name
  bases__ZN3ccc9DD2x11y12E, 2,
  &(vtc__ZN3ccc9DD2x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y13  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC2x11y133efgEv
  ~CC2x11y13(); // tgen
  CC2x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x11y133efgEv");}
ccc::CC2x11y13 ::~CC2x11y13(){ note_dtor("_ZN3ccc9CC2x11y13E", this);} // tgen
ccc::CC2x11y13 ::CC2x11y13(){ note_ctor("_ZN3ccc9CC2x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y13E, buf);
    ::ccc::CC2x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y13E);
    dp->::ccc::CC2x11y13::~CC2x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y13E(Test__ZN3ccc9CC2x11y13E, "_ZN3ccc9CC2x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y13C1Ev();
extern void _ZN3ccc9CC2x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y13E[] = {
  NSPAIR(_ZN3ccc9CC2x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC2x11y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x11y133efgEv,_ZTv0_n12_N3ccc9CC2x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y133efgEv,_ZThn4_N3ccc9CC2x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x11y133efgEv,_ZTv0_n12_N3ccc9CC2x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y13E[] = {
  {&(_ZTVN3ccc9CC2x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y13E[];
static VTBL_ENTRY alt_thunk_names1215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x11y133efgEv,_ZTv0_n12_N3ccc9CC2x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y133efgEv,_ZThn4_N3ccc9CC2x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x11y13E = {  "_ZN3ccc9CC2x11y13E", // class name
  bases__ZN3ccc9CC2x11y13E, 2,
  &(vtc__ZN3ccc9CC2x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y13  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD2x11y133efgEv
  ~DD2x11y13(); // tgen
  DD2x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD2x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x11y133efgEv");}
ccc::DD2x11y13 ::~DD2x11y13(){ note_dtor("_ZN3ccc9DD2x11y13E", this);} // tgen
ccc::DD2x11y13 ::DD2x11y13(){ note_ctor("_ZN3ccc9DD2x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y13E, buf);
    ::ccc::DD2x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y13E);
    dp->::ccc::DD2x11y13::~DD2x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y13E(Test__ZN3ccc9DD2x11y13E, "_ZN3ccc9DD2x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y13C1Ev();
extern void _ZN3ccc9DD2x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y13E[] = {
  NSPAIR(_ZN3ccc9DD2x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y13E[];
extern void _ZN3ccc9DD2x11y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD2x11y133efgEv,_ZTv0_n16_N3ccc9DD2x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x11y133efgEv,_ZThn4_N3ccc9DD2x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD2x11y133efgEv,_ZTv0_n16_N3ccc9DD2x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y13E[] = {
  {&(_ZTVN3ccc9DD2x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y13E[];
static VTBL_ENTRY alt_thunk_names1216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD2x11y133efgEv,_ZTv0_n16_N3ccc9DD2x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x11y133efgEv,_ZThn4_N3ccc9DD2x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x11y13E = {  "_ZN3ccc9DD2x11y13E", // class name
  bases__ZN3ccc9DD2x11y13E, 2,
  &(vtc__ZN3ccc9DD2x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y14  : virtual ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y143pqrEv
  ~CC2x11y14(); // tgen
  CC2x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y143pqrEv");}
ccc::CC2x11y14 ::~CC2x11y14(){ note_dtor("_ZN3ccc9CC2x11y14E", this);} // tgen
ccc::CC2x11y14 ::CC2x11y14(){ note_ctor("_ZN3ccc9CC2x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y14E, buf);
    ::ccc::CC2x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y14E);
    dp->::ccc::CC2x11y14::~CC2x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y14E(Test__ZN3ccc9CC2x11y14E, "_ZN3ccc9CC2x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y14C1Ev();
extern void _ZN3ccc9CC2x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y14E[] = {
  NSPAIR(_ZN3ccc9CC2x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y14E[];
extern void _ZN3ccc9CC2x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x11y143pqrEv,_ZTv0_n20_N3ccc9CC2x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y143pqrEv,_ZThn4_N3ccc9CC2x11y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x11y143pqrEv,_ZTv0_n20_N3ccc9CC2x11y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y14E[] = {
  {&(_ZTVN3ccc9CC2x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y14E[];
static VTBL_ENTRY alt_thunk_names1217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x11y143pqrEv,_ZTv0_n20_N3ccc9CC2x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x11y143pqrEv,_ZThn4_N3ccc9CC2x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x11y14E = {  "_ZN3ccc9CC2x11y14E", // class name
  bases__ZN3ccc9CC2x11y14E, 2,
  &(vtc__ZN3ccc9CC2x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y14  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD2x11y143pqrEv
  ~DD2x11y14(); // tgen
  DD2x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD2x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x11y143pqrEv");}
ccc::DD2x11y14 ::~DD2x11y14(){ note_dtor("_ZN3ccc9DD2x11y14E", this);} // tgen
ccc::DD2x11y14 ::DD2x11y14(){ note_ctor("_ZN3ccc9DD2x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y14E, buf);
    ::ccc::DD2x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y14E);
    dp->::ccc::DD2x11y14::~DD2x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y14E(Test__ZN3ccc9DD2x11y14E, "_ZN3ccc9DD2x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y14C1Ev();
extern void _ZN3ccc9DD2x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y14E[] = {
  NSPAIR(_ZN3ccc9DD2x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x11y143pqrEv,_ZTv0_n12_N3ccc9DD2x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x11y143pqrEv,_ZThn4_N3ccc9DD2x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x11y143pqrEv,_ZTv0_n12_N3ccc9DD2x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y14E[] = {
  {&(_ZTVN3ccc9DD2x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y14E[];
static VTBL_ENTRY alt_thunk_names1218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x11y143pqrEv,_ZTv0_n12_N3ccc9DD2x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x11y143pqrEv,_ZThn4_N3ccc9DD2x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x11y14E = {  "_ZN3ccc9DD2x11y14E", // class name
  bases__ZN3ccc9DD2x11y14E, 2,
  &(vtc__ZN3ccc9DD2x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y15  : virtual ::ccc::AA2 , ::ccc::BB11 {
  ~CC2x11y15(); // tgen
  CC2x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x11y15 ::~CC2x11y15(){ note_dtor("_ZN3ccc9CC2x11y15E", this);} // tgen
ccc::CC2x11y15 ::CC2x11y15(){ note_ctor("_ZN3ccc9CC2x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y15E, buf);
    ::ccc::CC2x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC2x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y15E);
    dp->::ccc::CC2x11y15::~CC2x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y15E(Test__ZN3ccc9CC2x11y15E, "_ZN3ccc9CC2x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y15C1Ev();
extern void _ZN3ccc9CC2x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y15E[] = {
  NSPAIR(_ZN3ccc9CC2x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x11y15E[] = {
  {&(_ZTVN3ccc9CC2x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x11y15E[];
Class_Descriptor cd__ZN3ccc9CC2x11y15E = {  "_ZN3ccc9CC2x11y15E", // class name
  bases__ZN3ccc9CC2x11y15E, 2,
  &(vtc__ZN3ccc9CC2x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x11y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x11y15  : virtual ::ccc::AA2 , virtual ::ccc::BB11 {
  ~DD2x11y15(); // tgen
  DD2x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD2x11y15 ::~DD2x11y15(){ note_dtor("_ZN3ccc9DD2x11y15E", this);} // tgen
ccc::DD2x11y15 ::DD2x11y15(){ note_ctor("_ZN3ccc9DD2x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x11y15E, buf);
    ::ccc::DD2x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x11y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD2x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x11y15E);
    dp->::ccc::DD2x11y15::~DD2x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x11y15E(Test__ZN3ccc9DD2x11y15E, "_ZN3ccc9DD2x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x11y15C1Ev();
extern void _ZN3ccc9DD2x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x11y15E[] = {
  NSPAIR(_ZN3ccc9DD2x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD2x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x11y15E[] = {
  {&(_ZTVN3ccc9DD2x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD2x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x11y15E[];
Class_Descriptor cd__ZN3ccc9DD2x11y15E = {  "_ZN3ccc9DD2x11y15E", // class name
  bases__ZN3ccc9DD2x11y15E, 2,
  &(vtc__ZN3ccc9DD2x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x11y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y0  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y03pqrEv
  ~CC2x12y0(); // tgen
  CC2x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y0E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y03abcEv");}
void  ccc::CC2x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y03efgEv");}
void  ccc::CC2x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y03pqrEv");}
ccc::CC2x12y0 ::~CC2x12y0(){ note_dtor("_ZN3ccc8CC2x12y0E", this);} // tgen
ccc::CC2x12y0 ::CC2x12y0(){ note_ctor("_ZN3ccc8CC2x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y0E, buf);
    ::ccc::CC2x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y0E);
    dp->::ccc::CC2x12y0::~CC2x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y0E(Test__ZN3ccc8CC2x12y0E, "_ZN3ccc8CC2x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y0C1Ev();
extern void _ZN3ccc8CC2x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y0E[] = {
  NSPAIR(_ZN3ccc8CC2x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y0E[];
extern void _ZN3ccc8CC2x12y03abcEv();
extern void _ZN3ccc8CC2x12y03efgEv();
extern void _ZN3ccc8CC2x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y03efgEv,_ZTv0_n12_N3ccc8CC2x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y03efgEv,_ZThn4_N3ccc8CC2x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y03abcEv,_ZTv0_n16_N3ccc8CC2x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y03abcEv,_ZThn4_N3ccc8CC2x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y03pqrEv,_ZTv0_n20_N3ccc8CC2x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y03pqrEv,_ZThn4_N3ccc8CC2x12y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y03efgEv,_ZTv0_n12_N3ccc8CC2x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y03abcEv,_ZTv0_n16_N3ccc8CC2x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y03pqrEv,_ZTv0_n20_N3ccc8CC2x12y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y0E[] = {
  {&(_ZTVN3ccc8CC2x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y0E[];
static VTBL_ENTRY alt_thunk_names1219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y03pqrEv,_ZTv0_n20_N3ccc8CC2x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y03pqrEv,_ZThn4_N3ccc8CC2x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y03abcEv,_ZTv0_n16_N3ccc8CC2x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y03abcEv,_ZThn4_N3ccc8CC2x12y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y03efgEv,_ZTv0_n12_N3ccc8CC2x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y03efgEv,_ZThn4_N3ccc8CC2x12y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y0E = {  "_ZN3ccc8CC2x12y0E", // class name
  bases__ZN3ccc8CC2x12y0E, 2,
  &(vtc__ZN3ccc8CC2x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y0  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD2x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y03pqrEv
  ~DD2x12y0(); // tgen
  DD2x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y03abcEv");}
void  ccc::DD2x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y03efgEv");}
void  ccc::DD2x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y03pqrEv");}
ccc::DD2x12y0 ::~DD2x12y0(){ note_dtor("_ZN3ccc8DD2x12y0E", this);} // tgen
ccc::DD2x12y0 ::DD2x12y0(){ note_ctor("_ZN3ccc8DD2x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y0E, buf);
    ::ccc::DD2x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y0E);
    dp->::ccc::DD2x12y0::~DD2x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y0E(Test__ZN3ccc8DD2x12y0E, "_ZN3ccc8DD2x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y0C1Ev();
extern void _ZN3ccc8DD2x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y0E[] = {
  NSPAIR(_ZN3ccc8DD2x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y0E[];
extern void _ZN3ccc8DD2x12y03efgEv();
extern void _ZN3ccc8DD2x12y03abcEv();
extern void _ZN3ccc8DD2x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y03abcEv,_ZTv0_n12_N3ccc8DD2x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y03abcEv,_ZThn4_N3ccc8DD2x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y03abcEv,_ZTv0_n12_N3ccc8DD2x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y0E[] = {
  {&(_ZTVN3ccc8DD2x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y0E[];
static VTBL_ENTRY alt_thunk_names1220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y03abcEv,_ZTv0_n12_N3ccc8DD2x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y03abcEv,_ZThn4_N3ccc8DD2x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y0E = {  "_ZN3ccc8DD2x12y0E", // class name
  bases__ZN3ccc8DD2x12y0E, 2,
  &(vtc__ZN3ccc8DD2x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y1  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x12y13efgEv
  ~CC2x12y1(); // tgen
  CC2x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y1E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y13abcEv");}
void  ccc::CC2x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y13pqrEv");}
void  ccc::CC2x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y13efgEv");}
ccc::CC2x12y1 ::~CC2x12y1(){ note_dtor("_ZN3ccc8CC2x12y1E", this);} // tgen
ccc::CC2x12y1 ::CC2x12y1(){ note_ctor("_ZN3ccc8CC2x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y1E, buf);
    ::ccc::CC2x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y1E);
    dp->::ccc::CC2x12y1::~CC2x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y1E(Test__ZN3ccc8CC2x12y1E, "_ZN3ccc8CC2x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y1C1Ev();
extern void _ZN3ccc8CC2x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y1E[] = {
  NSPAIR(_ZN3ccc8CC2x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y1E[];
extern void _ZN3ccc8CC2x12y13abcEv();
extern void _ZN3ccc8CC2x12y13pqrEv();
extern void _ZN3ccc8CC2x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y13efgEv,_ZTv0_n12_N3ccc8CC2x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y13efgEv,_ZThn4_N3ccc8CC2x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y13abcEv,_ZTv0_n16_N3ccc8CC2x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y13abcEv,_ZThn4_N3ccc8CC2x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y13pqrEv,_ZTv0_n20_N3ccc8CC2x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y13pqrEv,_ZThn4_N3ccc8CC2x12y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y13efgEv,_ZTv0_n12_N3ccc8CC2x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y13abcEv,_ZTv0_n16_N3ccc8CC2x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y13pqrEv,_ZTv0_n20_N3ccc8CC2x12y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y1E[] = {
  {&(_ZTVN3ccc8CC2x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y1E[];
static VTBL_ENTRY alt_thunk_names1221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y13pqrEv,_ZTv0_n20_N3ccc8CC2x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y13pqrEv,_ZThn4_N3ccc8CC2x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y13abcEv,_ZTv0_n16_N3ccc8CC2x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y13abcEv,_ZThn4_N3ccc8CC2x12y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y13efgEv,_ZTv0_n12_N3ccc8CC2x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y13efgEv,_ZThn4_N3ccc8CC2x12y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y1E = {  "_ZN3ccc8CC2x12y1E", // class name
  bases__ZN3ccc8CC2x12y1E, 2,
  &(vtc__ZN3ccc8CC2x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y1  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD2x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x12y13efgEv
  ~DD2x12y1(); // tgen
  DD2x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y13abcEv");}
void  ccc::DD2x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y13pqrEv");}
void  ccc::DD2x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y13efgEv");}
ccc::DD2x12y1 ::~DD2x12y1(){ note_dtor("_ZN3ccc8DD2x12y1E", this);} // tgen
ccc::DD2x12y1 ::DD2x12y1(){ note_ctor("_ZN3ccc8DD2x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y1E, buf);
    ::ccc::DD2x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y1E);
    dp->::ccc::DD2x12y1::~DD2x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y1E(Test__ZN3ccc8DD2x12y1E, "_ZN3ccc8DD2x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y1C1Ev();
extern void _ZN3ccc8DD2x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y1E[] = {
  NSPAIR(_ZN3ccc8DD2x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y1E[];
extern void _ZN3ccc8DD2x12y13efgEv();
extern void _ZN3ccc8DD2x12y13abcEv();
extern void _ZN3ccc8DD2x12y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y13abcEv,_ZTv0_n12_N3ccc8DD2x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y13abcEv,_ZThn4_N3ccc8DD2x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y13abcEv,_ZTv0_n12_N3ccc8DD2x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y1E[] = {
  {&(_ZTVN3ccc8DD2x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y1E[];
static VTBL_ENTRY alt_thunk_names1222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y13abcEv,_ZTv0_n12_N3ccc8DD2x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y13abcEv,_ZThn4_N3ccc8DD2x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y1E = {  "_ZN3ccc8DD2x12y1E", // class name
  bases__ZN3ccc8DD2x12y1E, 2,
  &(vtc__ZN3ccc8DD2x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y2  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y23pqrEv
  ~CC2x12y2(); // tgen
  CC2x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y2E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y23efgEv");}
void  ccc::CC2x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y23abcEv");}
void  ccc::CC2x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y23pqrEv");}
ccc::CC2x12y2 ::~CC2x12y2(){ note_dtor("_ZN3ccc8CC2x12y2E", this);} // tgen
ccc::CC2x12y2 ::CC2x12y2(){ note_ctor("_ZN3ccc8CC2x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y2E, buf);
    ::ccc::CC2x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y2E);
    dp->::ccc::CC2x12y2::~CC2x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y2E(Test__ZN3ccc8CC2x12y2E, "_ZN3ccc8CC2x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y2C1Ev();
extern void _ZN3ccc8CC2x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y2E[] = {
  NSPAIR(_ZN3ccc8CC2x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y2E[];
extern void _ZN3ccc8CC2x12y23abcEv();
extern void _ZN3ccc8CC2x12y23efgEv();
extern void _ZN3ccc8CC2x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y23efgEv,_ZTv0_n12_N3ccc8CC2x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y23efgEv,_ZThn4_N3ccc8CC2x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y23abcEv,_ZTv0_n16_N3ccc8CC2x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y23abcEv,_ZThn4_N3ccc8CC2x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y23pqrEv,_ZTv0_n20_N3ccc8CC2x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y23pqrEv,_ZThn4_N3ccc8CC2x12y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y23efgEv,_ZTv0_n12_N3ccc8CC2x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y23abcEv,_ZTv0_n16_N3ccc8CC2x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y23pqrEv,_ZTv0_n20_N3ccc8CC2x12y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y2E[] = {
  {&(_ZTVN3ccc8CC2x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y2E[];
static VTBL_ENTRY alt_thunk_names1223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y23pqrEv,_ZTv0_n20_N3ccc8CC2x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y23pqrEv,_ZThn4_N3ccc8CC2x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y23abcEv,_ZTv0_n16_N3ccc8CC2x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y23abcEv,_ZThn4_N3ccc8CC2x12y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y23efgEv,_ZTv0_n12_N3ccc8CC2x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y23efgEv,_ZThn4_N3ccc8CC2x12y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y2E = {  "_ZN3ccc8CC2x12y2E", // class name
  bases__ZN3ccc8CC2x12y2E, 2,
  &(vtc__ZN3ccc8CC2x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y2  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD2x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y23pqrEv
  ~DD2x12y2(); // tgen
  DD2x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y23efgEv");}
void  ccc::DD2x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y23abcEv");}
void  ccc::DD2x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y23pqrEv");}
ccc::DD2x12y2 ::~DD2x12y2(){ note_dtor("_ZN3ccc8DD2x12y2E", this);} // tgen
ccc::DD2x12y2 ::DD2x12y2(){ note_ctor("_ZN3ccc8DD2x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y2E, buf);
    ::ccc::DD2x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y2E);
    dp->::ccc::DD2x12y2::~DD2x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y2E(Test__ZN3ccc8DD2x12y2E, "_ZN3ccc8DD2x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y2C1Ev();
extern void _ZN3ccc8DD2x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y2E[] = {
  NSPAIR(_ZN3ccc8DD2x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y2E[];
extern void _ZN3ccc8DD2x12y23efgEv();
extern void _ZN3ccc8DD2x12y23abcEv();
extern void _ZN3ccc8DD2x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y23abcEv,_ZTv0_n12_N3ccc8DD2x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y23abcEv,_ZThn4_N3ccc8DD2x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y23abcEv,_ZTv0_n12_N3ccc8DD2x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y2E[] = {
  {&(_ZTVN3ccc8DD2x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y2E[];
static VTBL_ENTRY alt_thunk_names1224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y23abcEv,_ZTv0_n12_N3ccc8DD2x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y23abcEv,_ZThn4_N3ccc8DD2x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y2E = {  "_ZN3ccc8DD2x12y2E", // class name
  bases__ZN3ccc8DD2x12y2E, 2,
  &(vtc__ZN3ccc8DD2x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y3  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x12y33abcEv
  ~CC2x12y3(); // tgen
  CC2x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y3E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y33efgEv");}
void  ccc::CC2x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y33pqrEv");}
void  ccc::CC2x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y33abcEv");}
ccc::CC2x12y3 ::~CC2x12y3(){ note_dtor("_ZN3ccc8CC2x12y3E", this);} // tgen
ccc::CC2x12y3 ::CC2x12y3(){ note_ctor("_ZN3ccc8CC2x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y3E, buf);
    ::ccc::CC2x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y3E);
    dp->::ccc::CC2x12y3::~CC2x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y3E(Test__ZN3ccc8CC2x12y3E, "_ZN3ccc8CC2x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y3C1Ev();
extern void _ZN3ccc8CC2x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y3E[] = {
  NSPAIR(_ZN3ccc8CC2x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y3E[];
extern void _ZN3ccc8CC2x12y33abcEv();
extern void _ZN3ccc8CC2x12y33efgEv();
extern void _ZN3ccc8CC2x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y33efgEv,_ZTv0_n12_N3ccc8CC2x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y33efgEv,_ZThn4_N3ccc8CC2x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y33abcEv,_ZTv0_n16_N3ccc8CC2x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y33abcEv,_ZThn4_N3ccc8CC2x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y33pqrEv,_ZTv0_n20_N3ccc8CC2x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y33pqrEv,_ZThn4_N3ccc8CC2x12y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y33efgEv,_ZTv0_n12_N3ccc8CC2x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y33abcEv,_ZTv0_n16_N3ccc8CC2x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y33pqrEv,_ZTv0_n20_N3ccc8CC2x12y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y3E[] = {
  {&(_ZTVN3ccc8CC2x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y3E[];
static VTBL_ENTRY alt_thunk_names1225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y33pqrEv,_ZTv0_n20_N3ccc8CC2x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y33pqrEv,_ZThn4_N3ccc8CC2x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y33abcEv,_ZTv0_n16_N3ccc8CC2x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y33abcEv,_ZThn4_N3ccc8CC2x12y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y33efgEv,_ZTv0_n12_N3ccc8CC2x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y33efgEv,_ZThn4_N3ccc8CC2x12y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y3E = {  "_ZN3ccc8CC2x12y3E", // class name
  bases__ZN3ccc8CC2x12y3E, 2,
  &(vtc__ZN3ccc8CC2x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y3  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD2x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x12y33abcEv
  ~DD2x12y3(); // tgen
  DD2x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y33efgEv");}
void  ccc::DD2x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y33pqrEv");}
void  ccc::DD2x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y33abcEv");}
ccc::DD2x12y3 ::~DD2x12y3(){ note_dtor("_ZN3ccc8DD2x12y3E", this);} // tgen
ccc::DD2x12y3 ::DD2x12y3(){ note_ctor("_ZN3ccc8DD2x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y3E, buf);
    ::ccc::DD2x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y3E);
    dp->::ccc::DD2x12y3::~DD2x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y3E(Test__ZN3ccc8DD2x12y3E, "_ZN3ccc8DD2x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y3C1Ev();
extern void _ZN3ccc8DD2x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y3E[] = {
  NSPAIR(_ZN3ccc8DD2x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y3E[];
extern void _ZN3ccc8DD2x12y33efgEv();
extern void _ZN3ccc8DD2x12y33abcEv();
extern void _ZN3ccc8DD2x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y33abcEv,_ZTv0_n12_N3ccc8DD2x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y33abcEv,_ZThn4_N3ccc8DD2x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y33abcEv,_ZTv0_n12_N3ccc8DD2x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y3E[] = {
  {&(_ZTVN3ccc8DD2x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y3E[];
static VTBL_ENTRY alt_thunk_names1226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y33abcEv,_ZTv0_n12_N3ccc8DD2x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y33abcEv,_ZThn4_N3ccc8DD2x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y3E = {  "_ZN3ccc8DD2x12y3E", // class name
  bases__ZN3ccc8DD2x12y3E, 2,
  &(vtc__ZN3ccc8DD2x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y4  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC2x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y43efgEv
  ~CC2x12y4(); // tgen
  CC2x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y4E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y43pqrEv");}
void  ccc::CC2x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y43abcEv");}
void  ccc::CC2x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y43efgEv");}
ccc::CC2x12y4 ::~CC2x12y4(){ note_dtor("_ZN3ccc8CC2x12y4E", this);} // tgen
ccc::CC2x12y4 ::CC2x12y4(){ note_ctor("_ZN3ccc8CC2x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y4E, buf);
    ::ccc::CC2x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y4E);
    dp->::ccc::CC2x12y4::~CC2x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y4E(Test__ZN3ccc8CC2x12y4E, "_ZN3ccc8CC2x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y4C1Ev();
extern void _ZN3ccc8CC2x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y4E[] = {
  NSPAIR(_ZN3ccc8CC2x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y4E[];
extern void _ZN3ccc8CC2x12y43abcEv();
extern void _ZN3ccc8CC2x12y43pqrEv();
extern void _ZN3ccc8CC2x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y43efgEv,_ZTv0_n12_N3ccc8CC2x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y43efgEv,_ZThn4_N3ccc8CC2x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y43abcEv,_ZTv0_n16_N3ccc8CC2x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y43abcEv,_ZThn4_N3ccc8CC2x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y43pqrEv,_ZTv0_n20_N3ccc8CC2x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y43pqrEv,_ZThn4_N3ccc8CC2x12y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y43efgEv,_ZTv0_n12_N3ccc8CC2x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y43abcEv,_ZTv0_n16_N3ccc8CC2x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y43pqrEv,_ZTv0_n20_N3ccc8CC2x12y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y4E[] = {
  {&(_ZTVN3ccc8CC2x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y4E[];
static VTBL_ENTRY alt_thunk_names1227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y43pqrEv,_ZTv0_n20_N3ccc8CC2x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y43pqrEv,_ZThn4_N3ccc8CC2x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y43abcEv,_ZTv0_n16_N3ccc8CC2x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y43abcEv,_ZThn4_N3ccc8CC2x12y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y43efgEv,_ZTv0_n12_N3ccc8CC2x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y43efgEv,_ZThn4_N3ccc8CC2x12y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y4E = {  "_ZN3ccc8CC2x12y4E", // class name
  bases__ZN3ccc8CC2x12y4E, 2,
  &(vtc__ZN3ccc8CC2x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y4  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD2x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x12y43efgEv
  ~DD2x12y4(); // tgen
  DD2x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y43pqrEv");}
void  ccc::DD2x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y43abcEv");}
void  ccc::DD2x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y43efgEv");}
ccc::DD2x12y4 ::~DD2x12y4(){ note_dtor("_ZN3ccc8DD2x12y4E", this);} // tgen
ccc::DD2x12y4 ::DD2x12y4(){ note_ctor("_ZN3ccc8DD2x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y4E, buf);
    ::ccc::DD2x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y4E);
    dp->::ccc::DD2x12y4::~DD2x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y4E(Test__ZN3ccc8DD2x12y4E, "_ZN3ccc8DD2x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y4C1Ev();
extern void _ZN3ccc8DD2x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y4E[] = {
  NSPAIR(_ZN3ccc8DD2x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y4E[];
extern void _ZN3ccc8DD2x12y43efgEv();
extern void _ZN3ccc8DD2x12y43abcEv();
extern void _ZN3ccc8DD2x12y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y43abcEv,_ZTv0_n12_N3ccc8DD2x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y43abcEv,_ZThn4_N3ccc8DD2x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y43abcEv,_ZTv0_n12_N3ccc8DD2x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y4E[] = {
  {&(_ZTVN3ccc8DD2x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y4E[];
static VTBL_ENTRY alt_thunk_names1228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y43abcEv,_ZTv0_n12_N3ccc8DD2x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y43abcEv,_ZThn4_N3ccc8DD2x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y4E = {  "_ZN3ccc8DD2x12y4E", // class name
  bases__ZN3ccc8DD2x12y4E, 2,
  &(vtc__ZN3ccc8DD2x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y5  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC2x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y53abcEv
  ~CC2x12y5(); // tgen
  CC2x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y5E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y53pqrEv");}
void  ccc::CC2x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y53efgEv");}
void  ccc::CC2x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y53abcEv");}
ccc::CC2x12y5 ::~CC2x12y5(){ note_dtor("_ZN3ccc8CC2x12y5E", this);} // tgen
ccc::CC2x12y5 ::CC2x12y5(){ note_ctor("_ZN3ccc8CC2x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y5E, buf);
    ::ccc::CC2x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y5E);
    dp->::ccc::CC2x12y5::~CC2x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y5E(Test__ZN3ccc8CC2x12y5E, "_ZN3ccc8CC2x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y5C1Ev();
extern void _ZN3ccc8CC2x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y5E[] = {
  NSPAIR(_ZN3ccc8CC2x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y5E[];
extern void _ZN3ccc8CC2x12y53abcEv();
extern void _ZN3ccc8CC2x12y53pqrEv();
extern void _ZN3ccc8CC2x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y53efgEv,_ZTv0_n12_N3ccc8CC2x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y53efgEv,_ZThn4_N3ccc8CC2x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y53abcEv,_ZTv0_n16_N3ccc8CC2x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y53abcEv,_ZThn4_N3ccc8CC2x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y53pqrEv,_ZTv0_n20_N3ccc8CC2x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y53pqrEv,_ZThn4_N3ccc8CC2x12y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y53efgEv,_ZTv0_n12_N3ccc8CC2x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y53abcEv,_ZTv0_n16_N3ccc8CC2x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y53pqrEv,_ZTv0_n20_N3ccc8CC2x12y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y5E[] = {
  {&(_ZTVN3ccc8CC2x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y5E[];
static VTBL_ENTRY alt_thunk_names1229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y53pqrEv,_ZTv0_n20_N3ccc8CC2x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y53pqrEv,_ZThn4_N3ccc8CC2x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y53abcEv,_ZTv0_n16_N3ccc8CC2x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y53abcEv,_ZThn4_N3ccc8CC2x12y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y53efgEv,_ZTv0_n12_N3ccc8CC2x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y53efgEv,_ZThn4_N3ccc8CC2x12y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y5E = {  "_ZN3ccc8CC2x12y5E", // class name
  bases__ZN3ccc8CC2x12y5E, 2,
  &(vtc__ZN3ccc8CC2x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1229,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y5  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD2x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x12y53abcEv
  ~DD2x12y5(); // tgen
  DD2x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y53pqrEv");}
void  ccc::DD2x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y53efgEv");}
void  ccc::DD2x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y53abcEv");}
ccc::DD2x12y5 ::~DD2x12y5(){ note_dtor("_ZN3ccc8DD2x12y5E", this);} // tgen
ccc::DD2x12y5 ::DD2x12y5(){ note_ctor("_ZN3ccc8DD2x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y5E, buf);
    ::ccc::DD2x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y5E);
    dp->::ccc::DD2x12y5::~DD2x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y5E(Test__ZN3ccc8DD2x12y5E, "_ZN3ccc8DD2x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y5C1Ev();
extern void _ZN3ccc8DD2x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y5E[] = {
  NSPAIR(_ZN3ccc8DD2x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y5E[];
extern void _ZN3ccc8DD2x12y53efgEv();
extern void _ZN3ccc8DD2x12y53abcEv();
extern void _ZN3ccc8DD2x12y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y53abcEv,_ZTv0_n12_N3ccc8DD2x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y53abcEv,_ZThn4_N3ccc8DD2x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y53abcEv,_ZTv0_n12_N3ccc8DD2x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y5E[] = {
  {&(_ZTVN3ccc8DD2x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y5E[];
static VTBL_ENTRY alt_thunk_names1230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y53abcEv,_ZTv0_n12_N3ccc8DD2x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y53abcEv,_ZThn4_N3ccc8DD2x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y5E = {  "_ZN3ccc8DD2x12y5E", // class name
  bases__ZN3ccc8DD2x12y5E, 2,
  &(vtc__ZN3ccc8DD2x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1230,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y6  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y63efgEv
  ~CC2x12y6(); // tgen
  CC2x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y6E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y63abcEv");}
void  ccc::CC2x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y63efgEv");}
ccc::CC2x12y6 ::~CC2x12y6(){ note_dtor("_ZN3ccc8CC2x12y6E", this);} // tgen
ccc::CC2x12y6 ::CC2x12y6(){ note_ctor("_ZN3ccc8CC2x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y6E, buf);
    ::ccc::CC2x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y6E);
    dp->::ccc::CC2x12y6::~CC2x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y6E(Test__ZN3ccc8CC2x12y6E, "_ZN3ccc8CC2x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y6C1Ev();
extern void _ZN3ccc8CC2x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y6E[] = {
  NSPAIR(_ZN3ccc8CC2x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y6E[];
extern void _ZN3ccc8CC2x12y63abcEv();
extern void _ZN3ccc8CC2x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y63efgEv,_ZTv0_n12_N3ccc8CC2x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y63efgEv,_ZThn4_N3ccc8CC2x12y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y63abcEv,_ZTv0_n16_N3ccc8CC2x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y63abcEv,_ZThn4_N3ccc8CC2x12y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y63efgEv,_ZTv0_n12_N3ccc8CC2x12y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y63abcEv,_ZTv0_n16_N3ccc8CC2x12y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y6E[] = {
  {&(_ZTVN3ccc8CC2x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y6E[];
static VTBL_ENTRY alt_thunk_names1231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y63abcEv,_ZTv0_n16_N3ccc8CC2x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y63abcEv,_ZThn4_N3ccc8CC2x12y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y63efgEv,_ZTv0_n12_N3ccc8CC2x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y63efgEv,_ZThn4_N3ccc8CC2x12y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y6E = {  "_ZN3ccc8CC2x12y6E", // class name
  bases__ZN3ccc8CC2x12y6E, 2,
  &(vtc__ZN3ccc8CC2x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1231,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y6  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD2x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x12y63efgEv
  ~DD2x12y6(); // tgen
  DD2x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y63abcEv");}
void  ccc::DD2x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y63efgEv");}
ccc::DD2x12y6 ::~DD2x12y6(){ note_dtor("_ZN3ccc8DD2x12y6E", this);} // tgen
ccc::DD2x12y6 ::DD2x12y6(){ note_ctor("_ZN3ccc8DD2x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y6E, buf);
    ::ccc::DD2x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y6E);
    dp->::ccc::DD2x12y6::~DD2x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y6E(Test__ZN3ccc8DD2x12y6E, "_ZN3ccc8DD2x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y6C1Ev();
extern void _ZN3ccc8DD2x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y6E[] = {
  NSPAIR(_ZN3ccc8DD2x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y6E[];
extern void _ZN3ccc8DD2x12y63efgEv();
extern void _ZN3ccc8DD2x12y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y63abcEv,_ZTv0_n12_N3ccc8DD2x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y63abcEv,_ZThn4_N3ccc8DD2x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y63abcEv,_ZTv0_n12_N3ccc8DD2x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y6E[] = {
  {&(_ZTVN3ccc8DD2x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y6E[];
static VTBL_ENTRY alt_thunk_names1232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y63abcEv,_ZTv0_n12_N3ccc8DD2x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y63abcEv,_ZThn4_N3ccc8DD2x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y6E = {  "_ZN3ccc8DD2x12y6E", // class name
  bases__ZN3ccc8DD2x12y6E, 2,
  &(vtc__ZN3ccc8DD2x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1232,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y7  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y73pqrEv
  ~CC2x12y7(); // tgen
  CC2x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y7E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y73abcEv");}
void  ccc::CC2x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y73pqrEv");}
ccc::CC2x12y7 ::~CC2x12y7(){ note_dtor("_ZN3ccc8CC2x12y7E", this);} // tgen
ccc::CC2x12y7 ::CC2x12y7(){ note_ctor("_ZN3ccc8CC2x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y7E, buf);
    ::ccc::CC2x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y7E);
    dp->::ccc::CC2x12y7::~CC2x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y7E(Test__ZN3ccc8CC2x12y7E, "_ZN3ccc8CC2x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y7C1Ev();
extern void _ZN3ccc8CC2x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y7E[] = {
  NSPAIR(_ZN3ccc8CC2x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y7E[];
extern void _ZN3ccc8CC2x12y73abcEv();
extern void _ZN3ccc8CC2x12y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y73abcEv,_ZTv0_n16_N3ccc8CC2x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y73abcEv,_ZThn4_N3ccc8CC2x12y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y73pqrEv,_ZTv0_n20_N3ccc8CC2x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y73pqrEv,_ZThn4_N3ccc8CC2x12y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y73abcEv,_ZTv0_n16_N3ccc8CC2x12y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y73pqrEv,_ZTv0_n20_N3ccc8CC2x12y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y7E[] = {
  {&(_ZTVN3ccc8CC2x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y7E[];
static VTBL_ENTRY alt_thunk_names1233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y73pqrEv,_ZTv0_n20_N3ccc8CC2x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y73pqrEv,_ZThn4_N3ccc8CC2x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y73abcEv,_ZTv0_n16_N3ccc8CC2x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y73abcEv,_ZThn4_N3ccc8CC2x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y7E = {  "_ZN3ccc8CC2x12y7E", // class name
  bases__ZN3ccc8CC2x12y7E, 2,
  &(vtc__ZN3ccc8CC2x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1233,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y7  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD2x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y73pqrEv
  ~DD2x12y7(); // tgen
  DD2x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y73abcEv");}
void  ccc::DD2x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y73pqrEv");}
ccc::DD2x12y7 ::~DD2x12y7(){ note_dtor("_ZN3ccc8DD2x12y7E", this);} // tgen
ccc::DD2x12y7 ::DD2x12y7(){ note_ctor("_ZN3ccc8DD2x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y7E, buf);
    ::ccc::DD2x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y7E);
    dp->::ccc::DD2x12y7::~DD2x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y7E(Test__ZN3ccc8DD2x12y7E, "_ZN3ccc8DD2x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y7C1Ev();
extern void _ZN3ccc8DD2x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y7E[] = {
  NSPAIR(_ZN3ccc8DD2x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x12y73abcEv();
extern void _ZN3ccc8DD2x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y73abcEv,_ZTv0_n12_N3ccc8DD2x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y73abcEv,_ZThn4_N3ccc8DD2x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y73abcEv,_ZTv0_n12_N3ccc8DD2x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y7E[] = {
  {&(_ZTVN3ccc8DD2x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y7E[];
static VTBL_ENTRY alt_thunk_names1234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y73abcEv,_ZTv0_n12_N3ccc8DD2x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y73abcEv,_ZThn4_N3ccc8DD2x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y7E = {  "_ZN3ccc8DD2x12y7E", // class name
  bases__ZN3ccc8DD2x12y7E, 2,
  &(vtc__ZN3ccc8DD2x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y8  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y83abcEv
  ~CC2x12y8(); // tgen
  CC2x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y8E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y83efgEv");}
void  ccc::CC2x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y83abcEv");}
ccc::CC2x12y8 ::~CC2x12y8(){ note_dtor("_ZN3ccc8CC2x12y8E", this);} // tgen
ccc::CC2x12y8 ::CC2x12y8(){ note_ctor("_ZN3ccc8CC2x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y8E, buf);
    ::ccc::CC2x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y8E);
    dp->::ccc::CC2x12y8::~CC2x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y8E(Test__ZN3ccc8CC2x12y8E, "_ZN3ccc8CC2x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y8C1Ev();
extern void _ZN3ccc8CC2x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y8E[] = {
  NSPAIR(_ZN3ccc8CC2x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y8E[];
extern void _ZN3ccc8CC2x12y83abcEv();
extern void _ZN3ccc8CC2x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y83efgEv,_ZTv0_n12_N3ccc8CC2x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y83efgEv,_ZThn4_N3ccc8CC2x12y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x12y83abcEv,_ZTv0_n16_N3ccc8CC2x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y83abcEv,_ZThn4_N3ccc8CC2x12y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y83efgEv,_ZTv0_n12_N3ccc8CC2x12y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x12y83abcEv,_ZTv0_n16_N3ccc8CC2x12y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y8E[] = {
  {&(_ZTVN3ccc8CC2x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y8E[];
static VTBL_ENTRY alt_thunk_names1235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x12y83abcEv,_ZTv0_n16_N3ccc8CC2x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y83abcEv,_ZThn4_N3ccc8CC2x12y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y83efgEv,_ZTv0_n12_N3ccc8CC2x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y83efgEv,_ZThn4_N3ccc8CC2x12y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y8E = {  "_ZN3ccc8CC2x12y8E", // class name
  bases__ZN3ccc8CC2x12y8E, 2,
  &(vtc__ZN3ccc8CC2x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y8  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD2x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x12y83abcEv
  ~DD2x12y8(); // tgen
  DD2x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y83efgEv");}
void  ccc::DD2x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x12y83abcEv");}
ccc::DD2x12y8 ::~DD2x12y8(){ note_dtor("_ZN3ccc8DD2x12y8E", this);} // tgen
ccc::DD2x12y8 ::DD2x12y8(){ note_ctor("_ZN3ccc8DD2x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y8E, buf);
    ::ccc::DD2x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y8E);
    dp->::ccc::DD2x12y8::~DD2x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y8E(Test__ZN3ccc8DD2x12y8E, "_ZN3ccc8DD2x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y8C1Ev();
extern void _ZN3ccc8DD2x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y8E[] = {
  NSPAIR(_ZN3ccc8DD2x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y8E[];
extern void _ZN3ccc8DD2x12y83efgEv();
extern void _ZN3ccc8DD2x12y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x12y83abcEv,_ZTv0_n12_N3ccc8DD2x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x12y83abcEv,_ZThn4_N3ccc8DD2x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x12y83abcEv,_ZTv0_n12_N3ccc8DD2x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y8E[] = {
  {&(_ZTVN3ccc8DD2x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y8E[];
static VTBL_ENTRY alt_thunk_names1236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x12y83abcEv,_ZTv0_n12_N3ccc8DD2x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x12y83abcEv,_ZThn4_N3ccc8DD2x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x12y8E = {  "_ZN3ccc8DD2x12y8E", // class name
  bases__ZN3ccc8DD2x12y8E, 2,
  &(vtc__ZN3ccc8DD2x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y9  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y93pqrEv
  ~CC2x12y9(); // tgen
  CC2x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y9E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y93efgEv");}
void  ccc::CC2x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y93pqrEv");}
ccc::CC2x12y9 ::~CC2x12y9(){ note_dtor("_ZN3ccc8CC2x12y9E", this);} // tgen
ccc::CC2x12y9 ::CC2x12y9(){ note_ctor("_ZN3ccc8CC2x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y9E, buf);
    ::ccc::CC2x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC2x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y9E);
    dp->::ccc::CC2x12y9::~CC2x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y9E(Test__ZN3ccc8CC2x12y9E, "_ZN3ccc8CC2x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y9C1Ev();
extern void _ZN3ccc8CC2x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y9E[] = {
  NSPAIR(_ZN3ccc8CC2x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC2x12y93efgEv();
extern void _ZN3ccc8CC2x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x12y93efgEv,_ZTv0_n12_N3ccc8CC2x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y93efgEv,_ZThn4_N3ccc8CC2x12y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x12y93pqrEv,_ZTv0_n20_N3ccc8CC2x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y93pqrEv,_ZThn4_N3ccc8CC2x12y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x12y93efgEv,_ZTv0_n12_N3ccc8CC2x12y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x12y93pqrEv,_ZTv0_n20_N3ccc8CC2x12y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x12y9E[] = {
  {&(_ZTVN3ccc8CC2x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x12y9E[];
static VTBL_ENTRY alt_thunk_names1237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x12y93pqrEv,_ZTv0_n20_N3ccc8CC2x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y93pqrEv,_ZThn4_N3ccc8CC2x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x12y93efgEv,_ZTv0_n12_N3ccc8CC2x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x12y93efgEv,_ZThn4_N3ccc8CC2x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x12y9E = {  "_ZN3ccc8CC2x12y9E", // class name
  bases__ZN3ccc8CC2x12y9E, 2,
  &(vtc__ZN3ccc8CC2x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x12y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y9  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD2x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x12y93pqrEv
  ~DD2x12y9(); // tgen
  DD2x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x12y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x12y93efgEv");}
void  ccc::DD2x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x12y93pqrEv");}
ccc::DD2x12y9 ::~DD2x12y9(){ note_dtor("_ZN3ccc8DD2x12y9E", this);} // tgen
ccc::DD2x12y9 ::DD2x12y9(){ note_ctor("_ZN3ccc8DD2x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x12y9E, buf);
    ::ccc::DD2x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x12y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD2x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x12y9E);
    dp->::ccc::DD2x12y9::~DD2x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x12y9E(Test__ZN3ccc8DD2x12y9E, "_ZN3ccc8DD2x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x12y9C1Ev();
extern void _ZN3ccc8DD2x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x12y9E[] = {
  NSPAIR(_ZN3ccc8DD2x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD2x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y9E[];
extern void _ZN3ccc8DD2x12y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x12y9E[] = {
  {&(_ZTVN3ccc8DD2x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x12y9E[];
Class_Descriptor cd__ZN3ccc8DD2x12y9E = {  "_ZN3ccc8DD2x12y9E", // class name
  bases__ZN3ccc8DD2x12y9E, 2,
  &(vtc__ZN3ccc8DD2x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x12y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y10  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x12y103abcEv
  ~CC2x12y10(); // tgen
  CC2x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y10E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y103pqrEv");}
void  ccc::CC2x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x12y103abcEv");}
ccc::CC2x12y10 ::~CC2x12y10(){ note_dtor("_ZN3ccc9CC2x12y10E", this);} // tgen
ccc::CC2x12y10 ::CC2x12y10(){ note_ctor("_ZN3ccc9CC2x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y10E, buf);
    ::ccc::CC2x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y10E);
    dp->::ccc::CC2x12y10::~CC2x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y10E(Test__ZN3ccc9CC2x12y10E, "_ZN3ccc9CC2x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y10C1Ev();
extern void _ZN3ccc9CC2x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y10E[] = {
  NSPAIR(_ZN3ccc9CC2x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y10E[];
extern void _ZN3ccc9CC2x12y103abcEv();
extern void _ZN3ccc9CC2x12y103pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x12y103abcEv,_ZTv0_n16_N3ccc9CC2x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y103abcEv,_ZThn4_N3ccc9CC2x12y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x12y103pqrEv,_ZTv0_n20_N3ccc9CC2x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y103pqrEv,_ZThn4_N3ccc9CC2x12y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x12y103abcEv,_ZTv0_n16_N3ccc9CC2x12y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x12y103pqrEv,_ZTv0_n20_N3ccc9CC2x12y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y10E[] = {
  {&(_ZTVN3ccc9CC2x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y10E[];
static VTBL_ENTRY alt_thunk_names1238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x12y103pqrEv,_ZTv0_n20_N3ccc9CC2x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y103pqrEv,_ZThn4_N3ccc9CC2x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x12y103abcEv,_ZTv0_n16_N3ccc9CC2x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y103abcEv,_ZThn4_N3ccc9CC2x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x12y10E = {  "_ZN3ccc9CC2x12y10E", // class name
  bases__ZN3ccc9CC2x12y10E, 2,
  &(vtc__ZN3ccc9CC2x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y10  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD2x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x12y103abcEv
  ~DD2x12y10(); // tgen
  DD2x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x12y103pqrEv");}
void  ccc::DD2x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x12y103abcEv");}
ccc::DD2x12y10 ::~DD2x12y10(){ note_dtor("_ZN3ccc9DD2x12y10E", this);} // tgen
ccc::DD2x12y10 ::DD2x12y10(){ note_ctor("_ZN3ccc9DD2x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y10E, buf);
    ::ccc::DD2x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y10E);
    dp->::ccc::DD2x12y10::~DD2x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y10E(Test__ZN3ccc9DD2x12y10E, "_ZN3ccc9DD2x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y10C1Ev();
extern void _ZN3ccc9DD2x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y10E[] = {
  NSPAIR(_ZN3ccc9DD2x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x12y103abcEv();
extern void _ZN3ccc9DD2x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x12y103abcEv,_ZTv0_n12_N3ccc9DD2x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x12y103abcEv,_ZThn4_N3ccc9DD2x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x12y103abcEv,_ZTv0_n12_N3ccc9DD2x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y10E[] = {
  {&(_ZTVN3ccc9DD2x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y10E[];
static VTBL_ENTRY alt_thunk_names1239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x12y103abcEv,_ZTv0_n12_N3ccc9DD2x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x12y103abcEv,_ZThn4_N3ccc9DD2x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x12y10E = {  "_ZN3ccc9DD2x12y10E", // class name
  bases__ZN3ccc9DD2x12y10E, 2,
  &(vtc__ZN3ccc9DD2x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y11  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x12y113efgEv
  ~CC2x12y11(); // tgen
  CC2x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y11E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y113pqrEv");}
void  ccc::CC2x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x12y113efgEv");}
ccc::CC2x12y11 ::~CC2x12y11(){ note_dtor("_ZN3ccc9CC2x12y11E", this);} // tgen
ccc::CC2x12y11 ::CC2x12y11(){ note_ctor("_ZN3ccc9CC2x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y11E, buf);
    ::ccc::CC2x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y11E);
    dp->::ccc::CC2x12y11::~CC2x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y11E(Test__ZN3ccc9CC2x12y11E, "_ZN3ccc9CC2x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y11C1Ev();
extern void _ZN3ccc9CC2x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y11E[] = {
  NSPAIR(_ZN3ccc9CC2x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC2x12y113pqrEv();
extern void _ZN3ccc9CC2x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x12y113efgEv,_ZTv0_n12_N3ccc9CC2x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y113efgEv,_ZThn4_N3ccc9CC2x12y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x12y113pqrEv,_ZTv0_n20_N3ccc9CC2x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y113pqrEv,_ZThn4_N3ccc9CC2x12y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x12y113efgEv,_ZTv0_n12_N3ccc9CC2x12y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x12y113pqrEv,_ZTv0_n20_N3ccc9CC2x12y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y11E[] = {
  {&(_ZTVN3ccc9CC2x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y11E[];
static VTBL_ENTRY alt_thunk_names1240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x12y113pqrEv,_ZTv0_n20_N3ccc9CC2x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y113pqrEv,_ZThn4_N3ccc9CC2x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x12y113efgEv,_ZTv0_n12_N3ccc9CC2x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y113efgEv,_ZThn4_N3ccc9CC2x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x12y11E = {  "_ZN3ccc9CC2x12y11E", // class name
  bases__ZN3ccc9CC2x12y11E, 2,
  &(vtc__ZN3ccc9CC2x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y11  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD2x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x12y113efgEv
  ~DD2x12y11(); // tgen
  DD2x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x12y113pqrEv");}
void  ccc::DD2x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x12y113efgEv");}
ccc::DD2x12y11 ::~DD2x12y11(){ note_dtor("_ZN3ccc9DD2x12y11E", this);} // tgen
ccc::DD2x12y11 ::DD2x12y11(){ note_ctor("_ZN3ccc9DD2x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y11E, buf);
    ::ccc::DD2x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y11E);
    dp->::ccc::DD2x12y11::~DD2x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y11E(Test__ZN3ccc9DD2x12y11E, "_ZN3ccc9DD2x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y11C1Ev();
extern void _ZN3ccc9DD2x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y11E[] = {
  NSPAIR(_ZN3ccc9DD2x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y11E[];
extern void _ZN3ccc9DD2x12y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y113pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y11E[] = {
  {&(_ZTVN3ccc9DD2x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y11E[];
Class_Descriptor cd__ZN3ccc9DD2x12y11E = {  "_ZN3ccc9DD2x12y11E", // class name
  bases__ZN3ccc9DD2x12y11E, 2,
  &(vtc__ZN3ccc9DD2x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y12  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC2x12y123abcEv
  ~CC2x12y12(); // tgen
  CC2x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x12y123abcEv");}
ccc::CC2x12y12 ::~CC2x12y12(){ note_dtor("_ZN3ccc9CC2x12y12E", this);} // tgen
ccc::CC2x12y12 ::CC2x12y12(){ note_ctor("_ZN3ccc9CC2x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y12E, buf);
    ::ccc::CC2x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y12E);
    dp->::ccc::CC2x12y12::~CC2x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y12E(Test__ZN3ccc9CC2x12y12E, "_ZN3ccc9CC2x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y12C1Ev();
extern void _ZN3ccc9CC2x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y12E[] = {
  NSPAIR(_ZN3ccc9CC2x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y12E[];
extern void _ZN3ccc9CC2x12y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x12y123abcEv,_ZTv0_n16_N3ccc9CC2x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y123abcEv,_ZThn4_N3ccc9CC2x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x12y123abcEv,_ZTv0_n16_N3ccc9CC2x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y12E[] = {
  {&(_ZTVN3ccc9CC2x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y12E[];
static VTBL_ENTRY alt_thunk_names1241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x12y123abcEv,_ZTv0_n16_N3ccc9CC2x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y123abcEv,_ZThn4_N3ccc9CC2x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x12y12E = {  "_ZN3ccc9CC2x12y12E", // class name
  bases__ZN3ccc9CC2x12y12E, 2,
  &(vtc__ZN3ccc9CC2x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y12  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD2x12y123abcEv
  ~DD2x12y12(); // tgen
  DD2x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD2x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x12y123abcEv");}
ccc::DD2x12y12 ::~DD2x12y12(){ note_dtor("_ZN3ccc9DD2x12y12E", this);} // tgen
ccc::DD2x12y12 ::DD2x12y12(){ note_ctor("_ZN3ccc9DD2x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y12E, buf);
    ::ccc::DD2x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y12E);
    dp->::ccc::DD2x12y12::~DD2x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y12E(Test__ZN3ccc9DD2x12y12E, "_ZN3ccc9DD2x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y12C1Ev();
extern void _ZN3ccc9DD2x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y12E[] = {
  NSPAIR(_ZN3ccc9DD2x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x12y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x12y123abcEv,_ZTv0_n12_N3ccc9DD2x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x12y123abcEv,_ZThn4_N3ccc9DD2x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x12y123abcEv,_ZTv0_n12_N3ccc9DD2x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y12E[] = {
  {&(_ZTVN3ccc9DD2x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y12E[];
static VTBL_ENTRY alt_thunk_names1242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x12y123abcEv,_ZTv0_n12_N3ccc9DD2x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x12y123abcEv,_ZThn4_N3ccc9DD2x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x12y12E = {  "_ZN3ccc9DD2x12y12E", // class name
  bases__ZN3ccc9DD2x12y12E, 2,
  &(vtc__ZN3ccc9DD2x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y13  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC2x12y133efgEv
  ~CC2x12y13(); // tgen
  CC2x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x12y133efgEv");}
ccc::CC2x12y13 ::~CC2x12y13(){ note_dtor("_ZN3ccc9CC2x12y13E", this);} // tgen
ccc::CC2x12y13 ::CC2x12y13(){ note_ctor("_ZN3ccc9CC2x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y13E, buf);
    ::ccc::CC2x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y13E);
    dp->::ccc::CC2x12y13::~CC2x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y13E(Test__ZN3ccc9CC2x12y13E, "_ZN3ccc9CC2x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y13C1Ev();
extern void _ZN3ccc9CC2x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y13E[] = {
  NSPAIR(_ZN3ccc9CC2x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC2x12y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x12y133efgEv,_ZTv0_n12_N3ccc9CC2x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y133efgEv,_ZThn4_N3ccc9CC2x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x12y133efgEv,_ZTv0_n12_N3ccc9CC2x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y13E[] = {
  {&(_ZTVN3ccc9CC2x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y13E[];
static VTBL_ENTRY alt_thunk_names1243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x12y133efgEv,_ZTv0_n12_N3ccc9CC2x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y133efgEv,_ZThn4_N3ccc9CC2x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x12y13E = {  "_ZN3ccc9CC2x12y13E", // class name
  bases__ZN3ccc9CC2x12y13E, 2,
  &(vtc__ZN3ccc9CC2x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y13  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD2x12y133efgEv
  ~DD2x12y13(); // tgen
  DD2x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x12y133efgEv");}
ccc::DD2x12y13 ::~DD2x12y13(){ note_dtor("_ZN3ccc9DD2x12y13E", this);} // tgen
ccc::DD2x12y13 ::DD2x12y13(){ note_ctor("_ZN3ccc9DD2x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y13E, buf);
    ::ccc::DD2x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y13E);
    dp->::ccc::DD2x12y13::~DD2x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y13E(Test__ZN3ccc9DD2x12y13E, "_ZN3ccc9DD2x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y13C1Ev();
extern void _ZN3ccc9DD2x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y13E[] = {
  NSPAIR(_ZN3ccc9DD2x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y13E[];
extern void _ZN3ccc9DD2x12y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y13E[] = {
  {&(_ZTVN3ccc9DD2x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y13E[];
Class_Descriptor cd__ZN3ccc9DD2x12y13E = {  "_ZN3ccc9DD2x12y13E", // class name
  bases__ZN3ccc9DD2x12y13E, 2,
  &(vtc__ZN3ccc9DD2x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y14  : virtual ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y143pqrEv
  ~CC2x12y14(); // tgen
  CC2x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y143pqrEv");}
ccc::CC2x12y14 ::~CC2x12y14(){ note_dtor("_ZN3ccc9CC2x12y14E", this);} // tgen
ccc::CC2x12y14 ::CC2x12y14(){ note_ctor("_ZN3ccc9CC2x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y14E, buf);
    ::ccc::CC2x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y14E);
    dp->::ccc::CC2x12y14::~CC2x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y14E(Test__ZN3ccc9CC2x12y14E, "_ZN3ccc9CC2x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y14C1Ev();
extern void _ZN3ccc9CC2x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y14E[] = {
  NSPAIR(_ZN3ccc9CC2x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC2x12y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x12y143pqrEv,_ZTv0_n20_N3ccc9CC2x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y143pqrEv,_ZThn4_N3ccc9CC2x12y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x12y143pqrEv,_ZTv0_n20_N3ccc9CC2x12y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y14E[] = {
  {&(_ZTVN3ccc9CC2x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y14E[];
static VTBL_ENTRY alt_thunk_names1244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x12y143pqrEv,_ZTv0_n20_N3ccc9CC2x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x12y143pqrEv,_ZThn4_N3ccc9CC2x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x12y14E = {  "_ZN3ccc9CC2x12y14E", // class name
  bases__ZN3ccc9CC2x12y14E, 2,
  &(vtc__ZN3ccc9CC2x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y14  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD2x12y143pqrEv
  ~DD2x12y14(); // tgen
  DD2x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x12y143pqrEv");}
ccc::DD2x12y14 ::~DD2x12y14(){ note_dtor("_ZN3ccc9DD2x12y14E", this);} // tgen
ccc::DD2x12y14 ::DD2x12y14(){ note_ctor("_ZN3ccc9DD2x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y14E, buf);
    ::ccc::DD2x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y14E);
    dp->::ccc::DD2x12y14::~DD2x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y14E(Test__ZN3ccc9DD2x12y14E, "_ZN3ccc9DD2x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y14C1Ev();
extern void _ZN3ccc9DD2x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y14E[] = {
  NSPAIR(_ZN3ccc9DD2x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y14E[] = {
  {&(_ZTVN3ccc9DD2x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y14E[];
Class_Descriptor cd__ZN3ccc9DD2x12y14E = {  "_ZN3ccc9DD2x12y14E", // class name
  bases__ZN3ccc9DD2x12y14E, 2,
  &(vtc__ZN3ccc9DD2x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y15  : virtual ::ccc::AA2 , ::ccc::BB12 {
  ~CC2x12y15(); // tgen
  CC2x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x12y15 ::~CC2x12y15(){ note_dtor("_ZN3ccc9CC2x12y15E", this);} // tgen
ccc::CC2x12y15 ::CC2x12y15(){ note_ctor("_ZN3ccc9CC2x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y15E, buf);
    ::ccc::CC2x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC2x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y15E);
    dp->::ccc::CC2x12y15::~CC2x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y15E(Test__ZN3ccc9CC2x12y15E, "_ZN3ccc9CC2x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y15C1Ev();
extern void _ZN3ccc9CC2x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y15E[] = {
  NSPAIR(_ZN3ccc9CC2x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x12y15E[] = {
  {&(_ZTVN3ccc9CC2x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x12y15E[];
Class_Descriptor cd__ZN3ccc9CC2x12y15E = {  "_ZN3ccc9CC2x12y15E", // class name
  bases__ZN3ccc9CC2x12y15E, 2,
  &(vtc__ZN3ccc9CC2x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x12y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x12y15  : virtual ::ccc::AA2 , virtual ::ccc::BB12 {
  ~DD2x12y15(); // tgen
  DD2x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD2x12y15 ::~DD2x12y15(){ note_dtor("_ZN3ccc9DD2x12y15E", this);} // tgen
ccc::DD2x12y15 ::DD2x12y15(){ note_ctor("_ZN3ccc9DD2x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x12y15E, buf);
    ::ccc::DD2x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x12y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD2x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x12y15E);
    dp->::ccc::DD2x12y15::~DD2x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x12y15E(Test__ZN3ccc9DD2x12y15E, "_ZN3ccc9DD2x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x12y15C1Ev();
extern void _ZN3ccc9DD2x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x12y15E[] = {
  NSPAIR(_ZN3ccc9DD2x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD2x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x12y15E[] = {
  {&(_ZTVN3ccc9DD2x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x12y15E[];
Class_Descriptor cd__ZN3ccc9DD2x12y15E = {  "_ZN3ccc9DD2x12y15E", // class name
  bases__ZN3ccc9DD2x12y15E, 2,
  &(vtc__ZN3ccc9DD2x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x12y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y0  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y03pqrEv
  ~CC2x13y0(); // tgen
  CC2x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y0E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y03abcEv");}
void  ccc::CC2x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y03efgEv");}
void  ccc::CC2x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y03pqrEv");}
ccc::CC2x13y0 ::~CC2x13y0(){ note_dtor("_ZN3ccc8CC2x13y0E", this);} // tgen
ccc::CC2x13y0 ::CC2x13y0(){ note_ctor("_ZN3ccc8CC2x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y0E, buf);
    ::ccc::CC2x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y0E);
    dp->::ccc::CC2x13y0::~CC2x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y0E(Test__ZN3ccc8CC2x13y0E, "_ZN3ccc8CC2x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y0C1Ev();
extern void _ZN3ccc8CC2x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y0E[] = {
  NSPAIR(_ZN3ccc8CC2x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y0E[];
extern void _ZN3ccc8CC2x13y03efgEv();
extern void _ZN3ccc8CC2x13y03abcEv();
extern void _ZN3ccc8CC2x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y03efgEv,_ZTv0_n12_N3ccc8CC2x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y03efgEv,_ZThn4_N3ccc8CC2x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y03abcEv,_ZTv0_n16_N3ccc8CC2x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y03abcEv,_ZThn4_N3ccc8CC2x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y03pqrEv,_ZTv0_n20_N3ccc8CC2x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y03pqrEv,_ZThn4_N3ccc8CC2x13y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y03efgEv,_ZTv0_n12_N3ccc8CC2x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y03abcEv,_ZTv0_n16_N3ccc8CC2x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y03pqrEv,_ZTv0_n20_N3ccc8CC2x13y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y0E[] = {
  {&(_ZTVN3ccc8CC2x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y0E[];
static VTBL_ENTRY alt_thunk_names1245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y03pqrEv,_ZTv0_n20_N3ccc8CC2x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y03pqrEv,_ZThn4_N3ccc8CC2x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y03abcEv,_ZTv0_n16_N3ccc8CC2x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y03abcEv,_ZThn4_N3ccc8CC2x13y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y03efgEv,_ZTv0_n12_N3ccc8CC2x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y03efgEv,_ZThn4_N3ccc8CC2x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y0E = {  "_ZN3ccc8CC2x13y0E", // class name
  bases__ZN3ccc8CC2x13y0E, 2,
  &(vtc__ZN3ccc8CC2x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y0  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD2x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y03pqrEv
  ~DD2x13y0(); // tgen
  DD2x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y03abcEv");}
void  ccc::DD2x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y03efgEv");}
void  ccc::DD2x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y03pqrEv");}
ccc::DD2x13y0 ::~DD2x13y0(){ note_dtor("_ZN3ccc8DD2x13y0E", this);} // tgen
ccc::DD2x13y0 ::DD2x13y0(){ note_ctor("_ZN3ccc8DD2x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y0E, buf);
    ::ccc::DD2x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y0E);
    dp->::ccc::DD2x13y0::~DD2x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y0E(Test__ZN3ccc8DD2x13y0E, "_ZN3ccc8DD2x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y0C1Ev();
extern void _ZN3ccc8DD2x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y0E[] = {
  NSPAIR(_ZN3ccc8DD2x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y0E[];
extern void _ZN3ccc8DD2x13y03efgEv();
extern void _ZN3ccc8DD2x13y03abcEv();
extern void _ZN3ccc8DD2x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y03efgEv,_ZTv0_n12_N3ccc8DD2x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y03efgEv,_ZThn4_N3ccc8DD2x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y03efgEv,_ZTv0_n12_N3ccc8DD2x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y0E[] = {
  {&(_ZTVN3ccc8DD2x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y0E[];
static VTBL_ENTRY alt_thunk_names1246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y03efgEv,_ZTv0_n12_N3ccc8DD2x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y03efgEv,_ZThn4_N3ccc8DD2x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y0E = {  "_ZN3ccc8DD2x13y0E", // class name
  bases__ZN3ccc8DD2x13y0E, 2,
  &(vtc__ZN3ccc8DD2x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y1  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x13y13efgEv
  ~CC2x13y1(); // tgen
  CC2x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y1E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y13abcEv");}
void  ccc::CC2x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y13pqrEv");}
void  ccc::CC2x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y13efgEv");}
ccc::CC2x13y1 ::~CC2x13y1(){ note_dtor("_ZN3ccc8CC2x13y1E", this);} // tgen
ccc::CC2x13y1 ::CC2x13y1(){ note_ctor("_ZN3ccc8CC2x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y1E, buf);
    ::ccc::CC2x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y1E);
    dp->::ccc::CC2x13y1::~CC2x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y1E(Test__ZN3ccc8CC2x13y1E, "_ZN3ccc8CC2x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y1C1Ev();
extern void _ZN3ccc8CC2x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y1E[] = {
  NSPAIR(_ZN3ccc8CC2x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y1E[];
extern void _ZN3ccc8CC2x13y13efgEv();
extern void _ZN3ccc8CC2x13y13abcEv();
extern void _ZN3ccc8CC2x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y13efgEv,_ZTv0_n12_N3ccc8CC2x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y13efgEv,_ZThn4_N3ccc8CC2x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y13abcEv,_ZTv0_n16_N3ccc8CC2x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y13abcEv,_ZThn4_N3ccc8CC2x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y13pqrEv,_ZTv0_n20_N3ccc8CC2x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y13pqrEv,_ZThn4_N3ccc8CC2x13y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y13efgEv,_ZTv0_n12_N3ccc8CC2x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y13abcEv,_ZTv0_n16_N3ccc8CC2x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y13pqrEv,_ZTv0_n20_N3ccc8CC2x13y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y1E[] = {
  {&(_ZTVN3ccc8CC2x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y1E[];
static VTBL_ENTRY alt_thunk_names1247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y13pqrEv,_ZTv0_n20_N3ccc8CC2x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y13pqrEv,_ZThn4_N3ccc8CC2x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y13abcEv,_ZTv0_n16_N3ccc8CC2x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y13abcEv,_ZThn4_N3ccc8CC2x13y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y13efgEv,_ZTv0_n12_N3ccc8CC2x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y13efgEv,_ZThn4_N3ccc8CC2x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y1E = {  "_ZN3ccc8CC2x13y1E", // class name
  bases__ZN3ccc8CC2x13y1E, 2,
  &(vtc__ZN3ccc8CC2x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y1  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD2x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x13y13efgEv
  ~DD2x13y1(); // tgen
  DD2x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y13abcEv");}
void  ccc::DD2x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y13pqrEv");}
void  ccc::DD2x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y13efgEv");}
ccc::DD2x13y1 ::~DD2x13y1(){ note_dtor("_ZN3ccc8DD2x13y1E", this);} // tgen
ccc::DD2x13y1 ::DD2x13y1(){ note_ctor("_ZN3ccc8DD2x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y1E, buf);
    ::ccc::DD2x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y1E);
    dp->::ccc::DD2x13y1::~DD2x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y1E(Test__ZN3ccc8DD2x13y1E, "_ZN3ccc8DD2x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y1C1Ev();
extern void _ZN3ccc8DD2x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y1E[] = {
  NSPAIR(_ZN3ccc8DD2x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y1E[];
extern void _ZN3ccc8DD2x13y13efgEv();
extern void _ZN3ccc8DD2x13y13abcEv();
extern void _ZN3ccc8DD2x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y13efgEv,_ZTv0_n12_N3ccc8DD2x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y13efgEv,_ZThn4_N3ccc8DD2x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y13efgEv,_ZTv0_n12_N3ccc8DD2x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y1E[] = {
  {&(_ZTVN3ccc8DD2x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y1E[];
static VTBL_ENTRY alt_thunk_names1248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y13efgEv,_ZTv0_n12_N3ccc8DD2x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y13efgEv,_ZThn4_N3ccc8DD2x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y1E = {  "_ZN3ccc8DD2x13y1E", // class name
  bases__ZN3ccc8DD2x13y1E, 2,
  &(vtc__ZN3ccc8DD2x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y2  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y23pqrEv
  ~CC2x13y2(); // tgen
  CC2x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y2E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y23efgEv");}
void  ccc::CC2x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y23abcEv");}
void  ccc::CC2x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y23pqrEv");}
ccc::CC2x13y2 ::~CC2x13y2(){ note_dtor("_ZN3ccc8CC2x13y2E", this);} // tgen
ccc::CC2x13y2 ::CC2x13y2(){ note_ctor("_ZN3ccc8CC2x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y2E, buf);
    ::ccc::CC2x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y2E);
    dp->::ccc::CC2x13y2::~CC2x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y2E(Test__ZN3ccc8CC2x13y2E, "_ZN3ccc8CC2x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y2C1Ev();
extern void _ZN3ccc8CC2x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y2E[] = {
  NSPAIR(_ZN3ccc8CC2x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y2E[];
extern void _ZN3ccc8CC2x13y23efgEv();
extern void _ZN3ccc8CC2x13y23abcEv();
extern void _ZN3ccc8CC2x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y23efgEv,_ZTv0_n12_N3ccc8CC2x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y23efgEv,_ZThn4_N3ccc8CC2x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y23abcEv,_ZTv0_n16_N3ccc8CC2x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y23abcEv,_ZThn4_N3ccc8CC2x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y23pqrEv,_ZTv0_n20_N3ccc8CC2x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y23pqrEv,_ZThn4_N3ccc8CC2x13y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y23efgEv,_ZTv0_n12_N3ccc8CC2x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y23abcEv,_ZTv0_n16_N3ccc8CC2x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y23pqrEv,_ZTv0_n20_N3ccc8CC2x13y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y2E[] = {
  {&(_ZTVN3ccc8CC2x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y2E[];
static VTBL_ENTRY alt_thunk_names1249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y23pqrEv,_ZTv0_n20_N3ccc8CC2x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y23pqrEv,_ZThn4_N3ccc8CC2x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y23abcEv,_ZTv0_n16_N3ccc8CC2x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y23abcEv,_ZThn4_N3ccc8CC2x13y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y23efgEv,_ZTv0_n12_N3ccc8CC2x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y23efgEv,_ZThn4_N3ccc8CC2x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y2E = {  "_ZN3ccc8CC2x13y2E", // class name
  bases__ZN3ccc8CC2x13y2E, 2,
  &(vtc__ZN3ccc8CC2x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y2  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD2x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y23pqrEv
  ~DD2x13y2(); // tgen
  DD2x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y23efgEv");}
void  ccc::DD2x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y23abcEv");}
void  ccc::DD2x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y23pqrEv");}
ccc::DD2x13y2 ::~DD2x13y2(){ note_dtor("_ZN3ccc8DD2x13y2E", this);} // tgen
ccc::DD2x13y2 ::DD2x13y2(){ note_ctor("_ZN3ccc8DD2x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y2E, buf);
    ::ccc::DD2x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y2E);
    dp->::ccc::DD2x13y2::~DD2x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y2E(Test__ZN3ccc8DD2x13y2E, "_ZN3ccc8DD2x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y2C1Ev();
extern void _ZN3ccc8DD2x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y2E[] = {
  NSPAIR(_ZN3ccc8DD2x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y2E[];
extern void _ZN3ccc8DD2x13y23efgEv();
extern void _ZN3ccc8DD2x13y23abcEv();
extern void _ZN3ccc8DD2x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y23efgEv,_ZTv0_n12_N3ccc8DD2x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y23efgEv,_ZThn4_N3ccc8DD2x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y23efgEv,_ZTv0_n12_N3ccc8DD2x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y2E[] = {
  {&(_ZTVN3ccc8DD2x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y2E[];
static VTBL_ENTRY alt_thunk_names1250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y23efgEv,_ZTv0_n12_N3ccc8DD2x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y23efgEv,_ZThn4_N3ccc8DD2x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y2E = {  "_ZN3ccc8DD2x13y2E", // class name
  bases__ZN3ccc8DD2x13y2E, 2,
  &(vtc__ZN3ccc8DD2x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y3  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x13y33abcEv
  ~CC2x13y3(); // tgen
  CC2x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y3E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y33efgEv");}
void  ccc::CC2x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y33pqrEv");}
void  ccc::CC2x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y33abcEv");}
ccc::CC2x13y3 ::~CC2x13y3(){ note_dtor("_ZN3ccc8CC2x13y3E", this);} // tgen
ccc::CC2x13y3 ::CC2x13y3(){ note_ctor("_ZN3ccc8CC2x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y3E, buf);
    ::ccc::CC2x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y3E);
    dp->::ccc::CC2x13y3::~CC2x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y3E(Test__ZN3ccc8CC2x13y3E, "_ZN3ccc8CC2x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y3C1Ev();
extern void _ZN3ccc8CC2x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y3E[] = {
  NSPAIR(_ZN3ccc8CC2x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y3E[];
extern void _ZN3ccc8CC2x13y33efgEv();
extern void _ZN3ccc8CC2x13y33pqrEv();
extern void _ZN3ccc8CC2x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y33efgEv,_ZTv0_n12_N3ccc8CC2x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y33efgEv,_ZThn4_N3ccc8CC2x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y33abcEv,_ZTv0_n16_N3ccc8CC2x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y33abcEv,_ZThn4_N3ccc8CC2x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y33pqrEv,_ZTv0_n20_N3ccc8CC2x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y33pqrEv,_ZThn4_N3ccc8CC2x13y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y33efgEv,_ZTv0_n12_N3ccc8CC2x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y33abcEv,_ZTv0_n16_N3ccc8CC2x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y33pqrEv,_ZTv0_n20_N3ccc8CC2x13y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y3E[] = {
  {&(_ZTVN3ccc8CC2x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y3E[];
static VTBL_ENTRY alt_thunk_names1251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y33pqrEv,_ZTv0_n20_N3ccc8CC2x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y33pqrEv,_ZThn4_N3ccc8CC2x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y33abcEv,_ZTv0_n16_N3ccc8CC2x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y33abcEv,_ZThn4_N3ccc8CC2x13y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y33efgEv,_ZTv0_n12_N3ccc8CC2x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y33efgEv,_ZThn4_N3ccc8CC2x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y3E = {  "_ZN3ccc8CC2x13y3E", // class name
  bases__ZN3ccc8CC2x13y3E, 2,
  &(vtc__ZN3ccc8CC2x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y3  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD2x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x13y33abcEv
  ~DD2x13y3(); // tgen
  DD2x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y33efgEv");}
void  ccc::DD2x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y33pqrEv");}
void  ccc::DD2x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y33abcEv");}
ccc::DD2x13y3 ::~DD2x13y3(){ note_dtor("_ZN3ccc8DD2x13y3E", this);} // tgen
ccc::DD2x13y3 ::DD2x13y3(){ note_ctor("_ZN3ccc8DD2x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y3E, buf);
    ::ccc::DD2x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y3E);
    dp->::ccc::DD2x13y3::~DD2x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y3E(Test__ZN3ccc8DD2x13y3E, "_ZN3ccc8DD2x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y3C1Ev();
extern void _ZN3ccc8DD2x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y3E[] = {
  NSPAIR(_ZN3ccc8DD2x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y3E[];
extern void _ZN3ccc8DD2x13y33efgEv();
extern void _ZN3ccc8DD2x13y33abcEv();
extern void _ZN3ccc8DD2x13y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y33efgEv,_ZTv0_n12_N3ccc8DD2x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y33efgEv,_ZThn4_N3ccc8DD2x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y33efgEv,_ZTv0_n12_N3ccc8DD2x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y3E[] = {
  {&(_ZTVN3ccc8DD2x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y3E[];
static VTBL_ENTRY alt_thunk_names1252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y33efgEv,_ZTv0_n12_N3ccc8DD2x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y33efgEv,_ZThn4_N3ccc8DD2x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y3E = {  "_ZN3ccc8DD2x13y3E", // class name
  bases__ZN3ccc8DD2x13y3E, 2,
  &(vtc__ZN3ccc8DD2x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y4  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC2x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y43efgEv
  ~CC2x13y4(); // tgen
  CC2x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y4E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y43pqrEv");}
void  ccc::CC2x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y43abcEv");}
void  ccc::CC2x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y43efgEv");}
ccc::CC2x13y4 ::~CC2x13y4(){ note_dtor("_ZN3ccc8CC2x13y4E", this);} // tgen
ccc::CC2x13y4 ::CC2x13y4(){ note_ctor("_ZN3ccc8CC2x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y4E, buf);
    ::ccc::CC2x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y4E);
    dp->::ccc::CC2x13y4::~CC2x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y4E(Test__ZN3ccc8CC2x13y4E, "_ZN3ccc8CC2x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y4C1Ev();
extern void _ZN3ccc8CC2x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y4E[] = {
  NSPAIR(_ZN3ccc8CC2x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y4E[];
extern void _ZN3ccc8CC2x13y43efgEv();
extern void _ZN3ccc8CC2x13y43pqrEv();
extern void _ZN3ccc8CC2x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y43efgEv,_ZTv0_n12_N3ccc8CC2x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y43efgEv,_ZThn4_N3ccc8CC2x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y43abcEv,_ZTv0_n16_N3ccc8CC2x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y43abcEv,_ZThn4_N3ccc8CC2x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y43pqrEv,_ZTv0_n20_N3ccc8CC2x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y43pqrEv,_ZThn4_N3ccc8CC2x13y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y43efgEv,_ZTv0_n12_N3ccc8CC2x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y43abcEv,_ZTv0_n16_N3ccc8CC2x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y43pqrEv,_ZTv0_n20_N3ccc8CC2x13y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y4E[] = {
  {&(_ZTVN3ccc8CC2x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y4E[];
static VTBL_ENTRY alt_thunk_names1253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y43pqrEv,_ZTv0_n20_N3ccc8CC2x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y43pqrEv,_ZThn4_N3ccc8CC2x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y43abcEv,_ZTv0_n16_N3ccc8CC2x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y43abcEv,_ZThn4_N3ccc8CC2x13y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y43efgEv,_ZTv0_n12_N3ccc8CC2x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y43efgEv,_ZThn4_N3ccc8CC2x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y4E = {  "_ZN3ccc8CC2x13y4E", // class name
  bases__ZN3ccc8CC2x13y4E, 2,
  &(vtc__ZN3ccc8CC2x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y4  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD2x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x13y43efgEv
  ~DD2x13y4(); // tgen
  DD2x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y43pqrEv");}
void  ccc::DD2x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y43abcEv");}
void  ccc::DD2x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y43efgEv");}
ccc::DD2x13y4 ::~DD2x13y4(){ note_dtor("_ZN3ccc8DD2x13y4E", this);} // tgen
ccc::DD2x13y4 ::DD2x13y4(){ note_ctor("_ZN3ccc8DD2x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y4E, buf);
    ::ccc::DD2x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y4E);
    dp->::ccc::DD2x13y4::~DD2x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y4E(Test__ZN3ccc8DD2x13y4E, "_ZN3ccc8DD2x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y4C1Ev();
extern void _ZN3ccc8DD2x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y4E[] = {
  NSPAIR(_ZN3ccc8DD2x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y4E[];
extern void _ZN3ccc8DD2x13y43efgEv();
extern void _ZN3ccc8DD2x13y43abcEv();
extern void _ZN3ccc8DD2x13y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y43efgEv,_ZTv0_n12_N3ccc8DD2x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y43efgEv,_ZThn4_N3ccc8DD2x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y43efgEv,_ZTv0_n12_N3ccc8DD2x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y4E[] = {
  {&(_ZTVN3ccc8DD2x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y4E[];
static VTBL_ENTRY alt_thunk_names1254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y43efgEv,_ZTv0_n12_N3ccc8DD2x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y43efgEv,_ZThn4_N3ccc8DD2x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y4E = {  "_ZN3ccc8DD2x13y4E", // class name
  bases__ZN3ccc8DD2x13y4E, 2,
  &(vtc__ZN3ccc8DD2x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y5  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC2x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y53abcEv
  ~CC2x13y5(); // tgen
  CC2x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y5E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y53pqrEv");}
void  ccc::CC2x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y53efgEv");}
void  ccc::CC2x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y53abcEv");}
ccc::CC2x13y5 ::~CC2x13y5(){ note_dtor("_ZN3ccc8CC2x13y5E", this);} // tgen
ccc::CC2x13y5 ::CC2x13y5(){ note_ctor("_ZN3ccc8CC2x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y5E, buf);
    ::ccc::CC2x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y5E);
    dp->::ccc::CC2x13y5::~CC2x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y5E(Test__ZN3ccc8CC2x13y5E, "_ZN3ccc8CC2x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y5C1Ev();
extern void _ZN3ccc8CC2x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y5E[] = {
  NSPAIR(_ZN3ccc8CC2x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y5E[];
extern void _ZN3ccc8CC2x13y53efgEv();
extern void _ZN3ccc8CC2x13y53pqrEv();
extern void _ZN3ccc8CC2x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y53efgEv,_ZTv0_n12_N3ccc8CC2x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y53efgEv,_ZThn4_N3ccc8CC2x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y53abcEv,_ZTv0_n16_N3ccc8CC2x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y53abcEv,_ZThn4_N3ccc8CC2x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y53pqrEv,_ZTv0_n20_N3ccc8CC2x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y53pqrEv,_ZThn4_N3ccc8CC2x13y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y53efgEv,_ZTv0_n12_N3ccc8CC2x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y53abcEv,_ZTv0_n16_N3ccc8CC2x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y53pqrEv,_ZTv0_n20_N3ccc8CC2x13y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y5E[] = {
  {&(_ZTVN3ccc8CC2x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y5E[];
static VTBL_ENTRY alt_thunk_names1255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y53pqrEv,_ZTv0_n20_N3ccc8CC2x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y53pqrEv,_ZThn4_N3ccc8CC2x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y53abcEv,_ZTv0_n16_N3ccc8CC2x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y53abcEv,_ZThn4_N3ccc8CC2x13y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y53efgEv,_ZTv0_n12_N3ccc8CC2x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y53efgEv,_ZThn4_N3ccc8CC2x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y5E = {  "_ZN3ccc8CC2x13y5E", // class name
  bases__ZN3ccc8CC2x13y5E, 2,
  &(vtc__ZN3ccc8CC2x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y5  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD2x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x13y53abcEv
  ~DD2x13y5(); // tgen
  DD2x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y53pqrEv");}
void  ccc::DD2x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y53efgEv");}
void  ccc::DD2x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y53abcEv");}
ccc::DD2x13y5 ::~DD2x13y5(){ note_dtor("_ZN3ccc8DD2x13y5E", this);} // tgen
ccc::DD2x13y5 ::DD2x13y5(){ note_ctor("_ZN3ccc8DD2x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y5E, buf);
    ::ccc::DD2x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y5E);
    dp->::ccc::DD2x13y5::~DD2x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y5E(Test__ZN3ccc8DD2x13y5E, "_ZN3ccc8DD2x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y5C1Ev();
extern void _ZN3ccc8DD2x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y5E[] = {
  NSPAIR(_ZN3ccc8DD2x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y5E[];
extern void _ZN3ccc8DD2x13y53efgEv();
extern void _ZN3ccc8DD2x13y53abcEv();
extern void _ZN3ccc8DD2x13y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y53efgEv,_ZTv0_n12_N3ccc8DD2x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y53efgEv,_ZThn4_N3ccc8DD2x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y53efgEv,_ZTv0_n12_N3ccc8DD2x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y5E[] = {
  {&(_ZTVN3ccc8DD2x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y5E[];
static VTBL_ENTRY alt_thunk_names1256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y53efgEv,_ZTv0_n12_N3ccc8DD2x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y53efgEv,_ZThn4_N3ccc8DD2x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y5E = {  "_ZN3ccc8DD2x13y5E", // class name
  bases__ZN3ccc8DD2x13y5E, 2,
  &(vtc__ZN3ccc8DD2x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1256,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y6  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y63efgEv
  ~CC2x13y6(); // tgen
  CC2x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y6E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y63abcEv");}
void  ccc::CC2x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y63efgEv");}
ccc::CC2x13y6 ::~CC2x13y6(){ note_dtor("_ZN3ccc8CC2x13y6E", this);} // tgen
ccc::CC2x13y6 ::CC2x13y6(){ note_ctor("_ZN3ccc8CC2x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y6E, buf);
    ::ccc::CC2x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y6E);
    dp->::ccc::CC2x13y6::~CC2x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y6E(Test__ZN3ccc8CC2x13y6E, "_ZN3ccc8CC2x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y6C1Ev();
extern void _ZN3ccc8CC2x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y6E[] = {
  NSPAIR(_ZN3ccc8CC2x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y6E[];
extern void _ZN3ccc8CC2x13y63efgEv();
extern void _ZN3ccc8CC2x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y63efgEv,_ZTv0_n12_N3ccc8CC2x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y63efgEv,_ZThn4_N3ccc8CC2x13y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y63abcEv,_ZTv0_n16_N3ccc8CC2x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y63abcEv,_ZThn4_N3ccc8CC2x13y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y63efgEv,_ZTv0_n12_N3ccc8CC2x13y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y63abcEv,_ZTv0_n16_N3ccc8CC2x13y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y6E[] = {
  {&(_ZTVN3ccc8CC2x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y6E[];
static VTBL_ENTRY alt_thunk_names1257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y63abcEv,_ZTv0_n16_N3ccc8CC2x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y63abcEv,_ZThn4_N3ccc8CC2x13y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y63efgEv,_ZTv0_n12_N3ccc8CC2x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y63efgEv,_ZThn4_N3ccc8CC2x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y6E = {  "_ZN3ccc8CC2x13y6E", // class name
  bases__ZN3ccc8CC2x13y6E, 2,
  &(vtc__ZN3ccc8CC2x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1257,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y6  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD2x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x13y63efgEv
  ~DD2x13y6(); // tgen
  DD2x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y63abcEv");}
void  ccc::DD2x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y63efgEv");}
ccc::DD2x13y6 ::~DD2x13y6(){ note_dtor("_ZN3ccc8DD2x13y6E", this);} // tgen
ccc::DD2x13y6 ::DD2x13y6(){ note_ctor("_ZN3ccc8DD2x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y6E, buf);
    ::ccc::DD2x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y6E);
    dp->::ccc::DD2x13y6::~DD2x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y6E(Test__ZN3ccc8DD2x13y6E, "_ZN3ccc8DD2x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y6C1Ev();
extern void _ZN3ccc8DD2x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y6E[] = {
  NSPAIR(_ZN3ccc8DD2x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y6E[];
extern void _ZN3ccc8DD2x13y63efgEv();
extern void _ZN3ccc8DD2x13y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y63efgEv,_ZTv0_n12_N3ccc8DD2x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y63efgEv,_ZThn4_N3ccc8DD2x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y63efgEv,_ZTv0_n12_N3ccc8DD2x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y6E[] = {
  {&(_ZTVN3ccc8DD2x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y6E[];
static VTBL_ENTRY alt_thunk_names1258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y63efgEv,_ZTv0_n12_N3ccc8DD2x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y63efgEv,_ZThn4_N3ccc8DD2x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y6E = {  "_ZN3ccc8DD2x13y6E", // class name
  bases__ZN3ccc8DD2x13y6E, 2,
  &(vtc__ZN3ccc8DD2x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1258,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y7  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y73pqrEv
  ~CC2x13y7(); // tgen
  CC2x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y7E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y73abcEv");}
void  ccc::CC2x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y73pqrEv");}
ccc::CC2x13y7 ::~CC2x13y7(){ note_dtor("_ZN3ccc8CC2x13y7E", this);} // tgen
ccc::CC2x13y7 ::CC2x13y7(){ note_ctor("_ZN3ccc8CC2x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y7E, buf);
    ::ccc::CC2x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y7E);
    dp->::ccc::CC2x13y7::~CC2x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y7E(Test__ZN3ccc8CC2x13y7E, "_ZN3ccc8CC2x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y7C1Ev();
extern void _ZN3ccc8CC2x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y7E[] = {
  NSPAIR(_ZN3ccc8CC2x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC2x13y73abcEv();
extern void _ZN3ccc8CC2x13y73pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y73abcEv,_ZTv0_n16_N3ccc8CC2x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y73abcEv,_ZThn4_N3ccc8CC2x13y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y73pqrEv,_ZTv0_n20_N3ccc8CC2x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y73pqrEv,_ZThn4_N3ccc8CC2x13y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y73abcEv,_ZTv0_n16_N3ccc8CC2x13y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y73pqrEv,_ZTv0_n20_N3ccc8CC2x13y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y7E[] = {
  {&(_ZTVN3ccc8CC2x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y7E[];
static VTBL_ENTRY alt_thunk_names1259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y73pqrEv,_ZTv0_n20_N3ccc8CC2x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y73pqrEv,_ZThn4_N3ccc8CC2x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y73abcEv,_ZTv0_n16_N3ccc8CC2x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y73abcEv,_ZThn4_N3ccc8CC2x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y7E = {  "_ZN3ccc8CC2x13y7E", // class name
  bases__ZN3ccc8CC2x13y7E, 2,
  &(vtc__ZN3ccc8CC2x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1259,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y7  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD2x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y73pqrEv
  ~DD2x13y7(); // tgen
  DD2x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y73abcEv");}
void  ccc::DD2x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y73pqrEv");}
ccc::DD2x13y7 ::~DD2x13y7(){ note_dtor("_ZN3ccc8DD2x13y7E", this);} // tgen
ccc::DD2x13y7 ::DD2x13y7(){ note_ctor("_ZN3ccc8DD2x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y7E, buf);
    ::ccc::DD2x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y7E);
    dp->::ccc::DD2x13y7::~DD2x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y7E(Test__ZN3ccc8DD2x13y7E, "_ZN3ccc8DD2x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y7C1Ev();
extern void _ZN3ccc8DD2x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y7E[] = {
  NSPAIR(_ZN3ccc8DD2x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x13y73abcEv();
extern void _ZN3ccc8DD2x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y7E[] = {
  {&(_ZTVN3ccc8DD2x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y7E[];
Class_Descriptor cd__ZN3ccc8DD2x13y7E = {  "_ZN3ccc8DD2x13y7E", // class name
  bases__ZN3ccc8DD2x13y7E, 2,
  &(vtc__ZN3ccc8DD2x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y8  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y83abcEv
  ~CC2x13y8(); // tgen
  CC2x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y8E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y83efgEv");}
void  ccc::CC2x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y83abcEv");}
ccc::CC2x13y8 ::~CC2x13y8(){ note_dtor("_ZN3ccc8CC2x13y8E", this);} // tgen
ccc::CC2x13y8 ::CC2x13y8(){ note_ctor("_ZN3ccc8CC2x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y8E, buf);
    ::ccc::CC2x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y8E);
    dp->::ccc::CC2x13y8::~CC2x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y8E(Test__ZN3ccc8CC2x13y8E, "_ZN3ccc8CC2x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y8C1Ev();
extern void _ZN3ccc8CC2x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y8E[] = {
  NSPAIR(_ZN3ccc8CC2x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y8E[];
extern void _ZN3ccc8CC2x13y83efgEv();
extern void _ZN3ccc8CC2x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y83efgEv,_ZTv0_n12_N3ccc8CC2x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y83efgEv,_ZThn4_N3ccc8CC2x13y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x13y83abcEv,_ZTv0_n16_N3ccc8CC2x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y83abcEv,_ZThn4_N3ccc8CC2x13y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y83efgEv,_ZTv0_n12_N3ccc8CC2x13y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x13y83abcEv,_ZTv0_n16_N3ccc8CC2x13y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y8E[] = {
  {&(_ZTVN3ccc8CC2x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y8E[];
static VTBL_ENTRY alt_thunk_names1260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x13y83abcEv,_ZTv0_n16_N3ccc8CC2x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y83abcEv,_ZThn4_N3ccc8CC2x13y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y83efgEv,_ZTv0_n12_N3ccc8CC2x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y83efgEv,_ZThn4_N3ccc8CC2x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y8E = {  "_ZN3ccc8CC2x13y8E", // class name
  bases__ZN3ccc8CC2x13y8E, 2,
  &(vtc__ZN3ccc8CC2x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1260,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y8  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD2x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x13y83abcEv
  ~DD2x13y8(); // tgen
  DD2x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y83efgEv");}
void  ccc::DD2x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x13y83abcEv");}
ccc::DD2x13y8 ::~DD2x13y8(){ note_dtor("_ZN3ccc8DD2x13y8E", this);} // tgen
ccc::DD2x13y8 ::DD2x13y8(){ note_ctor("_ZN3ccc8DD2x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y8E, buf);
    ::ccc::DD2x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y8E);
    dp->::ccc::DD2x13y8::~DD2x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y8E(Test__ZN3ccc8DD2x13y8E, "_ZN3ccc8DD2x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y8C1Ev();
extern void _ZN3ccc8DD2x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y8E[] = {
  NSPAIR(_ZN3ccc8DD2x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y8E[];
extern void _ZN3ccc8DD2x13y83efgEv();
extern void _ZN3ccc8DD2x13y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y83efgEv,_ZTv0_n12_N3ccc8DD2x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y83efgEv,_ZThn4_N3ccc8DD2x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y83efgEv,_ZTv0_n12_N3ccc8DD2x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y8E[] = {
  {&(_ZTVN3ccc8DD2x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y8E[];
static VTBL_ENTRY alt_thunk_names1261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y83efgEv,_ZTv0_n12_N3ccc8DD2x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y83efgEv,_ZThn4_N3ccc8DD2x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y8E = {  "_ZN3ccc8DD2x13y8E", // class name
  bases__ZN3ccc8DD2x13y8E, 2,
  &(vtc__ZN3ccc8DD2x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1261,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y9  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y93pqrEv
  ~CC2x13y9(); // tgen
  CC2x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y9E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y93efgEv");}
void  ccc::CC2x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y93pqrEv");}
ccc::CC2x13y9 ::~CC2x13y9(){ note_dtor("_ZN3ccc8CC2x13y9E", this);} // tgen
ccc::CC2x13y9 ::CC2x13y9(){ note_ctor("_ZN3ccc8CC2x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y9E, buf);
    ::ccc::CC2x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC2x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y9E);
    dp->::ccc::CC2x13y9::~CC2x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y9E(Test__ZN3ccc8CC2x13y9E, "_ZN3ccc8CC2x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y9C1Ev();
extern void _ZN3ccc8CC2x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y9E[] = {
  NSPAIR(_ZN3ccc8CC2x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y9E[];
extern void _ZN3ccc8CC2x13y93efgEv();
extern void _ZN3ccc8CC2x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x13y93efgEv,_ZTv0_n12_N3ccc8CC2x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y93efgEv,_ZThn4_N3ccc8CC2x13y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x13y93pqrEv,_ZTv0_n20_N3ccc8CC2x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y93pqrEv,_ZThn4_N3ccc8CC2x13y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x13y93efgEv,_ZTv0_n12_N3ccc8CC2x13y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x13y93pqrEv,_ZTv0_n20_N3ccc8CC2x13y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x13y9E[] = {
  {&(_ZTVN3ccc8CC2x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x13y9E[];
static VTBL_ENTRY alt_thunk_names1262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x13y93pqrEv,_ZTv0_n20_N3ccc8CC2x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y93pqrEv,_ZThn4_N3ccc8CC2x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x13y93efgEv,_ZTv0_n12_N3ccc8CC2x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x13y93efgEv,_ZThn4_N3ccc8CC2x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x13y9E = {  "_ZN3ccc8CC2x13y9E", // class name
  bases__ZN3ccc8CC2x13y9E, 2,
  &(vtc__ZN3ccc8CC2x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x13y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1262,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y9  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD2x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x13y93pqrEv
  ~DD2x13y9(); // tgen
  DD2x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x13y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x13y93efgEv");}
void  ccc::DD2x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x13y93pqrEv");}
ccc::DD2x13y9 ::~DD2x13y9(){ note_dtor("_ZN3ccc8DD2x13y9E", this);} // tgen
ccc::DD2x13y9 ::DD2x13y9(){ note_ctor("_ZN3ccc8DD2x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x13y9E, buf);
    ::ccc::DD2x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x13y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD2x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x13y9E);
    dp->::ccc::DD2x13y9::~DD2x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x13y9E(Test__ZN3ccc8DD2x13y9E, "_ZN3ccc8DD2x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x13y9C1Ev();
extern void _ZN3ccc8DD2x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x13y9E[] = {
  NSPAIR(_ZN3ccc8DD2x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD2x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y9E[];
extern void _ZN3ccc8DD2x13y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x13y93efgEv,_ZTv0_n12_N3ccc8DD2x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x13y93efgEv,_ZThn4_N3ccc8DD2x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x13y93efgEv,_ZTv0_n12_N3ccc8DD2x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x13y9E[] = {
  {&(_ZTVN3ccc8DD2x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x13y9E[];
static VTBL_ENTRY alt_thunk_names1263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x13y93efgEv,_ZTv0_n12_N3ccc8DD2x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x13y93efgEv,_ZThn4_N3ccc8DD2x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x13y9E = {  "_ZN3ccc8DD2x13y9E", // class name
  bases__ZN3ccc8DD2x13y9E, 2,
  &(vtc__ZN3ccc8DD2x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x13y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1263,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y10  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x13y103abcEv
  ~CC2x13y10(); // tgen
  CC2x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y10E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y103pqrEv");}
void  ccc::CC2x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x13y103abcEv");}
ccc::CC2x13y10 ::~CC2x13y10(){ note_dtor("_ZN3ccc9CC2x13y10E", this);} // tgen
ccc::CC2x13y10 ::CC2x13y10(){ note_ctor("_ZN3ccc9CC2x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y10E, buf);
    ::ccc::CC2x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y10E);
    dp->::ccc::CC2x13y10::~CC2x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y10E(Test__ZN3ccc9CC2x13y10E, "_ZN3ccc9CC2x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y10C1Ev();
extern void _ZN3ccc9CC2x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y10E[] = {
  NSPAIR(_ZN3ccc9CC2x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC2x13y103pqrEv();
extern void _ZN3ccc9CC2x13y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x13y103abcEv,_ZTv0_n16_N3ccc9CC2x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y103abcEv,_ZThn4_N3ccc9CC2x13y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x13y103pqrEv,_ZTv0_n20_N3ccc9CC2x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y103pqrEv,_ZThn4_N3ccc9CC2x13y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x13y103abcEv,_ZTv0_n16_N3ccc9CC2x13y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x13y103pqrEv,_ZTv0_n20_N3ccc9CC2x13y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y10E[] = {
  {&(_ZTVN3ccc9CC2x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC2x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y10E[];
static VTBL_ENTRY alt_thunk_names1264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x13y103pqrEv,_ZTv0_n20_N3ccc9CC2x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y103pqrEv,_ZThn4_N3ccc9CC2x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x13y103abcEv,_ZTv0_n16_N3ccc9CC2x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y103abcEv,_ZThn4_N3ccc9CC2x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x13y10E = {  "_ZN3ccc9CC2x13y10E", // class name
  bases__ZN3ccc9CC2x13y10E, 2,
  &(vtc__ZN3ccc9CC2x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1264,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y10  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD2x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x13y103abcEv
  ~DD2x13y10(); // tgen
  DD2x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x13y103pqrEv");}
void  ccc::DD2x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x13y103abcEv");}
ccc::DD2x13y10 ::~DD2x13y10(){ note_dtor("_ZN3ccc9DD2x13y10E", this);} // tgen
ccc::DD2x13y10 ::DD2x13y10(){ note_ctor("_ZN3ccc9DD2x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y10E, buf);
    ::ccc::DD2x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y10E);
    dp->::ccc::DD2x13y10::~DD2x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y10E(Test__ZN3ccc9DD2x13y10E, "_ZN3ccc9DD2x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y10C1Ev();
extern void _ZN3ccc9DD2x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y10E[] = {
  NSPAIR(_ZN3ccc9DD2x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x13y103abcEv();
extern void _ZN3ccc9DD2x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y103pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y10E[] = {
  {&(_ZTVN3ccc9DD2x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y10E[];
Class_Descriptor cd__ZN3ccc9DD2x13y10E = {  "_ZN3ccc9DD2x13y10E", // class name
  bases__ZN3ccc9DD2x13y10E, 2,
  &(vtc__ZN3ccc9DD2x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y11  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x13y113efgEv
  ~CC2x13y11(); // tgen
  CC2x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y11E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y113pqrEv");}
void  ccc::CC2x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x13y113efgEv");}
ccc::CC2x13y11 ::~CC2x13y11(){ note_dtor("_ZN3ccc9CC2x13y11E", this);} // tgen
ccc::CC2x13y11 ::CC2x13y11(){ note_ctor("_ZN3ccc9CC2x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y11E, buf);
    ::ccc::CC2x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y11E);
    dp->::ccc::CC2x13y11::~CC2x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y11E(Test__ZN3ccc9CC2x13y11E, "_ZN3ccc9CC2x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y11C1Ev();
extern void _ZN3ccc9CC2x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y11E[] = {
  NSPAIR(_ZN3ccc9CC2x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y11E[];
extern void _ZN3ccc9CC2x13y113efgEv();
extern void _ZN3ccc9CC2x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x13y113efgEv,_ZTv0_n12_N3ccc9CC2x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y113efgEv,_ZThn4_N3ccc9CC2x13y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x13y113pqrEv,_ZTv0_n20_N3ccc9CC2x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y113pqrEv,_ZThn4_N3ccc9CC2x13y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x13y113efgEv,_ZTv0_n12_N3ccc9CC2x13y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x13y113pqrEv,_ZTv0_n20_N3ccc9CC2x13y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y11E[] = {
  {&(_ZTVN3ccc9CC2x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y11E[];
static VTBL_ENTRY alt_thunk_names1265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x13y113pqrEv,_ZTv0_n20_N3ccc9CC2x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y113pqrEv,_ZThn4_N3ccc9CC2x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x13y113efgEv,_ZTv0_n12_N3ccc9CC2x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y113efgEv,_ZThn4_N3ccc9CC2x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x13y11E = {  "_ZN3ccc9CC2x13y11E", // class name
  bases__ZN3ccc9CC2x13y11E, 2,
  &(vtc__ZN3ccc9CC2x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1265,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y11  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD2x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x13y113efgEv
  ~DD2x13y11(); // tgen
  DD2x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x13y113pqrEv");}
void  ccc::DD2x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x13y113efgEv");}
ccc::DD2x13y11 ::~DD2x13y11(){ note_dtor("_ZN3ccc9DD2x13y11E", this);} // tgen
ccc::DD2x13y11 ::DD2x13y11(){ note_ctor("_ZN3ccc9DD2x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y11E, buf);
    ::ccc::DD2x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y11E);
    dp->::ccc::DD2x13y11::~DD2x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y11E(Test__ZN3ccc9DD2x13y11E, "_ZN3ccc9DD2x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y11C1Ev();
extern void _ZN3ccc9DD2x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y11E[] = {
  NSPAIR(_ZN3ccc9DD2x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y11E[];
extern void _ZN3ccc9DD2x13y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x13y113efgEv,_ZTv0_n12_N3ccc9DD2x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x13y113efgEv,_ZThn4_N3ccc9DD2x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x13y113efgEv,_ZTv0_n12_N3ccc9DD2x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y11E[] = {
  {&(_ZTVN3ccc9DD2x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y11E[];
static VTBL_ENTRY alt_thunk_names1266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x13y113efgEv,_ZTv0_n12_N3ccc9DD2x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x13y113efgEv,_ZThn4_N3ccc9DD2x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x13y11E = {  "_ZN3ccc9DD2x13y11E", // class name
  bases__ZN3ccc9DD2x13y11E, 2,
  &(vtc__ZN3ccc9DD2x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1266,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y12  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC2x13y123abcEv
  ~CC2x13y12(); // tgen
  CC2x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x13y123abcEv");}
ccc::CC2x13y12 ::~CC2x13y12(){ note_dtor("_ZN3ccc9CC2x13y12E", this);} // tgen
ccc::CC2x13y12 ::CC2x13y12(){ note_ctor("_ZN3ccc9CC2x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y12E, buf);
    ::ccc::CC2x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y12E);
    dp->::ccc::CC2x13y12::~CC2x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y12E(Test__ZN3ccc9CC2x13y12E, "_ZN3ccc9CC2x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y12C1Ev();
extern void _ZN3ccc9CC2x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y12E[] = {
  NSPAIR(_ZN3ccc9CC2x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC2x13y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x13y123abcEv,_ZTv0_n16_N3ccc9CC2x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y123abcEv,_ZThn4_N3ccc9CC2x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x13y123abcEv,_ZTv0_n16_N3ccc9CC2x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y12E[] = {
  {&(_ZTVN3ccc9CC2x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y12E[];
static VTBL_ENTRY alt_thunk_names1267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x13y123abcEv,_ZTv0_n16_N3ccc9CC2x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y123abcEv,_ZThn4_N3ccc9CC2x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x13y12E = {  "_ZN3ccc9CC2x13y12E", // class name
  bases__ZN3ccc9CC2x13y12E, 2,
  &(vtc__ZN3ccc9CC2x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1267,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y12  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD2x13y123abcEv
  ~DD2x13y12(); // tgen
  DD2x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x13y123abcEv");}
ccc::DD2x13y12 ::~DD2x13y12(){ note_dtor("_ZN3ccc9DD2x13y12E", this);} // tgen
ccc::DD2x13y12 ::DD2x13y12(){ note_ctor("_ZN3ccc9DD2x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y12E, buf);
    ::ccc::DD2x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y12E);
    dp->::ccc::DD2x13y12::~DD2x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y12E(Test__ZN3ccc9DD2x13y12E, "_ZN3ccc9DD2x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y12C1Ev();
extern void _ZN3ccc9DD2x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y12E[] = {
  NSPAIR(_ZN3ccc9DD2x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x13y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y12E[] = {
  {&(_ZTVN3ccc9DD2x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y12E[];
Class_Descriptor cd__ZN3ccc9DD2x13y12E = {  "_ZN3ccc9DD2x13y12E", // class name
  bases__ZN3ccc9DD2x13y12E, 2,
  &(vtc__ZN3ccc9DD2x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y13  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC2x13y133efgEv
  ~CC2x13y13(); // tgen
  CC2x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x13y133efgEv");}
ccc::CC2x13y13 ::~CC2x13y13(){ note_dtor("_ZN3ccc9CC2x13y13E", this);} // tgen
ccc::CC2x13y13 ::CC2x13y13(){ note_ctor("_ZN3ccc9CC2x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y13E, buf);
    ::ccc::CC2x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y13E);
    dp->::ccc::CC2x13y13::~CC2x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y13E(Test__ZN3ccc9CC2x13y13E, "_ZN3ccc9CC2x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y13C1Ev();
extern void _ZN3ccc9CC2x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y13E[] = {
  NSPAIR(_ZN3ccc9CC2x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y13E[];
extern void _ZN3ccc9CC2x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x13y133efgEv,_ZTv0_n12_N3ccc9CC2x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y133efgEv,_ZThn4_N3ccc9CC2x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x13y133efgEv,_ZTv0_n12_N3ccc9CC2x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y13E[] = {
  {&(_ZTVN3ccc9CC2x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y13E[];
static VTBL_ENTRY alt_thunk_names1268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x13y133efgEv,_ZTv0_n12_N3ccc9CC2x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y133efgEv,_ZThn4_N3ccc9CC2x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x13y13E = {  "_ZN3ccc9CC2x13y13E", // class name
  bases__ZN3ccc9CC2x13y13E, 2,
  &(vtc__ZN3ccc9CC2x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1268,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y13  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD2x13y133efgEv
  ~DD2x13y13(); // tgen
  DD2x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD2x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x13y133efgEv");}
ccc::DD2x13y13 ::~DD2x13y13(){ note_dtor("_ZN3ccc9DD2x13y13E", this);} // tgen
ccc::DD2x13y13 ::DD2x13y13(){ note_ctor("_ZN3ccc9DD2x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y13E, buf);
    ::ccc::DD2x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y13E);
    dp->::ccc::DD2x13y13::~DD2x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y13E(Test__ZN3ccc9DD2x13y13E, "_ZN3ccc9DD2x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y13C1Ev();
extern void _ZN3ccc9DD2x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y13E[] = {
  NSPAIR(_ZN3ccc9DD2x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y13E[];
extern void _ZN3ccc9DD2x13y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x13y133efgEv,_ZTv0_n12_N3ccc9DD2x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x13y133efgEv,_ZThn4_N3ccc9DD2x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x13y133efgEv,_ZTv0_n12_N3ccc9DD2x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y13E[] = {
  {&(_ZTVN3ccc9DD2x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y13E[];
static VTBL_ENTRY alt_thunk_names1269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x13y133efgEv,_ZTv0_n12_N3ccc9DD2x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x13y133efgEv,_ZThn4_N3ccc9DD2x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x13y13E = {  "_ZN3ccc9DD2x13y13E", // class name
  bases__ZN3ccc9DD2x13y13E, 2,
  &(vtc__ZN3ccc9DD2x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1269,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y14  : virtual ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y143pqrEv
  ~CC2x13y14(); // tgen
  CC2x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y14E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y143pqrEv");}
ccc::CC2x13y14 ::~CC2x13y14(){ note_dtor("_ZN3ccc9CC2x13y14E", this);} // tgen
ccc::CC2x13y14 ::CC2x13y14(){ note_ctor("_ZN3ccc9CC2x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y14E, buf);
    ::ccc::CC2x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y14E);
    dp->::ccc::CC2x13y14::~CC2x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y14E(Test__ZN3ccc9CC2x13y14E, "_ZN3ccc9CC2x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y14C1Ev();
extern void _ZN3ccc9CC2x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y14E[] = {
  NSPAIR(_ZN3ccc9CC2x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC2x13y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x13y143pqrEv,_ZTv0_n20_N3ccc9CC2x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y143pqrEv,_ZThn4_N3ccc9CC2x13y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x13y143pqrEv,_ZTv0_n20_N3ccc9CC2x13y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y14E[] = {
  {&(_ZTVN3ccc9CC2x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y14E[];
static VTBL_ENTRY alt_thunk_names1270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x13y143pqrEv,_ZTv0_n20_N3ccc9CC2x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x13y143pqrEv,_ZThn4_N3ccc9CC2x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x13y14E = {  "_ZN3ccc9CC2x13y14E", // class name
  bases__ZN3ccc9CC2x13y14E, 2,
  &(vtc__ZN3ccc9CC2x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1270,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y14  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD2x13y143pqrEv
  ~DD2x13y14(); // tgen
  DD2x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x13y143pqrEv");}
ccc::DD2x13y14 ::~DD2x13y14(){ note_dtor("_ZN3ccc9DD2x13y14E", this);} // tgen
ccc::DD2x13y14 ::DD2x13y14(){ note_ctor("_ZN3ccc9DD2x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y14E, buf);
    ::ccc::DD2x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y14E);
    dp->::ccc::DD2x13y14::~DD2x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y14E(Test__ZN3ccc9DD2x13y14E, "_ZN3ccc9DD2x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y14C1Ev();
extern void _ZN3ccc9DD2x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y14E[] = {
  NSPAIR(_ZN3ccc9DD2x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y14E[] = {
  {&(_ZTVN3ccc9DD2x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y14E[];
Class_Descriptor cd__ZN3ccc9DD2x13y14E = {  "_ZN3ccc9DD2x13y14E", // class name
  bases__ZN3ccc9DD2x13y14E, 2,
  &(vtc__ZN3ccc9DD2x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y15  : virtual ::ccc::AA2 , ::ccc::BB13 {
  ~CC2x13y15(); // tgen
  CC2x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x13y15 ::~CC2x13y15(){ note_dtor("_ZN3ccc9CC2x13y15E", this);} // tgen
ccc::CC2x13y15 ::CC2x13y15(){ note_ctor("_ZN3ccc9CC2x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y15E, buf);
    ::ccc::CC2x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC2x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y15E);
    dp->::ccc::CC2x13y15::~CC2x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y15E(Test__ZN3ccc9CC2x13y15E, "_ZN3ccc9CC2x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y15C1Ev();
extern void _ZN3ccc9CC2x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y15E[] = {
  NSPAIR(_ZN3ccc9CC2x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x13y15E[] = {
  {&(_ZTVN3ccc9CC2x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x13y15E[];
Class_Descriptor cd__ZN3ccc9CC2x13y15E = {  "_ZN3ccc9CC2x13y15E", // class name
  bases__ZN3ccc9CC2x13y15E, 2,
  &(vtc__ZN3ccc9CC2x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x13y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x13y15  : virtual ::ccc::AA2 , virtual ::ccc::BB13 {
  ~DD2x13y15(); // tgen
  DD2x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD2x13y15 ::~DD2x13y15(){ note_dtor("_ZN3ccc9DD2x13y15E", this);} // tgen
ccc::DD2x13y15 ::DD2x13y15(){ note_ctor("_ZN3ccc9DD2x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x13y15E, buf);
    ::ccc::DD2x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x13y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD2x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x13y15E);
    dp->::ccc::DD2x13y15::~DD2x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x13y15E(Test__ZN3ccc9DD2x13y15E, "_ZN3ccc9DD2x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x13y15C1Ev();
extern void _ZN3ccc9DD2x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x13y15E[] = {
  NSPAIR(_ZN3ccc9DD2x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD2x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x13y15E[] = {
  {&(_ZTVN3ccc9DD2x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x13y15E[];
Class_Descriptor cd__ZN3ccc9DD2x13y15E = {  "_ZN3ccc9DD2x13y15E", // class name
  bases__ZN3ccc9DD2x13y15E, 2,
  &(vtc__ZN3ccc9DD2x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x13y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y0  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y03pqrEv
  ~CC2x14y0(); // tgen
  CC2x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y0E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y03abcEv");}
void  ccc::CC2x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y03efgEv");}
void  ccc::CC2x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y03pqrEv");}
ccc::CC2x14y0 ::~CC2x14y0(){ note_dtor("_ZN3ccc8CC2x14y0E", this);} // tgen
ccc::CC2x14y0 ::CC2x14y0(){ note_ctor("_ZN3ccc8CC2x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y0E, buf);
    ::ccc::CC2x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y0E);
    dp->::ccc::CC2x14y0::~CC2x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y0E(Test__ZN3ccc8CC2x14y0E, "_ZN3ccc8CC2x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y0C1Ev();
extern void _ZN3ccc8CC2x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y0E[] = {
  NSPAIR(_ZN3ccc8CC2x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y0E[];
extern void _ZN3ccc8CC2x14y03pqrEv();
extern void _ZN3ccc8CC2x14y03abcEv();
extern void _ZN3ccc8CC2x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y03efgEv,_ZTv0_n12_N3ccc8CC2x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y03efgEv,_ZThn4_N3ccc8CC2x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y03abcEv,_ZTv0_n16_N3ccc8CC2x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y03abcEv,_ZThn4_N3ccc8CC2x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y03pqrEv,_ZTv0_n20_N3ccc8CC2x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y03pqrEv,_ZThn4_N3ccc8CC2x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y03efgEv,_ZTv0_n12_N3ccc8CC2x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y03abcEv,_ZTv0_n16_N3ccc8CC2x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y03pqrEv,_ZTv0_n20_N3ccc8CC2x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y0E[] = {
  {&(_ZTVN3ccc8CC2x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y0E[];
static VTBL_ENTRY alt_thunk_names1271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y03pqrEv,_ZTv0_n20_N3ccc8CC2x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y03pqrEv,_ZThn4_N3ccc8CC2x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y03abcEv,_ZTv0_n16_N3ccc8CC2x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y03abcEv,_ZThn4_N3ccc8CC2x14y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y03efgEv,_ZTv0_n12_N3ccc8CC2x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y03efgEv,_ZThn4_N3ccc8CC2x14y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y0E = {  "_ZN3ccc8CC2x14y0E", // class name
  bases__ZN3ccc8CC2x14y0E, 2,
  &(vtc__ZN3ccc8CC2x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1271,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y0  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD2x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y03pqrEv
  ~DD2x14y0(); // tgen
  DD2x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y0E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y03abcEv");}
void  ccc::DD2x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y03efgEv");}
void  ccc::DD2x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y03pqrEv");}
ccc::DD2x14y0 ::~DD2x14y0(){ note_dtor("_ZN3ccc8DD2x14y0E", this);} // tgen
ccc::DD2x14y0 ::DD2x14y0(){ note_ctor("_ZN3ccc8DD2x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y0E, buf);
    ::ccc::DD2x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y0E);
    dp->::ccc::DD2x14y0::~DD2x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y0E(Test__ZN3ccc8DD2x14y0E, "_ZN3ccc8DD2x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y0C1Ev();
extern void _ZN3ccc8DD2x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y0E[] = {
  NSPAIR(_ZN3ccc8DD2x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y0E[];
extern void _ZN3ccc8DD2x14y03efgEv();
extern void _ZN3ccc8DD2x14y03abcEv();
extern void _ZN3ccc8DD2x14y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y03pqrEv,_ZTv0_n12_N3ccc8DD2x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y03pqrEv,_ZThn4_N3ccc8DD2x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y03pqrEv,_ZTv0_n12_N3ccc8DD2x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y0E[] = {
  {&(_ZTVN3ccc8DD2x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y0E[];
static VTBL_ENTRY alt_thunk_names1272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y03pqrEv,_ZTv0_n12_N3ccc8DD2x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y03pqrEv,_ZThn4_N3ccc8DD2x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y0E = {  "_ZN3ccc8DD2x14y0E", // class name
  bases__ZN3ccc8DD2x14y0E, 2,
  &(vtc__ZN3ccc8DD2x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1272,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y1  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x14y13efgEv
  ~CC2x14y1(); // tgen
  CC2x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y1E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y13abcEv");}
void  ccc::CC2x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y13pqrEv");}
void  ccc::CC2x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y13efgEv");}
ccc::CC2x14y1 ::~CC2x14y1(){ note_dtor("_ZN3ccc8CC2x14y1E", this);} // tgen
ccc::CC2x14y1 ::CC2x14y1(){ note_ctor("_ZN3ccc8CC2x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y1E, buf);
    ::ccc::CC2x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y1E);
    dp->::ccc::CC2x14y1::~CC2x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y1E(Test__ZN3ccc8CC2x14y1E, "_ZN3ccc8CC2x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y1C1Ev();
extern void _ZN3ccc8CC2x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y1E[] = {
  NSPAIR(_ZN3ccc8CC2x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y1E[];
extern void _ZN3ccc8CC2x14y13pqrEv();
extern void _ZN3ccc8CC2x14y13abcEv();
extern void _ZN3ccc8CC2x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y13efgEv,_ZTv0_n12_N3ccc8CC2x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y13efgEv,_ZThn4_N3ccc8CC2x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y13abcEv,_ZTv0_n16_N3ccc8CC2x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y13abcEv,_ZThn4_N3ccc8CC2x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y13pqrEv,_ZTv0_n20_N3ccc8CC2x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y13pqrEv,_ZThn4_N3ccc8CC2x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y13efgEv,_ZTv0_n12_N3ccc8CC2x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y13abcEv,_ZTv0_n16_N3ccc8CC2x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y13pqrEv,_ZTv0_n20_N3ccc8CC2x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y1E[] = {
  {&(_ZTVN3ccc8CC2x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y1E[];
static VTBL_ENTRY alt_thunk_names1273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y13pqrEv,_ZTv0_n20_N3ccc8CC2x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y13pqrEv,_ZThn4_N3ccc8CC2x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y13abcEv,_ZTv0_n16_N3ccc8CC2x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y13abcEv,_ZThn4_N3ccc8CC2x14y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y13efgEv,_ZTv0_n12_N3ccc8CC2x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y13efgEv,_ZThn4_N3ccc8CC2x14y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y1E = {  "_ZN3ccc8CC2x14y1E", // class name
  bases__ZN3ccc8CC2x14y1E, 2,
  &(vtc__ZN3ccc8CC2x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1273,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y1  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD2x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x14y13efgEv
  ~DD2x14y1(); // tgen
  DD2x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y1E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y13abcEv");}
void  ccc::DD2x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y13pqrEv");}
void  ccc::DD2x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y13efgEv");}
ccc::DD2x14y1 ::~DD2x14y1(){ note_dtor("_ZN3ccc8DD2x14y1E", this);} // tgen
ccc::DD2x14y1 ::DD2x14y1(){ note_ctor("_ZN3ccc8DD2x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y1E, buf);
    ::ccc::DD2x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y1E);
    dp->::ccc::DD2x14y1::~DD2x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y1E(Test__ZN3ccc8DD2x14y1E, "_ZN3ccc8DD2x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y1C1Ev();
extern void _ZN3ccc8DD2x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y1E[] = {
  NSPAIR(_ZN3ccc8DD2x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y1E[];
extern void _ZN3ccc8DD2x14y13efgEv();
extern void _ZN3ccc8DD2x14y13abcEv();
extern void _ZN3ccc8DD2x14y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y13pqrEv,_ZTv0_n12_N3ccc8DD2x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y13pqrEv,_ZThn4_N3ccc8DD2x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y13pqrEv,_ZTv0_n12_N3ccc8DD2x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y1E[] = {
  {&(_ZTVN3ccc8DD2x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y1E[];
static VTBL_ENTRY alt_thunk_names1274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y13pqrEv,_ZTv0_n12_N3ccc8DD2x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y13pqrEv,_ZThn4_N3ccc8DD2x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y1E = {  "_ZN3ccc8DD2x14y1E", // class name
  bases__ZN3ccc8DD2x14y1E, 2,
  &(vtc__ZN3ccc8DD2x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1274,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y2  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y23pqrEv
  ~CC2x14y2(); // tgen
  CC2x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y2E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y23efgEv");}
void  ccc::CC2x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y23abcEv");}
void  ccc::CC2x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y23pqrEv");}
ccc::CC2x14y2 ::~CC2x14y2(){ note_dtor("_ZN3ccc8CC2x14y2E", this);} // tgen
ccc::CC2x14y2 ::CC2x14y2(){ note_ctor("_ZN3ccc8CC2x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y2E, buf);
    ::ccc::CC2x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y2E);
    dp->::ccc::CC2x14y2::~CC2x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y2E(Test__ZN3ccc8CC2x14y2E, "_ZN3ccc8CC2x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y2C1Ev();
extern void _ZN3ccc8CC2x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y2E[] = {
  NSPAIR(_ZN3ccc8CC2x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y2E[];
extern void _ZN3ccc8CC2x14y23pqrEv();
extern void _ZN3ccc8CC2x14y23efgEv();
extern void _ZN3ccc8CC2x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y23efgEv,_ZTv0_n12_N3ccc8CC2x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y23efgEv,_ZThn4_N3ccc8CC2x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y23abcEv,_ZTv0_n16_N3ccc8CC2x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y23abcEv,_ZThn4_N3ccc8CC2x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y23pqrEv,_ZTv0_n20_N3ccc8CC2x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y23pqrEv,_ZThn4_N3ccc8CC2x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y23efgEv,_ZTv0_n12_N3ccc8CC2x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y23abcEv,_ZTv0_n16_N3ccc8CC2x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y23pqrEv,_ZTv0_n20_N3ccc8CC2x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y2E[] = {
  {&(_ZTVN3ccc8CC2x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y2E[];
static VTBL_ENTRY alt_thunk_names1275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y23pqrEv,_ZTv0_n20_N3ccc8CC2x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y23pqrEv,_ZThn4_N3ccc8CC2x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y23abcEv,_ZTv0_n16_N3ccc8CC2x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y23abcEv,_ZThn4_N3ccc8CC2x14y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y23efgEv,_ZTv0_n12_N3ccc8CC2x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y23efgEv,_ZThn4_N3ccc8CC2x14y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y2E = {  "_ZN3ccc8CC2x14y2E", // class name
  bases__ZN3ccc8CC2x14y2E, 2,
  &(vtc__ZN3ccc8CC2x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1275,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y2  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD2x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y23pqrEv
  ~DD2x14y2(); // tgen
  DD2x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y2E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y23efgEv");}
void  ccc::DD2x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y23abcEv");}
void  ccc::DD2x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y23pqrEv");}
ccc::DD2x14y2 ::~DD2x14y2(){ note_dtor("_ZN3ccc8DD2x14y2E", this);} // tgen
ccc::DD2x14y2 ::DD2x14y2(){ note_ctor("_ZN3ccc8DD2x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y2E, buf);
    ::ccc::DD2x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y2E);
    dp->::ccc::DD2x14y2::~DD2x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y2E(Test__ZN3ccc8DD2x14y2E, "_ZN3ccc8DD2x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y2C1Ev();
extern void _ZN3ccc8DD2x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y2E[] = {
  NSPAIR(_ZN3ccc8DD2x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y2E[];
extern void _ZN3ccc8DD2x14y23efgEv();
extern void _ZN3ccc8DD2x14y23abcEv();
extern void _ZN3ccc8DD2x14y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y23pqrEv,_ZTv0_n12_N3ccc8DD2x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y23pqrEv,_ZThn4_N3ccc8DD2x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y23pqrEv,_ZTv0_n12_N3ccc8DD2x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y2E[] = {
  {&(_ZTVN3ccc8DD2x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y2E[];
static VTBL_ENTRY alt_thunk_names1276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y23pqrEv,_ZTv0_n12_N3ccc8DD2x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y23pqrEv,_ZThn4_N3ccc8DD2x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y2E = {  "_ZN3ccc8DD2x14y2E", // class name
  bases__ZN3ccc8DD2x14y2E, 2,
  &(vtc__ZN3ccc8DD2x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1276,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y3  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x14y33abcEv
  ~CC2x14y3(); // tgen
  CC2x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y3E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y33efgEv");}
void  ccc::CC2x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y33pqrEv");}
void  ccc::CC2x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y33abcEv");}
ccc::CC2x14y3 ::~CC2x14y3(){ note_dtor("_ZN3ccc8CC2x14y3E", this);} // tgen
ccc::CC2x14y3 ::CC2x14y3(){ note_ctor("_ZN3ccc8CC2x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y3E, buf);
    ::ccc::CC2x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y3E);
    dp->::ccc::CC2x14y3::~CC2x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y3E(Test__ZN3ccc8CC2x14y3E, "_ZN3ccc8CC2x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y3C1Ev();
extern void _ZN3ccc8CC2x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y3E[] = {
  NSPAIR(_ZN3ccc8CC2x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y3E[];
extern void _ZN3ccc8CC2x14y33pqrEv();
extern void _ZN3ccc8CC2x14y33efgEv();
extern void _ZN3ccc8CC2x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y33efgEv,_ZTv0_n12_N3ccc8CC2x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y33efgEv,_ZThn4_N3ccc8CC2x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y33abcEv,_ZTv0_n16_N3ccc8CC2x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y33abcEv,_ZThn4_N3ccc8CC2x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y33pqrEv,_ZTv0_n20_N3ccc8CC2x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y33pqrEv,_ZThn4_N3ccc8CC2x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y33efgEv,_ZTv0_n12_N3ccc8CC2x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y33abcEv,_ZTv0_n16_N3ccc8CC2x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y33pqrEv,_ZTv0_n20_N3ccc8CC2x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y3E[] = {
  {&(_ZTVN3ccc8CC2x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y3E[];
static VTBL_ENTRY alt_thunk_names1277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y33pqrEv,_ZTv0_n20_N3ccc8CC2x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y33pqrEv,_ZThn4_N3ccc8CC2x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y33abcEv,_ZTv0_n16_N3ccc8CC2x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y33abcEv,_ZThn4_N3ccc8CC2x14y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y33efgEv,_ZTv0_n12_N3ccc8CC2x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y33efgEv,_ZThn4_N3ccc8CC2x14y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y3E = {  "_ZN3ccc8CC2x14y3E", // class name
  bases__ZN3ccc8CC2x14y3E, 2,
  &(vtc__ZN3ccc8CC2x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1277,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y3  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD2x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x14y33abcEv
  ~DD2x14y3(); // tgen
  DD2x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y3E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y33efgEv");}
void  ccc::DD2x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y33pqrEv");}
void  ccc::DD2x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y33abcEv");}
ccc::DD2x14y3 ::~DD2x14y3(){ note_dtor("_ZN3ccc8DD2x14y3E", this);} // tgen
ccc::DD2x14y3 ::DD2x14y3(){ note_ctor("_ZN3ccc8DD2x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y3E, buf);
    ::ccc::DD2x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y3E);
    dp->::ccc::DD2x14y3::~DD2x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y3E(Test__ZN3ccc8DD2x14y3E, "_ZN3ccc8DD2x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y3C1Ev();
extern void _ZN3ccc8DD2x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y3E[] = {
  NSPAIR(_ZN3ccc8DD2x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y3E[];
extern void _ZN3ccc8DD2x14y33efgEv();
extern void _ZN3ccc8DD2x14y33abcEv();
extern void _ZN3ccc8DD2x14y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y33pqrEv,_ZTv0_n12_N3ccc8DD2x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y33pqrEv,_ZThn4_N3ccc8DD2x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y33pqrEv,_ZTv0_n12_N3ccc8DD2x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y3E[] = {
  {&(_ZTVN3ccc8DD2x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y3E[];
static VTBL_ENTRY alt_thunk_names1278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y33pqrEv,_ZTv0_n12_N3ccc8DD2x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y33pqrEv,_ZThn4_N3ccc8DD2x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y3E = {  "_ZN3ccc8DD2x14y3E", // class name
  bases__ZN3ccc8DD2x14y3E, 2,
  &(vtc__ZN3ccc8DD2x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y4  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC2x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y43efgEv
  ~CC2x14y4(); // tgen
  CC2x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y4E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y43pqrEv");}
void  ccc::CC2x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y43abcEv");}
void  ccc::CC2x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y43efgEv");}
ccc::CC2x14y4 ::~CC2x14y4(){ note_dtor("_ZN3ccc8CC2x14y4E", this);} // tgen
ccc::CC2x14y4 ::CC2x14y4(){ note_ctor("_ZN3ccc8CC2x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y4E, buf);
    ::ccc::CC2x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y4E);
    dp->::ccc::CC2x14y4::~CC2x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y4E(Test__ZN3ccc8CC2x14y4E, "_ZN3ccc8CC2x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y4C1Ev();
extern void _ZN3ccc8CC2x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y4E[] = {
  NSPAIR(_ZN3ccc8CC2x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y4E[];
extern void _ZN3ccc8CC2x14y43pqrEv();
extern void _ZN3ccc8CC2x14y43abcEv();
extern void _ZN3ccc8CC2x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y43efgEv,_ZTv0_n12_N3ccc8CC2x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y43efgEv,_ZThn4_N3ccc8CC2x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y43abcEv,_ZTv0_n16_N3ccc8CC2x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y43abcEv,_ZThn4_N3ccc8CC2x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y43pqrEv,_ZTv0_n20_N3ccc8CC2x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y43pqrEv,_ZThn4_N3ccc8CC2x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y43efgEv,_ZTv0_n12_N3ccc8CC2x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y43abcEv,_ZTv0_n16_N3ccc8CC2x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y43pqrEv,_ZTv0_n20_N3ccc8CC2x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y4E[] = {
  {&(_ZTVN3ccc8CC2x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y4E[];
static VTBL_ENTRY alt_thunk_names1279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y43pqrEv,_ZTv0_n20_N3ccc8CC2x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y43pqrEv,_ZThn4_N3ccc8CC2x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y43abcEv,_ZTv0_n16_N3ccc8CC2x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y43abcEv,_ZThn4_N3ccc8CC2x14y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y43efgEv,_ZTv0_n12_N3ccc8CC2x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y43efgEv,_ZThn4_N3ccc8CC2x14y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y4E = {  "_ZN3ccc8CC2x14y4E", // class name
  bases__ZN3ccc8CC2x14y4E, 2,
  &(vtc__ZN3ccc8CC2x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1279,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y4  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD2x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x14y43efgEv
  ~DD2x14y4(); // tgen
  DD2x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y4E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y43pqrEv");}
void  ccc::DD2x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y43abcEv");}
void  ccc::DD2x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y43efgEv");}
ccc::DD2x14y4 ::~DD2x14y4(){ note_dtor("_ZN3ccc8DD2x14y4E", this);} // tgen
ccc::DD2x14y4 ::DD2x14y4(){ note_ctor("_ZN3ccc8DD2x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y4E, buf);
    ::ccc::DD2x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y4E);
    dp->::ccc::DD2x14y4::~DD2x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y4E(Test__ZN3ccc8DD2x14y4E, "_ZN3ccc8DD2x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y4C1Ev();
extern void _ZN3ccc8DD2x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y4E[] = {
  NSPAIR(_ZN3ccc8DD2x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y4E[];
extern void _ZN3ccc8DD2x14y43efgEv();
extern void _ZN3ccc8DD2x14y43abcEv();
extern void _ZN3ccc8DD2x14y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y43pqrEv,_ZTv0_n12_N3ccc8DD2x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y43pqrEv,_ZThn4_N3ccc8DD2x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y43pqrEv,_ZTv0_n12_N3ccc8DD2x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y4E[] = {
  {&(_ZTVN3ccc8DD2x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y4E[];
static VTBL_ENTRY alt_thunk_names1280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y43pqrEv,_ZTv0_n12_N3ccc8DD2x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y43pqrEv,_ZThn4_N3ccc8DD2x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y4E = {  "_ZN3ccc8DD2x14y4E", // class name
  bases__ZN3ccc8DD2x14y4E, 2,
  &(vtc__ZN3ccc8DD2x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1280,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y5  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC2x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y53abcEv
  ~CC2x14y5(); // tgen
  CC2x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y5E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y53pqrEv");}
void  ccc::CC2x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y53efgEv");}
void  ccc::CC2x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y53abcEv");}
ccc::CC2x14y5 ::~CC2x14y5(){ note_dtor("_ZN3ccc8CC2x14y5E", this);} // tgen
ccc::CC2x14y5 ::CC2x14y5(){ note_ctor("_ZN3ccc8CC2x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y5E, buf);
    ::ccc::CC2x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y5E);
    dp->::ccc::CC2x14y5::~CC2x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y5E(Test__ZN3ccc8CC2x14y5E, "_ZN3ccc8CC2x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y5C1Ev();
extern void _ZN3ccc8CC2x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y5E[] = {
  NSPAIR(_ZN3ccc8CC2x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y5E[];
extern void _ZN3ccc8CC2x14y53pqrEv();
extern void _ZN3ccc8CC2x14y53efgEv();
extern void _ZN3ccc8CC2x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y53efgEv,_ZTv0_n12_N3ccc8CC2x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y53efgEv,_ZThn4_N3ccc8CC2x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y53abcEv,_ZTv0_n16_N3ccc8CC2x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y53abcEv,_ZThn4_N3ccc8CC2x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y53pqrEv,_ZTv0_n20_N3ccc8CC2x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y53pqrEv,_ZThn4_N3ccc8CC2x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y53efgEv,_ZTv0_n12_N3ccc8CC2x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y53abcEv,_ZTv0_n16_N3ccc8CC2x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y53pqrEv,_ZTv0_n20_N3ccc8CC2x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y5E[] = {
  {&(_ZTVN3ccc8CC2x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y5E[];
static VTBL_ENTRY alt_thunk_names1281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y53pqrEv,_ZTv0_n20_N3ccc8CC2x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y53pqrEv,_ZThn4_N3ccc8CC2x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y53abcEv,_ZTv0_n16_N3ccc8CC2x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y53abcEv,_ZThn4_N3ccc8CC2x14y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y53efgEv,_ZTv0_n12_N3ccc8CC2x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y53efgEv,_ZThn4_N3ccc8CC2x14y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y5E = {  "_ZN3ccc8CC2x14y5E", // class name
  bases__ZN3ccc8CC2x14y5E, 2,
  &(vtc__ZN3ccc8CC2x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1281,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y5  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD2x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x14y53abcEv
  ~DD2x14y5(); // tgen
  DD2x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y5E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y53pqrEv");}
void  ccc::DD2x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y53efgEv");}
void  ccc::DD2x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y53abcEv");}
ccc::DD2x14y5 ::~DD2x14y5(){ note_dtor("_ZN3ccc8DD2x14y5E", this);} // tgen
ccc::DD2x14y5 ::DD2x14y5(){ note_ctor("_ZN3ccc8DD2x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y5E, buf);
    ::ccc::DD2x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y5E);
    dp->::ccc::DD2x14y5::~DD2x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y5E(Test__ZN3ccc8DD2x14y5E, "_ZN3ccc8DD2x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y5C1Ev();
extern void _ZN3ccc8DD2x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y5E[] = {
  NSPAIR(_ZN3ccc8DD2x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y5E[];
extern void _ZN3ccc8DD2x14y53efgEv();
extern void _ZN3ccc8DD2x14y53abcEv();
extern void _ZN3ccc8DD2x14y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y53pqrEv,_ZTv0_n12_N3ccc8DD2x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y53pqrEv,_ZThn4_N3ccc8DD2x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y53pqrEv,_ZTv0_n12_N3ccc8DD2x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y5E[] = {
  {&(_ZTVN3ccc8DD2x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y5E[];
static VTBL_ENTRY alt_thunk_names1282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y53pqrEv,_ZTv0_n12_N3ccc8DD2x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y53pqrEv,_ZThn4_N3ccc8DD2x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y5E = {  "_ZN3ccc8DD2x14y5E", // class name
  bases__ZN3ccc8DD2x14y5E, 2,
  &(vtc__ZN3ccc8DD2x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1282,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y6  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y63efgEv
  ~CC2x14y6(); // tgen
  CC2x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y6E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y63abcEv");}
void  ccc::CC2x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y63efgEv");}
ccc::CC2x14y6 ::~CC2x14y6(){ note_dtor("_ZN3ccc8CC2x14y6E", this);} // tgen
ccc::CC2x14y6 ::CC2x14y6(){ note_ctor("_ZN3ccc8CC2x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y6E, buf);
    ::ccc::CC2x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y6E);
    dp->::ccc::CC2x14y6::~CC2x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y6E(Test__ZN3ccc8CC2x14y6E, "_ZN3ccc8CC2x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y6C1Ev();
extern void _ZN3ccc8CC2x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y6E[] = {
  NSPAIR(_ZN3ccc8CC2x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC2x14y63abcEv();
extern void _ZN3ccc8CC2x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y63efgEv,_ZTv0_n12_N3ccc8CC2x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y63efgEv,_ZThn4_N3ccc8CC2x14y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y63abcEv,_ZTv0_n16_N3ccc8CC2x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y63abcEv,_ZThn4_N3ccc8CC2x14y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y63efgEv,_ZTv0_n12_N3ccc8CC2x14y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y63abcEv,_ZTv0_n16_N3ccc8CC2x14y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y6E[] = {
  {&(_ZTVN3ccc8CC2x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y6E[];
static VTBL_ENTRY alt_thunk_names1283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y63abcEv,_ZTv0_n16_N3ccc8CC2x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y63abcEv,_ZThn4_N3ccc8CC2x14y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y63efgEv,_ZTv0_n12_N3ccc8CC2x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y63efgEv,_ZThn4_N3ccc8CC2x14y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y6E = {  "_ZN3ccc8CC2x14y6E", // class name
  bases__ZN3ccc8CC2x14y6E, 2,
  &(vtc__ZN3ccc8CC2x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1283,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y6  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD2x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x14y63efgEv
  ~DD2x14y6(); // tgen
  DD2x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y6E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y63abcEv");}
void  ccc::DD2x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y63efgEv");}
ccc::DD2x14y6 ::~DD2x14y6(){ note_dtor("_ZN3ccc8DD2x14y6E", this);} // tgen
ccc::DD2x14y6 ::DD2x14y6(){ note_ctor("_ZN3ccc8DD2x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y6E, buf);
    ::ccc::DD2x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y6E);
    dp->::ccc::DD2x14y6::~DD2x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y6E(Test__ZN3ccc8DD2x14y6E, "_ZN3ccc8DD2x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y6C1Ev();
extern void _ZN3ccc8DD2x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y6E[] = {
  NSPAIR(_ZN3ccc8DD2x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y6E[];
extern void _ZN3ccc8DD2x14y63efgEv();
extern void _ZN3ccc8DD2x14y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y6E[] = {
  {&(_ZTVN3ccc8DD2x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y6E[];
Class_Descriptor cd__ZN3ccc8DD2x14y6E = {  "_ZN3ccc8DD2x14y6E", // class name
  bases__ZN3ccc8DD2x14y6E, 2,
  &(vtc__ZN3ccc8DD2x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y7  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y73pqrEv
  ~CC2x14y7(); // tgen
  CC2x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y7E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y73abcEv");}
void  ccc::CC2x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y73pqrEv");}
ccc::CC2x14y7 ::~CC2x14y7(){ note_dtor("_ZN3ccc8CC2x14y7E", this);} // tgen
ccc::CC2x14y7 ::CC2x14y7(){ note_ctor("_ZN3ccc8CC2x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y7E, buf);
    ::ccc::CC2x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y7E);
    dp->::ccc::CC2x14y7::~CC2x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y7E(Test__ZN3ccc8CC2x14y7E, "_ZN3ccc8CC2x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y7C1Ev();
extern void _ZN3ccc8CC2x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y7E[] = {
  NSPAIR(_ZN3ccc8CC2x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y7E[];
extern void _ZN3ccc8CC2x14y73pqrEv();
extern void _ZN3ccc8CC2x14y73abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y73abcEv,_ZTv0_n16_N3ccc8CC2x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y73abcEv,_ZThn4_N3ccc8CC2x14y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y73pqrEv,_ZTv0_n20_N3ccc8CC2x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y73pqrEv,_ZThn4_N3ccc8CC2x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y73abcEv,_ZTv0_n16_N3ccc8CC2x14y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y73pqrEv,_ZTv0_n20_N3ccc8CC2x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y7E[] = {
  {&(_ZTVN3ccc8CC2x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y7E[];
static VTBL_ENTRY alt_thunk_names1284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y73pqrEv,_ZTv0_n20_N3ccc8CC2x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y73pqrEv,_ZThn4_N3ccc8CC2x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y73abcEv,_ZTv0_n16_N3ccc8CC2x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y73abcEv,_ZThn4_N3ccc8CC2x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y7E = {  "_ZN3ccc8CC2x14y7E", // class name
  bases__ZN3ccc8CC2x14y7E, 2,
  &(vtc__ZN3ccc8CC2x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1284,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y7  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD2x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y73pqrEv
  ~DD2x14y7(); // tgen
  DD2x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y7E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y73abcEv");}
void  ccc::DD2x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y73pqrEv");}
ccc::DD2x14y7 ::~DD2x14y7(){ note_dtor("_ZN3ccc8DD2x14y7E", this);} // tgen
ccc::DD2x14y7 ::DD2x14y7(){ note_ctor("_ZN3ccc8DD2x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y7E, buf);
    ::ccc::DD2x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y7E);
    dp->::ccc::DD2x14y7::~DD2x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y7E(Test__ZN3ccc8DD2x14y7E, "_ZN3ccc8DD2x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y7C1Ev();
extern void _ZN3ccc8DD2x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y7E[] = {
  NSPAIR(_ZN3ccc8DD2x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x14y73abcEv();
extern void _ZN3ccc8DD2x14y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y73pqrEv,_ZTv0_n12_N3ccc8DD2x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y73pqrEv,_ZThn4_N3ccc8DD2x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y73pqrEv,_ZTv0_n12_N3ccc8DD2x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y7E[] = {
  {&(_ZTVN3ccc8DD2x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y7E[];
static VTBL_ENTRY alt_thunk_names1285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y73pqrEv,_ZTv0_n12_N3ccc8DD2x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y73pqrEv,_ZThn4_N3ccc8DD2x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y7E = {  "_ZN3ccc8DD2x14y7E", // class name
  bases__ZN3ccc8DD2x14y7E, 2,
  &(vtc__ZN3ccc8DD2x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1285,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y8  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y83abcEv
  ~CC2x14y8(); // tgen
  CC2x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y8E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y83efgEv");}
void  ccc::CC2x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y83abcEv");}
ccc::CC2x14y8 ::~CC2x14y8(){ note_dtor("_ZN3ccc8CC2x14y8E", this);} // tgen
ccc::CC2x14y8 ::CC2x14y8(){ note_ctor("_ZN3ccc8CC2x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y8E, buf);
    ::ccc::CC2x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y8E);
    dp->::ccc::CC2x14y8::~CC2x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y8E(Test__ZN3ccc8CC2x14y8E, "_ZN3ccc8CC2x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y8C1Ev();
extern void _ZN3ccc8CC2x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y8E[] = {
  NSPAIR(_ZN3ccc8CC2x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC2x14y83efgEv();
extern void _ZN3ccc8CC2x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y83efgEv,_ZTv0_n12_N3ccc8CC2x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y83efgEv,_ZThn4_N3ccc8CC2x14y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC2x14y83abcEv,_ZTv0_n16_N3ccc8CC2x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y83abcEv,_ZThn4_N3ccc8CC2x14y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y83efgEv,_ZTv0_n12_N3ccc8CC2x14y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC2x14y83abcEv,_ZTv0_n16_N3ccc8CC2x14y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y8E[] = {
  {&(_ZTVN3ccc8CC2x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC2x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y8E[];
static VTBL_ENTRY alt_thunk_names1286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC2x14y83abcEv,_ZTv0_n16_N3ccc8CC2x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y83abcEv,_ZThn4_N3ccc8CC2x14y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y83efgEv,_ZTv0_n12_N3ccc8CC2x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y83efgEv,_ZThn4_N3ccc8CC2x14y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y8E = {  "_ZN3ccc8CC2x14y8E", // class name
  bases__ZN3ccc8CC2x14y8E, 2,
  &(vtc__ZN3ccc8CC2x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1286,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y8  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD2x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x14y83abcEv
  ~DD2x14y8(); // tgen
  DD2x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y8E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y83efgEv");}
void  ccc::DD2x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x14y83abcEv");}
ccc::DD2x14y8 ::~DD2x14y8(){ note_dtor("_ZN3ccc8DD2x14y8E", this);} // tgen
ccc::DD2x14y8 ::DD2x14y8(){ note_ctor("_ZN3ccc8DD2x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y8E, buf);
    ::ccc::DD2x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y8E);
    dp->::ccc::DD2x14y8::~DD2x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y8E(Test__ZN3ccc8DD2x14y8E, "_ZN3ccc8DD2x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y8C1Ev();
extern void _ZN3ccc8DD2x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y8E[] = {
  NSPAIR(_ZN3ccc8DD2x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y8E[];
extern void _ZN3ccc8DD2x14y83efgEv();
extern void _ZN3ccc8DD2x14y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y8E[] = {
  {&(_ZTVN3ccc8DD2x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y8E[];
Class_Descriptor cd__ZN3ccc8DD2x14y8E = {  "_ZN3ccc8DD2x14y8E", // class name
  bases__ZN3ccc8DD2x14y8E, 2,
  &(vtc__ZN3ccc8DD2x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y9  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y93pqrEv
  ~CC2x14y9(); // tgen
  CC2x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y9E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y93efgEv");}
void  ccc::CC2x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y93pqrEv");}
ccc::CC2x14y9 ::~CC2x14y9(){ note_dtor("_ZN3ccc8CC2x14y9E", this);} // tgen
ccc::CC2x14y9 ::CC2x14y9(){ note_ctor("_ZN3ccc8CC2x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y9E, buf);
    ::ccc::CC2x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc8CC2x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC2x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y9E);
    dp->::ccc::CC2x14y9::~CC2x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y9E(Test__ZN3ccc8CC2x14y9E, "_ZN3ccc8CC2x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y9C1Ev();
extern void _ZN3ccc8CC2x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y9E[] = {
  NSPAIR(_ZN3ccc8CC2x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y9E[];
extern void _ZN3ccc8CC2x14y93pqrEv();
extern void _ZN3ccc8CC2x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC2x14y93efgEv,_ZTv0_n12_N3ccc8CC2x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y93efgEv,_ZThn4_N3ccc8CC2x14y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC2x14y93pqrEv,_ZTv0_n20_N3ccc8CC2x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y93pqrEv,_ZThn4_N3ccc8CC2x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC2x14y93efgEv,_ZTv0_n12_N3ccc8CC2x14y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC2x14y93pqrEv,_ZTv0_n20_N3ccc8CC2x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x14y9E[] = {
  {&(_ZTVN3ccc8CC2x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC2x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x14y9E[];
static VTBL_ENTRY alt_thunk_names1287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC2x14y93pqrEv,_ZTv0_n20_N3ccc8CC2x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y93pqrEv,_ZThn4_N3ccc8CC2x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC2x14y93efgEv,_ZTv0_n12_N3ccc8CC2x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC2x14y93efgEv,_ZThn4_N3ccc8CC2x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC2x14y9E = {  "_ZN3ccc8CC2x14y9E", // class name
  bases__ZN3ccc8CC2x14y9E, 2,
  &(vtc__ZN3ccc8CC2x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x14y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1287,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y9  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD2x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x14y93pqrEv
  ~DD2x14y9(); // tgen
  DD2x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x14y9E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x14y93efgEv");}
void  ccc::DD2x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x14y93pqrEv");}
ccc::DD2x14y9 ::~DD2x14y9(){ note_dtor("_ZN3ccc8DD2x14y9E", this);} // tgen
ccc::DD2x14y9 ::DD2x14y9(){ note_ctor("_ZN3ccc8DD2x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD2x14y9E, buf);
    ::ccc::DD2x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD2x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x14y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD2x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x14y9E);
    dp->::ccc::DD2x14y9::~DD2x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x14y9E(Test__ZN3ccc8DD2x14y9E, "_ZN3ccc8DD2x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD2x14y9C1Ev();
extern void _ZN3ccc8DD2x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x14y9E[] = {
  NSPAIR(_ZN3ccc8DD2x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD2x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y9E[];
extern void _ZN3ccc8DD2x14y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x14y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD2x14y93pqrEv,_ZTv0_n12_N3ccc8DD2x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD2x14y93pqrEv,_ZThn4_N3ccc8DD2x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD2x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x14y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD2x14y93pqrEv,_ZTv0_n12_N3ccc8DD2x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x14y9E[] = {
  {&(_ZTVN3ccc8DD2x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD2x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x14y9E[];
static VTBL_ENTRY alt_thunk_names1288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD2x14y93pqrEv,_ZTv0_n12_N3ccc8DD2x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD2x14y93pqrEv,_ZThn4_N3ccc8DD2x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD2x14y9E = {  "_ZN3ccc8DD2x14y9E", // class name
  bases__ZN3ccc8DD2x14y9E, 2,
  &(vtc__ZN3ccc8DD2x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD2x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x14y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1288,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y10  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x14y103abcEv
  ~CC2x14y10(); // tgen
  CC2x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y10E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y103pqrEv");}
void  ccc::CC2x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x14y103abcEv");}
ccc::CC2x14y10 ::~CC2x14y10(){ note_dtor("_ZN3ccc9CC2x14y10E", this);} // tgen
ccc::CC2x14y10 ::CC2x14y10(){ note_ctor("_ZN3ccc9CC2x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y10E, buf);
    ::ccc::CC2x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y10E);
    dp->::ccc::CC2x14y10::~CC2x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y10E(Test__ZN3ccc9CC2x14y10E, "_ZN3ccc9CC2x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y10C1Ev();
extern void _ZN3ccc9CC2x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y10E[] = {
  NSPAIR(_ZN3ccc9CC2x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y10E[];
extern void _ZN3ccc9CC2x14y103pqrEv();
extern void _ZN3ccc9CC2x14y103abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x14y103abcEv,_ZTv0_n16_N3ccc9CC2x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y103abcEv,_ZThn4_N3ccc9CC2x14y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x14y103pqrEv,_ZTv0_n20_N3ccc9CC2x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y103pqrEv,_ZThn4_N3ccc9CC2x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x14y103abcEv,_ZTv0_n16_N3ccc9CC2x14y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x14y103pqrEv,_ZTv0_n20_N3ccc9CC2x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y10E[] = {
  {&(_ZTVN3ccc9CC2x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y10E[];
static VTBL_ENTRY alt_thunk_names1289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x14y103pqrEv,_ZTv0_n20_N3ccc9CC2x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y103pqrEv,_ZThn4_N3ccc9CC2x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x14y103abcEv,_ZTv0_n16_N3ccc9CC2x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y103abcEv,_ZThn4_N3ccc9CC2x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x14y10E = {  "_ZN3ccc9CC2x14y10E", // class name
  bases__ZN3ccc9CC2x14y10E, 2,
  &(vtc__ZN3ccc9CC2x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1289,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y10  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD2x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x14y103abcEv
  ~DD2x14y10(); // tgen
  DD2x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y10E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x14y103pqrEv");}
void  ccc::DD2x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x14y103abcEv");}
ccc::DD2x14y10 ::~DD2x14y10(){ note_dtor("_ZN3ccc9DD2x14y10E", this);} // tgen
ccc::DD2x14y10 ::DD2x14y10(){ note_ctor("_ZN3ccc9DD2x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y10E, buf);
    ::ccc::DD2x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y10E);
    dp->::ccc::DD2x14y10::~DD2x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y10E(Test__ZN3ccc9DD2x14y10E, "_ZN3ccc9DD2x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y10C1Ev();
extern void _ZN3ccc9DD2x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y10E[] = {
  NSPAIR(_ZN3ccc9DD2x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x14y103abcEv();
extern void _ZN3ccc9DD2x14y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x14y103pqrEv,_ZTv0_n12_N3ccc9DD2x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x14y103pqrEv,_ZThn4_N3ccc9DD2x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x14y103pqrEv,_ZTv0_n12_N3ccc9DD2x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y10E[] = {
  {&(_ZTVN3ccc9DD2x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y10E[];
static VTBL_ENTRY alt_thunk_names1290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x14y103pqrEv,_ZTv0_n12_N3ccc9DD2x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x14y103pqrEv,_ZThn4_N3ccc9DD2x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x14y10E = {  "_ZN3ccc9DD2x14y10E", // class name
  bases__ZN3ccc9DD2x14y10E, 2,
  &(vtc__ZN3ccc9DD2x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1290,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y11  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x14y113efgEv
  ~CC2x14y11(); // tgen
  CC2x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y11E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y113pqrEv");}
void  ccc::CC2x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x14y113efgEv");}
ccc::CC2x14y11 ::~CC2x14y11(){ note_dtor("_ZN3ccc9CC2x14y11E", this);} // tgen
ccc::CC2x14y11 ::CC2x14y11(){ note_ctor("_ZN3ccc9CC2x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y11E, buf);
    ::ccc::CC2x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y11E);
    dp->::ccc::CC2x14y11::~CC2x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y11E(Test__ZN3ccc9CC2x14y11E, "_ZN3ccc9CC2x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y11C1Ev();
extern void _ZN3ccc9CC2x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y11E[] = {
  NSPAIR(_ZN3ccc9CC2x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y11E[];
extern void _ZN3ccc9CC2x14y113pqrEv();
extern void _ZN3ccc9CC2x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x14y113efgEv,_ZTv0_n12_N3ccc9CC2x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y113efgEv,_ZThn4_N3ccc9CC2x14y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x14y113pqrEv,_ZTv0_n20_N3ccc9CC2x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y113pqrEv,_ZThn4_N3ccc9CC2x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x14y113efgEv,_ZTv0_n12_N3ccc9CC2x14y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x14y113pqrEv,_ZTv0_n20_N3ccc9CC2x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y11E[] = {
  {&(_ZTVN3ccc9CC2x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y11E[];
static VTBL_ENTRY alt_thunk_names1291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x14y113pqrEv,_ZTv0_n20_N3ccc9CC2x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y113pqrEv,_ZThn4_N3ccc9CC2x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x14y113efgEv,_ZTv0_n12_N3ccc9CC2x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y113efgEv,_ZThn4_N3ccc9CC2x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x14y11E = {  "_ZN3ccc9CC2x14y11E", // class name
  bases__ZN3ccc9CC2x14y11E, 2,
  &(vtc__ZN3ccc9CC2x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1291,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y11  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD2x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x14y113efgEv
  ~DD2x14y11(); // tgen
  DD2x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y11E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD2x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x14y113pqrEv");}
void  ccc::DD2x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x14y113efgEv");}
ccc::DD2x14y11 ::~DD2x14y11(){ note_dtor("_ZN3ccc9DD2x14y11E", this);} // tgen
ccc::DD2x14y11 ::DD2x14y11(){ note_ctor("_ZN3ccc9DD2x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y11E, buf);
    ::ccc::DD2x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y11E);
    dp->::ccc::DD2x14y11::~DD2x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y11E(Test__ZN3ccc9DD2x14y11E, "_ZN3ccc9DD2x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y11C1Ev();
extern void _ZN3ccc9DD2x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y11E[] = {
  NSPAIR(_ZN3ccc9DD2x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y11E[];
extern void _ZN3ccc9DD2x14y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x14y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x14y113pqrEv,_ZTv0_n12_N3ccc9DD2x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x14y113pqrEv,_ZThn4_N3ccc9DD2x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x14y113pqrEv,_ZTv0_n12_N3ccc9DD2x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y11E[] = {
  {&(_ZTVN3ccc9DD2x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y11E[];
static VTBL_ENTRY alt_thunk_names1292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x14y113pqrEv,_ZTv0_n12_N3ccc9DD2x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x14y113pqrEv,_ZThn4_N3ccc9DD2x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x14y11E = {  "_ZN3ccc9DD2x14y11E", // class name
  bases__ZN3ccc9DD2x14y11E, 2,
  &(vtc__ZN3ccc9DD2x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1292,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y12  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC2x14y123abcEv
  ~CC2x14y12(); // tgen
  CC2x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x14y123abcEv");}
ccc::CC2x14y12 ::~CC2x14y12(){ note_dtor("_ZN3ccc9CC2x14y12E", this);} // tgen
ccc::CC2x14y12 ::CC2x14y12(){ note_ctor("_ZN3ccc9CC2x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y12E, buf);
    ::ccc::CC2x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y12E);
    dp->::ccc::CC2x14y12::~CC2x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y12E(Test__ZN3ccc9CC2x14y12E, "_ZN3ccc9CC2x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y12C1Ev();
extern void _ZN3ccc9CC2x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y12E[] = {
  NSPAIR(_ZN3ccc9CC2x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC2x14y123abcEv();
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC2x14y123abcEv,_ZTv0_n16_N3ccc9CC2x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y123abcEv,_ZThn4_N3ccc9CC2x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC2x14y123abcEv,_ZTv0_n16_N3ccc9CC2x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y12E[] = {
  {&(_ZTVN3ccc9CC2x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y12E[];
static VTBL_ENTRY alt_thunk_names1293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC2x14y123abcEv,_ZTv0_n16_N3ccc9CC2x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y123abcEv,_ZThn4_N3ccc9CC2x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x14y12E = {  "_ZN3ccc9CC2x14y12E", // class name
  bases__ZN3ccc9CC2x14y12E, 2,
  &(vtc__ZN3ccc9CC2x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1293,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y12  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD2x14y123abcEv
  ~DD2x14y12(); // tgen
  DD2x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x14y123abcEv");}
ccc::DD2x14y12 ::~DD2x14y12(){ note_dtor("_ZN3ccc9DD2x14y12E", this);} // tgen
ccc::DD2x14y12 ::DD2x14y12(){ note_ctor("_ZN3ccc9DD2x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y12E, buf);
    ::ccc::DD2x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y12E);
    dp->::ccc::DD2x14y12::~DD2x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y12E(Test__ZN3ccc9DD2x14y12E, "_ZN3ccc9DD2x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y12C1Ev();
extern void _ZN3ccc9DD2x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y12E[] = {
  NSPAIR(_ZN3ccc9DD2x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x14y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y12E[] = {
  {&(_ZTVN3ccc9DD2x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y12E[];
Class_Descriptor cd__ZN3ccc9DD2x14y12E = {  "_ZN3ccc9DD2x14y12E", // class name
  bases__ZN3ccc9DD2x14y12E, 2,
  &(vtc__ZN3ccc9DD2x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y13  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC2x14y133efgEv
  ~CC2x14y13(); // tgen
  CC2x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x14y133efgEv");}
ccc::CC2x14y13 ::~CC2x14y13(){ note_dtor("_ZN3ccc9CC2x14y13E", this);} // tgen
ccc::CC2x14y13 ::CC2x14y13(){ note_ctor("_ZN3ccc9CC2x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y13E, buf);
    ::ccc::CC2x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y13E);
    dp->::ccc::CC2x14y13::~CC2x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y13E(Test__ZN3ccc9CC2x14y13E, "_ZN3ccc9CC2x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y13C1Ev();
extern void _ZN3ccc9CC2x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y13E[] = {
  NSPAIR(_ZN3ccc9CC2x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC2x14y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC2x14y133efgEv,_ZTv0_n12_N3ccc9CC2x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y133efgEv,_ZThn4_N3ccc9CC2x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC2x14y133efgEv,_ZTv0_n12_N3ccc9CC2x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y13E[] = {
  {&(_ZTVN3ccc9CC2x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC2x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y13E[];
static VTBL_ENTRY alt_thunk_names1294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC2x14y133efgEv,_ZTv0_n12_N3ccc9CC2x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y133efgEv,_ZThn4_N3ccc9CC2x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x14y13E = {  "_ZN3ccc9CC2x14y13E", // class name
  bases__ZN3ccc9CC2x14y13E, 2,
  &(vtc__ZN3ccc9CC2x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1294,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y13  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD2x14y133efgEv
  ~DD2x14y13(); // tgen
  DD2x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD2x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x14y133efgEv");}
ccc::DD2x14y13 ::~DD2x14y13(){ note_dtor("_ZN3ccc9DD2x14y13E", this);} // tgen
ccc::DD2x14y13 ::DD2x14y13(){ note_ctor("_ZN3ccc9DD2x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y13E, buf);
    ::ccc::DD2x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y13E);
    dp->::ccc::DD2x14y13::~DD2x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y13E(Test__ZN3ccc9DD2x14y13E, "_ZN3ccc9DD2x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y13C1Ev();
extern void _ZN3ccc9DD2x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y13E[] = {
  NSPAIR(_ZN3ccc9DD2x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y13E[];
extern void _ZN3ccc9DD2x14y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y13E[] = {
  {&(_ZTVN3ccc9DD2x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y13E[];
Class_Descriptor cd__ZN3ccc9DD2x14y13E = {  "_ZN3ccc9DD2x14y13E", // class name
  bases__ZN3ccc9DD2x14y13E, 2,
  &(vtc__ZN3ccc9DD2x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y14  : virtual ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y143pqrEv
  ~CC2x14y14(); // tgen
  CC2x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y14E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y143pqrEv");}
ccc::CC2x14y14 ::~CC2x14y14(){ note_dtor("_ZN3ccc9CC2x14y14E", this);} // tgen
ccc::CC2x14y14 ::CC2x14y14(){ note_ctor("_ZN3ccc9CC2x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y14E, buf);
    ::ccc::CC2x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y14E);
    dp->::ccc::CC2x14y14::~CC2x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y14E(Test__ZN3ccc9CC2x14y14E, "_ZN3ccc9CC2x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y14C1Ev();
extern void _ZN3ccc9CC2x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y14E[] = {
  NSPAIR(_ZN3ccc9CC2x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y14E[];
extern void _ZN3ccc9CC2x14y143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC2x14y143pqrEv,_ZTv0_n20_N3ccc9CC2x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y143pqrEv,_ZThn4_N3ccc9CC2x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC2x14y143pqrEv,_ZTv0_n20_N3ccc9CC2x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y14E[] = {
  {&(_ZTVN3ccc9CC2x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y14E[];
static VTBL_ENTRY alt_thunk_names1295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC2x14y143pqrEv,_ZTv0_n20_N3ccc9CC2x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC2x14y143pqrEv,_ZThn4_N3ccc9CC2x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC2x14y14E = {  "_ZN3ccc9CC2x14y14E", // class name
  bases__ZN3ccc9CC2x14y14E, 2,
  &(vtc__ZN3ccc9CC2x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1295,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y14  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD2x14y143pqrEv
  ~DD2x14y14(); // tgen
  DD2x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y14E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD2x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x14y143pqrEv");}
ccc::DD2x14y14 ::~DD2x14y14(){ note_dtor("_ZN3ccc9DD2x14y14E", this);} // tgen
ccc::DD2x14y14 ::DD2x14y14(){ note_ctor("_ZN3ccc9DD2x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y14E, buf);
    ::ccc::DD2x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y14E);
    dp->::ccc::DD2x14y14::~DD2x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y14E(Test__ZN3ccc9DD2x14y14E, "_ZN3ccc9DD2x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y14C1Ev();
extern void _ZN3ccc9DD2x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y14E[] = {
  NSPAIR(_ZN3ccc9DD2x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD2x14y143pqrEv,_ZTv0_n12_N3ccc9DD2x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD2x14y143pqrEv,_ZThn4_N3ccc9DD2x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD2x14y143pqrEv,_ZTv0_n12_N3ccc9DD2x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y14E[] = {
  {&(_ZTVN3ccc9DD2x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y14E[];
static VTBL_ENTRY alt_thunk_names1296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD2x14y143pqrEv,_ZTv0_n12_N3ccc9DD2x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD2x14y143pqrEv,_ZThn4_N3ccc9DD2x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD2x14y14E = {  "_ZN3ccc9DD2x14y14E", // class name
  bases__ZN3ccc9DD2x14y14E, 2,
  &(vtc__ZN3ccc9DD2x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y15  : virtual ::ccc::AA2 , ::ccc::BB14 {
  ~CC2x14y15(); // tgen
  CC2x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x14y15 ::~CC2x14y15(){ note_dtor("_ZN3ccc9CC2x14y15E", this);} // tgen
ccc::CC2x14y15 ::CC2x14y15(){ note_ctor("_ZN3ccc9CC2x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y15E, buf);
    ::ccc::CC2x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), ABISELECT(8,4), "_ZN3ccc9CC2x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC2x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y15E);
    dp->::ccc::CC2x14y15::~CC2x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y15E(Test__ZN3ccc9CC2x14y15E, "_ZN3ccc9CC2x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y15C1Ev();
extern void _ZN3ccc9CC2x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y15E[] = {
  NSPAIR(_ZN3ccc9CC2x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x14y15E[] = {
  {&(_ZTVN3ccc9CC2x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC2x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x14y15E[];
Class_Descriptor cd__ZN3ccc9CC2x14y15E = {  "_ZN3ccc9CC2x14y15E", // class name
  bases__ZN3ccc9CC2x14y15E, 2,
  &(vtc__ZN3ccc9CC2x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x14y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD2x14y15  : virtual ::ccc::AA2 , virtual ::ccc::BB14 {
  ~DD2x14y15(); // tgen
  DD2x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD2x14y15 ::~DD2x14y15(){ note_dtor("_ZN3ccc9DD2x14y15E", this);} // tgen
ccc::DD2x14y15 ::DD2x14y15(){ note_ctor("_ZN3ccc9DD2x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD2x14y15E, buf);
    ::ccc::DD2x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD2x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x14y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD2x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x14y15E);
    dp->::ccc::DD2x14y15::~DD2x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x14y15E(Test__ZN3ccc9DD2x14y15E, "_ZN3ccc9DD2x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD2x14y15C1Ev();
extern void _ZN3ccc9DD2x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x14y15E[] = {
  NSPAIR(_ZN3ccc9DD2x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD2x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x14y15E[] = {
  {&(_ZTVN3ccc9DD2x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD2x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x14y15E[];
Class_Descriptor cd__ZN3ccc9DD2x14y15E = {  "_ZN3ccc9DD2x14y15E", // class name
  bases__ZN3ccc9DD2x14y15E, 2,
  &(vtc__ZN3ccc9DD2x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD2x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x14y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y0  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y03pqrEv
  ~CC2x15y0(); // tgen
  CC2x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y0E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y03abcEv");}
void  ccc::CC2x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y03efgEv");}
void  ccc::CC2x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y03pqrEv");}
ccc::CC2x15y0 ::~CC2x15y0(){ note_dtor("_ZN3ccc8CC2x15y0E", this);} // tgen
ccc::CC2x15y0 ::CC2x15y0(){ note_ctor("_ZN3ccc8CC2x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y0E, buf);
    ::ccc::CC2x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y0E);
    dp->::ccc::CC2x15y0::~CC2x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y0E(Test__ZN3ccc8CC2x15y0E, "_ZN3ccc8CC2x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y0C1Ev();
extern void _ZN3ccc8CC2x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y0E[] = {
  NSPAIR(_ZN3ccc8CC2x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y0E[];
extern void _ZN3ccc8CC2x15y03efgEv();
extern void _ZN3ccc8CC2x15y03abcEv();
extern void _ZN3ccc8CC2x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y0E[] = {
  {&(_ZTVN3ccc8CC2x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y0E[];
Class_Descriptor cd__ZN3ccc8CC2x15y0E = {  "_ZN3ccc8CC2x15y0E", // class name
  bases__ZN3ccc8CC2x15y0E, 2,
  &(vtc__ZN3ccc8CC2x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y0E),2, //virtual 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  DD2x15y0  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD2x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD2x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y03pqrEv
  ~DD2x15y0(); // tgen
  DD2x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y0E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y03abcEv");}
void  ccc::DD2x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y03efgEv");}
void  ccc::DD2x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y03pqrEv");}
ccc::DD2x15y0 ::~DD2x15y0(){ note_dtor("_ZN3ccc8DD2x15y0E", this);} // tgen
ccc::DD2x15y0 ::DD2x15y0(){ note_ctor("_ZN3ccc8DD2x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y0E, buf);
    ::ccc::DD2x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y0E);
    dp->::ccc::DD2x15y0::~DD2x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y0E(Test__ZN3ccc8DD2x15y0E, "_ZN3ccc8DD2x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y0C1Ev();
extern void _ZN3ccc8DD2x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y0E[] = {
  NSPAIR(_ZN3ccc8DD2x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y0E[];
extern void _ZN3ccc8DD2x15y03efgEv();
extern void _ZN3ccc8DD2x15y03abcEv();
extern void _ZN3ccc8DD2x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y0E[] = {
  {&(_ZTVN3ccc8DD2x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y0E[];
Class_Descriptor cd__ZN3ccc8DD2x15y0E = {  "_ZN3ccc8DD2x15y0E", // class name
  bases__ZN3ccc8DD2x15y0E, 2,
  &(vtc__ZN3ccc8DD2x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y0E),2, //virtual 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  CC2x15y1  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x15y13efgEv
  ~CC2x15y1(); // tgen
  CC2x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y1E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y13abcEv");}
void  ccc::CC2x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y13pqrEv");}
void  ccc::CC2x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y13efgEv");}
ccc::CC2x15y1 ::~CC2x15y1(){ note_dtor("_ZN3ccc8CC2x15y1E", this);} // tgen
ccc::CC2x15y1 ::CC2x15y1(){ note_ctor("_ZN3ccc8CC2x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y1E, buf);
    ::ccc::CC2x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y1E);
    dp->::ccc::CC2x15y1::~CC2x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y1E(Test__ZN3ccc8CC2x15y1E, "_ZN3ccc8CC2x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y1C1Ev();
extern void _ZN3ccc8CC2x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y1E[] = {
  NSPAIR(_ZN3ccc8CC2x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y1E[];
extern void _ZN3ccc8CC2x15y13efgEv();
extern void _ZN3ccc8CC2x15y13abcEv();
extern void _ZN3ccc8CC2x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y1E[] = {
  {&(_ZTVN3ccc8CC2x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y1E[];
Class_Descriptor cd__ZN3ccc8CC2x15y1E = {  "_ZN3ccc8CC2x15y1E", // class name
  bases__ZN3ccc8CC2x15y1E, 2,
  &(vtc__ZN3ccc8CC2x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y1E),2, //virtual 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  DD2x15y1  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD2x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x15y13efgEv
  ~DD2x15y1(); // tgen
  DD2x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y1E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y13abcEv");}
void  ccc::DD2x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y13pqrEv");}
void  ccc::DD2x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y13efgEv");}
ccc::DD2x15y1 ::~DD2x15y1(){ note_dtor("_ZN3ccc8DD2x15y1E", this);} // tgen
ccc::DD2x15y1 ::DD2x15y1(){ note_ctor("_ZN3ccc8DD2x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y1E, buf);
    ::ccc::DD2x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y1E);
    dp->::ccc::DD2x15y1::~DD2x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y1E(Test__ZN3ccc8DD2x15y1E, "_ZN3ccc8DD2x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y1C1Ev();
extern void _ZN3ccc8DD2x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y1E[] = {
  NSPAIR(_ZN3ccc8DD2x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y1E[];
extern void _ZN3ccc8DD2x15y13efgEv();
extern void _ZN3ccc8DD2x15y13abcEv();
extern void _ZN3ccc8DD2x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y1E[] = {
  {&(_ZTVN3ccc8DD2x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y1E[];
Class_Descriptor cd__ZN3ccc8DD2x15y1E = {  "_ZN3ccc8DD2x15y1E", // class name
  bases__ZN3ccc8DD2x15y1E, 2,
  &(vtc__ZN3ccc8DD2x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y1E),2, //virtual 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  CC2x15y2  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y23pqrEv
  ~CC2x15y2(); // tgen
  CC2x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y2E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y23efgEv");}
void  ccc::CC2x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y23abcEv");}
void  ccc::CC2x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y23pqrEv");}
ccc::CC2x15y2 ::~CC2x15y2(){ note_dtor("_ZN3ccc8CC2x15y2E", this);} // tgen
ccc::CC2x15y2 ::CC2x15y2(){ note_ctor("_ZN3ccc8CC2x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y2E, buf);
    ::ccc::CC2x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y2E);
    dp->::ccc::CC2x15y2::~CC2x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y2E(Test__ZN3ccc8CC2x15y2E, "_ZN3ccc8CC2x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y2C1Ev();
extern void _ZN3ccc8CC2x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y2E[] = {
  NSPAIR(_ZN3ccc8CC2x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y2E[];
extern void _ZN3ccc8CC2x15y23efgEv();
extern void _ZN3ccc8CC2x15y23abcEv();
extern void _ZN3ccc8CC2x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y2E[] = {
  {&(_ZTVN3ccc8CC2x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y2E[];
Class_Descriptor cd__ZN3ccc8CC2x15y2E = {  "_ZN3ccc8CC2x15y2E", // class name
  bases__ZN3ccc8CC2x15y2E, 2,
  &(vtc__ZN3ccc8CC2x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y2E),2, //virtual 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  DD2x15y2  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD2x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD2x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y23pqrEv
  ~DD2x15y2(); // tgen
  DD2x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y2E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y23efgEv");}
void  ccc::DD2x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y23abcEv");}
void  ccc::DD2x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y23pqrEv");}
ccc::DD2x15y2 ::~DD2x15y2(){ note_dtor("_ZN3ccc8DD2x15y2E", this);} // tgen
ccc::DD2x15y2 ::DD2x15y2(){ note_ctor("_ZN3ccc8DD2x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y2E, buf);
    ::ccc::DD2x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y2E);
    dp->::ccc::DD2x15y2::~DD2x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y2E(Test__ZN3ccc8DD2x15y2E, "_ZN3ccc8DD2x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y2C1Ev();
extern void _ZN3ccc8DD2x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y2E[] = {
  NSPAIR(_ZN3ccc8DD2x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y2E[];
extern void _ZN3ccc8DD2x15y23efgEv();
extern void _ZN3ccc8DD2x15y23abcEv();
extern void _ZN3ccc8DD2x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y2E[] = {
  {&(_ZTVN3ccc8DD2x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y2E[];
Class_Descriptor cd__ZN3ccc8DD2x15y2E = {  "_ZN3ccc8DD2x15y2E", // class name
  bases__ZN3ccc8DD2x15y2E, 2,
  &(vtc__ZN3ccc8DD2x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y2E),2, //virtual 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  CC2x15y3  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x15y33abcEv
  ~CC2x15y3(); // tgen
  CC2x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y3E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y33efgEv");}
void  ccc::CC2x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y33pqrEv");}
void  ccc::CC2x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y33abcEv");}
ccc::CC2x15y3 ::~CC2x15y3(){ note_dtor("_ZN3ccc8CC2x15y3E", this);} // tgen
ccc::CC2x15y3 ::CC2x15y3(){ note_ctor("_ZN3ccc8CC2x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y3E, buf);
    ::ccc::CC2x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y3E);
    dp->::ccc::CC2x15y3::~CC2x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y3E(Test__ZN3ccc8CC2x15y3E, "_ZN3ccc8CC2x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y3C1Ev();
extern void _ZN3ccc8CC2x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y3E[] = {
  NSPAIR(_ZN3ccc8CC2x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y3E[];
extern void _ZN3ccc8CC2x15y33efgEv();
extern void _ZN3ccc8CC2x15y33abcEv();
extern void _ZN3ccc8CC2x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y3E[] = {
  {&(_ZTVN3ccc8CC2x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y3E[];
Class_Descriptor cd__ZN3ccc8CC2x15y3E = {  "_ZN3ccc8CC2x15y3E", // class name
  bases__ZN3ccc8CC2x15y3E, 2,
  &(vtc__ZN3ccc8CC2x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y3E),2, //virtual 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  DD2x15y3  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD2x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x15y33abcEv
  ~DD2x15y3(); // tgen
  DD2x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y3E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y33efgEv");}
void  ccc::DD2x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y33pqrEv");}
void  ccc::DD2x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y33abcEv");}
ccc::DD2x15y3 ::~DD2x15y3(){ note_dtor("_ZN3ccc8DD2x15y3E", this);} // tgen
ccc::DD2x15y3 ::DD2x15y3(){ note_ctor("_ZN3ccc8DD2x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y3E, buf);
    ::ccc::DD2x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y3E);
    dp->::ccc::DD2x15y3::~DD2x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y3E(Test__ZN3ccc8DD2x15y3E, "_ZN3ccc8DD2x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y3C1Ev();
extern void _ZN3ccc8DD2x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y3E[] = {
  NSPAIR(_ZN3ccc8DD2x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y3E[];
extern void _ZN3ccc8DD2x15y33efgEv();
extern void _ZN3ccc8DD2x15y33abcEv();
extern void _ZN3ccc8DD2x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y3E[] = {
  {&(_ZTVN3ccc8DD2x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y3E[];
Class_Descriptor cd__ZN3ccc8DD2x15y3E = {  "_ZN3ccc8DD2x15y3E", // class name
  bases__ZN3ccc8DD2x15y3E, 2,
  &(vtc__ZN3ccc8DD2x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y3E),2, //virtual 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  CC2x15y4  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC2x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y43efgEv
  ~CC2x15y4(); // tgen
  CC2x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y4E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y43pqrEv");}
void  ccc::CC2x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y43abcEv");}
void  ccc::CC2x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y43efgEv");}
ccc::CC2x15y4 ::~CC2x15y4(){ note_dtor("_ZN3ccc8CC2x15y4E", this);} // tgen
ccc::CC2x15y4 ::CC2x15y4(){ note_ctor("_ZN3ccc8CC2x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y4E, buf);
    ::ccc::CC2x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y4E);
    dp->::ccc::CC2x15y4::~CC2x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y4E(Test__ZN3ccc8CC2x15y4E, "_ZN3ccc8CC2x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y4C1Ev();
extern void _ZN3ccc8CC2x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y4E[] = {
  NSPAIR(_ZN3ccc8CC2x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y4E[];
extern void _ZN3ccc8CC2x15y43efgEv();
extern void _ZN3ccc8CC2x15y43abcEv();
extern void _ZN3ccc8CC2x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y4E[] = {
  {&(_ZTVN3ccc8CC2x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y4E[];
Class_Descriptor cd__ZN3ccc8CC2x15y4E = {  "_ZN3ccc8CC2x15y4E", // class name
  bases__ZN3ccc8CC2x15y4E, 2,
  &(vtc__ZN3ccc8CC2x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y4E),2, //virtual 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  DD2x15y4  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD2x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD2x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD2x15y43efgEv
  ~DD2x15y4(); // tgen
  DD2x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y4E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y43pqrEv");}
void  ccc::DD2x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y43abcEv");}
void  ccc::DD2x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y43efgEv");}
ccc::DD2x15y4 ::~DD2x15y4(){ note_dtor("_ZN3ccc8DD2x15y4E", this);} // tgen
ccc::DD2x15y4 ::DD2x15y4(){ note_ctor("_ZN3ccc8DD2x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y4E, buf);
    ::ccc::DD2x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y4E);
    dp->::ccc::DD2x15y4::~DD2x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y4E(Test__ZN3ccc8DD2x15y4E, "_ZN3ccc8DD2x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y4C1Ev();
extern void _ZN3ccc8DD2x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y4E[] = {
  NSPAIR(_ZN3ccc8DD2x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y4E[];
extern void _ZN3ccc8DD2x15y43efgEv();
extern void _ZN3ccc8DD2x15y43abcEv();
extern void _ZN3ccc8DD2x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y4E[] = {
  {&(_ZTVN3ccc8DD2x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y4E[];
Class_Descriptor cd__ZN3ccc8DD2x15y4E = {  "_ZN3ccc8DD2x15y4E", // class name
  bases__ZN3ccc8DD2x15y4E, 2,
  &(vtc__ZN3ccc8DD2x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y4E),2, //virtual 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  CC2x15y5  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC2x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y53abcEv
  ~CC2x15y5(); // tgen
  CC2x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y5E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y53pqrEv");}
void  ccc::CC2x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y53efgEv");}
void  ccc::CC2x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y53abcEv");}
ccc::CC2x15y5 ::~CC2x15y5(){ note_dtor("_ZN3ccc8CC2x15y5E", this);} // tgen
ccc::CC2x15y5 ::CC2x15y5(){ note_ctor("_ZN3ccc8CC2x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y5E, buf);
    ::ccc::CC2x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y5E);
    dp->::ccc::CC2x15y5::~CC2x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y5E(Test__ZN3ccc8CC2x15y5E, "_ZN3ccc8CC2x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y5C1Ev();
extern void _ZN3ccc8CC2x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y5E[] = {
  NSPAIR(_ZN3ccc8CC2x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y5E[];
extern void _ZN3ccc8CC2x15y53efgEv();
extern void _ZN3ccc8CC2x15y53abcEv();
extern void _ZN3ccc8CC2x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y5E[] = {
  {&(_ZTVN3ccc8CC2x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y5E[];
Class_Descriptor cd__ZN3ccc8CC2x15y5E = {  "_ZN3ccc8CC2x15y5E", // class name
  bases__ZN3ccc8CC2x15y5E, 2,
  &(vtc__ZN3ccc8CC2x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y5E),2, //virtual 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  DD2x15y5  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD2x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD2x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD2x15y53abcEv
  ~DD2x15y5(); // tgen
  DD2x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y5E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD2x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y53pqrEv");}
void  ccc::DD2x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y53efgEv");}
void  ccc::DD2x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y53abcEv");}
ccc::DD2x15y5 ::~DD2x15y5(){ note_dtor("_ZN3ccc8DD2x15y5E", this);} // tgen
ccc::DD2x15y5 ::DD2x15y5(){ note_ctor("_ZN3ccc8DD2x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y5E, buf);
    ::ccc::DD2x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y5E);
    dp->::ccc::DD2x15y5::~DD2x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y5E(Test__ZN3ccc8DD2x15y5E, "_ZN3ccc8DD2x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y5C1Ev();
extern void _ZN3ccc8DD2x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y5E[] = {
  NSPAIR(_ZN3ccc8DD2x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y5E[];
extern void _ZN3ccc8DD2x15y53efgEv();
extern void _ZN3ccc8DD2x15y53abcEv();
extern void _ZN3ccc8DD2x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y5E[] = {
  {&(_ZTVN3ccc8DD2x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y5E[];
Class_Descriptor cd__ZN3ccc8DD2x15y5E = {  "_ZN3ccc8DD2x15y5E", // class name
  bases__ZN3ccc8DD2x15y5E, 2,
  &(vtc__ZN3ccc8DD2x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y5E),2, //virtual 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  CC2x15y6  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y63efgEv
  ~CC2x15y6(); // tgen
  CC2x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y6E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y63abcEv");}
void  ccc::CC2x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y63efgEv");}
ccc::CC2x15y6 ::~CC2x15y6(){ note_dtor("_ZN3ccc8CC2x15y6E", this);} // tgen
ccc::CC2x15y6 ::CC2x15y6(){ note_ctor("_ZN3ccc8CC2x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y6E, buf);
    ::ccc::CC2x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y6E);
    dp->::ccc::CC2x15y6::~CC2x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y6E(Test__ZN3ccc8CC2x15y6E, "_ZN3ccc8CC2x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y6C1Ev();
extern void _ZN3ccc8CC2x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y6E[] = {
  NSPAIR(_ZN3ccc8CC2x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y6E[];
extern void _ZN3ccc8CC2x15y63efgEv();
extern void _ZN3ccc8CC2x15y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y6E[] = {
  {&(_ZTVN3ccc8CC2x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y6E[];
Class_Descriptor cd__ZN3ccc8CC2x15y6E = {  "_ZN3ccc8CC2x15y6E", // class name
  bases__ZN3ccc8CC2x15y6E, 2,
  &(vtc__ZN3ccc8CC2x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y6E),2, //virtual 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  DD2x15y6  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD2x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD2x15y63efgEv
  ~DD2x15y6(); // tgen
  DD2x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y6E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y63abcEv");}
void  ccc::DD2x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y63efgEv");}
ccc::DD2x15y6 ::~DD2x15y6(){ note_dtor("_ZN3ccc8DD2x15y6E", this);} // tgen
ccc::DD2x15y6 ::DD2x15y6(){ note_ctor("_ZN3ccc8DD2x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y6E, buf);
    ::ccc::DD2x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y6E);
    dp->::ccc::DD2x15y6::~DD2x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y6E(Test__ZN3ccc8DD2x15y6E, "_ZN3ccc8DD2x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y6C1Ev();
extern void _ZN3ccc8DD2x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y6E[] = {
  NSPAIR(_ZN3ccc8DD2x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y6E[];
extern void _ZN3ccc8DD2x15y63efgEv();
extern void _ZN3ccc8DD2x15y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y6E[] = {
  {&(_ZTVN3ccc8DD2x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y6E[];
Class_Descriptor cd__ZN3ccc8DD2x15y6E = {  "_ZN3ccc8DD2x15y6E", // class name
  bases__ZN3ccc8DD2x15y6E, 2,
  &(vtc__ZN3ccc8DD2x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y6E),2, //virtual 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  CC2x15y7  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y73pqrEv
  ~CC2x15y7(); // tgen
  CC2x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y7E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y73abcEv");}
void  ccc::CC2x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y73pqrEv");}
ccc::CC2x15y7 ::~CC2x15y7(){ note_dtor("_ZN3ccc8CC2x15y7E", this);} // tgen
ccc::CC2x15y7 ::CC2x15y7(){ note_ctor("_ZN3ccc8CC2x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y7E, buf);
    ::ccc::CC2x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y7E);
    dp->::ccc::CC2x15y7::~CC2x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y7E(Test__ZN3ccc8CC2x15y7E, "_ZN3ccc8CC2x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y7C1Ev();
extern void _ZN3ccc8CC2x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y7E[] = {
  NSPAIR(_ZN3ccc8CC2x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x15y73abcEv();
extern void _ZN3ccc8CC2x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y7E[] = {
  {&(_ZTVN3ccc8CC2x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y7E[];
Class_Descriptor cd__ZN3ccc8CC2x15y7E = {  "_ZN3ccc8CC2x15y7E", // class name
  bases__ZN3ccc8CC2x15y7E, 2,
  &(vtc__ZN3ccc8CC2x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y7E),2, //virtual 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  DD2x15y7  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD2x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y73pqrEv
  ~DD2x15y7(); // tgen
  DD2x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y7E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y73abcEv");}
void  ccc::DD2x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y73pqrEv");}
ccc::DD2x15y7 ::~DD2x15y7(){ note_dtor("_ZN3ccc8DD2x15y7E", this);} // tgen
ccc::DD2x15y7 ::DD2x15y7(){ note_ctor("_ZN3ccc8DD2x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y7E, buf);
    ::ccc::DD2x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y7E);
    dp->::ccc::DD2x15y7::~DD2x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y7E(Test__ZN3ccc8DD2x15y7E, "_ZN3ccc8DD2x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y7C1Ev();
extern void _ZN3ccc8DD2x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y7E[] = {
  NSPAIR(_ZN3ccc8DD2x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8DD2x15y73abcEv();
extern void _ZN3ccc8DD2x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y7E[] = {
  {&(_ZTVN3ccc8DD2x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y7E[];
Class_Descriptor cd__ZN3ccc8DD2x15y7E = {  "_ZN3ccc8DD2x15y7E", // class name
  bases__ZN3ccc8DD2x15y7E, 2,
  &(vtc__ZN3ccc8DD2x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y7E),2, //virtual 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  CC2x15y8  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y83abcEv
  ~CC2x15y8(); // tgen
  CC2x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y8E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y83efgEv");}
void  ccc::CC2x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y83abcEv");}
ccc::CC2x15y8 ::~CC2x15y8(){ note_dtor("_ZN3ccc8CC2x15y8E", this);} // tgen
ccc::CC2x15y8 ::CC2x15y8(){ note_ctor("_ZN3ccc8CC2x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y8E, buf);
    ::ccc::CC2x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y8E);
    dp->::ccc::CC2x15y8::~CC2x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y8E(Test__ZN3ccc8CC2x15y8E, "_ZN3ccc8CC2x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y8C1Ev();
extern void _ZN3ccc8CC2x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y8E[] = {
  NSPAIR(_ZN3ccc8CC2x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y8E[];
extern void _ZN3ccc8CC2x15y83efgEv();
extern void _ZN3ccc8CC2x15y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y8E[] = {
  {&(_ZTVN3ccc8CC2x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y8E[];
Class_Descriptor cd__ZN3ccc8CC2x15y8E = {  "_ZN3ccc8CC2x15y8E", // class name
  bases__ZN3ccc8CC2x15y8E, 2,
  &(vtc__ZN3ccc8CC2x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y8E),2, //virtual 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  DD2x15y8  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD2x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD2x15y83abcEv
  ~DD2x15y8(); // tgen
  DD2x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y8E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y83efgEv");}
void  ccc::DD2x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD2x15y83abcEv");}
ccc::DD2x15y8 ::~DD2x15y8(){ note_dtor("_ZN3ccc8DD2x15y8E", this);} // tgen
ccc::DD2x15y8 ::DD2x15y8(){ note_ctor("_ZN3ccc8DD2x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y8E, buf);
    ::ccc::DD2x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y8E);
    dp->::ccc::DD2x15y8::~DD2x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y8E(Test__ZN3ccc8DD2x15y8E, "_ZN3ccc8DD2x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y8C1Ev();
extern void _ZN3ccc8DD2x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y8E[] = {
  NSPAIR(_ZN3ccc8DD2x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y8E[];
extern void _ZN3ccc8DD2x15y83efgEv();
extern void _ZN3ccc8DD2x15y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y8E[] = {
  {&(_ZTVN3ccc8DD2x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y8E[];
Class_Descriptor cd__ZN3ccc8DD2x15y8E = {  "_ZN3ccc8DD2x15y8E", // class name
  bases__ZN3ccc8DD2x15y8E, 2,
  &(vtc__ZN3ccc8DD2x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y8E),2, //virtual 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  CC2x15y9  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y93pqrEv
  ~CC2x15y9(); // tgen
  CC2x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y9E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y93efgEv");}
void  ccc::CC2x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y93pqrEv");}
ccc::CC2x15y9 ::~CC2x15y9(){ note_dtor("_ZN3ccc8CC2x15y9E", this);} // tgen
ccc::CC2x15y9 ::CC2x15y9(){ note_ctor("_ZN3ccc8CC2x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y9E, buf);
    ::ccc::CC2x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y9E);
    dp->::ccc::CC2x15y9::~CC2x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y9E(Test__ZN3ccc8CC2x15y9E, "_ZN3ccc8CC2x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y9C1Ev();
extern void _ZN3ccc8CC2x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y9E[] = {
  NSPAIR(_ZN3ccc8CC2x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y9E[];
extern void _ZN3ccc8CC2x15y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC2x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC2x15y9E[] = {
  {&(_ZTVN3ccc8CC2x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC2x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC2x15y9E[];
Class_Descriptor cd__ZN3ccc8CC2x15y9E = {  "_ZN3ccc8CC2x15y9E", // class name
  bases__ZN3ccc8CC2x15y9E, 2,
  &(vtc__ZN3ccc8CC2x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC2x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC2x15y9E),2, //virtual 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  DD2x15y9  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD2x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD2x15y93pqrEv
  ~DD2x15y9(); // tgen
  DD2x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD2x15y9E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD2x15y93efgEv");}
void  ccc::DD2x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD2x15y93pqrEv");}
ccc::DD2x15y9 ::~DD2x15y9(){ note_dtor("_ZN3ccc8DD2x15y9E", this);} // tgen
ccc::DD2x15y9 ::DD2x15y9(){ note_ctor("_ZN3ccc8DD2x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD2x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD2x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD2x15y9E, buf);
    ::ccc::DD2x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD2x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD2x15y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8DD2x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD2x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD2x15y9E);
    dp->::ccc::DD2x15y9::~DD2x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD2x15y9E(Test__ZN3ccc8DD2x15y9E, "_ZN3ccc8DD2x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD2x15y9C1Ev();
extern void _ZN3ccc8DD2x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD2x15y9E[] = {
  NSPAIR(_ZN3ccc8DD2x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD2x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD2x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y9E[];
extern void _ZN3ccc8DD2x15y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8DD2x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD2x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD2x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD2x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD2x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD2x15y9E[] = {
  {&(_ZTVN3ccc8DD2x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD2x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD2x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD2x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD2x15y9E[];
Class_Descriptor cd__ZN3ccc8DD2x15y9E = {  "_ZN3ccc8DD2x15y9E", // class name
  bases__ZN3ccc8DD2x15y9E, 2,
  &(vtc__ZN3ccc8DD2x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD2x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD2x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD2x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD2x15y9E),2, //virtual 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  CC2x15y10  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x15y103abcEv
  ~CC2x15y10(); // tgen
  CC2x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y10E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y103pqrEv");}
void  ccc::CC2x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x15y103abcEv");}
ccc::CC2x15y10 ::~CC2x15y10(){ note_dtor("_ZN3ccc9CC2x15y10E", this);} // tgen
ccc::CC2x15y10 ::CC2x15y10(){ note_ctor("_ZN3ccc9CC2x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y10E, buf);
    ::ccc::CC2x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y10E);
    dp->::ccc::CC2x15y10::~CC2x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y10E(Test__ZN3ccc9CC2x15y10E, "_ZN3ccc9CC2x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y10C1Ev();
extern void _ZN3ccc9CC2x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y10E[] = {
  NSPAIR(_ZN3ccc9CC2x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x15y103abcEv();
extern void _ZN3ccc9CC2x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y10E[] = {
  {&(_ZTVN3ccc9CC2x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y10E[];
Class_Descriptor cd__ZN3ccc9CC2x15y10E = {  "_ZN3ccc9CC2x15y10E", // class name
  bases__ZN3ccc9CC2x15y10E, 2,
  &(vtc__ZN3ccc9CC2x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y10E),2, //virtual 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  DD2x15y10  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD2x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD2x15y103abcEv
  ~DD2x15y10(); // tgen
  DD2x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y10E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x15y103pqrEv");}
void  ccc::DD2x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x15y103abcEv");}
ccc::DD2x15y10 ::~DD2x15y10(){ note_dtor("_ZN3ccc9DD2x15y10E", this);} // tgen
ccc::DD2x15y10 ::DD2x15y10(){ note_ctor("_ZN3ccc9DD2x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y10E, buf);
    ::ccc::DD2x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y10E);
    dp->::ccc::DD2x15y10::~DD2x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y10E(Test__ZN3ccc9DD2x15y10E, "_ZN3ccc9DD2x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y10C1Ev();
extern void _ZN3ccc9DD2x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y10E[] = {
  NSPAIR(_ZN3ccc9DD2x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x15y103abcEv();
extern void _ZN3ccc9DD2x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y10E[] = {
  {&(_ZTVN3ccc9DD2x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y10E[];
Class_Descriptor cd__ZN3ccc9DD2x15y10E = {  "_ZN3ccc9DD2x15y10E", // class name
  bases__ZN3ccc9DD2x15y10E, 2,
  &(vtc__ZN3ccc9DD2x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y10E),2, //virtual 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  CC2x15y11  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x15y113efgEv
  ~CC2x15y11(); // tgen
  CC2x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y11E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y113pqrEv");}
void  ccc::CC2x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x15y113efgEv");}
ccc::CC2x15y11 ::~CC2x15y11(){ note_dtor("_ZN3ccc9CC2x15y11E", this);} // tgen
ccc::CC2x15y11 ::CC2x15y11(){ note_ctor("_ZN3ccc9CC2x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y11E, buf);
    ::ccc::CC2x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y11E);
    dp->::ccc::CC2x15y11::~CC2x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y11E(Test__ZN3ccc9CC2x15y11E, "_ZN3ccc9CC2x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y11C1Ev();
extern void _ZN3ccc9CC2x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y11E[] = {
  NSPAIR(_ZN3ccc9CC2x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y11E[];
extern void _ZN3ccc9CC2x15y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y11E[] = {
  {&(_ZTVN3ccc9CC2x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y11E[];
Class_Descriptor cd__ZN3ccc9CC2x15y11E = {  "_ZN3ccc9CC2x15y11E", // class name
  bases__ZN3ccc9CC2x15y11E, 2,
  &(vtc__ZN3ccc9CC2x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y11E),2, //virtual 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  DD2x15y11  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD2x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD2x15y113efgEv
  ~DD2x15y11(); // tgen
  DD2x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y11E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD2x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x15y113pqrEv");}
void  ccc::DD2x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x15y113efgEv");}
ccc::DD2x15y11 ::~DD2x15y11(){ note_dtor("_ZN3ccc9DD2x15y11E", this);} // tgen
ccc::DD2x15y11 ::DD2x15y11(){ note_ctor("_ZN3ccc9DD2x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y11E, buf);
    ::ccc::DD2x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y11E);
    dp->::ccc::DD2x15y11::~DD2x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y11E(Test__ZN3ccc9DD2x15y11E, "_ZN3ccc9DD2x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y11C1Ev();
extern void _ZN3ccc9DD2x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y11E[] = {
  NSPAIR(_ZN3ccc9DD2x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y11E[];
extern void _ZN3ccc9DD2x15y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y11E[] = {
  {&(_ZTVN3ccc9DD2x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y11E[];
Class_Descriptor cd__ZN3ccc9DD2x15y11E = {  "_ZN3ccc9DD2x15y11E", // class name
  bases__ZN3ccc9DD2x15y11E, 2,
  &(vtc__ZN3ccc9DD2x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y11E),2, //virtual 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  CC2x15y12  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC2x15y123abcEv
  ~CC2x15y12(); // tgen
  CC2x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y12E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x15y123abcEv");}
ccc::CC2x15y12 ::~CC2x15y12(){ note_dtor("_ZN3ccc9CC2x15y12E", this);} // tgen
ccc::CC2x15y12 ::CC2x15y12(){ note_ctor("_ZN3ccc9CC2x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y12E, buf);
    ::ccc::CC2x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y12E);
    dp->::ccc::CC2x15y12::~CC2x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y12E(Test__ZN3ccc9CC2x15y12E, "_ZN3ccc9CC2x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y12C1Ev();
extern void _ZN3ccc9CC2x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y12E[] = {
  NSPAIR(_ZN3ccc9CC2x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x15y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y12E[] = {
  {&(_ZTVN3ccc9CC2x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y12E[];
Class_Descriptor cd__ZN3ccc9CC2x15y12E = {  "_ZN3ccc9CC2x15y12E", // class name
  bases__ZN3ccc9CC2x15y12E, 2,
  &(vtc__ZN3ccc9CC2x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y12E),2, //virtual 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  DD2x15y12  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD2x15y123abcEv
  ~DD2x15y12(); // tgen
  DD2x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y12E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD2x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD2x15y123abcEv");}
ccc::DD2x15y12 ::~DD2x15y12(){ note_dtor("_ZN3ccc9DD2x15y12E", this);} // tgen
ccc::DD2x15y12 ::DD2x15y12(){ note_ctor("_ZN3ccc9DD2x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y12E, buf);
    ::ccc::DD2x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y12E);
    dp->::ccc::DD2x15y12::~DD2x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y12E(Test__ZN3ccc9DD2x15y12E, "_ZN3ccc9DD2x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y12C1Ev();
extern void _ZN3ccc9DD2x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y12E[] = {
  NSPAIR(_ZN3ccc9DD2x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9DD2x15y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y12E[] = {
  {&(_ZTVN3ccc9DD2x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y12E[];
Class_Descriptor cd__ZN3ccc9DD2x15y12E = {  "_ZN3ccc9DD2x15y12E", // class name
  bases__ZN3ccc9DD2x15y12E, 2,
  &(vtc__ZN3ccc9DD2x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y12E),2, //virtual 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  CC2x15y13  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC2x15y133efgEv
  ~CC2x15y13(); // tgen
  CC2x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y13E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x15y133efgEv");}
ccc::CC2x15y13 ::~CC2x15y13(){ note_dtor("_ZN3ccc9CC2x15y13E", this);} // tgen
ccc::CC2x15y13 ::CC2x15y13(){ note_ctor("_ZN3ccc9CC2x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y13E, buf);
    ::ccc::CC2x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y13E);
    dp->::ccc::CC2x15y13::~CC2x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y13E(Test__ZN3ccc9CC2x15y13E, "_ZN3ccc9CC2x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y13C1Ev();
extern void _ZN3ccc9CC2x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y13E[] = {
  NSPAIR(_ZN3ccc9CC2x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y13E[];
extern void _ZN3ccc9CC2x15y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y13E[] = {
  {&(_ZTVN3ccc9CC2x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y13E[];
Class_Descriptor cd__ZN3ccc9CC2x15y13E = {  "_ZN3ccc9CC2x15y13E", // class name
  bases__ZN3ccc9CC2x15y13E, 2,
  &(vtc__ZN3ccc9CC2x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y13E),2, //virtual 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  DD2x15y13  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD2x15y133efgEv
  ~DD2x15y13(); // tgen
  DD2x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y13E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD2x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD2x15y133efgEv");}
ccc::DD2x15y13 ::~DD2x15y13(){ note_dtor("_ZN3ccc9DD2x15y13E", this);} // tgen
ccc::DD2x15y13 ::DD2x15y13(){ note_ctor("_ZN3ccc9DD2x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y13E, buf);
    ::ccc::DD2x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y13E);
    dp->::ccc::DD2x15y13::~DD2x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y13E(Test__ZN3ccc9DD2x15y13E, "_ZN3ccc9DD2x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y13C1Ev();
extern void _ZN3ccc9DD2x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y13E[] = {
  NSPAIR(_ZN3ccc9DD2x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y13E[];
extern void _ZN3ccc9DD2x15y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y13E[] = {
  {&(_ZTVN3ccc9DD2x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y13E[];
Class_Descriptor cd__ZN3ccc9DD2x15y13E = {  "_ZN3ccc9DD2x15y13E", // class name
  bases__ZN3ccc9DD2x15y13E, 2,
  &(vtc__ZN3ccc9DD2x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y13E),2, //virtual 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  CC2x15y14  : virtual ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y143pqrEv
  ~CC2x15y14(); // tgen
  CC2x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y14E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y143pqrEv");}
ccc::CC2x15y14 ::~CC2x15y14(){ note_dtor("_ZN3ccc9CC2x15y14E", this);} // tgen
ccc::CC2x15y14 ::CC2x15y14(){ note_ctor("_ZN3ccc9CC2x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y14E, buf);
    ::ccc::CC2x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y14E);
    dp->::ccc::CC2x15y14::~CC2x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y14E(Test__ZN3ccc9CC2x15y14E, "_ZN3ccc9CC2x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y14C1Ev();
extern void _ZN3ccc9CC2x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y14E[] = {
  NSPAIR(_ZN3ccc9CC2x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y14E[] = {
  {&(_ZTVN3ccc9CC2x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y14E[];
Class_Descriptor cd__ZN3ccc9CC2x15y14E = {  "_ZN3ccc9CC2x15y14E", // class name
  bases__ZN3ccc9CC2x15y14E, 2,
  &(vtc__ZN3ccc9CC2x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y14E),2, //virtual 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  DD2x15y14  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD2x15y143pqrEv
  ~DD2x15y14(); // tgen
  DD2x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y14E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD2x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD2x15y143pqrEv");}
ccc::DD2x15y14 ::~DD2x15y14(){ note_dtor("_ZN3ccc9DD2x15y14E", this);} // tgen
ccc::DD2x15y14 ::DD2x15y14(){ note_ctor("_ZN3ccc9DD2x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y14E, buf);
    ::ccc::DD2x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y14E);
    dp->::ccc::DD2x15y14::~DD2x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y14E(Test__ZN3ccc9DD2x15y14E, "_ZN3ccc9DD2x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y14C1Ev();
extern void _ZN3ccc9DD2x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y14E[] = {
  NSPAIR(_ZN3ccc9DD2x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9DD2x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD2x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y14E[] = {
  {&(_ZTVN3ccc9DD2x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y14E[];
Class_Descriptor cd__ZN3ccc9DD2x15y14E = {  "_ZN3ccc9DD2x15y14E", // class name
  bases__ZN3ccc9DD2x15y14E, 2,
  &(vtc__ZN3ccc9DD2x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y14E),2, //virtual 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  CC2x15y15  : virtual ::ccc::AA2 , ::ccc::BB15 {
  ~CC2x15y15(); // tgen
  CC2x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC2x15y15 ::~CC2x15y15(){ note_dtor("_ZN3ccc9CC2x15y15E", this);} // tgen
ccc::CC2x15y15 ::CC2x15y15(){ note_ctor("_ZN3ccc9CC2x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y15E, buf);
    ::ccc::CC2x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y15E);
    dp->::ccc::CC2x15y15::~CC2x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y15E(Test__ZN3ccc9CC2x15y15E, "_ZN3ccc9CC2x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y15C1Ev();
extern void _ZN3ccc9CC2x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y15E[] = {
  NSPAIR(_ZN3ccc9CC2x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC2x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC2x15y15E[] = {
  {&(_ZTVN3ccc9CC2x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC2x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC2x15y15E[];
Class_Descriptor cd__ZN3ccc9CC2x15y15E = {  "_ZN3ccc9CC2x15y15E", // class name
  bases__ZN3ccc9CC2x15y15E, 2,
  &(vtc__ZN3ccc9CC2x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC2x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC2x15y15E),2, //virtual 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  DD2x15y15  : virtual ::ccc::AA2 , virtual ::ccc::BB15 {
  ~DD2x15y15(); // tgen
  DD2x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD2x15y15E) C1{ VBC2{ v1 v2 v3} VBC3{}}
}
namespace ccc { 
ccc::DD2x15y15 ::~DD2x15y15(){ note_dtor("_ZN3ccc9DD2x15y15E", this);} // tgen
ccc::DD2x15y15 ::DD2x15y15(){ note_ctor("_ZN3ccc9DD2x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD2x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD2x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD2x15y15E, buf);
    ::ccc::DD2x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD2x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD2x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD2x15y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9DD2x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD2x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD2x15y15E);
    dp->::ccc::DD2x15y15::~DD2x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD2x15y15E(Test__ZN3ccc9DD2x15y15E, "_ZN3ccc9DD2x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD2x15y15C1Ev();
extern void _ZN3ccc9DD2x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD2x15y15E[] = {
  NSPAIR(_ZN3ccc9DD2x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD2x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD2x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD2x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD2x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD2x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD2x15y15E[] = {
  {&(_ZTVN3ccc9DD2x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD2x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD2x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD2x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD2x15y15E[];
Class_Descriptor cd__ZN3ccc9DD2x15y15E = {  "_ZN3ccc9DD2x15y15E", // class name
  bases__ZN3ccc9DD2x15y15E, 2,
  &(vtc__ZN3ccc9DD2x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD2x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD2x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD2x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD2x15y15E),2, //virtual 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  CC3x0y0  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y03pqrEv
  ~CC3x0y0(); // tgen
  CC3x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y0E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y03abcEv");}
void  ccc::CC3x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y03efgEv");}
void  ccc::CC3x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y03pqrEv");}
ccc::CC3x0y0 ::~CC3x0y0(){ note_dtor("_ZN3ccc7CC3x0y0E", this);} // tgen
ccc::CC3x0y0 ::CC3x0y0(){ note_ctor("_ZN3ccc7CC3x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y0E, buf);
    ::ccc::CC3x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y0E);
    dp->::ccc::CC3x0y0::~CC3x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y0E(Test__ZN3ccc7CC3x0y0E, "_ZN3ccc7CC3x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y0C1Ev();
extern void _ZN3ccc7CC3x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y0E[] = {
  NSPAIR(_ZN3ccc7CC3x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y0E[];
extern void _ZN3ccc7CC3x0y03abcEv();
extern void _ZN3ccc7CC3x0y03efgEv();
extern void _ZN3ccc7CC3x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y03efgEv,_ZTv0_n12_N3ccc7CC3x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03efgEv,_ZThn4_N3ccc7CC3x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y03pqrEv,_ZTv0_n16_N3ccc7CC3x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03pqrEv,_ZThn4_N3ccc7CC3x0y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y03abcEv,_ZTv0_n20_N3ccc7CC3x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03abcEv,_ZThn4_N3ccc7CC3x0y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y03efgEv,_ZTv0_n12_N3ccc7CC3x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y03pqrEv,_ZTv0_n16_N3ccc7CC3x0y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y03abcEv,_ZTv0_n20_N3ccc7CC3x0y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y0E[] = {
  {&(_ZTVN3ccc7CC3x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y0E[];
static VTBL_ENTRY alt_thunk_names1297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y03abcEv,_ZTv0_n20_N3ccc7CC3x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y03abcEv,_ZThn4_N3ccc7CC3x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y03pqrEv,_ZTv0_n16_N3ccc7CC3x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y03pqrEv,_ZThn4_N3ccc7CC3x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y03efgEv,_ZTv0_n12_N3ccc7CC3x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y03efgEv,_ZThn4_N3ccc7CC3x0y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y0E = {  "_ZN3ccc7CC3x0y0E", // class name
  bases__ZN3ccc7CC3x0y0E, 2,
  &(vtc__ZN3ccc7CC3x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1297,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y0  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD3x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y03pqrEv
  ~DD3x0y0(); // tgen
  DD3x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y03abcEv");}
void  ccc::DD3x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y03efgEv");}
void  ccc::DD3x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y03pqrEv");}
ccc::DD3x0y0 ::~DD3x0y0(){ note_dtor("_ZN3ccc7DD3x0y0E", this);} // tgen
ccc::DD3x0y0 ::DD3x0y0(){ note_ctor("_ZN3ccc7DD3x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y0E, buf);
    ::ccc::DD3x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y0E);
    dp->::ccc::DD3x0y0::~DD3x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y0E(Test__ZN3ccc7DD3x0y0E, "_ZN3ccc7DD3x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y0C1Ev();
extern void _ZN3ccc7DD3x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y0E[] = {
  NSPAIR(_ZN3ccc7DD3x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y0E[];
extern void _ZN3ccc7DD3x0y03efgEv();
extern void _ZN3ccc7DD3x0y03pqrEv();
extern void _ZN3ccc7DD3x0y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y03abcEv,_ZTv0_n12_N3ccc7DD3x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y03abcEv,_ZThn4_N3ccc7DD3x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y03efgEv,_ZTv0_n16_N3ccc7DD3x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y03efgEv,_ZThn4_N3ccc7DD3x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y03pqrEv,_ZTv0_n20_N3ccc7DD3x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y03pqrEv,_ZThn4_N3ccc7DD3x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y03abcEv,_ZTv0_n12_N3ccc7DD3x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y03efgEv,_ZTv0_n16_N3ccc7DD3x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y03pqrEv,_ZTv0_n20_N3ccc7DD3x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y0E[] = {
  {&(_ZTVN3ccc7DD3x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y0E[];
static VTBL_ENTRY alt_thunk_names1298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y03pqrEv,_ZTv0_n20_N3ccc7DD3x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y03pqrEv,_ZThn4_N3ccc7DD3x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y03efgEv,_ZTv0_n16_N3ccc7DD3x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y03efgEv,_ZThn4_N3ccc7DD3x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y03abcEv,_ZTv0_n12_N3ccc7DD3x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y03abcEv,_ZThn4_N3ccc7DD3x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y0E = {  "_ZN3ccc7DD3x0y0E", // class name
  bases__ZN3ccc7DD3x0y0E, 2,
  &(vtc__ZN3ccc7DD3x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1298,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y1  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x0y13efgEv
  ~CC3x0y1(); // tgen
  CC3x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y1E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y13abcEv");}
void  ccc::CC3x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y13pqrEv");}
void  ccc::CC3x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y13efgEv");}
ccc::CC3x0y1 ::~CC3x0y1(){ note_dtor("_ZN3ccc7CC3x0y1E", this);} // tgen
ccc::CC3x0y1 ::CC3x0y1(){ note_ctor("_ZN3ccc7CC3x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y1E, buf);
    ::ccc::CC3x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y1E);
    dp->::ccc::CC3x0y1::~CC3x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y1E(Test__ZN3ccc7CC3x0y1E, "_ZN3ccc7CC3x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y1C1Ev();
extern void _ZN3ccc7CC3x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y1E[] = {
  NSPAIR(_ZN3ccc7CC3x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y1E[];
extern void _ZN3ccc7CC3x0y13abcEv();
extern void _ZN3ccc7CC3x0y13efgEv();
extern void _ZN3ccc7CC3x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y13efgEv,_ZTv0_n12_N3ccc7CC3x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13efgEv,_ZThn4_N3ccc7CC3x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y13pqrEv,_ZTv0_n16_N3ccc7CC3x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13pqrEv,_ZThn4_N3ccc7CC3x0y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y13abcEv,_ZTv0_n20_N3ccc7CC3x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13abcEv,_ZThn4_N3ccc7CC3x0y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y13efgEv,_ZTv0_n12_N3ccc7CC3x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y13pqrEv,_ZTv0_n16_N3ccc7CC3x0y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y13abcEv,_ZTv0_n20_N3ccc7CC3x0y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y1E[] = {
  {&(_ZTVN3ccc7CC3x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y1E[];
static VTBL_ENTRY alt_thunk_names1299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y13abcEv,_ZTv0_n20_N3ccc7CC3x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y13abcEv,_ZThn4_N3ccc7CC3x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y13pqrEv,_ZTv0_n16_N3ccc7CC3x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y13pqrEv,_ZThn4_N3ccc7CC3x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y13efgEv,_ZTv0_n12_N3ccc7CC3x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y13efgEv,_ZThn4_N3ccc7CC3x0y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y1E = {  "_ZN3ccc7CC3x0y1E", // class name
  bases__ZN3ccc7CC3x0y1E, 2,
  &(vtc__ZN3ccc7CC3x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1299,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y1  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD3x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x0y13efgEv
  ~DD3x0y1(); // tgen
  DD3x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y13abcEv");}
void  ccc::DD3x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y13pqrEv");}
void  ccc::DD3x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y13efgEv");}
ccc::DD3x0y1 ::~DD3x0y1(){ note_dtor("_ZN3ccc7DD3x0y1E", this);} // tgen
ccc::DD3x0y1 ::DD3x0y1(){ note_ctor("_ZN3ccc7DD3x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y1E, buf);
    ::ccc::DD3x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y1E);
    dp->::ccc::DD3x0y1::~DD3x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y1E(Test__ZN3ccc7DD3x0y1E, "_ZN3ccc7DD3x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y1C1Ev();
extern void _ZN3ccc7DD3x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y1E[] = {
  NSPAIR(_ZN3ccc7DD3x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y1E[];
extern void _ZN3ccc7DD3x0y13efgEv();
extern void _ZN3ccc7DD3x0y13pqrEv();
extern void _ZN3ccc7DD3x0y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y13abcEv,_ZTv0_n12_N3ccc7DD3x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y13abcEv,_ZThn4_N3ccc7DD3x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y13efgEv,_ZTv0_n16_N3ccc7DD3x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y13efgEv,_ZThn4_N3ccc7DD3x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y13pqrEv,_ZTv0_n20_N3ccc7DD3x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y13pqrEv,_ZThn4_N3ccc7DD3x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y13abcEv,_ZTv0_n12_N3ccc7DD3x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y13efgEv,_ZTv0_n16_N3ccc7DD3x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y13pqrEv,_ZTv0_n20_N3ccc7DD3x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y1E[] = {
  {&(_ZTVN3ccc7DD3x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y1E[];
static VTBL_ENTRY alt_thunk_names1300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y13pqrEv,_ZTv0_n20_N3ccc7DD3x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y13pqrEv,_ZThn4_N3ccc7DD3x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y13efgEv,_ZTv0_n16_N3ccc7DD3x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y13efgEv,_ZThn4_N3ccc7DD3x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y13abcEv,_ZTv0_n12_N3ccc7DD3x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y13abcEv,_ZThn4_N3ccc7DD3x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y1E = {  "_ZN3ccc7DD3x0y1E", // class name
  bases__ZN3ccc7DD3x0y1E, 2,
  &(vtc__ZN3ccc7DD3x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1300,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y2  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y23pqrEv
  ~CC3x0y2(); // tgen
  CC3x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y2E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y23efgEv");}
void  ccc::CC3x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y23abcEv");}
void  ccc::CC3x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y23pqrEv");}
ccc::CC3x0y2 ::~CC3x0y2(){ note_dtor("_ZN3ccc7CC3x0y2E", this);} // tgen
ccc::CC3x0y2 ::CC3x0y2(){ note_ctor("_ZN3ccc7CC3x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y2E, buf);
    ::ccc::CC3x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y2E);
    dp->::ccc::CC3x0y2::~CC3x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y2E(Test__ZN3ccc7CC3x0y2E, "_ZN3ccc7CC3x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y2C1Ev();
extern void _ZN3ccc7CC3x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y2E[] = {
  NSPAIR(_ZN3ccc7CC3x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y2E[];
extern void _ZN3ccc7CC3x0y23abcEv();
extern void _ZN3ccc7CC3x0y23efgEv();
extern void _ZN3ccc7CC3x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y23efgEv,_ZTv0_n12_N3ccc7CC3x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23efgEv,_ZThn4_N3ccc7CC3x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y23pqrEv,_ZTv0_n16_N3ccc7CC3x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23pqrEv,_ZThn4_N3ccc7CC3x0y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y23abcEv,_ZTv0_n20_N3ccc7CC3x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23abcEv,_ZThn4_N3ccc7CC3x0y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y23efgEv,_ZTv0_n12_N3ccc7CC3x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y23pqrEv,_ZTv0_n16_N3ccc7CC3x0y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y23abcEv,_ZTv0_n20_N3ccc7CC3x0y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y2E[] = {
  {&(_ZTVN3ccc7CC3x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y2E[];
static VTBL_ENTRY alt_thunk_names1301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y23abcEv,_ZTv0_n20_N3ccc7CC3x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y23abcEv,_ZThn4_N3ccc7CC3x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y23pqrEv,_ZTv0_n16_N3ccc7CC3x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y23pqrEv,_ZThn4_N3ccc7CC3x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y23efgEv,_ZTv0_n12_N3ccc7CC3x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y23efgEv,_ZThn4_N3ccc7CC3x0y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y2E = {  "_ZN3ccc7CC3x0y2E", // class name
  bases__ZN3ccc7CC3x0y2E, 2,
  &(vtc__ZN3ccc7CC3x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1301,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y2  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD3x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y23pqrEv
  ~DD3x0y2(); // tgen
  DD3x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y23efgEv");}
void  ccc::DD3x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y23abcEv");}
void  ccc::DD3x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y23pqrEv");}
ccc::DD3x0y2 ::~DD3x0y2(){ note_dtor("_ZN3ccc7DD3x0y2E", this);} // tgen
ccc::DD3x0y2 ::DD3x0y2(){ note_ctor("_ZN3ccc7DD3x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y2E, buf);
    ::ccc::DD3x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y2E);
    dp->::ccc::DD3x0y2::~DD3x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y2E(Test__ZN3ccc7DD3x0y2E, "_ZN3ccc7DD3x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y2C1Ev();
extern void _ZN3ccc7DD3x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y2E[] = {
  NSPAIR(_ZN3ccc7DD3x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y2E[];
extern void _ZN3ccc7DD3x0y23efgEv();
extern void _ZN3ccc7DD3x0y23pqrEv();
extern void _ZN3ccc7DD3x0y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y23abcEv,_ZTv0_n12_N3ccc7DD3x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y23abcEv,_ZThn4_N3ccc7DD3x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y23efgEv,_ZTv0_n16_N3ccc7DD3x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y23efgEv,_ZThn4_N3ccc7DD3x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y23pqrEv,_ZTv0_n20_N3ccc7DD3x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y23pqrEv,_ZThn4_N3ccc7DD3x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y23abcEv,_ZTv0_n12_N3ccc7DD3x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y23efgEv,_ZTv0_n16_N3ccc7DD3x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y23pqrEv,_ZTv0_n20_N3ccc7DD3x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y2E[] = {
  {&(_ZTVN3ccc7DD3x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y2E[];
static VTBL_ENTRY alt_thunk_names1302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y23pqrEv,_ZTv0_n20_N3ccc7DD3x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y23pqrEv,_ZThn4_N3ccc7DD3x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y23efgEv,_ZTv0_n16_N3ccc7DD3x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y23efgEv,_ZThn4_N3ccc7DD3x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y23abcEv,_ZTv0_n12_N3ccc7DD3x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y23abcEv,_ZThn4_N3ccc7DD3x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y2E = {  "_ZN3ccc7DD3x0y2E", // class name
  bases__ZN3ccc7DD3x0y2E, 2,
  &(vtc__ZN3ccc7DD3x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1302,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y3  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x0y33abcEv
  ~CC3x0y3(); // tgen
  CC3x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y3E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y33efgEv");}
void  ccc::CC3x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y33pqrEv");}
void  ccc::CC3x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y33abcEv");}
ccc::CC3x0y3 ::~CC3x0y3(){ note_dtor("_ZN3ccc7CC3x0y3E", this);} // tgen
ccc::CC3x0y3 ::CC3x0y3(){ note_ctor("_ZN3ccc7CC3x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y3E, buf);
    ::ccc::CC3x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y3E);
    dp->::ccc::CC3x0y3::~CC3x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y3E(Test__ZN3ccc7CC3x0y3E, "_ZN3ccc7CC3x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y3C1Ev();
extern void _ZN3ccc7CC3x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y3E[] = {
  NSPAIR(_ZN3ccc7CC3x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y3E[];
extern void _ZN3ccc7CC3x0y33abcEv();
extern void _ZN3ccc7CC3x0y33efgEv();
extern void _ZN3ccc7CC3x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y33efgEv,_ZTv0_n12_N3ccc7CC3x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33efgEv,_ZThn4_N3ccc7CC3x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y33pqrEv,_ZTv0_n16_N3ccc7CC3x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33pqrEv,_ZThn4_N3ccc7CC3x0y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y33abcEv,_ZTv0_n20_N3ccc7CC3x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33abcEv,_ZThn4_N3ccc7CC3x0y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y33efgEv,_ZTv0_n12_N3ccc7CC3x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y33pqrEv,_ZTv0_n16_N3ccc7CC3x0y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y33abcEv,_ZTv0_n20_N3ccc7CC3x0y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y3E[] = {
  {&(_ZTVN3ccc7CC3x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y3E[];
static VTBL_ENTRY alt_thunk_names1303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y33abcEv,_ZTv0_n20_N3ccc7CC3x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y33abcEv,_ZThn4_N3ccc7CC3x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y33pqrEv,_ZTv0_n16_N3ccc7CC3x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y33pqrEv,_ZThn4_N3ccc7CC3x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y33efgEv,_ZTv0_n12_N3ccc7CC3x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y33efgEv,_ZThn4_N3ccc7CC3x0y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y3E = {  "_ZN3ccc7CC3x0y3E", // class name
  bases__ZN3ccc7CC3x0y3E, 2,
  &(vtc__ZN3ccc7CC3x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1303,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y3  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD3x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x0y33abcEv
  ~DD3x0y3(); // tgen
  DD3x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y33efgEv");}
void  ccc::DD3x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y33pqrEv");}
void  ccc::DD3x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y33abcEv");}
ccc::DD3x0y3 ::~DD3x0y3(){ note_dtor("_ZN3ccc7DD3x0y3E", this);} // tgen
ccc::DD3x0y3 ::DD3x0y3(){ note_ctor("_ZN3ccc7DD3x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y3E, buf);
    ::ccc::DD3x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y3E);
    dp->::ccc::DD3x0y3::~DD3x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y3E(Test__ZN3ccc7DD3x0y3E, "_ZN3ccc7DD3x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y3C1Ev();
extern void _ZN3ccc7DD3x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y3E[] = {
  NSPAIR(_ZN3ccc7DD3x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y3E[];
extern void _ZN3ccc7DD3x0y33efgEv();
extern void _ZN3ccc7DD3x0y33pqrEv();
extern void _ZN3ccc7DD3x0y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y33abcEv,_ZTv0_n12_N3ccc7DD3x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y33abcEv,_ZThn4_N3ccc7DD3x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y33efgEv,_ZTv0_n16_N3ccc7DD3x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y33efgEv,_ZThn4_N3ccc7DD3x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y33pqrEv,_ZTv0_n20_N3ccc7DD3x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y33pqrEv,_ZThn4_N3ccc7DD3x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y33abcEv,_ZTv0_n12_N3ccc7DD3x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y33efgEv,_ZTv0_n16_N3ccc7DD3x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y33pqrEv,_ZTv0_n20_N3ccc7DD3x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y3E[] = {
  {&(_ZTVN3ccc7DD3x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y3E[];
static VTBL_ENTRY alt_thunk_names1304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y33pqrEv,_ZTv0_n20_N3ccc7DD3x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y33pqrEv,_ZThn4_N3ccc7DD3x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y33efgEv,_ZTv0_n16_N3ccc7DD3x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y33efgEv,_ZThn4_N3ccc7DD3x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y33abcEv,_ZTv0_n12_N3ccc7DD3x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y33abcEv,_ZThn4_N3ccc7DD3x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y3E = {  "_ZN3ccc7DD3x0y3E", // class name
  bases__ZN3ccc7DD3x0y3E, 2,
  &(vtc__ZN3ccc7DD3x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1304,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y4  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC3x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y43efgEv
  ~CC3x0y4(); // tgen
  CC3x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y4E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y43pqrEv");}
void  ccc::CC3x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y43abcEv");}
void  ccc::CC3x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y43efgEv");}
ccc::CC3x0y4 ::~CC3x0y4(){ note_dtor("_ZN3ccc7CC3x0y4E", this);} // tgen
ccc::CC3x0y4 ::CC3x0y4(){ note_ctor("_ZN3ccc7CC3x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y4E, buf);
    ::ccc::CC3x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y4E);
    dp->::ccc::CC3x0y4::~CC3x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y4E(Test__ZN3ccc7CC3x0y4E, "_ZN3ccc7CC3x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y4C1Ev();
extern void _ZN3ccc7CC3x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y4E[] = {
  NSPAIR(_ZN3ccc7CC3x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y4E[];
extern void _ZN3ccc7CC3x0y43abcEv();
extern void _ZN3ccc7CC3x0y43efgEv();
extern void _ZN3ccc7CC3x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y43efgEv,_ZTv0_n12_N3ccc7CC3x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43efgEv,_ZThn4_N3ccc7CC3x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y43pqrEv,_ZTv0_n16_N3ccc7CC3x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43pqrEv,_ZThn4_N3ccc7CC3x0y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y43abcEv,_ZTv0_n20_N3ccc7CC3x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43abcEv,_ZThn4_N3ccc7CC3x0y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y43efgEv,_ZTv0_n12_N3ccc7CC3x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y43pqrEv,_ZTv0_n16_N3ccc7CC3x0y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y43abcEv,_ZTv0_n20_N3ccc7CC3x0y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y4E[] = {
  {&(_ZTVN3ccc7CC3x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y4E[];
static VTBL_ENTRY alt_thunk_names1305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y43abcEv,_ZTv0_n20_N3ccc7CC3x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y43abcEv,_ZThn4_N3ccc7CC3x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y43pqrEv,_ZTv0_n16_N3ccc7CC3x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y43pqrEv,_ZThn4_N3ccc7CC3x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y43efgEv,_ZTv0_n12_N3ccc7CC3x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y43efgEv,_ZThn4_N3ccc7CC3x0y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y4E = {  "_ZN3ccc7CC3x0y4E", // class name
  bases__ZN3ccc7CC3x0y4E, 2,
  &(vtc__ZN3ccc7CC3x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1305,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y4  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD3x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x0y43efgEv
  ~DD3x0y4(); // tgen
  DD3x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y43pqrEv");}
void  ccc::DD3x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y43abcEv");}
void  ccc::DD3x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y43efgEv");}
ccc::DD3x0y4 ::~DD3x0y4(){ note_dtor("_ZN3ccc7DD3x0y4E", this);} // tgen
ccc::DD3x0y4 ::DD3x0y4(){ note_ctor("_ZN3ccc7DD3x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y4E, buf);
    ::ccc::DD3x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y4E);
    dp->::ccc::DD3x0y4::~DD3x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y4E(Test__ZN3ccc7DD3x0y4E, "_ZN3ccc7DD3x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y4C1Ev();
extern void _ZN3ccc7DD3x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y4E[] = {
  NSPAIR(_ZN3ccc7DD3x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y4E[];
extern void _ZN3ccc7DD3x0y43efgEv();
extern void _ZN3ccc7DD3x0y43pqrEv();
extern void _ZN3ccc7DD3x0y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y43abcEv,_ZTv0_n12_N3ccc7DD3x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y43abcEv,_ZThn4_N3ccc7DD3x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y43efgEv,_ZTv0_n16_N3ccc7DD3x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y43efgEv,_ZThn4_N3ccc7DD3x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y43pqrEv,_ZTv0_n20_N3ccc7DD3x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y43pqrEv,_ZThn4_N3ccc7DD3x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y43abcEv,_ZTv0_n12_N3ccc7DD3x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y43efgEv,_ZTv0_n16_N3ccc7DD3x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y43pqrEv,_ZTv0_n20_N3ccc7DD3x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y4E[] = {
  {&(_ZTVN3ccc7DD3x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y4E[];
static VTBL_ENTRY alt_thunk_names1306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y43pqrEv,_ZTv0_n20_N3ccc7DD3x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y43pqrEv,_ZThn4_N3ccc7DD3x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y43efgEv,_ZTv0_n16_N3ccc7DD3x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y43efgEv,_ZThn4_N3ccc7DD3x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y43abcEv,_ZTv0_n12_N3ccc7DD3x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y43abcEv,_ZThn4_N3ccc7DD3x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y4E = {  "_ZN3ccc7DD3x0y4E", // class name
  bases__ZN3ccc7DD3x0y4E, 2,
  &(vtc__ZN3ccc7DD3x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1306,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y5  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC3x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y53abcEv
  ~CC3x0y5(); // tgen
  CC3x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y5E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y53pqrEv");}
void  ccc::CC3x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y53efgEv");}
void  ccc::CC3x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y53abcEv");}
ccc::CC3x0y5 ::~CC3x0y5(){ note_dtor("_ZN3ccc7CC3x0y5E", this);} // tgen
ccc::CC3x0y5 ::CC3x0y5(){ note_ctor("_ZN3ccc7CC3x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y5E, buf);
    ::ccc::CC3x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y5E);
    dp->::ccc::CC3x0y5::~CC3x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y5E(Test__ZN3ccc7CC3x0y5E, "_ZN3ccc7CC3x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y5C1Ev();
extern void _ZN3ccc7CC3x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y5E[] = {
  NSPAIR(_ZN3ccc7CC3x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y5E[];
extern void _ZN3ccc7CC3x0y53abcEv();
extern void _ZN3ccc7CC3x0y53efgEv();
extern void _ZN3ccc7CC3x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y53efgEv,_ZTv0_n12_N3ccc7CC3x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53efgEv,_ZThn4_N3ccc7CC3x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y53pqrEv,_ZTv0_n16_N3ccc7CC3x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53pqrEv,_ZThn4_N3ccc7CC3x0y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y53abcEv,_ZTv0_n20_N3ccc7CC3x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53abcEv,_ZThn4_N3ccc7CC3x0y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y53efgEv,_ZTv0_n12_N3ccc7CC3x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y53pqrEv,_ZTv0_n16_N3ccc7CC3x0y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y53abcEv,_ZTv0_n20_N3ccc7CC3x0y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y5E[] = {
  {&(_ZTVN3ccc7CC3x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y5E[];
static VTBL_ENTRY alt_thunk_names1307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y53abcEv,_ZTv0_n20_N3ccc7CC3x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y53abcEv,_ZThn4_N3ccc7CC3x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y53pqrEv,_ZTv0_n16_N3ccc7CC3x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y53pqrEv,_ZThn4_N3ccc7CC3x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y53efgEv,_ZTv0_n12_N3ccc7CC3x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y53efgEv,_ZThn4_N3ccc7CC3x0y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y5E = {  "_ZN3ccc7CC3x0y5E", // class name
  bases__ZN3ccc7CC3x0y5E, 2,
  &(vtc__ZN3ccc7CC3x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1307,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y5  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD3x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x0y53abcEv
  ~DD3x0y5(); // tgen
  DD3x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y53pqrEv");}
void  ccc::DD3x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y53efgEv");}
void  ccc::DD3x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y53abcEv");}
ccc::DD3x0y5 ::~DD3x0y5(){ note_dtor("_ZN3ccc7DD3x0y5E", this);} // tgen
ccc::DD3x0y5 ::DD3x0y5(){ note_ctor("_ZN3ccc7DD3x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y5E, buf);
    ::ccc::DD3x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y5E);
    dp->::ccc::DD3x0y5::~DD3x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y5E(Test__ZN3ccc7DD3x0y5E, "_ZN3ccc7DD3x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y5C1Ev();
extern void _ZN3ccc7DD3x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y5E[] = {
  NSPAIR(_ZN3ccc7DD3x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y5E[];
extern void _ZN3ccc7DD3x0y53efgEv();
extern void _ZN3ccc7DD3x0y53pqrEv();
extern void _ZN3ccc7DD3x0y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y53abcEv,_ZTv0_n12_N3ccc7DD3x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y53abcEv,_ZThn4_N3ccc7DD3x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y53efgEv,_ZTv0_n16_N3ccc7DD3x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y53efgEv,_ZThn4_N3ccc7DD3x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y53pqrEv,_ZTv0_n20_N3ccc7DD3x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y53pqrEv,_ZThn4_N3ccc7DD3x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y53abcEv,_ZTv0_n12_N3ccc7DD3x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y53efgEv,_ZTv0_n16_N3ccc7DD3x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y53pqrEv,_ZTv0_n20_N3ccc7DD3x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y5E[] = {
  {&(_ZTVN3ccc7DD3x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y5E[];
static VTBL_ENTRY alt_thunk_names1308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y53pqrEv,_ZTv0_n20_N3ccc7DD3x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y53pqrEv,_ZThn4_N3ccc7DD3x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y53efgEv,_ZTv0_n16_N3ccc7DD3x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y53efgEv,_ZThn4_N3ccc7DD3x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y53abcEv,_ZTv0_n12_N3ccc7DD3x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y53abcEv,_ZThn4_N3ccc7DD3x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y5E = {  "_ZN3ccc7DD3x0y5E", // class name
  bases__ZN3ccc7DD3x0y5E, 2,
  &(vtc__ZN3ccc7DD3x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1308,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y6  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y63efgEv
  ~CC3x0y6(); // tgen
  CC3x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y6E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y63abcEv");}
void  ccc::CC3x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y63efgEv");}
ccc::CC3x0y6 ::~CC3x0y6(){ note_dtor("_ZN3ccc7CC3x0y6E", this);} // tgen
ccc::CC3x0y6 ::CC3x0y6(){ note_ctor("_ZN3ccc7CC3x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y6E, buf);
    ::ccc::CC3x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y6E);
    dp->::ccc::CC3x0y6::~CC3x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y6E(Test__ZN3ccc7CC3x0y6E, "_ZN3ccc7CC3x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y6C1Ev();
extern void _ZN3ccc7CC3x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y6E[] = {
  NSPAIR(_ZN3ccc7CC3x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y6E[];
extern void _ZN3ccc7CC3x0y63abcEv();
extern void _ZN3ccc7CC3x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y63efgEv,_ZTv0_n12_N3ccc7CC3x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y63efgEv,_ZThn4_N3ccc7CC3x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y63abcEv,_ZTv0_n20_N3ccc7CC3x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y63abcEv,_ZThn4_N3ccc7CC3x0y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y63efgEv,_ZTv0_n12_N3ccc7CC3x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y63abcEv,_ZTv0_n20_N3ccc7CC3x0y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y6E[] = {
  {&(_ZTVN3ccc7CC3x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y6E[];
static VTBL_ENTRY alt_thunk_names1309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y63abcEv,_ZTv0_n20_N3ccc7CC3x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y63abcEv,_ZThn4_N3ccc7CC3x0y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y63efgEv,_ZTv0_n12_N3ccc7CC3x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y63efgEv,_ZThn4_N3ccc7CC3x0y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y6E = {  "_ZN3ccc7CC3x0y6E", // class name
  bases__ZN3ccc7CC3x0y6E, 2,
  &(vtc__ZN3ccc7CC3x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1309,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y6  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD3x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x0y63efgEv
  ~DD3x0y6(); // tgen
  DD3x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y63abcEv");}
void  ccc::DD3x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y63efgEv");}
ccc::DD3x0y6 ::~DD3x0y6(){ note_dtor("_ZN3ccc7DD3x0y6E", this);} // tgen
ccc::DD3x0y6 ::DD3x0y6(){ note_ctor("_ZN3ccc7DD3x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y6E, buf);
    ::ccc::DD3x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y6E);
    dp->::ccc::DD3x0y6::~DD3x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y6E(Test__ZN3ccc7DD3x0y6E, "_ZN3ccc7DD3x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y6C1Ev();
extern void _ZN3ccc7DD3x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y6E[] = {
  NSPAIR(_ZN3ccc7DD3x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y6E[];
extern void _ZN3ccc7DD3x0y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x0y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y63abcEv,_ZTv0_n12_N3ccc7DD3x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y63abcEv,_ZThn4_N3ccc7DD3x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y63efgEv,_ZTv0_n16_N3ccc7DD3x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y63efgEv,_ZThn4_N3ccc7DD3x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y63abcEv,_ZTv0_n12_N3ccc7DD3x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y63efgEv,_ZTv0_n16_N3ccc7DD3x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y6E[] = {
  {&(_ZTVN3ccc7DD3x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y6E[];
static VTBL_ENTRY alt_thunk_names1310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y63efgEv,_ZTv0_n16_N3ccc7DD3x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y63efgEv,_ZThn4_N3ccc7DD3x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y63abcEv,_ZTv0_n12_N3ccc7DD3x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y63abcEv,_ZThn4_N3ccc7DD3x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y6E = {  "_ZN3ccc7DD3x0y6E", // class name
  bases__ZN3ccc7DD3x0y6E, 2,
  &(vtc__ZN3ccc7DD3x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1310,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y7  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y73pqrEv
  ~CC3x0y7(); // tgen
  CC3x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y7E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y73abcEv");}
void  ccc::CC3x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y73pqrEv");}
ccc::CC3x0y7 ::~CC3x0y7(){ note_dtor("_ZN3ccc7CC3x0y7E", this);} // tgen
ccc::CC3x0y7 ::CC3x0y7(){ note_ctor("_ZN3ccc7CC3x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y7E, buf);
    ::ccc::CC3x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y7E);
    dp->::ccc::CC3x0y7::~CC3x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y7E(Test__ZN3ccc7CC3x0y7E, "_ZN3ccc7CC3x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y7C1Ev();
extern void _ZN3ccc7CC3x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y7E[] = {
  NSPAIR(_ZN3ccc7CC3x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y7E[];
extern void _ZN3ccc7CC3x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC3x0y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y73pqrEv,_ZTv0_n16_N3ccc7CC3x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y73pqrEv,_ZThn4_N3ccc7CC3x0y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y73abcEv,_ZTv0_n20_N3ccc7CC3x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y73abcEv,_ZThn4_N3ccc7CC3x0y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y73pqrEv,_ZTv0_n16_N3ccc7CC3x0y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y73abcEv,_ZTv0_n20_N3ccc7CC3x0y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y7E[] = {
  {&(_ZTVN3ccc7CC3x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y7E[];
static VTBL_ENTRY alt_thunk_names1311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y73abcEv,_ZTv0_n20_N3ccc7CC3x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y73abcEv,_ZThn4_N3ccc7CC3x0y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y73pqrEv,_ZTv0_n16_N3ccc7CC3x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y73pqrEv,_ZThn4_N3ccc7CC3x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y7E = {  "_ZN3ccc7CC3x0y7E", // class name
  bases__ZN3ccc7CC3x0y7E, 2,
  &(vtc__ZN3ccc7CC3x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1311,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y7  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD3x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y73pqrEv
  ~DD3x0y7(); // tgen
  DD3x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y73abcEv");}
void  ccc::DD3x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y73pqrEv");}
ccc::DD3x0y7 ::~DD3x0y7(){ note_dtor("_ZN3ccc7DD3x0y7E", this);} // tgen
ccc::DD3x0y7 ::DD3x0y7(){ note_ctor("_ZN3ccc7DD3x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y7E, buf);
    ::ccc::DD3x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y7E);
    dp->::ccc::DD3x0y7::~DD3x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y7E(Test__ZN3ccc7DD3x0y7E, "_ZN3ccc7DD3x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y7C1Ev();
extern void _ZN3ccc7DD3x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y7E[] = {
  NSPAIR(_ZN3ccc7DD3x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x0y73pqrEv();
extern void _ZN3ccc7DD3x0y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y73abcEv,_ZTv0_n12_N3ccc7DD3x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y73abcEv,_ZThn4_N3ccc7DD3x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y73pqrEv,_ZTv0_n20_N3ccc7DD3x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y73pqrEv,_ZThn4_N3ccc7DD3x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y73abcEv,_ZTv0_n12_N3ccc7DD3x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y73pqrEv,_ZTv0_n20_N3ccc7DD3x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y7E[] = {
  {&(_ZTVN3ccc7DD3x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y7E[];
static VTBL_ENTRY alt_thunk_names1312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y73pqrEv,_ZTv0_n20_N3ccc7DD3x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y73pqrEv,_ZThn4_N3ccc7DD3x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y73abcEv,_ZTv0_n12_N3ccc7DD3x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y73abcEv,_ZThn4_N3ccc7DD3x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y7E = {  "_ZN3ccc7DD3x0y7E", // class name
  bases__ZN3ccc7DD3x0y7E, 2,
  &(vtc__ZN3ccc7DD3x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1312,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y8  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y83abcEv
  ~CC3x0y8(); // tgen
  CC3x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y8E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y83efgEv");}
void  ccc::CC3x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y83abcEv");}
ccc::CC3x0y8 ::~CC3x0y8(){ note_dtor("_ZN3ccc7CC3x0y8E", this);} // tgen
ccc::CC3x0y8 ::CC3x0y8(){ note_ctor("_ZN3ccc7CC3x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y8E, buf);
    ::ccc::CC3x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y8E);
    dp->::ccc::CC3x0y8::~CC3x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y8E(Test__ZN3ccc7CC3x0y8E, "_ZN3ccc7CC3x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y8C1Ev();
extern void _ZN3ccc7CC3x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y8E[] = {
  NSPAIR(_ZN3ccc7CC3x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y8E[];
extern void _ZN3ccc7CC3x0y83abcEv();
extern void _ZN3ccc7CC3x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y83efgEv,_ZTv0_n12_N3ccc7CC3x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y83efgEv,_ZThn4_N3ccc7CC3x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x0y83abcEv,_ZTv0_n20_N3ccc7CC3x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y83abcEv,_ZThn4_N3ccc7CC3x0y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y83efgEv,_ZTv0_n12_N3ccc7CC3x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x0y83abcEv,_ZTv0_n20_N3ccc7CC3x0y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y8E[] = {
  {&(_ZTVN3ccc7CC3x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y8E[];
static VTBL_ENTRY alt_thunk_names1313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x0y83abcEv,_ZTv0_n20_N3ccc7CC3x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y83abcEv,_ZThn4_N3ccc7CC3x0y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y83efgEv,_ZTv0_n12_N3ccc7CC3x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y83efgEv,_ZThn4_N3ccc7CC3x0y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y8E = {  "_ZN3ccc7CC3x0y8E", // class name
  bases__ZN3ccc7CC3x0y8E, 2,
  &(vtc__ZN3ccc7CC3x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1313,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y8  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD3x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x0y83abcEv
  ~DD3x0y8(); // tgen
  DD3x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y83efgEv");}
void  ccc::DD3x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x0y83abcEv");}
ccc::DD3x0y8 ::~DD3x0y8(){ note_dtor("_ZN3ccc7DD3x0y8E", this);} // tgen
ccc::DD3x0y8 ::DD3x0y8(){ note_ctor("_ZN3ccc7DD3x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y8E, buf);
    ::ccc::DD3x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y8E);
    dp->::ccc::DD3x0y8::~DD3x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y8E(Test__ZN3ccc7DD3x0y8E, "_ZN3ccc7DD3x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y8C1Ev();
extern void _ZN3ccc7DD3x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y8E[] = {
  NSPAIR(_ZN3ccc7DD3x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y8E[];
extern void _ZN3ccc7DD3x0y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x0y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x0y83abcEv,_ZTv0_n12_N3ccc7DD3x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y83abcEv,_ZThn4_N3ccc7DD3x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y83efgEv,_ZTv0_n16_N3ccc7DD3x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y83efgEv,_ZThn4_N3ccc7DD3x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x0y83abcEv,_ZTv0_n12_N3ccc7DD3x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y83efgEv,_ZTv0_n16_N3ccc7DD3x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y8E[] = {
  {&(_ZTVN3ccc7DD3x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y8E[];
static VTBL_ENTRY alt_thunk_names1314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y83efgEv,_ZTv0_n16_N3ccc7DD3x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y83efgEv,_ZThn4_N3ccc7DD3x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x0y83abcEv,_ZTv0_n12_N3ccc7DD3x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y83abcEv,_ZThn4_N3ccc7DD3x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y8E = {  "_ZN3ccc7DD3x0y8E", // class name
  bases__ZN3ccc7DD3x0y8E, 2,
  &(vtc__ZN3ccc7DD3x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1314,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y9  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y93pqrEv
  ~CC3x0y9(); // tgen
  CC3x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y9E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y93efgEv");}
void  ccc::CC3x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y93pqrEv");}
ccc::CC3x0y9 ::~CC3x0y9(){ note_dtor("_ZN3ccc7CC3x0y9E", this);} // tgen
ccc::CC3x0y9 ::CC3x0y9(){ note_ctor("_ZN3ccc7CC3x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y9E, buf);
    ::ccc::CC3x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC3x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y9E);
    dp->::ccc::CC3x0y9::~CC3x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y9E(Test__ZN3ccc7CC3x0y9E, "_ZN3ccc7CC3x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y9C1Ev();
extern void _ZN3ccc7CC3x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y9E[] = {
  NSPAIR(_ZN3ccc7CC3x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC3x0y93efgEv();
extern void _ZN3ccc7CC3x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x0y93efgEv,_ZTv0_n12_N3ccc7CC3x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y93efgEv,_ZThn4_N3ccc7CC3x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x0y93pqrEv,_ZTv0_n16_N3ccc7CC3x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y93pqrEv,_ZThn4_N3ccc7CC3x0y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x0y93efgEv,_ZTv0_n12_N3ccc7CC3x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x0y93pqrEv,_ZTv0_n16_N3ccc7CC3x0y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x0y9E[] = {
  {&(_ZTVN3ccc7CC3x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x0y9E[];
static VTBL_ENTRY alt_thunk_names1315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x0y93pqrEv,_ZTv0_n16_N3ccc7CC3x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y93pqrEv,_ZThn4_N3ccc7CC3x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x0y93efgEv,_ZTv0_n12_N3ccc7CC3x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x0y93efgEv,_ZThn4_N3ccc7CC3x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x0y9E = {  "_ZN3ccc7CC3x0y9E", // class name
  bases__ZN3ccc7CC3x0y9E, 2,
  &(vtc__ZN3ccc7CC3x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x0y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1315,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y9  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD3x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x0y93pqrEv
  ~DD3x0y9(); // tgen
  DD3x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x0y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x0y93efgEv");}
void  ccc::DD3x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x0y93pqrEv");}
ccc::DD3x0y9 ::~DD3x0y9(){ note_dtor("_ZN3ccc7DD3x0y9E", this);} // tgen
ccc::DD3x0y9 ::DD3x0y9(){ note_ctor("_ZN3ccc7DD3x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x0y9E, buf);
    ::ccc::DD3x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x0y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD3x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x0y9E);
    dp->::ccc::DD3x0y9::~DD3x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x0y9E(Test__ZN3ccc7DD3x0y9E, "_ZN3ccc7DD3x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x0y9C1Ev();
extern void _ZN3ccc7DD3x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x0y9E[] = {
  NSPAIR(_ZN3ccc7DD3x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD3x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y9E[];
extern void _ZN3ccc7DD3x0y93efgEv();
extern void _ZN3ccc7DD3x0y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x0y93efgEv,_ZTv0_n16_N3ccc7DD3x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y93efgEv,_ZThn4_N3ccc7DD3x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x0y93pqrEv,_ZTv0_n20_N3ccc7DD3x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x0y93pqrEv,_ZThn4_N3ccc7DD3x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x0y93efgEv,_ZTv0_n16_N3ccc7DD3x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x0y93pqrEv,_ZTv0_n20_N3ccc7DD3x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x0y9E[] = {
  {&(_ZTVN3ccc7DD3x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x0y9E[];
static VTBL_ENTRY alt_thunk_names1316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x0y93pqrEv,_ZTv0_n20_N3ccc7DD3x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y93pqrEv,_ZThn4_N3ccc7DD3x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x0y93efgEv,_ZTv0_n16_N3ccc7DD3x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x0y93efgEv,_ZThn4_N3ccc7DD3x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x0y9E = {  "_ZN3ccc7DD3x0y9E", // class name
  bases__ZN3ccc7DD3x0y9E, 2,
  &(vtc__ZN3ccc7DD3x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x0y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1316,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y10  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x0y103abcEv
  ~CC3x0y10(); // tgen
  CC3x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y10E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y103pqrEv");}
void  ccc::CC3x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x0y103abcEv");}
ccc::CC3x0y10 ::~CC3x0y10(){ note_dtor("_ZN3ccc8CC3x0y10E", this);} // tgen
ccc::CC3x0y10 ::CC3x0y10(){ note_ctor("_ZN3ccc8CC3x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y10E, buf);
    ::ccc::CC3x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y10E);
    dp->::ccc::CC3x0y10::~CC3x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y10E(Test__ZN3ccc8CC3x0y10E, "_ZN3ccc8CC3x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y10C1Ev();
extern void _ZN3ccc8CC3x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y10E[] = {
  NSPAIR(_ZN3ccc8CC3x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y10E[];
extern void _ZN3ccc8CC3x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC3x0y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x0y103pqrEv,_ZTv0_n16_N3ccc8CC3x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y103pqrEv,_ZThn4_N3ccc8CC3x0y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x0y103abcEv,_ZTv0_n20_N3ccc8CC3x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y103abcEv,_ZThn4_N3ccc8CC3x0y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x0y103pqrEv,_ZTv0_n16_N3ccc8CC3x0y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x0y103abcEv,_ZTv0_n20_N3ccc8CC3x0y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y10E[] = {
  {&(_ZTVN3ccc8CC3x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y10E[];
static VTBL_ENTRY alt_thunk_names1317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x0y103abcEv,_ZTv0_n20_N3ccc8CC3x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y103abcEv,_ZThn4_N3ccc8CC3x0y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x0y103pqrEv,_ZTv0_n16_N3ccc8CC3x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y103pqrEv,_ZThn4_N3ccc8CC3x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x0y10E = {  "_ZN3ccc8CC3x0y10E", // class name
  bases__ZN3ccc8CC3x0y10E, 2,
  &(vtc__ZN3ccc8CC3x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1317,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y10  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD3x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x0y103abcEv
  ~DD3x0y10(); // tgen
  DD3x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x0y103pqrEv");}
void  ccc::DD3x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x0y103abcEv");}
ccc::DD3x0y10 ::~DD3x0y10(){ note_dtor("_ZN3ccc8DD3x0y10E", this);} // tgen
ccc::DD3x0y10 ::DD3x0y10(){ note_ctor("_ZN3ccc8DD3x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y10E, buf);
    ::ccc::DD3x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y10E);
    dp->::ccc::DD3x0y10::~DD3x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y10E(Test__ZN3ccc8DD3x0y10E, "_ZN3ccc8DD3x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y10C1Ev();
extern void _ZN3ccc8DD3x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y10E[] = {
  NSPAIR(_ZN3ccc8DD3x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x0y103pqrEv();
extern void _ZN3ccc8DD3x0y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x0y103abcEv,_ZTv0_n12_N3ccc8DD3x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y103abcEv,_ZThn4_N3ccc8DD3x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x0y103pqrEv,_ZTv0_n20_N3ccc8DD3x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y103pqrEv,_ZThn4_N3ccc8DD3x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x0y103abcEv,_ZTv0_n12_N3ccc8DD3x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x0y103pqrEv,_ZTv0_n20_N3ccc8DD3x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y10E[] = {
  {&(_ZTVN3ccc8DD3x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y10E[];
static VTBL_ENTRY alt_thunk_names1318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x0y103pqrEv,_ZTv0_n20_N3ccc8DD3x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y103pqrEv,_ZThn4_N3ccc8DD3x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x0y103abcEv,_ZTv0_n12_N3ccc8DD3x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y103abcEv,_ZThn4_N3ccc8DD3x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x0y10E = {  "_ZN3ccc8DD3x0y10E", // class name
  bases__ZN3ccc8DD3x0y10E, 2,
  &(vtc__ZN3ccc8DD3x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1318,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y11  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x0y113efgEv
  ~CC3x0y11(); // tgen
  CC3x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y11E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y113pqrEv");}
void  ccc::CC3x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x0y113efgEv");}
ccc::CC3x0y11 ::~CC3x0y11(){ note_dtor("_ZN3ccc8CC3x0y11E", this);} // tgen
ccc::CC3x0y11 ::CC3x0y11(){ note_ctor("_ZN3ccc8CC3x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y11E, buf);
    ::ccc::CC3x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y11E);
    dp->::ccc::CC3x0y11::~CC3x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y11E(Test__ZN3ccc8CC3x0y11E, "_ZN3ccc8CC3x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y11C1Ev();
extern void _ZN3ccc8CC3x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y11E[] = {
  NSPAIR(_ZN3ccc8CC3x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC3x0y113efgEv();
extern void _ZN3ccc8CC3x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x0y113efgEv,_ZTv0_n12_N3ccc8CC3x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y113efgEv,_ZThn4_N3ccc8CC3x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x0y113pqrEv,_ZTv0_n16_N3ccc8CC3x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y113pqrEv,_ZThn4_N3ccc8CC3x0y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x0y113efgEv,_ZTv0_n12_N3ccc8CC3x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x0y113pqrEv,_ZTv0_n16_N3ccc8CC3x0y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y11E[] = {
  {&(_ZTVN3ccc8CC3x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y11E[];
static VTBL_ENTRY alt_thunk_names1319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x0y113pqrEv,_ZTv0_n16_N3ccc8CC3x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y113pqrEv,_ZThn4_N3ccc8CC3x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x0y113efgEv,_ZTv0_n12_N3ccc8CC3x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y113efgEv,_ZThn4_N3ccc8CC3x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x0y11E = {  "_ZN3ccc8CC3x0y11E", // class name
  bases__ZN3ccc8CC3x0y11E, 2,
  &(vtc__ZN3ccc8CC3x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1319,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y11  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD3x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x0y113efgEv
  ~DD3x0y11(); // tgen
  DD3x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x0y113pqrEv");}
void  ccc::DD3x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x0y113efgEv");}
ccc::DD3x0y11 ::~DD3x0y11(){ note_dtor("_ZN3ccc8DD3x0y11E", this);} // tgen
ccc::DD3x0y11 ::DD3x0y11(){ note_ctor("_ZN3ccc8DD3x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y11E, buf);
    ::ccc::DD3x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y11E);
    dp->::ccc::DD3x0y11::~DD3x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y11E(Test__ZN3ccc8DD3x0y11E, "_ZN3ccc8DD3x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y11C1Ev();
extern void _ZN3ccc8DD3x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y11E[] = {
  NSPAIR(_ZN3ccc8DD3x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y11E[];
extern void _ZN3ccc8DD3x0y113efgEv();
extern void _ZN3ccc8DD3x0y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x0y113efgEv,_ZTv0_n16_N3ccc8DD3x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y113efgEv,_ZThn4_N3ccc8DD3x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x0y113pqrEv,_ZTv0_n20_N3ccc8DD3x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y113pqrEv,_ZThn4_N3ccc8DD3x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x0y113efgEv,_ZTv0_n16_N3ccc8DD3x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x0y113pqrEv,_ZTv0_n20_N3ccc8DD3x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y11E[] = {
  {&(_ZTVN3ccc8DD3x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y11E[];
static VTBL_ENTRY alt_thunk_names1320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x0y113pqrEv,_ZTv0_n20_N3ccc8DD3x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y113pqrEv,_ZThn4_N3ccc8DD3x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x0y113efgEv,_ZTv0_n16_N3ccc8DD3x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y113efgEv,_ZThn4_N3ccc8DD3x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x0y11E = {  "_ZN3ccc8DD3x0y11E", // class name
  bases__ZN3ccc8DD3x0y11E, 2,
  &(vtc__ZN3ccc8DD3x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1320,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y12  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC3x0y123abcEv
  ~CC3x0y12(); // tgen
  CC3x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x0y123abcEv");}
ccc::CC3x0y12 ::~CC3x0y12(){ note_dtor("_ZN3ccc8CC3x0y12E", this);} // tgen
ccc::CC3x0y12 ::CC3x0y12(){ note_ctor("_ZN3ccc8CC3x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y12E, buf);
    ::ccc::CC3x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y12E);
    dp->::ccc::CC3x0y12::~CC3x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y12E(Test__ZN3ccc8CC3x0y12E, "_ZN3ccc8CC3x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y12C1Ev();
extern void _ZN3ccc8CC3x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y12E[] = {
  NSPAIR(_ZN3ccc8CC3x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y12E[];
extern void _ZN3ccc8CC3x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x0y123abcEv,_ZTv0_n20_N3ccc8CC3x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y123abcEv,_ZThn4_N3ccc8CC3x0y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x0y123abcEv,_ZTv0_n20_N3ccc8CC3x0y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y12E[] = {
  {&(_ZTVN3ccc8CC3x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y12E[];
static VTBL_ENTRY alt_thunk_names1321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x0y123abcEv,_ZTv0_n20_N3ccc8CC3x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y123abcEv,_ZThn4_N3ccc8CC3x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x0y12E = {  "_ZN3ccc8CC3x0y12E", // class name
  bases__ZN3ccc8CC3x0y12E, 2,
  &(vtc__ZN3ccc8CC3x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1321,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y12  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD3x0y123abcEv
  ~DD3x0y12(); // tgen
  DD3x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x0y123abcEv");}
ccc::DD3x0y12 ::~DD3x0y12(){ note_dtor("_ZN3ccc8DD3x0y12E", this);} // tgen
ccc::DD3x0y12 ::DD3x0y12(){ note_ctor("_ZN3ccc8DD3x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y12E, buf);
    ::ccc::DD3x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y12E);
    dp->::ccc::DD3x0y12::~DD3x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y12E(Test__ZN3ccc8DD3x0y12E, "_ZN3ccc8DD3x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y12C1Ev();
extern void _ZN3ccc8DD3x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y12E[] = {
  NSPAIR(_ZN3ccc8DD3x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x0y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x0y123abcEv,_ZTv0_n12_N3ccc8DD3x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y123abcEv,_ZThn4_N3ccc8DD3x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x0y123abcEv,_ZTv0_n12_N3ccc8DD3x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y12E[] = {
  {&(_ZTVN3ccc8DD3x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y12E[];
static VTBL_ENTRY alt_thunk_names1322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x0y123abcEv,_ZTv0_n12_N3ccc8DD3x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y123abcEv,_ZThn4_N3ccc8DD3x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x0y12E = {  "_ZN3ccc8DD3x0y12E", // class name
  bases__ZN3ccc8DD3x0y12E, 2,
  &(vtc__ZN3ccc8DD3x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1322,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y13  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC3x0y133efgEv
  ~CC3x0y13(); // tgen
  CC3x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x0y133efgEv");}
ccc::CC3x0y13 ::~CC3x0y13(){ note_dtor("_ZN3ccc8CC3x0y13E", this);} // tgen
ccc::CC3x0y13 ::CC3x0y13(){ note_ctor("_ZN3ccc8CC3x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y13E, buf);
    ::ccc::CC3x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y13E);
    dp->::ccc::CC3x0y13::~CC3x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y13E(Test__ZN3ccc8CC3x0y13E, "_ZN3ccc8CC3x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y13C1Ev();
extern void _ZN3ccc8CC3x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y13E[] = {
  NSPAIR(_ZN3ccc8CC3x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC3x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x0y133efgEv,_ZTv0_n12_N3ccc8CC3x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y133efgEv,_ZThn4_N3ccc8CC3x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x0y133efgEv,_ZTv0_n12_N3ccc8CC3x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y13E[] = {
  {&(_ZTVN3ccc8CC3x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y13E[];
static VTBL_ENTRY alt_thunk_names1323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x0y133efgEv,_ZTv0_n12_N3ccc8CC3x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y133efgEv,_ZThn4_N3ccc8CC3x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x0y13E = {  "_ZN3ccc8CC3x0y13E", // class name
  bases__ZN3ccc8CC3x0y13E, 2,
  &(vtc__ZN3ccc8CC3x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1323,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y13  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD3x0y133efgEv
  ~DD3x0y13(); // tgen
  DD3x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x0y133efgEv");}
ccc::DD3x0y13 ::~DD3x0y13(){ note_dtor("_ZN3ccc8DD3x0y13E", this);} // tgen
ccc::DD3x0y13 ::DD3x0y13(){ note_ctor("_ZN3ccc8DD3x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y13E, buf);
    ::ccc::DD3x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y13E);
    dp->::ccc::DD3x0y13::~DD3x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y13E(Test__ZN3ccc8DD3x0y13E, "_ZN3ccc8DD3x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y13C1Ev();
extern void _ZN3ccc8DD3x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y13E[] = {
  NSPAIR(_ZN3ccc8DD3x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y13E[];
extern void _ZN3ccc8DD3x0y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x0y133efgEv,_ZTv0_n16_N3ccc8DD3x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y133efgEv,_ZThn4_N3ccc8DD3x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x0y133efgEv,_ZTv0_n16_N3ccc8DD3x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y13E[] = {
  {&(_ZTVN3ccc8DD3x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y13E[];
static VTBL_ENTRY alt_thunk_names1324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x0y133efgEv,_ZTv0_n16_N3ccc8DD3x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y133efgEv,_ZThn4_N3ccc8DD3x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x0y13E = {  "_ZN3ccc8DD3x0y13E", // class name
  bases__ZN3ccc8DD3x0y13E, 2,
  &(vtc__ZN3ccc8DD3x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1324,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y14  : virtual ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y143pqrEv
  ~CC3x0y14(); // tgen
  CC3x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y143pqrEv");}
ccc::CC3x0y14 ::~CC3x0y14(){ note_dtor("_ZN3ccc8CC3x0y14E", this);} // tgen
ccc::CC3x0y14 ::CC3x0y14(){ note_ctor("_ZN3ccc8CC3x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y14E, buf);
    ::ccc::CC3x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y14E);
    dp->::ccc::CC3x0y14::~CC3x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y14E(Test__ZN3ccc8CC3x0y14E, "_ZN3ccc8CC3x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y14C1Ev();
extern void _ZN3ccc8CC3x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y14E[] = {
  NSPAIR(_ZN3ccc8CC3x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC3x0y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x0y143pqrEv,_ZTv0_n16_N3ccc8CC3x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y143pqrEv,_ZThn4_N3ccc8CC3x0y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x0y143pqrEv,_ZTv0_n16_N3ccc8CC3x0y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y14E[] = {
  {&(_ZTVN3ccc8CC3x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y14E[];
static VTBL_ENTRY alt_thunk_names1325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x0y143pqrEv,_ZTv0_n16_N3ccc8CC3x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x0y143pqrEv,_ZThn4_N3ccc8CC3x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x0y14E = {  "_ZN3ccc8CC3x0y14E", // class name
  bases__ZN3ccc8CC3x0y14E, 2,
  &(vtc__ZN3ccc8CC3x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1325,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y14  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD3x0y143pqrEv
  ~DD3x0y14(); // tgen
  DD3x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x0y143pqrEv");}
ccc::DD3x0y14 ::~DD3x0y14(){ note_dtor("_ZN3ccc8DD3x0y14E", this);} // tgen
ccc::DD3x0y14 ::DD3x0y14(){ note_ctor("_ZN3ccc8DD3x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y14E, buf);
    ::ccc::DD3x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y14E);
    dp->::ccc::DD3x0y14::~DD3x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y14E(Test__ZN3ccc8DD3x0y14E, "_ZN3ccc8DD3x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y14C1Ev();
extern void _ZN3ccc8DD3x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y14E[] = {
  NSPAIR(_ZN3ccc8DD3x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x0y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x0y143pqrEv,_ZTv0_n20_N3ccc8DD3x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x0y143pqrEv,_ZThn4_N3ccc8DD3x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x0y143pqrEv,_ZTv0_n20_N3ccc8DD3x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y14E[] = {
  {&(_ZTVN3ccc8DD3x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y14E[];
static VTBL_ENTRY alt_thunk_names1326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x0y143pqrEv,_ZTv0_n20_N3ccc8DD3x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x0y143pqrEv,_ZThn4_N3ccc8DD3x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x0y14E = {  "_ZN3ccc8DD3x0y14E", // class name
  bases__ZN3ccc8DD3x0y14E, 2,
  &(vtc__ZN3ccc8DD3x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1326,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y15  : virtual ::ccc::AA3 , ::ccc::BB0 {
  ~CC3x0y15(); // tgen
  CC3x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x0y15 ::~CC3x0y15(){ note_dtor("_ZN3ccc8CC3x0y15E", this);} // tgen
ccc::CC3x0y15 ::CC3x0y15(){ note_ctor("_ZN3ccc8CC3x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y15E, buf);
    ::ccc::CC3x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC3x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y15E);
    dp->::ccc::CC3x0y15::~CC3x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y15E(Test__ZN3ccc8CC3x0y15E, "_ZN3ccc8CC3x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y15C1Ev();
extern void _ZN3ccc8CC3x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y15E[] = {
  NSPAIR(_ZN3ccc8CC3x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x0y15E[] = {
  {&(_ZTVN3ccc8CC3x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x0y15E[];
Class_Descriptor cd__ZN3ccc8CC3x0y15E = {  "_ZN3ccc8CC3x0y15E", // class name
  bases__ZN3ccc8CC3x0y15E, 2,
  &(vtc__ZN3ccc8CC3x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x0y15  : virtual ::ccc::AA3 , virtual ::ccc::BB0 {
  ~DD3x0y15(); // tgen
  DD3x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x0y15 ::~DD3x0y15(){ note_dtor("_ZN3ccc8DD3x0y15E", this);} // tgen
ccc::DD3x0y15 ::DD3x0y15(){ note_ctor("_ZN3ccc8DD3x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x0y15E, buf);
    ::ccc::DD3x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x0y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD3x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x0y15E);
    dp->::ccc::DD3x0y15::~DD3x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x0y15E(Test__ZN3ccc8DD3x0y15E, "_ZN3ccc8DD3x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x0y15C1Ev();
extern void _ZN3ccc8DD3x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x0y15E[] = {
  NSPAIR(_ZN3ccc8DD3x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD3x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x0y15E[] = {
  {&(_ZTVN3ccc8DD3x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x0y15E[];
Class_Descriptor cd__ZN3ccc8DD3x0y15E = {  "_ZN3ccc8DD3x0y15E", // class name
  bases__ZN3ccc8DD3x0y15E, 2,
  &(vtc__ZN3ccc8DD3x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y0  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y03pqrEv
  ~CC3x1y0(); // tgen
  CC3x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y0E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y03abcEv");}
void  ccc::CC3x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y03efgEv");}
void  ccc::CC3x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y03pqrEv");}
ccc::CC3x1y0 ::~CC3x1y0(){ note_dtor("_ZN3ccc7CC3x1y0E", this);} // tgen
ccc::CC3x1y0 ::CC3x1y0(){ note_ctor("_ZN3ccc7CC3x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y0E, buf);
    ::ccc::CC3x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y0E);
    dp->::ccc::CC3x1y0::~CC3x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y0E(Test__ZN3ccc7CC3x1y0E, "_ZN3ccc7CC3x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y0C1Ev();
extern void _ZN3ccc7CC3x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y0E[] = {
  NSPAIR(_ZN3ccc7CC3x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y0E[];
extern void _ZN3ccc7CC3x1y03abcEv();
extern void _ZN3ccc7CC3x1y03pqrEv();
extern void _ZN3ccc7CC3x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y03efgEv,_ZTv0_n12_N3ccc7CC3x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03efgEv,_ZThn4_N3ccc7CC3x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y03pqrEv,_ZTv0_n16_N3ccc7CC3x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03pqrEv,_ZThn4_N3ccc7CC3x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y03abcEv,_ZTv0_n20_N3ccc7CC3x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03abcEv,_ZThn4_N3ccc7CC3x1y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y03efgEv,_ZTv0_n12_N3ccc7CC3x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y03pqrEv,_ZTv0_n16_N3ccc7CC3x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y03abcEv,_ZTv0_n20_N3ccc7CC3x1y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y0E[] = {
  {&(_ZTVN3ccc7CC3x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y0E[];
static VTBL_ENTRY alt_thunk_names1327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y03abcEv,_ZTv0_n20_N3ccc7CC3x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y03abcEv,_ZThn4_N3ccc7CC3x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y03pqrEv,_ZTv0_n16_N3ccc7CC3x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y03pqrEv,_ZThn4_N3ccc7CC3x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y03efgEv,_ZTv0_n12_N3ccc7CC3x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y03efgEv,_ZThn4_N3ccc7CC3x1y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y0E = {  "_ZN3ccc7CC3x1y0E", // class name
  bases__ZN3ccc7CC3x1y0E, 2,
  &(vtc__ZN3ccc7CC3x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1327,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y0  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD3x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y03pqrEv
  ~DD3x1y0(); // tgen
  DD3x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y03abcEv");}
void  ccc::DD3x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y03efgEv");}
void  ccc::DD3x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y03pqrEv");}
ccc::DD3x1y0 ::~DD3x1y0(){ note_dtor("_ZN3ccc7DD3x1y0E", this);} // tgen
ccc::DD3x1y0 ::DD3x1y0(){ note_ctor("_ZN3ccc7DD3x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y0E, buf);
    ::ccc::DD3x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y0E);
    dp->::ccc::DD3x1y0::~DD3x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y0E(Test__ZN3ccc7DD3x1y0E, "_ZN3ccc7DD3x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y0C1Ev();
extern void _ZN3ccc7DD3x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y0E[] = {
  NSPAIR(_ZN3ccc7DD3x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y0E[];
extern void _ZN3ccc7DD3x1y03efgEv();
extern void _ZN3ccc7DD3x1y03pqrEv();
extern void _ZN3ccc7DD3x1y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y03abcEv,_ZTv0_n12_N3ccc7DD3x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y03abcEv,_ZThn4_N3ccc7DD3x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y03pqrEv,_ZTv0_n16_N3ccc7DD3x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y03pqrEv,_ZThn4_N3ccc7DD3x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y03efgEv,_ZTv0_n20_N3ccc7DD3x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y03efgEv,_ZThn4_N3ccc7DD3x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y03abcEv,_ZTv0_n12_N3ccc7DD3x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y03pqrEv,_ZTv0_n16_N3ccc7DD3x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y03efgEv,_ZTv0_n20_N3ccc7DD3x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y0E[] = {
  {&(_ZTVN3ccc7DD3x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y0E[];
static VTBL_ENTRY alt_thunk_names1328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y03efgEv,_ZTv0_n20_N3ccc7DD3x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y03efgEv,_ZThn4_N3ccc7DD3x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y03pqrEv,_ZTv0_n16_N3ccc7DD3x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y03pqrEv,_ZThn4_N3ccc7DD3x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y03abcEv,_ZTv0_n12_N3ccc7DD3x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y03abcEv,_ZThn4_N3ccc7DD3x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y0E = {  "_ZN3ccc7DD3x1y0E", // class name
  bases__ZN3ccc7DD3x1y0E, 2,
  &(vtc__ZN3ccc7DD3x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1328,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y1  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x1y13efgEv
  ~CC3x1y1(); // tgen
  CC3x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y1E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y13abcEv");}
void  ccc::CC3x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y13pqrEv");}
void  ccc::CC3x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y13efgEv");}
ccc::CC3x1y1 ::~CC3x1y1(){ note_dtor("_ZN3ccc7CC3x1y1E", this);} // tgen
ccc::CC3x1y1 ::CC3x1y1(){ note_ctor("_ZN3ccc7CC3x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y1E, buf);
    ::ccc::CC3x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y1E);
    dp->::ccc::CC3x1y1::~CC3x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y1E(Test__ZN3ccc7CC3x1y1E, "_ZN3ccc7CC3x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y1C1Ev();
extern void _ZN3ccc7CC3x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y1E[] = {
  NSPAIR(_ZN3ccc7CC3x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y1E[];
extern void _ZN3ccc7CC3x1y13abcEv();
extern void _ZN3ccc7CC3x1y13pqrEv();
extern void _ZN3ccc7CC3x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y13efgEv,_ZTv0_n12_N3ccc7CC3x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13efgEv,_ZThn4_N3ccc7CC3x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y13pqrEv,_ZTv0_n16_N3ccc7CC3x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13pqrEv,_ZThn4_N3ccc7CC3x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y13abcEv,_ZTv0_n20_N3ccc7CC3x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13abcEv,_ZThn4_N3ccc7CC3x1y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y13efgEv,_ZTv0_n12_N3ccc7CC3x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y13pqrEv,_ZTv0_n16_N3ccc7CC3x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y13abcEv,_ZTv0_n20_N3ccc7CC3x1y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y1E[] = {
  {&(_ZTVN3ccc7CC3x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y1E[];
static VTBL_ENTRY alt_thunk_names1329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y13abcEv,_ZTv0_n20_N3ccc7CC3x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y13abcEv,_ZThn4_N3ccc7CC3x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y13pqrEv,_ZTv0_n16_N3ccc7CC3x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y13pqrEv,_ZThn4_N3ccc7CC3x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y13efgEv,_ZTv0_n12_N3ccc7CC3x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y13efgEv,_ZThn4_N3ccc7CC3x1y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y1E = {  "_ZN3ccc7CC3x1y1E", // class name
  bases__ZN3ccc7CC3x1y1E, 2,
  &(vtc__ZN3ccc7CC3x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1329,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y1  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD3x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x1y13efgEv
  ~DD3x1y1(); // tgen
  DD3x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y13abcEv");}
void  ccc::DD3x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y13pqrEv");}
void  ccc::DD3x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y13efgEv");}
ccc::DD3x1y1 ::~DD3x1y1(){ note_dtor("_ZN3ccc7DD3x1y1E", this);} // tgen
ccc::DD3x1y1 ::DD3x1y1(){ note_ctor("_ZN3ccc7DD3x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y1E, buf);
    ::ccc::DD3x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y1E);
    dp->::ccc::DD3x1y1::~DD3x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y1E(Test__ZN3ccc7DD3x1y1E, "_ZN3ccc7DD3x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y1C1Ev();
extern void _ZN3ccc7DD3x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y1E[] = {
  NSPAIR(_ZN3ccc7DD3x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y1E[];
extern void _ZN3ccc7DD3x1y13efgEv();
extern void _ZN3ccc7DD3x1y13pqrEv();
extern void _ZN3ccc7DD3x1y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y13abcEv,_ZTv0_n12_N3ccc7DD3x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y13abcEv,_ZThn4_N3ccc7DD3x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y13pqrEv,_ZTv0_n16_N3ccc7DD3x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y13pqrEv,_ZThn4_N3ccc7DD3x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y13efgEv,_ZTv0_n20_N3ccc7DD3x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y13efgEv,_ZThn4_N3ccc7DD3x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y13abcEv,_ZTv0_n12_N3ccc7DD3x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y13pqrEv,_ZTv0_n16_N3ccc7DD3x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y13efgEv,_ZTv0_n20_N3ccc7DD3x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y1E[] = {
  {&(_ZTVN3ccc7DD3x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y1E[];
static VTBL_ENTRY alt_thunk_names1330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y13efgEv,_ZTv0_n20_N3ccc7DD3x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y13efgEv,_ZThn4_N3ccc7DD3x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y13pqrEv,_ZTv0_n16_N3ccc7DD3x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y13pqrEv,_ZThn4_N3ccc7DD3x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y13abcEv,_ZTv0_n12_N3ccc7DD3x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y13abcEv,_ZThn4_N3ccc7DD3x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y1E = {  "_ZN3ccc7DD3x1y1E", // class name
  bases__ZN3ccc7DD3x1y1E, 2,
  &(vtc__ZN3ccc7DD3x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1330,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y2  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y23pqrEv
  ~CC3x1y2(); // tgen
  CC3x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y2E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y23efgEv");}
void  ccc::CC3x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y23abcEv");}
void  ccc::CC3x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y23pqrEv");}
ccc::CC3x1y2 ::~CC3x1y2(){ note_dtor("_ZN3ccc7CC3x1y2E", this);} // tgen
ccc::CC3x1y2 ::CC3x1y2(){ note_ctor("_ZN3ccc7CC3x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y2E, buf);
    ::ccc::CC3x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y2E);
    dp->::ccc::CC3x1y2::~CC3x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y2E(Test__ZN3ccc7CC3x1y2E, "_ZN3ccc7CC3x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y2C1Ev();
extern void _ZN3ccc7CC3x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y2E[] = {
  NSPAIR(_ZN3ccc7CC3x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y2E[];
extern void _ZN3ccc7CC3x1y23abcEv();
extern void _ZN3ccc7CC3x1y23pqrEv();
extern void _ZN3ccc7CC3x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y23efgEv,_ZTv0_n12_N3ccc7CC3x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23efgEv,_ZThn4_N3ccc7CC3x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y23pqrEv,_ZTv0_n16_N3ccc7CC3x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23pqrEv,_ZThn4_N3ccc7CC3x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y23abcEv,_ZTv0_n20_N3ccc7CC3x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23abcEv,_ZThn4_N3ccc7CC3x1y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y23efgEv,_ZTv0_n12_N3ccc7CC3x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y23pqrEv,_ZTv0_n16_N3ccc7CC3x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y23abcEv,_ZTv0_n20_N3ccc7CC3x1y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y2E[] = {
  {&(_ZTVN3ccc7CC3x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y2E[];
static VTBL_ENTRY alt_thunk_names1331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y23abcEv,_ZTv0_n20_N3ccc7CC3x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y23abcEv,_ZThn4_N3ccc7CC3x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y23pqrEv,_ZTv0_n16_N3ccc7CC3x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y23pqrEv,_ZThn4_N3ccc7CC3x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y23efgEv,_ZTv0_n12_N3ccc7CC3x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y23efgEv,_ZThn4_N3ccc7CC3x1y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y2E = {  "_ZN3ccc7CC3x1y2E", // class name
  bases__ZN3ccc7CC3x1y2E, 2,
  &(vtc__ZN3ccc7CC3x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1331,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y2  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD3x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y23pqrEv
  ~DD3x1y2(); // tgen
  DD3x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y23efgEv");}
void  ccc::DD3x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y23abcEv");}
void  ccc::DD3x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y23pqrEv");}
ccc::DD3x1y2 ::~DD3x1y2(){ note_dtor("_ZN3ccc7DD3x1y2E", this);} // tgen
ccc::DD3x1y2 ::DD3x1y2(){ note_ctor("_ZN3ccc7DD3x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y2E, buf);
    ::ccc::DD3x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y2E);
    dp->::ccc::DD3x1y2::~DD3x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y2E(Test__ZN3ccc7DD3x1y2E, "_ZN3ccc7DD3x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y2C1Ev();
extern void _ZN3ccc7DD3x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y2E[] = {
  NSPAIR(_ZN3ccc7DD3x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y2E[];
extern void _ZN3ccc7DD3x1y23efgEv();
extern void _ZN3ccc7DD3x1y23pqrEv();
extern void _ZN3ccc7DD3x1y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y23abcEv,_ZTv0_n12_N3ccc7DD3x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y23abcEv,_ZThn4_N3ccc7DD3x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y23pqrEv,_ZTv0_n16_N3ccc7DD3x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y23pqrEv,_ZThn4_N3ccc7DD3x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y23efgEv,_ZTv0_n20_N3ccc7DD3x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y23efgEv,_ZThn4_N3ccc7DD3x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y23abcEv,_ZTv0_n12_N3ccc7DD3x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y23pqrEv,_ZTv0_n16_N3ccc7DD3x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y23efgEv,_ZTv0_n20_N3ccc7DD3x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y2E[] = {
  {&(_ZTVN3ccc7DD3x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y2E[];
static VTBL_ENTRY alt_thunk_names1332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y23efgEv,_ZTv0_n20_N3ccc7DD3x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y23efgEv,_ZThn4_N3ccc7DD3x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y23pqrEv,_ZTv0_n16_N3ccc7DD3x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y23pqrEv,_ZThn4_N3ccc7DD3x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y23abcEv,_ZTv0_n12_N3ccc7DD3x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y23abcEv,_ZThn4_N3ccc7DD3x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y2E = {  "_ZN3ccc7DD3x1y2E", // class name
  bases__ZN3ccc7DD3x1y2E, 2,
  &(vtc__ZN3ccc7DD3x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1332,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y3  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x1y33abcEv
  ~CC3x1y3(); // tgen
  CC3x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y3E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y33efgEv");}
void  ccc::CC3x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y33pqrEv");}
void  ccc::CC3x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y33abcEv");}
ccc::CC3x1y3 ::~CC3x1y3(){ note_dtor("_ZN3ccc7CC3x1y3E", this);} // tgen
ccc::CC3x1y3 ::CC3x1y3(){ note_ctor("_ZN3ccc7CC3x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y3E, buf);
    ::ccc::CC3x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y3E);
    dp->::ccc::CC3x1y3::~CC3x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y3E(Test__ZN3ccc7CC3x1y3E, "_ZN3ccc7CC3x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y3C1Ev();
extern void _ZN3ccc7CC3x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y3E[] = {
  NSPAIR(_ZN3ccc7CC3x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y3E[];
extern void _ZN3ccc7CC3x1y33abcEv();
extern void _ZN3ccc7CC3x1y33pqrEv();
extern void _ZN3ccc7CC3x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y33efgEv,_ZTv0_n12_N3ccc7CC3x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33efgEv,_ZThn4_N3ccc7CC3x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y33pqrEv,_ZTv0_n16_N3ccc7CC3x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33pqrEv,_ZThn4_N3ccc7CC3x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y33abcEv,_ZTv0_n20_N3ccc7CC3x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33abcEv,_ZThn4_N3ccc7CC3x1y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y33efgEv,_ZTv0_n12_N3ccc7CC3x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y33pqrEv,_ZTv0_n16_N3ccc7CC3x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y33abcEv,_ZTv0_n20_N3ccc7CC3x1y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y3E[] = {
  {&(_ZTVN3ccc7CC3x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y3E[];
static VTBL_ENTRY alt_thunk_names1333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y33abcEv,_ZTv0_n20_N3ccc7CC3x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y33abcEv,_ZThn4_N3ccc7CC3x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y33pqrEv,_ZTv0_n16_N3ccc7CC3x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y33pqrEv,_ZThn4_N3ccc7CC3x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y33efgEv,_ZTv0_n12_N3ccc7CC3x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y33efgEv,_ZThn4_N3ccc7CC3x1y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y3E = {  "_ZN3ccc7CC3x1y3E", // class name
  bases__ZN3ccc7CC3x1y3E, 2,
  &(vtc__ZN3ccc7CC3x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1333,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y3  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD3x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x1y33abcEv
  ~DD3x1y3(); // tgen
  DD3x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y33efgEv");}
void  ccc::DD3x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y33pqrEv");}
void  ccc::DD3x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y33abcEv");}
ccc::DD3x1y3 ::~DD3x1y3(){ note_dtor("_ZN3ccc7DD3x1y3E", this);} // tgen
ccc::DD3x1y3 ::DD3x1y3(){ note_ctor("_ZN3ccc7DD3x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y3E, buf);
    ::ccc::DD3x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y3E);
    dp->::ccc::DD3x1y3::~DD3x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y3E(Test__ZN3ccc7DD3x1y3E, "_ZN3ccc7DD3x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y3C1Ev();
extern void _ZN3ccc7DD3x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y3E[] = {
  NSPAIR(_ZN3ccc7DD3x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y3E[];
extern void _ZN3ccc7DD3x1y33efgEv();
extern void _ZN3ccc7DD3x1y33pqrEv();
extern void _ZN3ccc7DD3x1y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y33abcEv,_ZTv0_n12_N3ccc7DD3x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y33abcEv,_ZThn4_N3ccc7DD3x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y33pqrEv,_ZTv0_n16_N3ccc7DD3x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y33pqrEv,_ZThn4_N3ccc7DD3x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y33efgEv,_ZTv0_n20_N3ccc7DD3x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y33efgEv,_ZThn4_N3ccc7DD3x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y33abcEv,_ZTv0_n12_N3ccc7DD3x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y33pqrEv,_ZTv0_n16_N3ccc7DD3x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y33efgEv,_ZTv0_n20_N3ccc7DD3x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y3E[] = {
  {&(_ZTVN3ccc7DD3x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y3E[];
static VTBL_ENTRY alt_thunk_names1334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y33efgEv,_ZTv0_n20_N3ccc7DD3x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y33efgEv,_ZThn4_N3ccc7DD3x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y33pqrEv,_ZTv0_n16_N3ccc7DD3x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y33pqrEv,_ZThn4_N3ccc7DD3x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y33abcEv,_ZTv0_n12_N3ccc7DD3x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y33abcEv,_ZThn4_N3ccc7DD3x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y3E = {  "_ZN3ccc7DD3x1y3E", // class name
  bases__ZN3ccc7DD3x1y3E, 2,
  &(vtc__ZN3ccc7DD3x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1334,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y4  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC3x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y43efgEv
  ~CC3x1y4(); // tgen
  CC3x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y4E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y43pqrEv");}
void  ccc::CC3x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y43abcEv");}
void  ccc::CC3x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y43efgEv");}
ccc::CC3x1y4 ::~CC3x1y4(){ note_dtor("_ZN3ccc7CC3x1y4E", this);} // tgen
ccc::CC3x1y4 ::CC3x1y4(){ note_ctor("_ZN3ccc7CC3x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y4E, buf);
    ::ccc::CC3x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y4E);
    dp->::ccc::CC3x1y4::~CC3x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y4E(Test__ZN3ccc7CC3x1y4E, "_ZN3ccc7CC3x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y4C1Ev();
extern void _ZN3ccc7CC3x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y4E[] = {
  NSPAIR(_ZN3ccc7CC3x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y4E[];
extern void _ZN3ccc7CC3x1y43abcEv();
extern void _ZN3ccc7CC3x1y43pqrEv();
extern void _ZN3ccc7CC3x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y43efgEv,_ZTv0_n12_N3ccc7CC3x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43efgEv,_ZThn4_N3ccc7CC3x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y43pqrEv,_ZTv0_n16_N3ccc7CC3x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43pqrEv,_ZThn4_N3ccc7CC3x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y43abcEv,_ZTv0_n20_N3ccc7CC3x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43abcEv,_ZThn4_N3ccc7CC3x1y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y43efgEv,_ZTv0_n12_N3ccc7CC3x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y43pqrEv,_ZTv0_n16_N3ccc7CC3x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y43abcEv,_ZTv0_n20_N3ccc7CC3x1y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y4E[] = {
  {&(_ZTVN3ccc7CC3x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y4E[];
static VTBL_ENTRY alt_thunk_names1335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y43abcEv,_ZTv0_n20_N3ccc7CC3x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y43abcEv,_ZThn4_N3ccc7CC3x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y43pqrEv,_ZTv0_n16_N3ccc7CC3x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y43pqrEv,_ZThn4_N3ccc7CC3x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y43efgEv,_ZTv0_n12_N3ccc7CC3x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y43efgEv,_ZThn4_N3ccc7CC3x1y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y4E = {  "_ZN3ccc7CC3x1y4E", // class name
  bases__ZN3ccc7CC3x1y4E, 2,
  &(vtc__ZN3ccc7CC3x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1335,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y4  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD3x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x1y43efgEv
  ~DD3x1y4(); // tgen
  DD3x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y43pqrEv");}
void  ccc::DD3x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y43abcEv");}
void  ccc::DD3x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y43efgEv");}
ccc::DD3x1y4 ::~DD3x1y4(){ note_dtor("_ZN3ccc7DD3x1y4E", this);} // tgen
ccc::DD3x1y4 ::DD3x1y4(){ note_ctor("_ZN3ccc7DD3x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y4E, buf);
    ::ccc::DD3x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y4E);
    dp->::ccc::DD3x1y4::~DD3x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y4E(Test__ZN3ccc7DD3x1y4E, "_ZN3ccc7DD3x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y4C1Ev();
extern void _ZN3ccc7DD3x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y4E[] = {
  NSPAIR(_ZN3ccc7DD3x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y4E[];
extern void _ZN3ccc7DD3x1y43efgEv();
extern void _ZN3ccc7DD3x1y43pqrEv();
extern void _ZN3ccc7DD3x1y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y43abcEv,_ZTv0_n12_N3ccc7DD3x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y43abcEv,_ZThn4_N3ccc7DD3x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y43pqrEv,_ZTv0_n16_N3ccc7DD3x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y43pqrEv,_ZThn4_N3ccc7DD3x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y43efgEv,_ZTv0_n20_N3ccc7DD3x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y43efgEv,_ZThn4_N3ccc7DD3x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y43abcEv,_ZTv0_n12_N3ccc7DD3x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y43pqrEv,_ZTv0_n16_N3ccc7DD3x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y43efgEv,_ZTv0_n20_N3ccc7DD3x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y4E[] = {
  {&(_ZTVN3ccc7DD3x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y4E[];
static VTBL_ENTRY alt_thunk_names1336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y43efgEv,_ZTv0_n20_N3ccc7DD3x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y43efgEv,_ZThn4_N3ccc7DD3x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y43pqrEv,_ZTv0_n16_N3ccc7DD3x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y43pqrEv,_ZThn4_N3ccc7DD3x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y43abcEv,_ZTv0_n12_N3ccc7DD3x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y43abcEv,_ZThn4_N3ccc7DD3x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y4E = {  "_ZN3ccc7DD3x1y4E", // class name
  bases__ZN3ccc7DD3x1y4E, 2,
  &(vtc__ZN3ccc7DD3x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1336,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y5  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC3x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y53abcEv
  ~CC3x1y5(); // tgen
  CC3x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y5E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y53pqrEv");}
void  ccc::CC3x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y53efgEv");}
void  ccc::CC3x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y53abcEv");}
ccc::CC3x1y5 ::~CC3x1y5(){ note_dtor("_ZN3ccc7CC3x1y5E", this);} // tgen
ccc::CC3x1y5 ::CC3x1y5(){ note_ctor("_ZN3ccc7CC3x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y5E, buf);
    ::ccc::CC3x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y5E);
    dp->::ccc::CC3x1y5::~CC3x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y5E(Test__ZN3ccc7CC3x1y5E, "_ZN3ccc7CC3x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y5C1Ev();
extern void _ZN3ccc7CC3x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y5E[] = {
  NSPAIR(_ZN3ccc7CC3x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y5E[];
extern void _ZN3ccc7CC3x1y53abcEv();
extern void _ZN3ccc7CC3x1y53pqrEv();
extern void _ZN3ccc7CC3x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y53efgEv,_ZTv0_n12_N3ccc7CC3x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53efgEv,_ZThn4_N3ccc7CC3x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y53pqrEv,_ZTv0_n16_N3ccc7CC3x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53pqrEv,_ZThn4_N3ccc7CC3x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y53abcEv,_ZTv0_n20_N3ccc7CC3x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53abcEv,_ZThn4_N3ccc7CC3x1y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y53efgEv,_ZTv0_n12_N3ccc7CC3x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y53pqrEv,_ZTv0_n16_N3ccc7CC3x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y53abcEv,_ZTv0_n20_N3ccc7CC3x1y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y5E[] = {
  {&(_ZTVN3ccc7CC3x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y5E[];
static VTBL_ENTRY alt_thunk_names1337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y53abcEv,_ZTv0_n20_N3ccc7CC3x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y53abcEv,_ZThn4_N3ccc7CC3x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y53pqrEv,_ZTv0_n16_N3ccc7CC3x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y53pqrEv,_ZThn4_N3ccc7CC3x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y53efgEv,_ZTv0_n12_N3ccc7CC3x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y53efgEv,_ZThn4_N3ccc7CC3x1y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y5E = {  "_ZN3ccc7CC3x1y5E", // class name
  bases__ZN3ccc7CC3x1y5E, 2,
  &(vtc__ZN3ccc7CC3x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1337,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y5  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD3x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x1y53abcEv
  ~DD3x1y5(); // tgen
  DD3x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y53pqrEv");}
void  ccc::DD3x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y53efgEv");}
void  ccc::DD3x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y53abcEv");}
ccc::DD3x1y5 ::~DD3x1y5(){ note_dtor("_ZN3ccc7DD3x1y5E", this);} // tgen
ccc::DD3x1y5 ::DD3x1y5(){ note_ctor("_ZN3ccc7DD3x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y5E, buf);
    ::ccc::DD3x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y5E);
    dp->::ccc::DD3x1y5::~DD3x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y5E(Test__ZN3ccc7DD3x1y5E, "_ZN3ccc7DD3x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y5C1Ev();
extern void _ZN3ccc7DD3x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y5E[] = {
  NSPAIR(_ZN3ccc7DD3x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y5E[];
extern void _ZN3ccc7DD3x1y53efgEv();
extern void _ZN3ccc7DD3x1y53pqrEv();
extern void _ZN3ccc7DD3x1y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y53abcEv,_ZTv0_n12_N3ccc7DD3x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y53abcEv,_ZThn4_N3ccc7DD3x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y53pqrEv,_ZTv0_n16_N3ccc7DD3x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y53pqrEv,_ZThn4_N3ccc7DD3x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y53efgEv,_ZTv0_n20_N3ccc7DD3x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y53efgEv,_ZThn4_N3ccc7DD3x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y53abcEv,_ZTv0_n12_N3ccc7DD3x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y53pqrEv,_ZTv0_n16_N3ccc7DD3x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y53efgEv,_ZTv0_n20_N3ccc7DD3x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y5E[] = {
  {&(_ZTVN3ccc7DD3x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y5E[];
static VTBL_ENTRY alt_thunk_names1338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y53efgEv,_ZTv0_n20_N3ccc7DD3x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y53efgEv,_ZThn4_N3ccc7DD3x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y53pqrEv,_ZTv0_n16_N3ccc7DD3x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y53pqrEv,_ZThn4_N3ccc7DD3x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y53abcEv,_ZTv0_n12_N3ccc7DD3x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y53abcEv,_ZThn4_N3ccc7DD3x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y5E = {  "_ZN3ccc7DD3x1y5E", // class name
  bases__ZN3ccc7DD3x1y5E, 2,
  &(vtc__ZN3ccc7DD3x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1338,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y6  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y63efgEv
  ~CC3x1y6(); // tgen
  CC3x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y6E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y63abcEv");}
void  ccc::CC3x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y63efgEv");}
ccc::CC3x1y6 ::~CC3x1y6(){ note_dtor("_ZN3ccc7CC3x1y6E", this);} // tgen
ccc::CC3x1y6 ::CC3x1y6(){ note_ctor("_ZN3ccc7CC3x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y6E, buf);
    ::ccc::CC3x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y6E);
    dp->::ccc::CC3x1y6::~CC3x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y6E(Test__ZN3ccc7CC3x1y6E, "_ZN3ccc7CC3x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y6C1Ev();
extern void _ZN3ccc7CC3x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y6E[] = {
  NSPAIR(_ZN3ccc7CC3x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y6E[];
extern void _ZN3ccc7CC3x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC3x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y63efgEv,_ZTv0_n12_N3ccc7CC3x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y63efgEv,_ZThn4_N3ccc7CC3x1y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y63abcEv,_ZTv0_n20_N3ccc7CC3x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y63abcEv,_ZThn4_N3ccc7CC3x1y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y63efgEv,_ZTv0_n12_N3ccc7CC3x1y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y63abcEv,_ZTv0_n20_N3ccc7CC3x1y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y6E[] = {
  {&(_ZTVN3ccc7CC3x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y6E[];
static VTBL_ENTRY alt_thunk_names1339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y63abcEv,_ZTv0_n20_N3ccc7CC3x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y63abcEv,_ZThn4_N3ccc7CC3x1y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y63efgEv,_ZTv0_n12_N3ccc7CC3x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y63efgEv,_ZThn4_N3ccc7CC3x1y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y6E = {  "_ZN3ccc7CC3x1y6E", // class name
  bases__ZN3ccc7CC3x1y6E, 2,
  &(vtc__ZN3ccc7CC3x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1339,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y6  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD3x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x1y63efgEv
  ~DD3x1y6(); // tgen
  DD3x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y63abcEv");}
void  ccc::DD3x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y63efgEv");}
ccc::DD3x1y6 ::~DD3x1y6(){ note_dtor("_ZN3ccc7DD3x1y6E", this);} // tgen
ccc::DD3x1y6 ::DD3x1y6(){ note_ctor("_ZN3ccc7DD3x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y6E, buf);
    ::ccc::DD3x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y6E);
    dp->::ccc::DD3x1y6::~DD3x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y6E(Test__ZN3ccc7DD3x1y6E, "_ZN3ccc7DD3x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y6C1Ev();
extern void _ZN3ccc7DD3x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y6E[] = {
  NSPAIR(_ZN3ccc7DD3x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y6E[];
extern void _ZN3ccc7DD3x1y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x1y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y63abcEv,_ZTv0_n12_N3ccc7DD3x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y63abcEv,_ZThn4_N3ccc7DD3x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y63efgEv,_ZTv0_n20_N3ccc7DD3x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y63efgEv,_ZThn4_N3ccc7DD3x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y63abcEv,_ZTv0_n12_N3ccc7DD3x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y63efgEv,_ZTv0_n20_N3ccc7DD3x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y6E[] = {
  {&(_ZTVN3ccc7DD3x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y6E[];
static VTBL_ENTRY alt_thunk_names1340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y63efgEv,_ZTv0_n20_N3ccc7DD3x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y63efgEv,_ZThn4_N3ccc7DD3x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y63abcEv,_ZTv0_n12_N3ccc7DD3x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y63abcEv,_ZThn4_N3ccc7DD3x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y6E = {  "_ZN3ccc7DD3x1y6E", // class name
  bases__ZN3ccc7DD3x1y6E, 2,
  &(vtc__ZN3ccc7DD3x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1340,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y7  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y73pqrEv
  ~CC3x1y7(); // tgen
  CC3x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y7E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y73abcEv");}
void  ccc::CC3x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y73pqrEv");}
ccc::CC3x1y7 ::~CC3x1y7(){ note_dtor("_ZN3ccc7CC3x1y7E", this);} // tgen
ccc::CC3x1y7 ::CC3x1y7(){ note_ctor("_ZN3ccc7CC3x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y7E, buf);
    ::ccc::CC3x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y7E);
    dp->::ccc::CC3x1y7::~CC3x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y7E(Test__ZN3ccc7CC3x1y7E, "_ZN3ccc7CC3x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y7C1Ev();
extern void _ZN3ccc7CC3x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y7E[] = {
  NSPAIR(_ZN3ccc7CC3x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y7E[];
extern void _ZN3ccc7CC3x1y73abcEv();
extern void _ZN3ccc7CC3x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y73pqrEv,_ZTv0_n16_N3ccc7CC3x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y73pqrEv,_ZThn4_N3ccc7CC3x1y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y73abcEv,_ZTv0_n20_N3ccc7CC3x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y73abcEv,_ZThn4_N3ccc7CC3x1y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y73pqrEv,_ZTv0_n16_N3ccc7CC3x1y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y73abcEv,_ZTv0_n20_N3ccc7CC3x1y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y7E[] = {
  {&(_ZTVN3ccc7CC3x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y7E[];
static VTBL_ENTRY alt_thunk_names1341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y73abcEv,_ZTv0_n20_N3ccc7CC3x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y73abcEv,_ZThn4_N3ccc7CC3x1y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y73pqrEv,_ZTv0_n16_N3ccc7CC3x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y73pqrEv,_ZThn4_N3ccc7CC3x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y7E = {  "_ZN3ccc7CC3x1y7E", // class name
  bases__ZN3ccc7CC3x1y7E, 2,
  &(vtc__ZN3ccc7CC3x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1341,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y7  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD3x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y73pqrEv
  ~DD3x1y7(); // tgen
  DD3x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y73abcEv");}
void  ccc::DD3x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y73pqrEv");}
ccc::DD3x1y7 ::~DD3x1y7(){ note_dtor("_ZN3ccc7DD3x1y7E", this);} // tgen
ccc::DD3x1y7 ::DD3x1y7(){ note_ctor("_ZN3ccc7DD3x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y7E, buf);
    ::ccc::DD3x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y7E);
    dp->::ccc::DD3x1y7::~DD3x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y7E(Test__ZN3ccc7DD3x1y7E, "_ZN3ccc7DD3x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y7C1Ev();
extern void _ZN3ccc7DD3x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y7E[] = {
  NSPAIR(_ZN3ccc7DD3x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x1y73pqrEv();
extern void _ZN3ccc7DD3x1y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y73abcEv,_ZTv0_n12_N3ccc7DD3x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y73abcEv,_ZThn4_N3ccc7DD3x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y73pqrEv,_ZTv0_n16_N3ccc7DD3x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y73pqrEv,_ZThn4_N3ccc7DD3x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y73abcEv,_ZTv0_n12_N3ccc7DD3x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y73pqrEv,_ZTv0_n16_N3ccc7DD3x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y7E[] = {
  {&(_ZTVN3ccc7DD3x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y7E[];
static VTBL_ENTRY alt_thunk_names1342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y73pqrEv,_ZTv0_n16_N3ccc7DD3x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y73pqrEv,_ZThn4_N3ccc7DD3x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y73abcEv,_ZTv0_n12_N3ccc7DD3x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y73abcEv,_ZThn4_N3ccc7DD3x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y7E = {  "_ZN3ccc7DD3x1y7E", // class name
  bases__ZN3ccc7DD3x1y7E, 2,
  &(vtc__ZN3ccc7DD3x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1342,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y8  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y83abcEv
  ~CC3x1y8(); // tgen
  CC3x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y8E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y83efgEv");}
void  ccc::CC3x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y83abcEv");}
ccc::CC3x1y8 ::~CC3x1y8(){ note_dtor("_ZN3ccc7CC3x1y8E", this);} // tgen
ccc::CC3x1y8 ::CC3x1y8(){ note_ctor("_ZN3ccc7CC3x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y8E, buf);
    ::ccc::CC3x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y8E);
    dp->::ccc::CC3x1y8::~CC3x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y8E(Test__ZN3ccc7CC3x1y8E, "_ZN3ccc7CC3x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y8C1Ev();
extern void _ZN3ccc7CC3x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y8E[] = {
  NSPAIR(_ZN3ccc7CC3x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y8E[];
extern void _ZN3ccc7CC3x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC3x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y83efgEv,_ZTv0_n12_N3ccc7CC3x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y83efgEv,_ZThn4_N3ccc7CC3x1y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x1y83abcEv,_ZTv0_n20_N3ccc7CC3x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y83abcEv,_ZThn4_N3ccc7CC3x1y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y83efgEv,_ZTv0_n12_N3ccc7CC3x1y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x1y83abcEv,_ZTv0_n20_N3ccc7CC3x1y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y8E[] = {
  {&(_ZTVN3ccc7CC3x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y8E[];
static VTBL_ENTRY alt_thunk_names1343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x1y83abcEv,_ZTv0_n20_N3ccc7CC3x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y83abcEv,_ZThn4_N3ccc7CC3x1y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y83efgEv,_ZTv0_n12_N3ccc7CC3x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y83efgEv,_ZThn4_N3ccc7CC3x1y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y8E = {  "_ZN3ccc7CC3x1y8E", // class name
  bases__ZN3ccc7CC3x1y8E, 2,
  &(vtc__ZN3ccc7CC3x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1343,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y8  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD3x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x1y83abcEv
  ~DD3x1y8(); // tgen
  DD3x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y83efgEv");}
void  ccc::DD3x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x1y83abcEv");}
ccc::DD3x1y8 ::~DD3x1y8(){ note_dtor("_ZN3ccc7DD3x1y8E", this);} // tgen
ccc::DD3x1y8 ::DD3x1y8(){ note_ctor("_ZN3ccc7DD3x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y8E, buf);
    ::ccc::DD3x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y8E);
    dp->::ccc::DD3x1y8::~DD3x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y8E(Test__ZN3ccc7DD3x1y8E, "_ZN3ccc7DD3x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y8C1Ev();
extern void _ZN3ccc7DD3x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y8E[] = {
  NSPAIR(_ZN3ccc7DD3x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y8E[];
extern void _ZN3ccc7DD3x1y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x1y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x1y83abcEv,_ZTv0_n12_N3ccc7DD3x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y83abcEv,_ZThn4_N3ccc7DD3x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y83efgEv,_ZTv0_n20_N3ccc7DD3x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y83efgEv,_ZThn4_N3ccc7DD3x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x1y83abcEv,_ZTv0_n12_N3ccc7DD3x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y83efgEv,_ZTv0_n20_N3ccc7DD3x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y8E[] = {
  {&(_ZTVN3ccc7DD3x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y8E[];
static VTBL_ENTRY alt_thunk_names1344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y83efgEv,_ZTv0_n20_N3ccc7DD3x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y83efgEv,_ZThn4_N3ccc7DD3x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x1y83abcEv,_ZTv0_n12_N3ccc7DD3x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y83abcEv,_ZThn4_N3ccc7DD3x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y8E = {  "_ZN3ccc7DD3x1y8E", // class name
  bases__ZN3ccc7DD3x1y8E, 2,
  &(vtc__ZN3ccc7DD3x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1344,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y9  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y93pqrEv
  ~CC3x1y9(); // tgen
  CC3x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y9E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y93efgEv");}
void  ccc::CC3x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y93pqrEv");}
ccc::CC3x1y9 ::~CC3x1y9(){ note_dtor("_ZN3ccc7CC3x1y9E", this);} // tgen
ccc::CC3x1y9 ::CC3x1y9(){ note_ctor("_ZN3ccc7CC3x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y9E, buf);
    ::ccc::CC3x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC3x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y9E);
    dp->::ccc::CC3x1y9::~CC3x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y9E(Test__ZN3ccc7CC3x1y9E, "_ZN3ccc7CC3x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y9C1Ev();
extern void _ZN3ccc7CC3x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y9E[] = {
  NSPAIR(_ZN3ccc7CC3x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC3x1y93pqrEv();
extern void _ZN3ccc7CC3x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x1y93efgEv,_ZTv0_n12_N3ccc7CC3x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y93efgEv,_ZThn4_N3ccc7CC3x1y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x1y93pqrEv,_ZTv0_n16_N3ccc7CC3x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y93pqrEv,_ZThn4_N3ccc7CC3x1y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x1y93efgEv,_ZTv0_n12_N3ccc7CC3x1y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x1y93pqrEv,_ZTv0_n16_N3ccc7CC3x1y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x1y9E[] = {
  {&(_ZTVN3ccc7CC3x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x1y9E[];
static VTBL_ENTRY alt_thunk_names1345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x1y93pqrEv,_ZTv0_n16_N3ccc7CC3x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y93pqrEv,_ZThn4_N3ccc7CC3x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x1y93efgEv,_ZTv0_n12_N3ccc7CC3x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x1y93efgEv,_ZThn4_N3ccc7CC3x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x1y9E = {  "_ZN3ccc7CC3x1y9E", // class name
  bases__ZN3ccc7CC3x1y9E, 2,
  &(vtc__ZN3ccc7CC3x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x1y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1345,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y9  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD3x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x1y93pqrEv
  ~DD3x1y9(); // tgen
  DD3x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x1y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x1y93efgEv");}
void  ccc::DD3x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x1y93pqrEv");}
ccc::DD3x1y9 ::~DD3x1y9(){ note_dtor("_ZN3ccc7DD3x1y9E", this);} // tgen
ccc::DD3x1y9 ::DD3x1y9(){ note_ctor("_ZN3ccc7DD3x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x1y9E, buf);
    ::ccc::DD3x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x1y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD3x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x1y9E);
    dp->::ccc::DD3x1y9::~DD3x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x1y9E(Test__ZN3ccc7DD3x1y9E, "_ZN3ccc7DD3x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x1y9C1Ev();
extern void _ZN3ccc7DD3x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x1y9E[] = {
  NSPAIR(_ZN3ccc7DD3x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD3x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y9E[];
extern void _ZN3ccc7DD3x1y93efgEv();
extern void _ZN3ccc7DD3x1y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x1y93pqrEv,_ZTv0_n16_N3ccc7DD3x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y93pqrEv,_ZThn4_N3ccc7DD3x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x1y93efgEv,_ZTv0_n20_N3ccc7DD3x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x1y93efgEv,_ZThn4_N3ccc7DD3x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x1y93pqrEv,_ZTv0_n16_N3ccc7DD3x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x1y93efgEv,_ZTv0_n20_N3ccc7DD3x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x1y9E[] = {
  {&(_ZTVN3ccc7DD3x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x1y9E[];
static VTBL_ENTRY alt_thunk_names1346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x1y93efgEv,_ZTv0_n20_N3ccc7DD3x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y93efgEv,_ZThn4_N3ccc7DD3x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x1y93pqrEv,_ZTv0_n16_N3ccc7DD3x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x1y93pqrEv,_ZThn4_N3ccc7DD3x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x1y9E = {  "_ZN3ccc7DD3x1y9E", // class name
  bases__ZN3ccc7DD3x1y9E, 2,
  &(vtc__ZN3ccc7DD3x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x1y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1346,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y10  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x1y103abcEv
  ~CC3x1y10(); // tgen
  CC3x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y10E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y103pqrEv");}
void  ccc::CC3x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x1y103abcEv");}
ccc::CC3x1y10 ::~CC3x1y10(){ note_dtor("_ZN3ccc8CC3x1y10E", this);} // tgen
ccc::CC3x1y10 ::CC3x1y10(){ note_ctor("_ZN3ccc8CC3x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y10E, buf);
    ::ccc::CC3x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y10E);
    dp->::ccc::CC3x1y10::~CC3x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y10E(Test__ZN3ccc8CC3x1y10E, "_ZN3ccc8CC3x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y10C1Ev();
extern void _ZN3ccc8CC3x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y10E[] = {
  NSPAIR(_ZN3ccc8CC3x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y10E[];
extern void _ZN3ccc8CC3x1y103abcEv();
extern void _ZN3ccc8CC3x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x1y103pqrEv,_ZTv0_n16_N3ccc8CC3x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y103pqrEv,_ZThn4_N3ccc8CC3x1y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x1y103abcEv,_ZTv0_n20_N3ccc8CC3x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y103abcEv,_ZThn4_N3ccc8CC3x1y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x1y103pqrEv,_ZTv0_n16_N3ccc8CC3x1y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x1y103abcEv,_ZTv0_n20_N3ccc8CC3x1y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y10E[] = {
  {&(_ZTVN3ccc8CC3x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y10E[];
static VTBL_ENTRY alt_thunk_names1347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x1y103abcEv,_ZTv0_n20_N3ccc8CC3x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y103abcEv,_ZThn4_N3ccc8CC3x1y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x1y103pqrEv,_ZTv0_n16_N3ccc8CC3x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y103pqrEv,_ZThn4_N3ccc8CC3x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x1y10E = {  "_ZN3ccc8CC3x1y10E", // class name
  bases__ZN3ccc8CC3x1y10E, 2,
  &(vtc__ZN3ccc8CC3x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1347,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y10  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD3x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x1y103abcEv
  ~DD3x1y10(); // tgen
  DD3x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x1y103pqrEv");}
void  ccc::DD3x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x1y103abcEv");}
ccc::DD3x1y10 ::~DD3x1y10(){ note_dtor("_ZN3ccc8DD3x1y10E", this);} // tgen
ccc::DD3x1y10 ::DD3x1y10(){ note_ctor("_ZN3ccc8DD3x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y10E, buf);
    ::ccc::DD3x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y10E);
    dp->::ccc::DD3x1y10::~DD3x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y10E(Test__ZN3ccc8DD3x1y10E, "_ZN3ccc8DD3x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y10C1Ev();
extern void _ZN3ccc8DD3x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y10E[] = {
  NSPAIR(_ZN3ccc8DD3x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x1y103pqrEv();
extern void _ZN3ccc8DD3x1y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x1y103abcEv,_ZTv0_n12_N3ccc8DD3x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y103abcEv,_ZThn4_N3ccc8DD3x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x1y103pqrEv,_ZTv0_n16_N3ccc8DD3x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y103pqrEv,_ZThn4_N3ccc8DD3x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x1y103abcEv,_ZTv0_n12_N3ccc8DD3x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x1y103pqrEv,_ZTv0_n16_N3ccc8DD3x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y10E[] = {
  {&(_ZTVN3ccc8DD3x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y10E[];
static VTBL_ENTRY alt_thunk_names1348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x1y103pqrEv,_ZTv0_n16_N3ccc8DD3x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y103pqrEv,_ZThn4_N3ccc8DD3x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x1y103abcEv,_ZTv0_n12_N3ccc8DD3x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y103abcEv,_ZThn4_N3ccc8DD3x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x1y10E = {  "_ZN3ccc8DD3x1y10E", // class name
  bases__ZN3ccc8DD3x1y10E, 2,
  &(vtc__ZN3ccc8DD3x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1348,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y11  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x1y113efgEv
  ~CC3x1y11(); // tgen
  CC3x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y11E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y113pqrEv");}
void  ccc::CC3x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x1y113efgEv");}
ccc::CC3x1y11 ::~CC3x1y11(){ note_dtor("_ZN3ccc8CC3x1y11E", this);} // tgen
ccc::CC3x1y11 ::CC3x1y11(){ note_ctor("_ZN3ccc8CC3x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y11E, buf);
    ::ccc::CC3x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y11E);
    dp->::ccc::CC3x1y11::~CC3x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y11E(Test__ZN3ccc8CC3x1y11E, "_ZN3ccc8CC3x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y11C1Ev();
extern void _ZN3ccc8CC3x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y11E[] = {
  NSPAIR(_ZN3ccc8CC3x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC3x1y113pqrEv();
extern void _ZN3ccc8CC3x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x1y113efgEv,_ZTv0_n12_N3ccc8CC3x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y113efgEv,_ZThn4_N3ccc8CC3x1y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x1y113pqrEv,_ZTv0_n16_N3ccc8CC3x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y113pqrEv,_ZThn4_N3ccc8CC3x1y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x1y113efgEv,_ZTv0_n12_N3ccc8CC3x1y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x1y113pqrEv,_ZTv0_n16_N3ccc8CC3x1y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y11E[] = {
  {&(_ZTVN3ccc8CC3x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y11E[];
static VTBL_ENTRY alt_thunk_names1349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x1y113pqrEv,_ZTv0_n16_N3ccc8CC3x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y113pqrEv,_ZThn4_N3ccc8CC3x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x1y113efgEv,_ZTv0_n12_N3ccc8CC3x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y113efgEv,_ZThn4_N3ccc8CC3x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x1y11E = {  "_ZN3ccc8CC3x1y11E", // class name
  bases__ZN3ccc8CC3x1y11E, 2,
  &(vtc__ZN3ccc8CC3x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1349,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y11  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD3x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x1y113efgEv
  ~DD3x1y11(); // tgen
  DD3x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x1y113pqrEv");}
void  ccc::DD3x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x1y113efgEv");}
ccc::DD3x1y11 ::~DD3x1y11(){ note_dtor("_ZN3ccc8DD3x1y11E", this);} // tgen
ccc::DD3x1y11 ::DD3x1y11(){ note_ctor("_ZN3ccc8DD3x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y11E, buf);
    ::ccc::DD3x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y11E);
    dp->::ccc::DD3x1y11::~DD3x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y11E(Test__ZN3ccc8DD3x1y11E, "_ZN3ccc8DD3x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y11C1Ev();
extern void _ZN3ccc8DD3x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y11E[] = {
  NSPAIR(_ZN3ccc8DD3x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y11E[];
extern void _ZN3ccc8DD3x1y113efgEv();
extern void _ZN3ccc8DD3x1y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x1y113pqrEv,_ZTv0_n16_N3ccc8DD3x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y113pqrEv,_ZThn4_N3ccc8DD3x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x1y113efgEv,_ZTv0_n20_N3ccc8DD3x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y113efgEv,_ZThn4_N3ccc8DD3x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x1y113pqrEv,_ZTv0_n16_N3ccc8DD3x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x1y113efgEv,_ZTv0_n20_N3ccc8DD3x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y11E[] = {
  {&(_ZTVN3ccc8DD3x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y11E[];
static VTBL_ENTRY alt_thunk_names1350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x1y113efgEv,_ZTv0_n20_N3ccc8DD3x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y113efgEv,_ZThn4_N3ccc8DD3x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x1y113pqrEv,_ZTv0_n16_N3ccc8DD3x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y113pqrEv,_ZThn4_N3ccc8DD3x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x1y11E = {  "_ZN3ccc8DD3x1y11E", // class name
  bases__ZN3ccc8DD3x1y11E, 2,
  &(vtc__ZN3ccc8DD3x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1350,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y12  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC3x1y123abcEv
  ~CC3x1y12(); // tgen
  CC3x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x1y123abcEv");}
ccc::CC3x1y12 ::~CC3x1y12(){ note_dtor("_ZN3ccc8CC3x1y12E", this);} // tgen
ccc::CC3x1y12 ::CC3x1y12(){ note_ctor("_ZN3ccc8CC3x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y12E, buf);
    ::ccc::CC3x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y12E);
    dp->::ccc::CC3x1y12::~CC3x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y12E(Test__ZN3ccc8CC3x1y12E, "_ZN3ccc8CC3x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y12C1Ev();
extern void _ZN3ccc8CC3x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y12E[] = {
  NSPAIR(_ZN3ccc8CC3x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y12E[];
extern void _ZN3ccc8CC3x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x1y123abcEv,_ZTv0_n20_N3ccc8CC3x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y123abcEv,_ZThn4_N3ccc8CC3x1y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x1y123abcEv,_ZTv0_n20_N3ccc8CC3x1y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y12E[] = {
  {&(_ZTVN3ccc8CC3x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y12E[];
static VTBL_ENTRY alt_thunk_names1351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x1y123abcEv,_ZTv0_n20_N3ccc8CC3x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y123abcEv,_ZThn4_N3ccc8CC3x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x1y12E = {  "_ZN3ccc8CC3x1y12E", // class name
  bases__ZN3ccc8CC3x1y12E, 2,
  &(vtc__ZN3ccc8CC3x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1351,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y12  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD3x1y123abcEv
  ~DD3x1y12(); // tgen
  DD3x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x1y123abcEv");}
ccc::DD3x1y12 ::~DD3x1y12(){ note_dtor("_ZN3ccc8DD3x1y12E", this);} // tgen
ccc::DD3x1y12 ::DD3x1y12(){ note_ctor("_ZN3ccc8DD3x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y12E, buf);
    ::ccc::DD3x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y12E);
    dp->::ccc::DD3x1y12::~DD3x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y12E(Test__ZN3ccc8DD3x1y12E, "_ZN3ccc8DD3x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y12C1Ev();
extern void _ZN3ccc8DD3x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y12E[] = {
  NSPAIR(_ZN3ccc8DD3x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x1y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x1y123abcEv,_ZTv0_n12_N3ccc8DD3x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y123abcEv,_ZThn4_N3ccc8DD3x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x1y123abcEv,_ZTv0_n12_N3ccc8DD3x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y12E[] = {
  {&(_ZTVN3ccc8DD3x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y12E[];
static VTBL_ENTRY alt_thunk_names1352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x1y123abcEv,_ZTv0_n12_N3ccc8DD3x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y123abcEv,_ZThn4_N3ccc8DD3x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x1y12E = {  "_ZN3ccc8DD3x1y12E", // class name
  bases__ZN3ccc8DD3x1y12E, 2,
  &(vtc__ZN3ccc8DD3x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1352,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y13  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC3x1y133efgEv
  ~CC3x1y13(); // tgen
  CC3x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x1y133efgEv");}
ccc::CC3x1y13 ::~CC3x1y13(){ note_dtor("_ZN3ccc8CC3x1y13E", this);} // tgen
ccc::CC3x1y13 ::CC3x1y13(){ note_ctor("_ZN3ccc8CC3x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y13E, buf);
    ::ccc::CC3x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y13E);
    dp->::ccc::CC3x1y13::~CC3x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y13E(Test__ZN3ccc8CC3x1y13E, "_ZN3ccc8CC3x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y13C1Ev();
extern void _ZN3ccc8CC3x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y13E[] = {
  NSPAIR(_ZN3ccc8CC3x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC3x1y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x1y133efgEv,_ZTv0_n12_N3ccc8CC3x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y133efgEv,_ZThn4_N3ccc8CC3x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x1y133efgEv,_ZTv0_n12_N3ccc8CC3x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y13E[] = {
  {&(_ZTVN3ccc8CC3x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y13E[];
static VTBL_ENTRY alt_thunk_names1353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x1y133efgEv,_ZTv0_n12_N3ccc8CC3x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y133efgEv,_ZThn4_N3ccc8CC3x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x1y13E = {  "_ZN3ccc8CC3x1y13E", // class name
  bases__ZN3ccc8CC3x1y13E, 2,
  &(vtc__ZN3ccc8CC3x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1353,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y13  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD3x1y133efgEv
  ~DD3x1y13(); // tgen
  DD3x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x1y133efgEv");}
ccc::DD3x1y13 ::~DD3x1y13(){ note_dtor("_ZN3ccc8DD3x1y13E", this);} // tgen
ccc::DD3x1y13 ::DD3x1y13(){ note_ctor("_ZN3ccc8DD3x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y13E, buf);
    ::ccc::DD3x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y13E);
    dp->::ccc::DD3x1y13::~DD3x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y13E(Test__ZN3ccc8DD3x1y13E, "_ZN3ccc8DD3x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y13C1Ev();
extern void _ZN3ccc8DD3x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y13E[] = {
  NSPAIR(_ZN3ccc8DD3x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y13E[];
extern void _ZN3ccc8DD3x1y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x1y133efgEv,_ZTv0_n20_N3ccc8DD3x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y133efgEv,_ZThn4_N3ccc8DD3x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x1y133efgEv,_ZTv0_n20_N3ccc8DD3x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y13E[] = {
  {&(_ZTVN3ccc8DD3x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y13E[];
static VTBL_ENTRY alt_thunk_names1354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x1y133efgEv,_ZTv0_n20_N3ccc8DD3x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y133efgEv,_ZThn4_N3ccc8DD3x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x1y13E = {  "_ZN3ccc8DD3x1y13E", // class name
  bases__ZN3ccc8DD3x1y13E, 2,
  &(vtc__ZN3ccc8DD3x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1354,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y14  : virtual ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y143pqrEv
  ~CC3x1y14(); // tgen
  CC3x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y143pqrEv");}
ccc::CC3x1y14 ::~CC3x1y14(){ note_dtor("_ZN3ccc8CC3x1y14E", this);} // tgen
ccc::CC3x1y14 ::CC3x1y14(){ note_ctor("_ZN3ccc8CC3x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y14E, buf);
    ::ccc::CC3x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y14E);
    dp->::ccc::CC3x1y14::~CC3x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y14E(Test__ZN3ccc8CC3x1y14E, "_ZN3ccc8CC3x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y14C1Ev();
extern void _ZN3ccc8CC3x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y14E[] = {
  NSPAIR(_ZN3ccc8CC3x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC3x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x1y143pqrEv,_ZTv0_n16_N3ccc8CC3x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y143pqrEv,_ZThn4_N3ccc8CC3x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x1y143pqrEv,_ZTv0_n16_N3ccc8CC3x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y14E[] = {
  {&(_ZTVN3ccc8CC3x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y14E[];
static VTBL_ENTRY alt_thunk_names1355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x1y143pqrEv,_ZTv0_n16_N3ccc8CC3x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x1y143pqrEv,_ZThn4_N3ccc8CC3x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x1y14E = {  "_ZN3ccc8CC3x1y14E", // class name
  bases__ZN3ccc8CC3x1y14E, 2,
  &(vtc__ZN3ccc8CC3x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1355,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y14  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD3x1y143pqrEv
  ~DD3x1y14(); // tgen
  DD3x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x1y143pqrEv");}
ccc::DD3x1y14 ::~DD3x1y14(){ note_dtor("_ZN3ccc8DD3x1y14E", this);} // tgen
ccc::DD3x1y14 ::DD3x1y14(){ note_ctor("_ZN3ccc8DD3x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y14E, buf);
    ::ccc::DD3x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y14E);
    dp->::ccc::DD3x1y14::~DD3x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y14E(Test__ZN3ccc8DD3x1y14E, "_ZN3ccc8DD3x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y14C1Ev();
extern void _ZN3ccc8DD3x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y14E[] = {
  NSPAIR(_ZN3ccc8DD3x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x1y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x1y143pqrEv,_ZTv0_n16_N3ccc8DD3x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x1y143pqrEv,_ZThn4_N3ccc8DD3x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x1y143pqrEv,_ZTv0_n16_N3ccc8DD3x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y14E[] = {
  {&(_ZTVN3ccc8DD3x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y14E[];
static VTBL_ENTRY alt_thunk_names1356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x1y143pqrEv,_ZTv0_n16_N3ccc8DD3x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x1y143pqrEv,_ZThn4_N3ccc8DD3x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x1y14E = {  "_ZN3ccc8DD3x1y14E", // class name
  bases__ZN3ccc8DD3x1y14E, 2,
  &(vtc__ZN3ccc8DD3x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1356,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y15  : virtual ::ccc::AA3 , ::ccc::BB1 {
  ~CC3x1y15(); // tgen
  CC3x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x1y15 ::~CC3x1y15(){ note_dtor("_ZN3ccc8CC3x1y15E", this);} // tgen
ccc::CC3x1y15 ::CC3x1y15(){ note_ctor("_ZN3ccc8CC3x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y15E, buf);
    ::ccc::CC3x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC3x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y15E);
    dp->::ccc::CC3x1y15::~CC3x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y15E(Test__ZN3ccc8CC3x1y15E, "_ZN3ccc8CC3x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y15C1Ev();
extern void _ZN3ccc8CC3x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y15E[] = {
  NSPAIR(_ZN3ccc8CC3x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x1y15E[] = {
  {&(_ZTVN3ccc8CC3x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x1y15E[];
Class_Descriptor cd__ZN3ccc8CC3x1y15E = {  "_ZN3ccc8CC3x1y15E", // class name
  bases__ZN3ccc8CC3x1y15E, 2,
  &(vtc__ZN3ccc8CC3x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x1y15  : virtual ::ccc::AA3 , virtual ::ccc::BB1 {
  ~DD3x1y15(); // tgen
  DD3x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x1y15 ::~DD3x1y15(){ note_dtor("_ZN3ccc8DD3x1y15E", this);} // tgen
ccc::DD3x1y15 ::DD3x1y15(){ note_ctor("_ZN3ccc8DD3x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x1y15E, buf);
    ::ccc::DD3x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x1y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD3x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x1y15E);
    dp->::ccc::DD3x1y15::~DD3x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x1y15E(Test__ZN3ccc8DD3x1y15E, "_ZN3ccc8DD3x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x1y15C1Ev();
extern void _ZN3ccc8DD3x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x1y15E[] = {
  NSPAIR(_ZN3ccc8DD3x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD3x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x1y15E[] = {
  {&(_ZTVN3ccc8DD3x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x1y15E[];
Class_Descriptor cd__ZN3ccc8DD3x1y15E = {  "_ZN3ccc8DD3x1y15E", // class name
  bases__ZN3ccc8DD3x1y15E, 2,
  &(vtc__ZN3ccc8DD3x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y0  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y03pqrEv
  ~CC3x2y0(); // tgen
  CC3x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y0E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y03abcEv");}
void  ccc::CC3x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y03efgEv");}
void  ccc::CC3x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y03pqrEv");}
ccc::CC3x2y0 ::~CC3x2y0(){ note_dtor("_ZN3ccc7CC3x2y0E", this);} // tgen
ccc::CC3x2y0 ::CC3x2y0(){ note_ctor("_ZN3ccc7CC3x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y0E, buf);
    ::ccc::CC3x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y0E);
    dp->::ccc::CC3x2y0::~CC3x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y0E(Test__ZN3ccc7CC3x2y0E, "_ZN3ccc7CC3x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y0C1Ev();
extern void _ZN3ccc7CC3x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y0E[] = {
  NSPAIR(_ZN3ccc7CC3x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y0E[];
extern void _ZN3ccc7CC3x2y03efgEv();
extern void _ZN3ccc7CC3x2y03abcEv();
extern void _ZN3ccc7CC3x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y03efgEv,_ZTv0_n12_N3ccc7CC3x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03efgEv,_ZThn4_N3ccc7CC3x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y03pqrEv,_ZTv0_n16_N3ccc7CC3x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03pqrEv,_ZThn4_N3ccc7CC3x2y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y03abcEv,_ZTv0_n20_N3ccc7CC3x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03abcEv,_ZThn4_N3ccc7CC3x2y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y03efgEv,_ZTv0_n12_N3ccc7CC3x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y03pqrEv,_ZTv0_n16_N3ccc7CC3x2y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y03abcEv,_ZTv0_n20_N3ccc7CC3x2y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y0E[] = {
  {&(_ZTVN3ccc7CC3x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y0E[];
static VTBL_ENTRY alt_thunk_names1357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y03abcEv,_ZTv0_n20_N3ccc7CC3x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y03abcEv,_ZThn4_N3ccc7CC3x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y03pqrEv,_ZTv0_n16_N3ccc7CC3x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y03pqrEv,_ZThn4_N3ccc7CC3x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y03efgEv,_ZTv0_n12_N3ccc7CC3x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y03efgEv,_ZThn4_N3ccc7CC3x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y0E = {  "_ZN3ccc7CC3x2y0E", // class name
  bases__ZN3ccc7CC3x2y0E, 2,
  &(vtc__ZN3ccc7CC3x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1357,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y0  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD3x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y03pqrEv
  ~DD3x2y0(); // tgen
  DD3x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y03abcEv");}
void  ccc::DD3x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y03efgEv");}
void  ccc::DD3x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y03pqrEv");}
ccc::DD3x2y0 ::~DD3x2y0(){ note_dtor("_ZN3ccc7DD3x2y0E", this);} // tgen
ccc::DD3x2y0 ::DD3x2y0(){ note_ctor("_ZN3ccc7DD3x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y0E, buf);
    ::ccc::DD3x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y0E);
    dp->::ccc::DD3x2y0::~DD3x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y0E(Test__ZN3ccc7DD3x2y0E, "_ZN3ccc7DD3x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y0C1Ev();
extern void _ZN3ccc7DD3x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y0E[] = {
  NSPAIR(_ZN3ccc7DD3x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y0E[];
extern void _ZN3ccc7DD3x2y03efgEv();
extern void _ZN3ccc7DD3x2y03pqrEv();
extern void _ZN3ccc7DD3x2y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y03efgEv,_ZTv0_n12_N3ccc7DD3x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y03efgEv,_ZThn4_N3ccc7DD3x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y03abcEv,_ZTv0_n16_N3ccc7DD3x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y03abcEv,_ZThn4_N3ccc7DD3x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y03pqrEv,_ZTv0_n20_N3ccc7DD3x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y03pqrEv,_ZThn4_N3ccc7DD3x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y03efgEv,_ZTv0_n12_N3ccc7DD3x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y03abcEv,_ZTv0_n16_N3ccc7DD3x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y03pqrEv,_ZTv0_n20_N3ccc7DD3x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y0E[] = {
  {&(_ZTVN3ccc7DD3x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y0E[];
static VTBL_ENTRY alt_thunk_names1358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y03pqrEv,_ZTv0_n20_N3ccc7DD3x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y03pqrEv,_ZThn4_N3ccc7DD3x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y03abcEv,_ZTv0_n16_N3ccc7DD3x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y03abcEv,_ZThn4_N3ccc7DD3x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y03efgEv,_ZTv0_n12_N3ccc7DD3x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y03efgEv,_ZThn4_N3ccc7DD3x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y0E = {  "_ZN3ccc7DD3x2y0E", // class name
  bases__ZN3ccc7DD3x2y0E, 2,
  &(vtc__ZN3ccc7DD3x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1358,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y1  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x2y13efgEv
  ~CC3x2y1(); // tgen
  CC3x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y1E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y13abcEv");}
void  ccc::CC3x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y13pqrEv");}
void  ccc::CC3x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y13efgEv");}
ccc::CC3x2y1 ::~CC3x2y1(){ note_dtor("_ZN3ccc7CC3x2y1E", this);} // tgen
ccc::CC3x2y1 ::CC3x2y1(){ note_ctor("_ZN3ccc7CC3x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y1E, buf);
    ::ccc::CC3x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y1E);
    dp->::ccc::CC3x2y1::~CC3x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y1E(Test__ZN3ccc7CC3x2y1E, "_ZN3ccc7CC3x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y1C1Ev();
extern void _ZN3ccc7CC3x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y1E[] = {
  NSPAIR(_ZN3ccc7CC3x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y1E[];
extern void _ZN3ccc7CC3x2y13efgEv();
extern void _ZN3ccc7CC3x2y13abcEv();
extern void _ZN3ccc7CC3x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y13efgEv,_ZTv0_n12_N3ccc7CC3x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13efgEv,_ZThn4_N3ccc7CC3x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y13pqrEv,_ZTv0_n16_N3ccc7CC3x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13pqrEv,_ZThn4_N3ccc7CC3x2y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y13abcEv,_ZTv0_n20_N3ccc7CC3x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13abcEv,_ZThn4_N3ccc7CC3x2y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y13efgEv,_ZTv0_n12_N3ccc7CC3x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y13pqrEv,_ZTv0_n16_N3ccc7CC3x2y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y13abcEv,_ZTv0_n20_N3ccc7CC3x2y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y1E[] = {
  {&(_ZTVN3ccc7CC3x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y1E[];
static VTBL_ENTRY alt_thunk_names1359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y13abcEv,_ZTv0_n20_N3ccc7CC3x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y13abcEv,_ZThn4_N3ccc7CC3x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y13pqrEv,_ZTv0_n16_N3ccc7CC3x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y13pqrEv,_ZThn4_N3ccc7CC3x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y13efgEv,_ZTv0_n12_N3ccc7CC3x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y13efgEv,_ZThn4_N3ccc7CC3x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y1E = {  "_ZN3ccc7CC3x2y1E", // class name
  bases__ZN3ccc7CC3x2y1E, 2,
  &(vtc__ZN3ccc7CC3x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1359,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y1  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD3x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x2y13efgEv
  ~DD3x2y1(); // tgen
  DD3x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y13abcEv");}
void  ccc::DD3x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y13pqrEv");}
void  ccc::DD3x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y13efgEv");}
ccc::DD3x2y1 ::~DD3x2y1(){ note_dtor("_ZN3ccc7DD3x2y1E", this);} // tgen
ccc::DD3x2y1 ::DD3x2y1(){ note_ctor("_ZN3ccc7DD3x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y1E, buf);
    ::ccc::DD3x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y1E);
    dp->::ccc::DD3x2y1::~DD3x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y1E(Test__ZN3ccc7DD3x2y1E, "_ZN3ccc7DD3x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y1C1Ev();
extern void _ZN3ccc7DD3x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y1E[] = {
  NSPAIR(_ZN3ccc7DD3x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y1E[];
extern void _ZN3ccc7DD3x2y13efgEv();
extern void _ZN3ccc7DD3x2y13pqrEv();
extern void _ZN3ccc7DD3x2y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y13efgEv,_ZTv0_n12_N3ccc7DD3x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y13efgEv,_ZThn4_N3ccc7DD3x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y13abcEv,_ZTv0_n16_N3ccc7DD3x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y13abcEv,_ZThn4_N3ccc7DD3x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y13pqrEv,_ZTv0_n20_N3ccc7DD3x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y13pqrEv,_ZThn4_N3ccc7DD3x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y13efgEv,_ZTv0_n12_N3ccc7DD3x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y13abcEv,_ZTv0_n16_N3ccc7DD3x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y13pqrEv,_ZTv0_n20_N3ccc7DD3x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y1E[] = {
  {&(_ZTVN3ccc7DD3x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y1E[];
static VTBL_ENTRY alt_thunk_names1360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y13pqrEv,_ZTv0_n20_N3ccc7DD3x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y13pqrEv,_ZThn4_N3ccc7DD3x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y13abcEv,_ZTv0_n16_N3ccc7DD3x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y13abcEv,_ZThn4_N3ccc7DD3x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y13efgEv,_ZTv0_n12_N3ccc7DD3x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y13efgEv,_ZThn4_N3ccc7DD3x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y1E = {  "_ZN3ccc7DD3x2y1E", // class name
  bases__ZN3ccc7DD3x2y1E, 2,
  &(vtc__ZN3ccc7DD3x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1360,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y2  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y23pqrEv
  ~CC3x2y2(); // tgen
  CC3x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y2E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y23efgEv");}
void  ccc::CC3x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y23abcEv");}
void  ccc::CC3x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y23pqrEv");}
ccc::CC3x2y2 ::~CC3x2y2(){ note_dtor("_ZN3ccc7CC3x2y2E", this);} // tgen
ccc::CC3x2y2 ::CC3x2y2(){ note_ctor("_ZN3ccc7CC3x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y2E, buf);
    ::ccc::CC3x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y2E);
    dp->::ccc::CC3x2y2::~CC3x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y2E(Test__ZN3ccc7CC3x2y2E, "_ZN3ccc7CC3x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y2C1Ev();
extern void _ZN3ccc7CC3x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y2E[] = {
  NSPAIR(_ZN3ccc7CC3x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y2E[];
extern void _ZN3ccc7CC3x2y23efgEv();
extern void _ZN3ccc7CC3x2y23abcEv();
extern void _ZN3ccc7CC3x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y23efgEv,_ZTv0_n12_N3ccc7CC3x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23efgEv,_ZThn4_N3ccc7CC3x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y23pqrEv,_ZTv0_n16_N3ccc7CC3x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23pqrEv,_ZThn4_N3ccc7CC3x2y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y23abcEv,_ZTv0_n20_N3ccc7CC3x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23abcEv,_ZThn4_N3ccc7CC3x2y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y23efgEv,_ZTv0_n12_N3ccc7CC3x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y23pqrEv,_ZTv0_n16_N3ccc7CC3x2y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y23abcEv,_ZTv0_n20_N3ccc7CC3x2y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y2E[] = {
  {&(_ZTVN3ccc7CC3x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y2E[];
static VTBL_ENTRY alt_thunk_names1361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y23abcEv,_ZTv0_n20_N3ccc7CC3x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y23abcEv,_ZThn4_N3ccc7CC3x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y23pqrEv,_ZTv0_n16_N3ccc7CC3x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y23pqrEv,_ZThn4_N3ccc7CC3x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y23efgEv,_ZTv0_n12_N3ccc7CC3x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y23efgEv,_ZThn4_N3ccc7CC3x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y2E = {  "_ZN3ccc7CC3x2y2E", // class name
  bases__ZN3ccc7CC3x2y2E, 2,
  &(vtc__ZN3ccc7CC3x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1361,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y2  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD3x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y23pqrEv
  ~DD3x2y2(); // tgen
  DD3x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y23efgEv");}
void  ccc::DD3x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y23abcEv");}
void  ccc::DD3x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y23pqrEv");}
ccc::DD3x2y2 ::~DD3x2y2(){ note_dtor("_ZN3ccc7DD3x2y2E", this);} // tgen
ccc::DD3x2y2 ::DD3x2y2(){ note_ctor("_ZN3ccc7DD3x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y2E, buf);
    ::ccc::DD3x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y2E);
    dp->::ccc::DD3x2y2::~DD3x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y2E(Test__ZN3ccc7DD3x2y2E, "_ZN3ccc7DD3x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y2C1Ev();
extern void _ZN3ccc7DD3x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y2E[] = {
  NSPAIR(_ZN3ccc7DD3x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y2E[];
extern void _ZN3ccc7DD3x2y23efgEv();
extern void _ZN3ccc7DD3x2y23pqrEv();
extern void _ZN3ccc7DD3x2y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y23efgEv,_ZTv0_n12_N3ccc7DD3x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y23efgEv,_ZThn4_N3ccc7DD3x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y23abcEv,_ZTv0_n16_N3ccc7DD3x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y23abcEv,_ZThn4_N3ccc7DD3x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y23pqrEv,_ZTv0_n20_N3ccc7DD3x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y23pqrEv,_ZThn4_N3ccc7DD3x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y23efgEv,_ZTv0_n12_N3ccc7DD3x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y23abcEv,_ZTv0_n16_N3ccc7DD3x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y23pqrEv,_ZTv0_n20_N3ccc7DD3x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y2E[] = {
  {&(_ZTVN3ccc7DD3x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y2E[];
static VTBL_ENTRY alt_thunk_names1362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y23pqrEv,_ZTv0_n20_N3ccc7DD3x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y23pqrEv,_ZThn4_N3ccc7DD3x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y23abcEv,_ZTv0_n16_N3ccc7DD3x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y23abcEv,_ZThn4_N3ccc7DD3x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y23efgEv,_ZTv0_n12_N3ccc7DD3x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y23efgEv,_ZThn4_N3ccc7DD3x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y2E = {  "_ZN3ccc7DD3x2y2E", // class name
  bases__ZN3ccc7DD3x2y2E, 2,
  &(vtc__ZN3ccc7DD3x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1362,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y3  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x2y33abcEv
  ~CC3x2y3(); // tgen
  CC3x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y3E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y33efgEv");}
void  ccc::CC3x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y33pqrEv");}
void  ccc::CC3x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y33abcEv");}
ccc::CC3x2y3 ::~CC3x2y3(){ note_dtor("_ZN3ccc7CC3x2y3E", this);} // tgen
ccc::CC3x2y3 ::CC3x2y3(){ note_ctor("_ZN3ccc7CC3x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y3E, buf);
    ::ccc::CC3x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y3E);
    dp->::ccc::CC3x2y3::~CC3x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y3E(Test__ZN3ccc7CC3x2y3E, "_ZN3ccc7CC3x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y3C1Ev();
extern void _ZN3ccc7CC3x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y3E[] = {
  NSPAIR(_ZN3ccc7CC3x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y3E[];
extern void _ZN3ccc7CC3x2y33efgEv();
extern void _ZN3ccc7CC3x2y33abcEv();
extern void _ZN3ccc7CC3x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y33efgEv,_ZTv0_n12_N3ccc7CC3x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33efgEv,_ZThn4_N3ccc7CC3x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y33pqrEv,_ZTv0_n16_N3ccc7CC3x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33pqrEv,_ZThn4_N3ccc7CC3x2y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y33abcEv,_ZTv0_n20_N3ccc7CC3x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33abcEv,_ZThn4_N3ccc7CC3x2y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y33efgEv,_ZTv0_n12_N3ccc7CC3x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y33pqrEv,_ZTv0_n16_N3ccc7CC3x2y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y33abcEv,_ZTv0_n20_N3ccc7CC3x2y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y3E[] = {
  {&(_ZTVN3ccc7CC3x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y3E[];
static VTBL_ENTRY alt_thunk_names1363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y33abcEv,_ZTv0_n20_N3ccc7CC3x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y33abcEv,_ZThn4_N3ccc7CC3x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y33pqrEv,_ZTv0_n16_N3ccc7CC3x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y33pqrEv,_ZThn4_N3ccc7CC3x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y33efgEv,_ZTv0_n12_N3ccc7CC3x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y33efgEv,_ZThn4_N3ccc7CC3x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y3E = {  "_ZN3ccc7CC3x2y3E", // class name
  bases__ZN3ccc7CC3x2y3E, 2,
  &(vtc__ZN3ccc7CC3x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1363,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y3  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD3x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x2y33abcEv
  ~DD3x2y3(); // tgen
  DD3x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y33efgEv");}
void  ccc::DD3x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y33pqrEv");}
void  ccc::DD3x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y33abcEv");}
ccc::DD3x2y3 ::~DD3x2y3(){ note_dtor("_ZN3ccc7DD3x2y3E", this);} // tgen
ccc::DD3x2y3 ::DD3x2y3(){ note_ctor("_ZN3ccc7DD3x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y3E, buf);
    ::ccc::DD3x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y3E);
    dp->::ccc::DD3x2y3::~DD3x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y3E(Test__ZN3ccc7DD3x2y3E, "_ZN3ccc7DD3x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y3C1Ev();
extern void _ZN3ccc7DD3x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y3E[] = {
  NSPAIR(_ZN3ccc7DD3x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y3E[];
extern void _ZN3ccc7DD3x2y33efgEv();
extern void _ZN3ccc7DD3x2y33pqrEv();
extern void _ZN3ccc7DD3x2y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y33efgEv,_ZTv0_n12_N3ccc7DD3x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y33efgEv,_ZThn4_N3ccc7DD3x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y33abcEv,_ZTv0_n16_N3ccc7DD3x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y33abcEv,_ZThn4_N3ccc7DD3x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y33pqrEv,_ZTv0_n20_N3ccc7DD3x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y33pqrEv,_ZThn4_N3ccc7DD3x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y33efgEv,_ZTv0_n12_N3ccc7DD3x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y33abcEv,_ZTv0_n16_N3ccc7DD3x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y33pqrEv,_ZTv0_n20_N3ccc7DD3x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y3E[] = {
  {&(_ZTVN3ccc7DD3x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y3E[];
static VTBL_ENTRY alt_thunk_names1364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y33pqrEv,_ZTv0_n20_N3ccc7DD3x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y33pqrEv,_ZThn4_N3ccc7DD3x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y33abcEv,_ZTv0_n16_N3ccc7DD3x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y33abcEv,_ZThn4_N3ccc7DD3x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y33efgEv,_ZTv0_n12_N3ccc7DD3x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y33efgEv,_ZThn4_N3ccc7DD3x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y3E = {  "_ZN3ccc7DD3x2y3E", // class name
  bases__ZN3ccc7DD3x2y3E, 2,
  &(vtc__ZN3ccc7DD3x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1364,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y4  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC3x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y43efgEv
  ~CC3x2y4(); // tgen
  CC3x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y4E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y43pqrEv");}
void  ccc::CC3x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y43abcEv");}
void  ccc::CC3x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y43efgEv");}
ccc::CC3x2y4 ::~CC3x2y4(){ note_dtor("_ZN3ccc7CC3x2y4E", this);} // tgen
ccc::CC3x2y4 ::CC3x2y4(){ note_ctor("_ZN3ccc7CC3x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y4E, buf);
    ::ccc::CC3x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y4E);
    dp->::ccc::CC3x2y4::~CC3x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y4E(Test__ZN3ccc7CC3x2y4E, "_ZN3ccc7CC3x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y4C1Ev();
extern void _ZN3ccc7CC3x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y4E[] = {
  NSPAIR(_ZN3ccc7CC3x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y4E[];
extern void _ZN3ccc7CC3x2y43efgEv();
extern void _ZN3ccc7CC3x2y43abcEv();
extern void _ZN3ccc7CC3x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y43efgEv,_ZTv0_n12_N3ccc7CC3x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43efgEv,_ZThn4_N3ccc7CC3x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y43pqrEv,_ZTv0_n16_N3ccc7CC3x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43pqrEv,_ZThn4_N3ccc7CC3x2y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y43abcEv,_ZTv0_n20_N3ccc7CC3x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43abcEv,_ZThn4_N3ccc7CC3x2y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y43efgEv,_ZTv0_n12_N3ccc7CC3x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y43pqrEv,_ZTv0_n16_N3ccc7CC3x2y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y43abcEv,_ZTv0_n20_N3ccc7CC3x2y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y4E[] = {
  {&(_ZTVN3ccc7CC3x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y4E[];
static VTBL_ENTRY alt_thunk_names1365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y43abcEv,_ZTv0_n20_N3ccc7CC3x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y43abcEv,_ZThn4_N3ccc7CC3x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y43pqrEv,_ZTv0_n16_N3ccc7CC3x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y43pqrEv,_ZThn4_N3ccc7CC3x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y43efgEv,_ZTv0_n12_N3ccc7CC3x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y43efgEv,_ZThn4_N3ccc7CC3x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y4E = {  "_ZN3ccc7CC3x2y4E", // class name
  bases__ZN3ccc7CC3x2y4E, 2,
  &(vtc__ZN3ccc7CC3x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1365,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y4  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD3x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x2y43efgEv
  ~DD3x2y4(); // tgen
  DD3x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y43pqrEv");}
void  ccc::DD3x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y43abcEv");}
void  ccc::DD3x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y43efgEv");}
ccc::DD3x2y4 ::~DD3x2y4(){ note_dtor("_ZN3ccc7DD3x2y4E", this);} // tgen
ccc::DD3x2y4 ::DD3x2y4(){ note_ctor("_ZN3ccc7DD3x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y4E, buf);
    ::ccc::DD3x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y4E);
    dp->::ccc::DD3x2y4::~DD3x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y4E(Test__ZN3ccc7DD3x2y4E, "_ZN3ccc7DD3x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y4C1Ev();
extern void _ZN3ccc7DD3x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y4E[] = {
  NSPAIR(_ZN3ccc7DD3x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y4E[];
extern void _ZN3ccc7DD3x2y43efgEv();
extern void _ZN3ccc7DD3x2y43pqrEv();
extern void _ZN3ccc7DD3x2y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y43efgEv,_ZTv0_n12_N3ccc7DD3x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y43efgEv,_ZThn4_N3ccc7DD3x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y43abcEv,_ZTv0_n16_N3ccc7DD3x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y43abcEv,_ZThn4_N3ccc7DD3x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y43pqrEv,_ZTv0_n20_N3ccc7DD3x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y43pqrEv,_ZThn4_N3ccc7DD3x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y43efgEv,_ZTv0_n12_N3ccc7DD3x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y43abcEv,_ZTv0_n16_N3ccc7DD3x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y43pqrEv,_ZTv0_n20_N3ccc7DD3x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y4E[] = {
  {&(_ZTVN3ccc7DD3x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y4E[];
static VTBL_ENTRY alt_thunk_names1366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y43pqrEv,_ZTv0_n20_N3ccc7DD3x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y43pqrEv,_ZThn4_N3ccc7DD3x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y43abcEv,_ZTv0_n16_N3ccc7DD3x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y43abcEv,_ZThn4_N3ccc7DD3x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y43efgEv,_ZTv0_n12_N3ccc7DD3x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y43efgEv,_ZThn4_N3ccc7DD3x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y4E = {  "_ZN3ccc7DD3x2y4E", // class name
  bases__ZN3ccc7DD3x2y4E, 2,
  &(vtc__ZN3ccc7DD3x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1366,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y5  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC3x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y53abcEv
  ~CC3x2y5(); // tgen
  CC3x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y5E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y53pqrEv");}
void  ccc::CC3x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y53efgEv");}
void  ccc::CC3x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y53abcEv");}
ccc::CC3x2y5 ::~CC3x2y5(){ note_dtor("_ZN3ccc7CC3x2y5E", this);} // tgen
ccc::CC3x2y5 ::CC3x2y5(){ note_ctor("_ZN3ccc7CC3x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y5E, buf);
    ::ccc::CC3x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y5E);
    dp->::ccc::CC3x2y5::~CC3x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y5E(Test__ZN3ccc7CC3x2y5E, "_ZN3ccc7CC3x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y5C1Ev();
extern void _ZN3ccc7CC3x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y5E[] = {
  NSPAIR(_ZN3ccc7CC3x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y5E[];
extern void _ZN3ccc7CC3x2y53efgEv();
extern void _ZN3ccc7CC3x2y53abcEv();
extern void _ZN3ccc7CC3x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y53efgEv,_ZTv0_n12_N3ccc7CC3x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53efgEv,_ZThn4_N3ccc7CC3x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y53pqrEv,_ZTv0_n16_N3ccc7CC3x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53pqrEv,_ZThn4_N3ccc7CC3x2y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y53abcEv,_ZTv0_n20_N3ccc7CC3x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53abcEv,_ZThn4_N3ccc7CC3x2y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y53efgEv,_ZTv0_n12_N3ccc7CC3x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y53pqrEv,_ZTv0_n16_N3ccc7CC3x2y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y53abcEv,_ZTv0_n20_N3ccc7CC3x2y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y5E[] = {
  {&(_ZTVN3ccc7CC3x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y5E[];
static VTBL_ENTRY alt_thunk_names1367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y53abcEv,_ZTv0_n20_N3ccc7CC3x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y53abcEv,_ZThn4_N3ccc7CC3x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y53pqrEv,_ZTv0_n16_N3ccc7CC3x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y53pqrEv,_ZThn4_N3ccc7CC3x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y53efgEv,_ZTv0_n12_N3ccc7CC3x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y53efgEv,_ZThn4_N3ccc7CC3x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y5E = {  "_ZN3ccc7CC3x2y5E", // class name
  bases__ZN3ccc7CC3x2y5E, 2,
  &(vtc__ZN3ccc7CC3x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1367,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y5  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD3x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x2y53abcEv
  ~DD3x2y5(); // tgen
  DD3x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y53pqrEv");}
void  ccc::DD3x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y53efgEv");}
void  ccc::DD3x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y53abcEv");}
ccc::DD3x2y5 ::~DD3x2y5(){ note_dtor("_ZN3ccc7DD3x2y5E", this);} // tgen
ccc::DD3x2y5 ::DD3x2y5(){ note_ctor("_ZN3ccc7DD3x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y5E, buf);
    ::ccc::DD3x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y5E);
    dp->::ccc::DD3x2y5::~DD3x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y5E(Test__ZN3ccc7DD3x2y5E, "_ZN3ccc7DD3x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y5C1Ev();
extern void _ZN3ccc7DD3x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y5E[] = {
  NSPAIR(_ZN3ccc7DD3x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y5E[];
extern void _ZN3ccc7DD3x2y53efgEv();
extern void _ZN3ccc7DD3x2y53pqrEv();
extern void _ZN3ccc7DD3x2y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y53efgEv,_ZTv0_n12_N3ccc7DD3x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y53efgEv,_ZThn4_N3ccc7DD3x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y53abcEv,_ZTv0_n16_N3ccc7DD3x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y53abcEv,_ZThn4_N3ccc7DD3x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y53pqrEv,_ZTv0_n20_N3ccc7DD3x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y53pqrEv,_ZThn4_N3ccc7DD3x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y53efgEv,_ZTv0_n12_N3ccc7DD3x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y53abcEv,_ZTv0_n16_N3ccc7DD3x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y53pqrEv,_ZTv0_n20_N3ccc7DD3x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y5E[] = {
  {&(_ZTVN3ccc7DD3x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y5E[];
static VTBL_ENTRY alt_thunk_names1368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y53pqrEv,_ZTv0_n20_N3ccc7DD3x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y53pqrEv,_ZThn4_N3ccc7DD3x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y53abcEv,_ZTv0_n16_N3ccc7DD3x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y53abcEv,_ZThn4_N3ccc7DD3x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y53efgEv,_ZTv0_n12_N3ccc7DD3x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y53efgEv,_ZThn4_N3ccc7DD3x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y5E = {  "_ZN3ccc7DD3x2y5E", // class name
  bases__ZN3ccc7DD3x2y5E, 2,
  &(vtc__ZN3ccc7DD3x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1368,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y6  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y63efgEv
  ~CC3x2y6(); // tgen
  CC3x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y6E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y63abcEv");}
void  ccc::CC3x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y63efgEv");}
ccc::CC3x2y6 ::~CC3x2y6(){ note_dtor("_ZN3ccc7CC3x2y6E", this);} // tgen
ccc::CC3x2y6 ::CC3x2y6(){ note_ctor("_ZN3ccc7CC3x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y6E, buf);
    ::ccc::CC3x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y6E);
    dp->::ccc::CC3x2y6::~CC3x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y6E(Test__ZN3ccc7CC3x2y6E, "_ZN3ccc7CC3x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y6C1Ev();
extern void _ZN3ccc7CC3x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y6E[] = {
  NSPAIR(_ZN3ccc7CC3x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y6E[];
extern void _ZN3ccc7CC3x2y63efgEv();
extern void _ZN3ccc7CC3x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y63efgEv,_ZTv0_n12_N3ccc7CC3x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y63efgEv,_ZThn4_N3ccc7CC3x2y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y63abcEv,_ZTv0_n20_N3ccc7CC3x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y63abcEv,_ZThn4_N3ccc7CC3x2y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y63efgEv,_ZTv0_n12_N3ccc7CC3x2y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y63abcEv,_ZTv0_n20_N3ccc7CC3x2y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y6E[] = {
  {&(_ZTVN3ccc7CC3x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y6E[];
static VTBL_ENTRY alt_thunk_names1369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y63abcEv,_ZTv0_n20_N3ccc7CC3x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y63abcEv,_ZThn4_N3ccc7CC3x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y63efgEv,_ZTv0_n12_N3ccc7CC3x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y63efgEv,_ZThn4_N3ccc7CC3x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y6E = {  "_ZN3ccc7CC3x2y6E", // class name
  bases__ZN3ccc7CC3x2y6E, 2,
  &(vtc__ZN3ccc7CC3x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1369,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y6  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD3x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x2y63efgEv
  ~DD3x2y6(); // tgen
  DD3x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y63abcEv");}
void  ccc::DD3x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y63efgEv");}
ccc::DD3x2y6 ::~DD3x2y6(){ note_dtor("_ZN3ccc7DD3x2y6E", this);} // tgen
ccc::DD3x2y6 ::DD3x2y6(){ note_ctor("_ZN3ccc7DD3x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y6E, buf);
    ::ccc::DD3x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y6E);
    dp->::ccc::DD3x2y6::~DD3x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y6E(Test__ZN3ccc7DD3x2y6E, "_ZN3ccc7DD3x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y6C1Ev();
extern void _ZN3ccc7DD3x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y6E[] = {
  NSPAIR(_ZN3ccc7DD3x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y6E[];
extern void _ZN3ccc7DD3x2y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x2y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y63efgEv,_ZTv0_n12_N3ccc7DD3x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y63efgEv,_ZThn4_N3ccc7DD3x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y63abcEv,_ZTv0_n16_N3ccc7DD3x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y63abcEv,_ZThn4_N3ccc7DD3x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y63efgEv,_ZTv0_n12_N3ccc7DD3x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y63abcEv,_ZTv0_n16_N3ccc7DD3x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y6E[] = {
  {&(_ZTVN3ccc7DD3x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y6E[];
static VTBL_ENTRY alt_thunk_names1370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y63abcEv,_ZTv0_n16_N3ccc7DD3x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y63abcEv,_ZThn4_N3ccc7DD3x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y63efgEv,_ZTv0_n12_N3ccc7DD3x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y63efgEv,_ZThn4_N3ccc7DD3x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y6E = {  "_ZN3ccc7DD3x2y6E", // class name
  bases__ZN3ccc7DD3x2y6E, 2,
  &(vtc__ZN3ccc7DD3x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1370,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y7  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y73pqrEv
  ~CC3x2y7(); // tgen
  CC3x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y7E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y73abcEv");}
void  ccc::CC3x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y73pqrEv");}
ccc::CC3x2y7 ::~CC3x2y7(){ note_dtor("_ZN3ccc7CC3x2y7E", this);} // tgen
ccc::CC3x2y7 ::CC3x2y7(){ note_ctor("_ZN3ccc7CC3x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y7E, buf);
    ::ccc::CC3x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y7E);
    dp->::ccc::CC3x2y7::~CC3x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y7E(Test__ZN3ccc7CC3x2y7E, "_ZN3ccc7CC3x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y7C1Ev();
extern void _ZN3ccc7CC3x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y7E[] = {
  NSPAIR(_ZN3ccc7CC3x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC3x2y73abcEv();
extern void _ZN3ccc7CC3x2y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y73pqrEv,_ZTv0_n16_N3ccc7CC3x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y73pqrEv,_ZThn4_N3ccc7CC3x2y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y73abcEv,_ZTv0_n20_N3ccc7CC3x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y73abcEv,_ZThn4_N3ccc7CC3x2y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y73pqrEv,_ZTv0_n16_N3ccc7CC3x2y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y73abcEv,_ZTv0_n20_N3ccc7CC3x2y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y7E[] = {
  {&(_ZTVN3ccc7CC3x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y7E[];
static VTBL_ENTRY alt_thunk_names1371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y73abcEv,_ZTv0_n20_N3ccc7CC3x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y73abcEv,_ZThn4_N3ccc7CC3x2y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y73pqrEv,_ZTv0_n16_N3ccc7CC3x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y73pqrEv,_ZThn4_N3ccc7CC3x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y7E = {  "_ZN3ccc7CC3x2y7E", // class name
  bases__ZN3ccc7CC3x2y7E, 2,
  &(vtc__ZN3ccc7CC3x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1371,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y7  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD3x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y73pqrEv
  ~DD3x2y7(); // tgen
  DD3x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y73abcEv");}
void  ccc::DD3x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y73pqrEv");}
ccc::DD3x2y7 ::~DD3x2y7(){ note_dtor("_ZN3ccc7DD3x2y7E", this);} // tgen
ccc::DD3x2y7 ::DD3x2y7(){ note_ctor("_ZN3ccc7DD3x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y7E, buf);
    ::ccc::DD3x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y7E);
    dp->::ccc::DD3x2y7::~DD3x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y7E(Test__ZN3ccc7DD3x2y7E, "_ZN3ccc7DD3x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y7C1Ev();
extern void _ZN3ccc7DD3x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y7E[] = {
  NSPAIR(_ZN3ccc7DD3x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x2y73pqrEv();
extern void _ZN3ccc7DD3x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y73abcEv,_ZTv0_n16_N3ccc7DD3x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y73abcEv,_ZThn4_N3ccc7DD3x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y73pqrEv,_ZTv0_n20_N3ccc7DD3x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y73pqrEv,_ZThn4_N3ccc7DD3x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y73abcEv,_ZTv0_n16_N3ccc7DD3x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y73pqrEv,_ZTv0_n20_N3ccc7DD3x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y7E[] = {
  {&(_ZTVN3ccc7DD3x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y7E[];
static VTBL_ENTRY alt_thunk_names1372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y73pqrEv,_ZTv0_n20_N3ccc7DD3x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y73pqrEv,_ZThn4_N3ccc7DD3x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y73abcEv,_ZTv0_n16_N3ccc7DD3x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y73abcEv,_ZThn4_N3ccc7DD3x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y7E = {  "_ZN3ccc7DD3x2y7E", // class name
  bases__ZN3ccc7DD3x2y7E, 2,
  &(vtc__ZN3ccc7DD3x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1372,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y8  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y83abcEv
  ~CC3x2y8(); // tgen
  CC3x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y8E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y83efgEv");}
void  ccc::CC3x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y83abcEv");}
ccc::CC3x2y8 ::~CC3x2y8(){ note_dtor("_ZN3ccc7CC3x2y8E", this);} // tgen
ccc::CC3x2y8 ::CC3x2y8(){ note_ctor("_ZN3ccc7CC3x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y8E, buf);
    ::ccc::CC3x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y8E);
    dp->::ccc::CC3x2y8::~CC3x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y8E(Test__ZN3ccc7CC3x2y8E, "_ZN3ccc7CC3x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y8C1Ev();
extern void _ZN3ccc7CC3x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y8E[] = {
  NSPAIR(_ZN3ccc7CC3x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y8E[];
extern void _ZN3ccc7CC3x2y83efgEv();
extern void _ZN3ccc7CC3x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y83efgEv,_ZTv0_n12_N3ccc7CC3x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y83efgEv,_ZThn4_N3ccc7CC3x2y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x2y83abcEv,_ZTv0_n20_N3ccc7CC3x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y83abcEv,_ZThn4_N3ccc7CC3x2y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y83efgEv,_ZTv0_n12_N3ccc7CC3x2y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x2y83abcEv,_ZTv0_n20_N3ccc7CC3x2y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y8E[] = {
  {&(_ZTVN3ccc7CC3x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y8E[];
static VTBL_ENTRY alt_thunk_names1373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x2y83abcEv,_ZTv0_n20_N3ccc7CC3x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y83abcEv,_ZThn4_N3ccc7CC3x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y83efgEv,_ZTv0_n12_N3ccc7CC3x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y83efgEv,_ZThn4_N3ccc7CC3x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y8E = {  "_ZN3ccc7CC3x2y8E", // class name
  bases__ZN3ccc7CC3x2y8E, 2,
  &(vtc__ZN3ccc7CC3x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1373,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y8  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD3x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x2y83abcEv
  ~DD3x2y8(); // tgen
  DD3x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y83efgEv");}
void  ccc::DD3x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x2y83abcEv");}
ccc::DD3x2y8 ::~DD3x2y8(){ note_dtor("_ZN3ccc7DD3x2y8E", this);} // tgen
ccc::DD3x2y8 ::DD3x2y8(){ note_ctor("_ZN3ccc7DD3x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y8E, buf);
    ::ccc::DD3x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y8E);
    dp->::ccc::DD3x2y8::~DD3x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y8E(Test__ZN3ccc7DD3x2y8E, "_ZN3ccc7DD3x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y8C1Ev();
extern void _ZN3ccc7DD3x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y8E[] = {
  NSPAIR(_ZN3ccc7DD3x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y8E[];
extern void _ZN3ccc7DD3x2y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x2y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y83efgEv,_ZTv0_n12_N3ccc7DD3x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y83efgEv,_ZThn4_N3ccc7DD3x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x2y83abcEv,_ZTv0_n16_N3ccc7DD3x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y83abcEv,_ZThn4_N3ccc7DD3x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y83efgEv,_ZTv0_n12_N3ccc7DD3x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x2y83abcEv,_ZTv0_n16_N3ccc7DD3x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y8E[] = {
  {&(_ZTVN3ccc7DD3x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y8E[];
static VTBL_ENTRY alt_thunk_names1374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x2y83abcEv,_ZTv0_n16_N3ccc7DD3x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y83abcEv,_ZThn4_N3ccc7DD3x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y83efgEv,_ZTv0_n12_N3ccc7DD3x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y83efgEv,_ZThn4_N3ccc7DD3x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y8E = {  "_ZN3ccc7DD3x2y8E", // class name
  bases__ZN3ccc7DD3x2y8E, 2,
  &(vtc__ZN3ccc7DD3x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1374,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y9  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y93pqrEv
  ~CC3x2y9(); // tgen
  CC3x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y9E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y93efgEv");}
void  ccc::CC3x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y93pqrEv");}
ccc::CC3x2y9 ::~CC3x2y9(){ note_dtor("_ZN3ccc7CC3x2y9E", this);} // tgen
ccc::CC3x2y9 ::CC3x2y9(){ note_ctor("_ZN3ccc7CC3x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y9E, buf);
    ::ccc::CC3x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC3x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y9E);
    dp->::ccc::CC3x2y9::~CC3x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y9E(Test__ZN3ccc7CC3x2y9E, "_ZN3ccc7CC3x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y9C1Ev();
extern void _ZN3ccc7CC3x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y9E[] = {
  NSPAIR(_ZN3ccc7CC3x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y9E[];
extern void _ZN3ccc7CC3x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC3x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x2y93efgEv,_ZTv0_n12_N3ccc7CC3x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y93efgEv,_ZThn4_N3ccc7CC3x2y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x2y93pqrEv,_ZTv0_n16_N3ccc7CC3x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y93pqrEv,_ZThn4_N3ccc7CC3x2y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x2y93efgEv,_ZTv0_n12_N3ccc7CC3x2y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x2y93pqrEv,_ZTv0_n16_N3ccc7CC3x2y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x2y9E[] = {
  {&(_ZTVN3ccc7CC3x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x2y9E[];
static VTBL_ENTRY alt_thunk_names1375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x2y93pqrEv,_ZTv0_n16_N3ccc7CC3x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y93pqrEv,_ZThn4_N3ccc7CC3x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x2y93efgEv,_ZTv0_n12_N3ccc7CC3x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x2y93efgEv,_ZThn4_N3ccc7CC3x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x2y9E = {  "_ZN3ccc7CC3x2y9E", // class name
  bases__ZN3ccc7CC3x2y9E, 2,
  &(vtc__ZN3ccc7CC3x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x2y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1375,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y9  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD3x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x2y93pqrEv
  ~DD3x2y9(); // tgen
  DD3x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x2y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x2y93efgEv");}
void  ccc::DD3x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x2y93pqrEv");}
ccc::DD3x2y9 ::~DD3x2y9(){ note_dtor("_ZN3ccc7DD3x2y9E", this);} // tgen
ccc::DD3x2y9 ::DD3x2y9(){ note_ctor("_ZN3ccc7DD3x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x2y9E, buf);
    ::ccc::DD3x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x2y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD3x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x2y9E);
    dp->::ccc::DD3x2y9::~DD3x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x2y9E(Test__ZN3ccc7DD3x2y9E, "_ZN3ccc7DD3x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x2y9C1Ev();
extern void _ZN3ccc7DD3x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x2y9E[] = {
  NSPAIR(_ZN3ccc7DD3x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD3x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y9E[];
extern void _ZN3ccc7DD3x2y93efgEv();
extern void _ZN3ccc7DD3x2y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x2y93efgEv,_ZTv0_n12_N3ccc7DD3x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y93efgEv,_ZThn4_N3ccc7DD3x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x2y93pqrEv,_ZTv0_n20_N3ccc7DD3x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x2y93pqrEv,_ZThn4_N3ccc7DD3x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x2y93efgEv,_ZTv0_n12_N3ccc7DD3x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x2y93pqrEv,_ZTv0_n20_N3ccc7DD3x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x2y9E[] = {
  {&(_ZTVN3ccc7DD3x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x2y9E[];
static VTBL_ENTRY alt_thunk_names1376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x2y93pqrEv,_ZTv0_n20_N3ccc7DD3x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y93pqrEv,_ZThn4_N3ccc7DD3x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x2y93efgEv,_ZTv0_n12_N3ccc7DD3x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x2y93efgEv,_ZThn4_N3ccc7DD3x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x2y9E = {  "_ZN3ccc7DD3x2y9E", // class name
  bases__ZN3ccc7DD3x2y9E, 2,
  &(vtc__ZN3ccc7DD3x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x2y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1376,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y10  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x2y103abcEv
  ~CC3x2y10(); // tgen
  CC3x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y10E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y103pqrEv");}
void  ccc::CC3x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x2y103abcEv");}
ccc::CC3x2y10 ::~CC3x2y10(){ note_dtor("_ZN3ccc8CC3x2y10E", this);} // tgen
ccc::CC3x2y10 ::CC3x2y10(){ note_ctor("_ZN3ccc8CC3x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y10E, buf);
    ::ccc::CC3x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y10E);
    dp->::ccc::CC3x2y10::~CC3x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y10E(Test__ZN3ccc8CC3x2y10E, "_ZN3ccc8CC3x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y10C1Ev();
extern void _ZN3ccc8CC3x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y10E[] = {
  NSPAIR(_ZN3ccc8CC3x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC3x2y103abcEv();
extern void _ZN3ccc8CC3x2y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x2y103pqrEv,_ZTv0_n16_N3ccc8CC3x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y103pqrEv,_ZThn4_N3ccc8CC3x2y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x2y103abcEv,_ZTv0_n20_N3ccc8CC3x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y103abcEv,_ZThn4_N3ccc8CC3x2y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x2y103pqrEv,_ZTv0_n16_N3ccc8CC3x2y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x2y103abcEv,_ZTv0_n20_N3ccc8CC3x2y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y10E[] = {
  {&(_ZTVN3ccc8CC3x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y10E[];
static VTBL_ENTRY alt_thunk_names1377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x2y103abcEv,_ZTv0_n20_N3ccc8CC3x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y103abcEv,_ZThn4_N3ccc8CC3x2y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x2y103pqrEv,_ZTv0_n16_N3ccc8CC3x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y103pqrEv,_ZThn4_N3ccc8CC3x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x2y10E = {  "_ZN3ccc8CC3x2y10E", // class name
  bases__ZN3ccc8CC3x2y10E, 2,
  &(vtc__ZN3ccc8CC3x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1377,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y10  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD3x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x2y103abcEv
  ~DD3x2y10(); // tgen
  DD3x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x2y103pqrEv");}
void  ccc::DD3x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x2y103abcEv");}
ccc::DD3x2y10 ::~DD3x2y10(){ note_dtor("_ZN3ccc8DD3x2y10E", this);} // tgen
ccc::DD3x2y10 ::DD3x2y10(){ note_ctor("_ZN3ccc8DD3x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y10E, buf);
    ::ccc::DD3x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y10E);
    dp->::ccc::DD3x2y10::~DD3x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y10E(Test__ZN3ccc8DD3x2y10E, "_ZN3ccc8DD3x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y10C1Ev();
extern void _ZN3ccc8DD3x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y10E[] = {
  NSPAIR(_ZN3ccc8DD3x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x2y103pqrEv();
extern void _ZN3ccc8DD3x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x2y103abcEv,_ZTv0_n16_N3ccc8DD3x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y103abcEv,_ZThn4_N3ccc8DD3x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x2y103pqrEv,_ZTv0_n20_N3ccc8DD3x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y103pqrEv,_ZThn4_N3ccc8DD3x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x2y103abcEv,_ZTv0_n16_N3ccc8DD3x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x2y103pqrEv,_ZTv0_n20_N3ccc8DD3x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y10E[] = {
  {&(_ZTVN3ccc8DD3x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y10E[];
static VTBL_ENTRY alt_thunk_names1378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x2y103pqrEv,_ZTv0_n20_N3ccc8DD3x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y103pqrEv,_ZThn4_N3ccc8DD3x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x2y103abcEv,_ZTv0_n16_N3ccc8DD3x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y103abcEv,_ZThn4_N3ccc8DD3x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x2y10E = {  "_ZN3ccc8DD3x2y10E", // class name
  bases__ZN3ccc8DD3x2y10E, 2,
  &(vtc__ZN3ccc8DD3x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1378,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y11  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x2y113efgEv
  ~CC3x2y11(); // tgen
  CC3x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y11E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y113pqrEv");}
void  ccc::CC3x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x2y113efgEv");}
ccc::CC3x2y11 ::~CC3x2y11(){ note_dtor("_ZN3ccc8CC3x2y11E", this);} // tgen
ccc::CC3x2y11 ::CC3x2y11(){ note_ctor("_ZN3ccc8CC3x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y11E, buf);
    ::ccc::CC3x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y11E);
    dp->::ccc::CC3x2y11::~CC3x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y11E(Test__ZN3ccc8CC3x2y11E, "_ZN3ccc8CC3x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y11C1Ev();
extern void _ZN3ccc8CC3x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y11E[] = {
  NSPAIR(_ZN3ccc8CC3x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y11E[];
extern void _ZN3ccc8CC3x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC3x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x2y113efgEv,_ZTv0_n12_N3ccc8CC3x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y113efgEv,_ZThn4_N3ccc8CC3x2y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x2y113pqrEv,_ZTv0_n16_N3ccc8CC3x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y113pqrEv,_ZThn4_N3ccc8CC3x2y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x2y113efgEv,_ZTv0_n12_N3ccc8CC3x2y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x2y113pqrEv,_ZTv0_n16_N3ccc8CC3x2y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y11E[] = {
  {&(_ZTVN3ccc8CC3x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y11E[];
static VTBL_ENTRY alt_thunk_names1379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x2y113pqrEv,_ZTv0_n16_N3ccc8CC3x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y113pqrEv,_ZThn4_N3ccc8CC3x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x2y113efgEv,_ZTv0_n12_N3ccc8CC3x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y113efgEv,_ZThn4_N3ccc8CC3x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x2y11E = {  "_ZN3ccc8CC3x2y11E", // class name
  bases__ZN3ccc8CC3x2y11E, 2,
  &(vtc__ZN3ccc8CC3x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1379,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y11  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD3x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x2y113efgEv
  ~DD3x2y11(); // tgen
  DD3x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x2y113pqrEv");}
void  ccc::DD3x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x2y113efgEv");}
ccc::DD3x2y11 ::~DD3x2y11(){ note_dtor("_ZN3ccc8DD3x2y11E", this);} // tgen
ccc::DD3x2y11 ::DD3x2y11(){ note_ctor("_ZN3ccc8DD3x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y11E, buf);
    ::ccc::DD3x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y11E);
    dp->::ccc::DD3x2y11::~DD3x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y11E(Test__ZN3ccc8DD3x2y11E, "_ZN3ccc8DD3x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y11C1Ev();
extern void _ZN3ccc8DD3x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y11E[] = {
  NSPAIR(_ZN3ccc8DD3x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y11E[];
extern void _ZN3ccc8DD3x2y113efgEv();
extern void _ZN3ccc8DD3x2y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x2y113efgEv,_ZTv0_n12_N3ccc8DD3x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y113efgEv,_ZThn4_N3ccc8DD3x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x2y113pqrEv,_ZTv0_n20_N3ccc8DD3x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y113pqrEv,_ZThn4_N3ccc8DD3x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x2y113efgEv,_ZTv0_n12_N3ccc8DD3x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x2y113pqrEv,_ZTv0_n20_N3ccc8DD3x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y11E[] = {
  {&(_ZTVN3ccc8DD3x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y11E[];
static VTBL_ENTRY alt_thunk_names1380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x2y113pqrEv,_ZTv0_n20_N3ccc8DD3x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y113pqrEv,_ZThn4_N3ccc8DD3x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x2y113efgEv,_ZTv0_n12_N3ccc8DD3x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y113efgEv,_ZThn4_N3ccc8DD3x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x2y11E = {  "_ZN3ccc8DD3x2y11E", // class name
  bases__ZN3ccc8DD3x2y11E, 2,
  &(vtc__ZN3ccc8DD3x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1380,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y12  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC3x2y123abcEv
  ~CC3x2y12(); // tgen
  CC3x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x2y123abcEv");}
ccc::CC3x2y12 ::~CC3x2y12(){ note_dtor("_ZN3ccc8CC3x2y12E", this);} // tgen
ccc::CC3x2y12 ::CC3x2y12(){ note_ctor("_ZN3ccc8CC3x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y12E, buf);
    ::ccc::CC3x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y12E);
    dp->::ccc::CC3x2y12::~CC3x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y12E(Test__ZN3ccc8CC3x2y12E, "_ZN3ccc8CC3x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y12C1Ev();
extern void _ZN3ccc8CC3x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y12E[] = {
  NSPAIR(_ZN3ccc8CC3x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC3x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x2y123abcEv,_ZTv0_n20_N3ccc8CC3x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y123abcEv,_ZThn4_N3ccc8CC3x2y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x2y123abcEv,_ZTv0_n20_N3ccc8CC3x2y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y12E[] = {
  {&(_ZTVN3ccc8CC3x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y12E[];
static VTBL_ENTRY alt_thunk_names1381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x2y123abcEv,_ZTv0_n20_N3ccc8CC3x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y123abcEv,_ZThn4_N3ccc8CC3x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x2y12E = {  "_ZN3ccc8CC3x2y12E", // class name
  bases__ZN3ccc8CC3x2y12E, 2,
  &(vtc__ZN3ccc8CC3x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1381,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y12  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD3x2y123abcEv
  ~DD3x2y12(); // tgen
  DD3x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x2y123abcEv");}
ccc::DD3x2y12 ::~DD3x2y12(){ note_dtor("_ZN3ccc8DD3x2y12E", this);} // tgen
ccc::DD3x2y12 ::DD3x2y12(){ note_ctor("_ZN3ccc8DD3x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y12E, buf);
    ::ccc::DD3x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y12E);
    dp->::ccc::DD3x2y12::~DD3x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y12E(Test__ZN3ccc8DD3x2y12E, "_ZN3ccc8DD3x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y12C1Ev();
extern void _ZN3ccc8DD3x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y12E[] = {
  NSPAIR(_ZN3ccc8DD3x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x2y123abcEv,_ZTv0_n16_N3ccc8DD3x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y123abcEv,_ZThn4_N3ccc8DD3x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x2y123abcEv,_ZTv0_n16_N3ccc8DD3x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y12E[] = {
  {&(_ZTVN3ccc8DD3x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y12E[];
static VTBL_ENTRY alt_thunk_names1382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x2y123abcEv,_ZTv0_n16_N3ccc8DD3x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y123abcEv,_ZThn4_N3ccc8DD3x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x2y12E = {  "_ZN3ccc8DD3x2y12E", // class name
  bases__ZN3ccc8DD3x2y12E, 2,
  &(vtc__ZN3ccc8DD3x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1382,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y13  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC3x2y133efgEv
  ~CC3x2y13(); // tgen
  CC3x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x2y133efgEv");}
ccc::CC3x2y13 ::~CC3x2y13(){ note_dtor("_ZN3ccc8CC3x2y13E", this);} // tgen
ccc::CC3x2y13 ::CC3x2y13(){ note_ctor("_ZN3ccc8CC3x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y13E, buf);
    ::ccc::CC3x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y13E);
    dp->::ccc::CC3x2y13::~CC3x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y13E(Test__ZN3ccc8CC3x2y13E, "_ZN3ccc8CC3x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y13C1Ev();
extern void _ZN3ccc8CC3x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y13E[] = {
  NSPAIR(_ZN3ccc8CC3x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y13E[];
extern void _ZN3ccc8CC3x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x2y133efgEv,_ZTv0_n12_N3ccc8CC3x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y133efgEv,_ZThn4_N3ccc8CC3x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x2y133efgEv,_ZTv0_n12_N3ccc8CC3x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y13E[] = {
  {&(_ZTVN3ccc8CC3x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y13E[];
static VTBL_ENTRY alt_thunk_names1383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x2y133efgEv,_ZTv0_n12_N3ccc8CC3x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y133efgEv,_ZThn4_N3ccc8CC3x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x2y13E = {  "_ZN3ccc8CC3x2y13E", // class name
  bases__ZN3ccc8CC3x2y13E, 2,
  &(vtc__ZN3ccc8CC3x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1383,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y13  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD3x2y133efgEv
  ~DD3x2y13(); // tgen
  DD3x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x2y133efgEv");}
ccc::DD3x2y13 ::~DD3x2y13(){ note_dtor("_ZN3ccc8DD3x2y13E", this);} // tgen
ccc::DD3x2y13 ::DD3x2y13(){ note_ctor("_ZN3ccc8DD3x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y13E, buf);
    ::ccc::DD3x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y13E);
    dp->::ccc::DD3x2y13::~DD3x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y13E(Test__ZN3ccc8DD3x2y13E, "_ZN3ccc8DD3x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y13C1Ev();
extern void _ZN3ccc8DD3x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y13E[] = {
  NSPAIR(_ZN3ccc8DD3x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y13E[];
extern void _ZN3ccc8DD3x2y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x2y133efgEv,_ZTv0_n12_N3ccc8DD3x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y133efgEv,_ZThn4_N3ccc8DD3x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x2y133efgEv,_ZTv0_n12_N3ccc8DD3x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y13E[] = {
  {&(_ZTVN3ccc8DD3x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y13E[];
static VTBL_ENTRY alt_thunk_names1384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x2y133efgEv,_ZTv0_n12_N3ccc8DD3x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y133efgEv,_ZThn4_N3ccc8DD3x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x2y13E = {  "_ZN3ccc8DD3x2y13E", // class name
  bases__ZN3ccc8DD3x2y13E, 2,
  &(vtc__ZN3ccc8DD3x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1384,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y14  : virtual ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y143pqrEv
  ~CC3x2y14(); // tgen
  CC3x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y143pqrEv");}
ccc::CC3x2y14 ::~CC3x2y14(){ note_dtor("_ZN3ccc8CC3x2y14E", this);} // tgen
ccc::CC3x2y14 ::CC3x2y14(){ note_ctor("_ZN3ccc8CC3x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y14E, buf);
    ::ccc::CC3x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y14E);
    dp->::ccc::CC3x2y14::~CC3x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y14E(Test__ZN3ccc8CC3x2y14E, "_ZN3ccc8CC3x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y14C1Ev();
extern void _ZN3ccc8CC3x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y14E[] = {
  NSPAIR(_ZN3ccc8CC3x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC3x2y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x2y143pqrEv,_ZTv0_n16_N3ccc8CC3x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y143pqrEv,_ZThn4_N3ccc8CC3x2y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x2y143pqrEv,_ZTv0_n16_N3ccc8CC3x2y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y14E[] = {
  {&(_ZTVN3ccc8CC3x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y14E[];
static VTBL_ENTRY alt_thunk_names1385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x2y143pqrEv,_ZTv0_n16_N3ccc8CC3x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x2y143pqrEv,_ZThn4_N3ccc8CC3x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x2y14E = {  "_ZN3ccc8CC3x2y14E", // class name
  bases__ZN3ccc8CC3x2y14E, 2,
  &(vtc__ZN3ccc8CC3x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1385,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y14  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD3x2y143pqrEv
  ~DD3x2y14(); // tgen
  DD3x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x2y143pqrEv");}
ccc::DD3x2y14 ::~DD3x2y14(){ note_dtor("_ZN3ccc8DD3x2y14E", this);} // tgen
ccc::DD3x2y14 ::DD3x2y14(){ note_ctor("_ZN3ccc8DD3x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y14E, buf);
    ::ccc::DD3x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y14E);
    dp->::ccc::DD3x2y14::~DD3x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y14E(Test__ZN3ccc8DD3x2y14E, "_ZN3ccc8DD3x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y14C1Ev();
extern void _ZN3ccc8DD3x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y14E[] = {
  NSPAIR(_ZN3ccc8DD3x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x2y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x2y143pqrEv,_ZTv0_n20_N3ccc8DD3x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x2y143pqrEv,_ZThn4_N3ccc8DD3x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x2y143pqrEv,_ZTv0_n20_N3ccc8DD3x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y14E[] = {
  {&(_ZTVN3ccc8DD3x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y14E[];
static VTBL_ENTRY alt_thunk_names1386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x2y143pqrEv,_ZTv0_n20_N3ccc8DD3x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x2y143pqrEv,_ZThn4_N3ccc8DD3x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x2y14E = {  "_ZN3ccc8DD3x2y14E", // class name
  bases__ZN3ccc8DD3x2y14E, 2,
  &(vtc__ZN3ccc8DD3x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1386,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y15  : virtual ::ccc::AA3 , ::ccc::BB2 {
  ~CC3x2y15(); // tgen
  CC3x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x2y15 ::~CC3x2y15(){ note_dtor("_ZN3ccc8CC3x2y15E", this);} // tgen
ccc::CC3x2y15 ::CC3x2y15(){ note_ctor("_ZN3ccc8CC3x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y15E, buf);
    ::ccc::CC3x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC3x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y15E);
    dp->::ccc::CC3x2y15::~CC3x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y15E(Test__ZN3ccc8CC3x2y15E, "_ZN3ccc8CC3x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y15C1Ev();
extern void _ZN3ccc8CC3x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y15E[] = {
  NSPAIR(_ZN3ccc8CC3x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x2y15E[] = {
  {&(_ZTVN3ccc8CC3x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x2y15E[];
Class_Descriptor cd__ZN3ccc8CC3x2y15E = {  "_ZN3ccc8CC3x2y15E", // class name
  bases__ZN3ccc8CC3x2y15E, 2,
  &(vtc__ZN3ccc8CC3x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x2y15  : virtual ::ccc::AA3 , virtual ::ccc::BB2 {
  ~DD3x2y15(); // tgen
  DD3x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x2y15 ::~DD3x2y15(){ note_dtor("_ZN3ccc8DD3x2y15E", this);} // tgen
ccc::DD3x2y15 ::DD3x2y15(){ note_ctor("_ZN3ccc8DD3x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x2y15E, buf);
    ::ccc::DD3x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x2y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD3x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x2y15E);
    dp->::ccc::DD3x2y15::~DD3x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x2y15E(Test__ZN3ccc8DD3x2y15E, "_ZN3ccc8DD3x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x2y15C1Ev();
extern void _ZN3ccc8DD3x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x2y15E[] = {
  NSPAIR(_ZN3ccc8DD3x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD3x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x2y15E[] = {
  {&(_ZTVN3ccc8DD3x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x2y15E[];
Class_Descriptor cd__ZN3ccc8DD3x2y15E = {  "_ZN3ccc8DD3x2y15E", // class name
  bases__ZN3ccc8DD3x2y15E, 2,
  &(vtc__ZN3ccc8DD3x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y0  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y03pqrEv
  ~CC3x3y0(); // tgen
  CC3x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y0E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y03abcEv");}
void  ccc::CC3x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y03efgEv");}
void  ccc::CC3x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y03pqrEv");}
ccc::CC3x3y0 ::~CC3x3y0(){ note_dtor("_ZN3ccc7CC3x3y0E", this);} // tgen
ccc::CC3x3y0 ::CC3x3y0(){ note_ctor("_ZN3ccc7CC3x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y0E, buf);
    ::ccc::CC3x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y0E);
    dp->::ccc::CC3x3y0::~CC3x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y0E(Test__ZN3ccc7CC3x3y0E, "_ZN3ccc7CC3x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y0C1Ev();
extern void _ZN3ccc7CC3x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y0E[] = {
  NSPAIR(_ZN3ccc7CC3x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y0E[];
extern void _ZN3ccc7CC3x3y03efgEv();
extern void _ZN3ccc7CC3x3y03pqrEv();
extern void _ZN3ccc7CC3x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y03efgEv,_ZTv0_n12_N3ccc7CC3x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03efgEv,_ZThn4_N3ccc7CC3x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y03pqrEv,_ZTv0_n16_N3ccc7CC3x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03pqrEv,_ZThn4_N3ccc7CC3x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y03abcEv,_ZTv0_n20_N3ccc7CC3x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03abcEv,_ZThn4_N3ccc7CC3x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y03efgEv,_ZTv0_n12_N3ccc7CC3x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y03pqrEv,_ZTv0_n16_N3ccc7CC3x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y03abcEv,_ZTv0_n20_N3ccc7CC3x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y0E[] = {
  {&(_ZTVN3ccc7CC3x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y0E[];
static VTBL_ENTRY alt_thunk_names1387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y03abcEv,_ZTv0_n20_N3ccc7CC3x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y03abcEv,_ZThn4_N3ccc7CC3x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y03pqrEv,_ZTv0_n16_N3ccc7CC3x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y03pqrEv,_ZThn4_N3ccc7CC3x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y03efgEv,_ZTv0_n12_N3ccc7CC3x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y03efgEv,_ZThn4_N3ccc7CC3x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y0E = {  "_ZN3ccc7CC3x3y0E", // class name
  bases__ZN3ccc7CC3x3y0E, 2,
  &(vtc__ZN3ccc7CC3x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1387,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y0  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD3x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y03pqrEv
  ~DD3x3y0(); // tgen
  DD3x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y03abcEv");}
void  ccc::DD3x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y03efgEv");}
void  ccc::DD3x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y03pqrEv");}
ccc::DD3x3y0 ::~DD3x3y0(){ note_dtor("_ZN3ccc7DD3x3y0E", this);} // tgen
ccc::DD3x3y0 ::DD3x3y0(){ note_ctor("_ZN3ccc7DD3x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y0E, buf);
    ::ccc::DD3x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y0E);
    dp->::ccc::DD3x3y0::~DD3x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y0E(Test__ZN3ccc7DD3x3y0E, "_ZN3ccc7DD3x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y0C1Ev();
extern void _ZN3ccc7DD3x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y0E[] = {
  NSPAIR(_ZN3ccc7DD3x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y0E[];
extern void _ZN3ccc7DD3x3y03efgEv();
extern void _ZN3ccc7DD3x3y03pqrEv();
extern void _ZN3ccc7DD3x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y03efgEv,_ZTv0_n12_N3ccc7DD3x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y03efgEv,_ZThn4_N3ccc7DD3x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y03pqrEv,_ZTv0_n16_N3ccc7DD3x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y03pqrEv,_ZThn4_N3ccc7DD3x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y03abcEv,_ZTv0_n20_N3ccc7DD3x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y03abcEv,_ZThn4_N3ccc7DD3x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y03efgEv,_ZTv0_n12_N3ccc7DD3x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y03pqrEv,_ZTv0_n16_N3ccc7DD3x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y03abcEv,_ZTv0_n20_N3ccc7DD3x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y0E[] = {
  {&(_ZTVN3ccc7DD3x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y0E[];
static VTBL_ENTRY alt_thunk_names1388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y03abcEv,_ZTv0_n20_N3ccc7DD3x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y03abcEv,_ZThn4_N3ccc7DD3x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y03pqrEv,_ZTv0_n16_N3ccc7DD3x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y03pqrEv,_ZThn4_N3ccc7DD3x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y03efgEv,_ZTv0_n12_N3ccc7DD3x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y03efgEv,_ZThn4_N3ccc7DD3x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y0E = {  "_ZN3ccc7DD3x3y0E", // class name
  bases__ZN3ccc7DD3x3y0E, 2,
  &(vtc__ZN3ccc7DD3x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1388,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y1  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x3y13efgEv
  ~CC3x3y1(); // tgen
  CC3x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y1E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y13abcEv");}
void  ccc::CC3x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y13pqrEv");}
void  ccc::CC3x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y13efgEv");}
ccc::CC3x3y1 ::~CC3x3y1(){ note_dtor("_ZN3ccc7CC3x3y1E", this);} // tgen
ccc::CC3x3y1 ::CC3x3y1(){ note_ctor("_ZN3ccc7CC3x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y1E, buf);
    ::ccc::CC3x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y1E);
    dp->::ccc::CC3x3y1::~CC3x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y1E(Test__ZN3ccc7CC3x3y1E, "_ZN3ccc7CC3x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y1C1Ev();
extern void _ZN3ccc7CC3x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y1E[] = {
  NSPAIR(_ZN3ccc7CC3x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y1E[];
extern void _ZN3ccc7CC3x3y13efgEv();
extern void _ZN3ccc7CC3x3y13pqrEv();
extern void _ZN3ccc7CC3x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y13efgEv,_ZTv0_n12_N3ccc7CC3x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13efgEv,_ZThn4_N3ccc7CC3x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y13pqrEv,_ZTv0_n16_N3ccc7CC3x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13pqrEv,_ZThn4_N3ccc7CC3x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y13abcEv,_ZTv0_n20_N3ccc7CC3x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13abcEv,_ZThn4_N3ccc7CC3x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y13efgEv,_ZTv0_n12_N3ccc7CC3x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y13pqrEv,_ZTv0_n16_N3ccc7CC3x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y13abcEv,_ZTv0_n20_N3ccc7CC3x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y1E[] = {
  {&(_ZTVN3ccc7CC3x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y1E[];
static VTBL_ENTRY alt_thunk_names1389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y13abcEv,_ZTv0_n20_N3ccc7CC3x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y13abcEv,_ZThn4_N3ccc7CC3x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y13pqrEv,_ZTv0_n16_N3ccc7CC3x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y13pqrEv,_ZThn4_N3ccc7CC3x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y13efgEv,_ZTv0_n12_N3ccc7CC3x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y13efgEv,_ZThn4_N3ccc7CC3x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y1E = {  "_ZN3ccc7CC3x3y1E", // class name
  bases__ZN3ccc7CC3x3y1E, 2,
  &(vtc__ZN3ccc7CC3x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1389,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y1  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD3x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x3y13efgEv
  ~DD3x3y1(); // tgen
  DD3x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y13abcEv");}
void  ccc::DD3x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y13pqrEv");}
void  ccc::DD3x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y13efgEv");}
ccc::DD3x3y1 ::~DD3x3y1(){ note_dtor("_ZN3ccc7DD3x3y1E", this);} // tgen
ccc::DD3x3y1 ::DD3x3y1(){ note_ctor("_ZN3ccc7DD3x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y1E, buf);
    ::ccc::DD3x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y1E);
    dp->::ccc::DD3x3y1::~DD3x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y1E(Test__ZN3ccc7DD3x3y1E, "_ZN3ccc7DD3x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y1C1Ev();
extern void _ZN3ccc7DD3x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y1E[] = {
  NSPAIR(_ZN3ccc7DD3x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y1E[];
extern void _ZN3ccc7DD3x3y13efgEv();
extern void _ZN3ccc7DD3x3y13pqrEv();
extern void _ZN3ccc7DD3x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y13efgEv,_ZTv0_n12_N3ccc7DD3x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y13efgEv,_ZThn4_N3ccc7DD3x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y13pqrEv,_ZTv0_n16_N3ccc7DD3x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y13pqrEv,_ZThn4_N3ccc7DD3x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y13abcEv,_ZTv0_n20_N3ccc7DD3x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y13abcEv,_ZThn4_N3ccc7DD3x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y13efgEv,_ZTv0_n12_N3ccc7DD3x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y13pqrEv,_ZTv0_n16_N3ccc7DD3x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y13abcEv,_ZTv0_n20_N3ccc7DD3x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y1E[] = {
  {&(_ZTVN3ccc7DD3x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y1E[];
static VTBL_ENTRY alt_thunk_names1390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y13abcEv,_ZTv0_n20_N3ccc7DD3x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y13abcEv,_ZThn4_N3ccc7DD3x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y13pqrEv,_ZTv0_n16_N3ccc7DD3x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y13pqrEv,_ZThn4_N3ccc7DD3x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y13efgEv,_ZTv0_n12_N3ccc7DD3x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y13efgEv,_ZThn4_N3ccc7DD3x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y1E = {  "_ZN3ccc7DD3x3y1E", // class name
  bases__ZN3ccc7DD3x3y1E, 2,
  &(vtc__ZN3ccc7DD3x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1390,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y2  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y23pqrEv
  ~CC3x3y2(); // tgen
  CC3x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y2E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y23efgEv");}
void  ccc::CC3x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y23abcEv");}
void  ccc::CC3x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y23pqrEv");}
ccc::CC3x3y2 ::~CC3x3y2(){ note_dtor("_ZN3ccc7CC3x3y2E", this);} // tgen
ccc::CC3x3y2 ::CC3x3y2(){ note_ctor("_ZN3ccc7CC3x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y2E, buf);
    ::ccc::CC3x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y2E);
    dp->::ccc::CC3x3y2::~CC3x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y2E(Test__ZN3ccc7CC3x3y2E, "_ZN3ccc7CC3x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y2C1Ev();
extern void _ZN3ccc7CC3x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y2E[] = {
  NSPAIR(_ZN3ccc7CC3x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y2E[];
extern void _ZN3ccc7CC3x3y23efgEv();
extern void _ZN3ccc7CC3x3y23pqrEv();
extern void _ZN3ccc7CC3x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y23efgEv,_ZTv0_n12_N3ccc7CC3x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23efgEv,_ZThn4_N3ccc7CC3x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y23pqrEv,_ZTv0_n16_N3ccc7CC3x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23pqrEv,_ZThn4_N3ccc7CC3x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y23abcEv,_ZTv0_n20_N3ccc7CC3x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23abcEv,_ZThn4_N3ccc7CC3x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y23efgEv,_ZTv0_n12_N3ccc7CC3x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y23pqrEv,_ZTv0_n16_N3ccc7CC3x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y23abcEv,_ZTv0_n20_N3ccc7CC3x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y2E[] = {
  {&(_ZTVN3ccc7CC3x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y2E[];
static VTBL_ENTRY alt_thunk_names1391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y23abcEv,_ZTv0_n20_N3ccc7CC3x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y23abcEv,_ZThn4_N3ccc7CC3x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y23pqrEv,_ZTv0_n16_N3ccc7CC3x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y23pqrEv,_ZThn4_N3ccc7CC3x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y23efgEv,_ZTv0_n12_N3ccc7CC3x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y23efgEv,_ZThn4_N3ccc7CC3x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y2E = {  "_ZN3ccc7CC3x3y2E", // class name
  bases__ZN3ccc7CC3x3y2E, 2,
  &(vtc__ZN3ccc7CC3x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1391,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y2  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD3x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y23pqrEv
  ~DD3x3y2(); // tgen
  DD3x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y23efgEv");}
void  ccc::DD3x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y23abcEv");}
void  ccc::DD3x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y23pqrEv");}
ccc::DD3x3y2 ::~DD3x3y2(){ note_dtor("_ZN3ccc7DD3x3y2E", this);} // tgen
ccc::DD3x3y2 ::DD3x3y2(){ note_ctor("_ZN3ccc7DD3x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y2E, buf);
    ::ccc::DD3x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y2E);
    dp->::ccc::DD3x3y2::~DD3x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y2E(Test__ZN3ccc7DD3x3y2E, "_ZN3ccc7DD3x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y2C1Ev();
extern void _ZN3ccc7DD3x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y2E[] = {
  NSPAIR(_ZN3ccc7DD3x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y2E[];
extern void _ZN3ccc7DD3x3y23efgEv();
extern void _ZN3ccc7DD3x3y23pqrEv();
extern void _ZN3ccc7DD3x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y23efgEv,_ZTv0_n12_N3ccc7DD3x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y23efgEv,_ZThn4_N3ccc7DD3x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y23pqrEv,_ZTv0_n16_N3ccc7DD3x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y23pqrEv,_ZThn4_N3ccc7DD3x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y23abcEv,_ZTv0_n20_N3ccc7DD3x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y23abcEv,_ZThn4_N3ccc7DD3x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y23efgEv,_ZTv0_n12_N3ccc7DD3x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y23pqrEv,_ZTv0_n16_N3ccc7DD3x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y23abcEv,_ZTv0_n20_N3ccc7DD3x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y2E[] = {
  {&(_ZTVN3ccc7DD3x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y2E[];
static VTBL_ENTRY alt_thunk_names1392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y23abcEv,_ZTv0_n20_N3ccc7DD3x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y23abcEv,_ZThn4_N3ccc7DD3x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y23pqrEv,_ZTv0_n16_N3ccc7DD3x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y23pqrEv,_ZThn4_N3ccc7DD3x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y23efgEv,_ZTv0_n12_N3ccc7DD3x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y23efgEv,_ZThn4_N3ccc7DD3x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y2E = {  "_ZN3ccc7DD3x3y2E", // class name
  bases__ZN3ccc7DD3x3y2E, 2,
  &(vtc__ZN3ccc7DD3x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1392,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y3  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x3y33abcEv
  ~CC3x3y3(); // tgen
  CC3x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y3E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y33efgEv");}
void  ccc::CC3x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y33pqrEv");}
void  ccc::CC3x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y33abcEv");}
ccc::CC3x3y3 ::~CC3x3y3(){ note_dtor("_ZN3ccc7CC3x3y3E", this);} // tgen
ccc::CC3x3y3 ::CC3x3y3(){ note_ctor("_ZN3ccc7CC3x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y3E, buf);
    ::ccc::CC3x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y3E);
    dp->::ccc::CC3x3y3::~CC3x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y3E(Test__ZN3ccc7CC3x3y3E, "_ZN3ccc7CC3x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y3C1Ev();
extern void _ZN3ccc7CC3x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y3E[] = {
  NSPAIR(_ZN3ccc7CC3x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y3E[];
extern void _ZN3ccc7CC3x3y33efgEv();
extern void _ZN3ccc7CC3x3y33pqrEv();
extern void _ZN3ccc7CC3x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y33efgEv,_ZTv0_n12_N3ccc7CC3x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33efgEv,_ZThn4_N3ccc7CC3x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y33pqrEv,_ZTv0_n16_N3ccc7CC3x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33pqrEv,_ZThn4_N3ccc7CC3x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y33abcEv,_ZTv0_n20_N3ccc7CC3x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33abcEv,_ZThn4_N3ccc7CC3x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y33efgEv,_ZTv0_n12_N3ccc7CC3x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y33pqrEv,_ZTv0_n16_N3ccc7CC3x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y33abcEv,_ZTv0_n20_N3ccc7CC3x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y3E[] = {
  {&(_ZTVN3ccc7CC3x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y3E[];
static VTBL_ENTRY alt_thunk_names1393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y33abcEv,_ZTv0_n20_N3ccc7CC3x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y33abcEv,_ZThn4_N3ccc7CC3x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y33pqrEv,_ZTv0_n16_N3ccc7CC3x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y33pqrEv,_ZThn4_N3ccc7CC3x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y33efgEv,_ZTv0_n12_N3ccc7CC3x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y33efgEv,_ZThn4_N3ccc7CC3x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y3E = {  "_ZN3ccc7CC3x3y3E", // class name
  bases__ZN3ccc7CC3x3y3E, 2,
  &(vtc__ZN3ccc7CC3x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1393,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y3  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD3x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x3y33abcEv
  ~DD3x3y3(); // tgen
  DD3x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y33efgEv");}
void  ccc::DD3x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y33pqrEv");}
void  ccc::DD3x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y33abcEv");}
ccc::DD3x3y3 ::~DD3x3y3(){ note_dtor("_ZN3ccc7DD3x3y3E", this);} // tgen
ccc::DD3x3y3 ::DD3x3y3(){ note_ctor("_ZN3ccc7DD3x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y3E, buf);
    ::ccc::DD3x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y3E);
    dp->::ccc::DD3x3y3::~DD3x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y3E(Test__ZN3ccc7DD3x3y3E, "_ZN3ccc7DD3x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y3C1Ev();
extern void _ZN3ccc7DD3x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y3E[] = {
  NSPAIR(_ZN3ccc7DD3x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y3E[];
extern void _ZN3ccc7DD3x3y33efgEv();
extern void _ZN3ccc7DD3x3y33pqrEv();
extern void _ZN3ccc7DD3x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y33efgEv,_ZTv0_n12_N3ccc7DD3x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y33efgEv,_ZThn4_N3ccc7DD3x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y33pqrEv,_ZTv0_n16_N3ccc7DD3x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y33pqrEv,_ZThn4_N3ccc7DD3x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y33abcEv,_ZTv0_n20_N3ccc7DD3x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y33abcEv,_ZThn4_N3ccc7DD3x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y33efgEv,_ZTv0_n12_N3ccc7DD3x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y33pqrEv,_ZTv0_n16_N3ccc7DD3x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y33abcEv,_ZTv0_n20_N3ccc7DD3x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y3E[] = {
  {&(_ZTVN3ccc7DD3x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y3E[];
static VTBL_ENTRY alt_thunk_names1394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y33abcEv,_ZTv0_n20_N3ccc7DD3x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y33abcEv,_ZThn4_N3ccc7DD3x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y33pqrEv,_ZTv0_n16_N3ccc7DD3x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y33pqrEv,_ZThn4_N3ccc7DD3x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y33efgEv,_ZTv0_n12_N3ccc7DD3x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y33efgEv,_ZThn4_N3ccc7DD3x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y3E = {  "_ZN3ccc7DD3x3y3E", // class name
  bases__ZN3ccc7DD3x3y3E, 2,
  &(vtc__ZN3ccc7DD3x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1394,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y4  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC3x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y43efgEv
  ~CC3x3y4(); // tgen
  CC3x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y4E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y43pqrEv");}
void  ccc::CC3x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y43abcEv");}
void  ccc::CC3x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y43efgEv");}
ccc::CC3x3y4 ::~CC3x3y4(){ note_dtor("_ZN3ccc7CC3x3y4E", this);} // tgen
ccc::CC3x3y4 ::CC3x3y4(){ note_ctor("_ZN3ccc7CC3x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y4E, buf);
    ::ccc::CC3x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y4E);
    dp->::ccc::CC3x3y4::~CC3x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y4E(Test__ZN3ccc7CC3x3y4E, "_ZN3ccc7CC3x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y4C1Ev();
extern void _ZN3ccc7CC3x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y4E[] = {
  NSPAIR(_ZN3ccc7CC3x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y4E[];
extern void _ZN3ccc7CC3x3y43efgEv();
extern void _ZN3ccc7CC3x3y43pqrEv();
extern void _ZN3ccc7CC3x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y43efgEv,_ZTv0_n12_N3ccc7CC3x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43efgEv,_ZThn4_N3ccc7CC3x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y43pqrEv,_ZTv0_n16_N3ccc7CC3x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43pqrEv,_ZThn4_N3ccc7CC3x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y43abcEv,_ZTv0_n20_N3ccc7CC3x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43abcEv,_ZThn4_N3ccc7CC3x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y43efgEv,_ZTv0_n12_N3ccc7CC3x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y43pqrEv,_ZTv0_n16_N3ccc7CC3x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y43abcEv,_ZTv0_n20_N3ccc7CC3x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y4E[] = {
  {&(_ZTVN3ccc7CC3x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y4E[];
static VTBL_ENTRY alt_thunk_names1395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y43abcEv,_ZTv0_n20_N3ccc7CC3x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y43abcEv,_ZThn4_N3ccc7CC3x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y43pqrEv,_ZTv0_n16_N3ccc7CC3x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y43pqrEv,_ZThn4_N3ccc7CC3x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y43efgEv,_ZTv0_n12_N3ccc7CC3x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y43efgEv,_ZThn4_N3ccc7CC3x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y4E = {  "_ZN3ccc7CC3x3y4E", // class name
  bases__ZN3ccc7CC3x3y4E, 2,
  &(vtc__ZN3ccc7CC3x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1395,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y4  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD3x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x3y43efgEv
  ~DD3x3y4(); // tgen
  DD3x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y43pqrEv");}
void  ccc::DD3x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y43abcEv");}
void  ccc::DD3x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y43efgEv");}
ccc::DD3x3y4 ::~DD3x3y4(){ note_dtor("_ZN3ccc7DD3x3y4E", this);} // tgen
ccc::DD3x3y4 ::DD3x3y4(){ note_ctor("_ZN3ccc7DD3x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y4E, buf);
    ::ccc::DD3x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y4E);
    dp->::ccc::DD3x3y4::~DD3x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y4E(Test__ZN3ccc7DD3x3y4E, "_ZN3ccc7DD3x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y4C1Ev();
extern void _ZN3ccc7DD3x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y4E[] = {
  NSPAIR(_ZN3ccc7DD3x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y4E[];
extern void _ZN3ccc7DD3x3y43efgEv();
extern void _ZN3ccc7DD3x3y43pqrEv();
extern void _ZN3ccc7DD3x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y43efgEv,_ZTv0_n12_N3ccc7DD3x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y43efgEv,_ZThn4_N3ccc7DD3x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y43pqrEv,_ZTv0_n16_N3ccc7DD3x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y43pqrEv,_ZThn4_N3ccc7DD3x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y43abcEv,_ZTv0_n20_N3ccc7DD3x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y43abcEv,_ZThn4_N3ccc7DD3x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y43efgEv,_ZTv0_n12_N3ccc7DD3x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y43pqrEv,_ZTv0_n16_N3ccc7DD3x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y43abcEv,_ZTv0_n20_N3ccc7DD3x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y4E[] = {
  {&(_ZTVN3ccc7DD3x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y4E[];
static VTBL_ENTRY alt_thunk_names1396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y43abcEv,_ZTv0_n20_N3ccc7DD3x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y43abcEv,_ZThn4_N3ccc7DD3x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y43pqrEv,_ZTv0_n16_N3ccc7DD3x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y43pqrEv,_ZThn4_N3ccc7DD3x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y43efgEv,_ZTv0_n12_N3ccc7DD3x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y43efgEv,_ZThn4_N3ccc7DD3x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y4E = {  "_ZN3ccc7DD3x3y4E", // class name
  bases__ZN3ccc7DD3x3y4E, 2,
  &(vtc__ZN3ccc7DD3x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1396,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y5  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC3x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y53abcEv
  ~CC3x3y5(); // tgen
  CC3x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y5E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y53pqrEv");}
void  ccc::CC3x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y53efgEv");}
void  ccc::CC3x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y53abcEv");}
ccc::CC3x3y5 ::~CC3x3y5(){ note_dtor("_ZN3ccc7CC3x3y5E", this);} // tgen
ccc::CC3x3y5 ::CC3x3y5(){ note_ctor("_ZN3ccc7CC3x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y5E, buf);
    ::ccc::CC3x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y5E);
    dp->::ccc::CC3x3y5::~CC3x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y5E(Test__ZN3ccc7CC3x3y5E, "_ZN3ccc7CC3x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y5C1Ev();
extern void _ZN3ccc7CC3x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y5E[] = {
  NSPAIR(_ZN3ccc7CC3x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y5E[];
extern void _ZN3ccc7CC3x3y53efgEv();
extern void _ZN3ccc7CC3x3y53pqrEv();
extern void _ZN3ccc7CC3x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y53efgEv,_ZTv0_n12_N3ccc7CC3x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53efgEv,_ZThn4_N3ccc7CC3x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y53pqrEv,_ZTv0_n16_N3ccc7CC3x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53pqrEv,_ZThn4_N3ccc7CC3x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y53abcEv,_ZTv0_n20_N3ccc7CC3x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53abcEv,_ZThn4_N3ccc7CC3x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y53efgEv,_ZTv0_n12_N3ccc7CC3x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y53pqrEv,_ZTv0_n16_N3ccc7CC3x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y53abcEv,_ZTv0_n20_N3ccc7CC3x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y5E[] = {
  {&(_ZTVN3ccc7CC3x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y5E[];
static VTBL_ENTRY alt_thunk_names1397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y53abcEv,_ZTv0_n20_N3ccc7CC3x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y53abcEv,_ZThn4_N3ccc7CC3x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y53pqrEv,_ZTv0_n16_N3ccc7CC3x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y53pqrEv,_ZThn4_N3ccc7CC3x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y53efgEv,_ZTv0_n12_N3ccc7CC3x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y53efgEv,_ZThn4_N3ccc7CC3x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y5E = {  "_ZN3ccc7CC3x3y5E", // class name
  bases__ZN3ccc7CC3x3y5E, 2,
  &(vtc__ZN3ccc7CC3x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1397,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y5  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD3x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x3y53abcEv
  ~DD3x3y5(); // tgen
  DD3x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y53pqrEv");}
void  ccc::DD3x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y53efgEv");}
void  ccc::DD3x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y53abcEv");}
ccc::DD3x3y5 ::~DD3x3y5(){ note_dtor("_ZN3ccc7DD3x3y5E", this);} // tgen
ccc::DD3x3y5 ::DD3x3y5(){ note_ctor("_ZN3ccc7DD3x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y5E, buf);
    ::ccc::DD3x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y5E);
    dp->::ccc::DD3x3y5::~DD3x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y5E(Test__ZN3ccc7DD3x3y5E, "_ZN3ccc7DD3x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y5C1Ev();
extern void _ZN3ccc7DD3x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y5E[] = {
  NSPAIR(_ZN3ccc7DD3x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y5E[];
extern void _ZN3ccc7DD3x3y53efgEv();
extern void _ZN3ccc7DD3x3y53pqrEv();
extern void _ZN3ccc7DD3x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y53efgEv,_ZTv0_n12_N3ccc7DD3x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y53efgEv,_ZThn4_N3ccc7DD3x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y53pqrEv,_ZTv0_n16_N3ccc7DD3x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y53pqrEv,_ZThn4_N3ccc7DD3x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y53abcEv,_ZTv0_n20_N3ccc7DD3x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y53abcEv,_ZThn4_N3ccc7DD3x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y53efgEv,_ZTv0_n12_N3ccc7DD3x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y53pqrEv,_ZTv0_n16_N3ccc7DD3x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y53abcEv,_ZTv0_n20_N3ccc7DD3x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y5E[] = {
  {&(_ZTVN3ccc7DD3x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y5E[];
static VTBL_ENTRY alt_thunk_names1398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y53abcEv,_ZTv0_n20_N3ccc7DD3x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y53abcEv,_ZThn4_N3ccc7DD3x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y53pqrEv,_ZTv0_n16_N3ccc7DD3x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y53pqrEv,_ZThn4_N3ccc7DD3x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y53efgEv,_ZTv0_n12_N3ccc7DD3x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y53efgEv,_ZThn4_N3ccc7DD3x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y5E = {  "_ZN3ccc7DD3x3y5E", // class name
  bases__ZN3ccc7DD3x3y5E, 2,
  &(vtc__ZN3ccc7DD3x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1398,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y6  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y63efgEv
  ~CC3x3y6(); // tgen
  CC3x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y6E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y63abcEv");}
void  ccc::CC3x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y63efgEv");}
ccc::CC3x3y6 ::~CC3x3y6(){ note_dtor("_ZN3ccc7CC3x3y6E", this);} // tgen
ccc::CC3x3y6 ::CC3x3y6(){ note_ctor("_ZN3ccc7CC3x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y6E, buf);
    ::ccc::CC3x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y6E);
    dp->::ccc::CC3x3y6::~CC3x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y6E(Test__ZN3ccc7CC3x3y6E, "_ZN3ccc7CC3x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y6C1Ev();
extern void _ZN3ccc7CC3x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y6E[] = {
  NSPAIR(_ZN3ccc7CC3x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y6E[];
extern void _ZN3ccc7CC3x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC3x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y63efgEv,_ZTv0_n12_N3ccc7CC3x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y63efgEv,_ZThn4_N3ccc7CC3x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y63abcEv,_ZTv0_n20_N3ccc7CC3x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y63abcEv,_ZThn4_N3ccc7CC3x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y63efgEv,_ZTv0_n12_N3ccc7CC3x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y63abcEv,_ZTv0_n20_N3ccc7CC3x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y6E[] = {
  {&(_ZTVN3ccc7CC3x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y6E[];
static VTBL_ENTRY alt_thunk_names1399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y63abcEv,_ZTv0_n20_N3ccc7CC3x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y63abcEv,_ZThn4_N3ccc7CC3x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y63efgEv,_ZTv0_n12_N3ccc7CC3x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y63efgEv,_ZThn4_N3ccc7CC3x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y6E = {  "_ZN3ccc7CC3x3y6E", // class name
  bases__ZN3ccc7CC3x3y6E, 2,
  &(vtc__ZN3ccc7CC3x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1399,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y6  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD3x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x3y63efgEv
  ~DD3x3y6(); // tgen
  DD3x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y63abcEv");}
void  ccc::DD3x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y63efgEv");}
ccc::DD3x3y6 ::~DD3x3y6(){ note_dtor("_ZN3ccc7DD3x3y6E", this);} // tgen
ccc::DD3x3y6 ::DD3x3y6(){ note_ctor("_ZN3ccc7DD3x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y6E, buf);
    ::ccc::DD3x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y6E);
    dp->::ccc::DD3x3y6::~DD3x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y6E(Test__ZN3ccc7DD3x3y6E, "_ZN3ccc7DD3x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y6C1Ev();
extern void _ZN3ccc7DD3x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y6E[] = {
  NSPAIR(_ZN3ccc7DD3x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y6E[];
extern void _ZN3ccc7DD3x3y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y63efgEv,_ZTv0_n12_N3ccc7DD3x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y63efgEv,_ZThn4_N3ccc7DD3x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y63abcEv,_ZTv0_n20_N3ccc7DD3x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y63abcEv,_ZThn4_N3ccc7DD3x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y63efgEv,_ZTv0_n12_N3ccc7DD3x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y63abcEv,_ZTv0_n20_N3ccc7DD3x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y6E[] = {
  {&(_ZTVN3ccc7DD3x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y6E[];
static VTBL_ENTRY alt_thunk_names1400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y63abcEv,_ZTv0_n20_N3ccc7DD3x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y63abcEv,_ZThn4_N3ccc7DD3x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y63efgEv,_ZTv0_n12_N3ccc7DD3x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y63efgEv,_ZThn4_N3ccc7DD3x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y6E = {  "_ZN3ccc7DD3x3y6E", // class name
  bases__ZN3ccc7DD3x3y6E, 2,
  &(vtc__ZN3ccc7DD3x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1400,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y7  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y73pqrEv
  ~CC3x3y7(); // tgen
  CC3x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y7E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y73abcEv");}
void  ccc::CC3x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y73pqrEv");}
ccc::CC3x3y7 ::~CC3x3y7(){ note_dtor("_ZN3ccc7CC3x3y7E", this);} // tgen
ccc::CC3x3y7 ::CC3x3y7(){ note_ctor("_ZN3ccc7CC3x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y7E, buf);
    ::ccc::CC3x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y7E);
    dp->::ccc::CC3x3y7::~CC3x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y7E(Test__ZN3ccc7CC3x3y7E, "_ZN3ccc7CC3x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y7C1Ev();
extern void _ZN3ccc7CC3x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y7E[] = {
  NSPAIR(_ZN3ccc7CC3x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC3x3y73pqrEv();
extern void _ZN3ccc7CC3x3y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y73pqrEv,_ZTv0_n16_N3ccc7CC3x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y73pqrEv,_ZThn4_N3ccc7CC3x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y73abcEv,_ZTv0_n20_N3ccc7CC3x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y73abcEv,_ZThn4_N3ccc7CC3x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y73pqrEv,_ZTv0_n16_N3ccc7CC3x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y73abcEv,_ZTv0_n20_N3ccc7CC3x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y7E[] = {
  {&(_ZTVN3ccc7CC3x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y7E[];
static VTBL_ENTRY alt_thunk_names1401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y73abcEv,_ZTv0_n20_N3ccc7CC3x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y73abcEv,_ZThn4_N3ccc7CC3x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y73pqrEv,_ZTv0_n16_N3ccc7CC3x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y73pqrEv,_ZThn4_N3ccc7CC3x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y7E = {  "_ZN3ccc7CC3x3y7E", // class name
  bases__ZN3ccc7CC3x3y7E, 2,
  &(vtc__ZN3ccc7CC3x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1401,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y7  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD3x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y73pqrEv
  ~DD3x3y7(); // tgen
  DD3x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y73abcEv");}
void  ccc::DD3x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y73pqrEv");}
ccc::DD3x3y7 ::~DD3x3y7(){ note_dtor("_ZN3ccc7DD3x3y7E", this);} // tgen
ccc::DD3x3y7 ::DD3x3y7(){ note_ctor("_ZN3ccc7DD3x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y7E, buf);
    ::ccc::DD3x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y7E);
    dp->::ccc::DD3x3y7::~DD3x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y7E(Test__ZN3ccc7DD3x3y7E, "_ZN3ccc7DD3x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y7C1Ev();
extern void _ZN3ccc7DD3x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y7E[] = {
  NSPAIR(_ZN3ccc7DD3x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x3y73pqrEv();
extern void _ZN3ccc7DD3x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y73pqrEv,_ZTv0_n16_N3ccc7DD3x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y73pqrEv,_ZThn4_N3ccc7DD3x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y73abcEv,_ZTv0_n20_N3ccc7DD3x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y73abcEv,_ZThn4_N3ccc7DD3x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y73pqrEv,_ZTv0_n16_N3ccc7DD3x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y73abcEv,_ZTv0_n20_N3ccc7DD3x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y7E[] = {
  {&(_ZTVN3ccc7DD3x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y7E[];
static VTBL_ENTRY alt_thunk_names1402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y73abcEv,_ZTv0_n20_N3ccc7DD3x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y73abcEv,_ZThn4_N3ccc7DD3x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y73pqrEv,_ZTv0_n16_N3ccc7DD3x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y73pqrEv,_ZThn4_N3ccc7DD3x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y7E = {  "_ZN3ccc7DD3x3y7E", // class name
  bases__ZN3ccc7DD3x3y7E, 2,
  &(vtc__ZN3ccc7DD3x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1402,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y8  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y83abcEv
  ~CC3x3y8(); // tgen
  CC3x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y8E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y83efgEv");}
void  ccc::CC3x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y83abcEv");}
ccc::CC3x3y8 ::~CC3x3y8(){ note_dtor("_ZN3ccc7CC3x3y8E", this);} // tgen
ccc::CC3x3y8 ::CC3x3y8(){ note_ctor("_ZN3ccc7CC3x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y8E, buf);
    ::ccc::CC3x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y8E);
    dp->::ccc::CC3x3y8::~CC3x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y8E(Test__ZN3ccc7CC3x3y8E, "_ZN3ccc7CC3x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y8C1Ev();
extern void _ZN3ccc7CC3x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y8E[] = {
  NSPAIR(_ZN3ccc7CC3x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y8E[];
extern void _ZN3ccc7CC3x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC3x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y83efgEv,_ZTv0_n12_N3ccc7CC3x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y83efgEv,_ZThn4_N3ccc7CC3x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x3y83abcEv,_ZTv0_n20_N3ccc7CC3x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y83abcEv,_ZThn4_N3ccc7CC3x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y83efgEv,_ZTv0_n12_N3ccc7CC3x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x3y83abcEv,_ZTv0_n20_N3ccc7CC3x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y8E[] = {
  {&(_ZTVN3ccc7CC3x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y8E[];
static VTBL_ENTRY alt_thunk_names1403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x3y83abcEv,_ZTv0_n20_N3ccc7CC3x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y83abcEv,_ZThn4_N3ccc7CC3x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y83efgEv,_ZTv0_n12_N3ccc7CC3x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y83efgEv,_ZThn4_N3ccc7CC3x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y8E = {  "_ZN3ccc7CC3x3y8E", // class name
  bases__ZN3ccc7CC3x3y8E, 2,
  &(vtc__ZN3ccc7CC3x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1403,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y8  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD3x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x3y83abcEv
  ~DD3x3y8(); // tgen
  DD3x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y83efgEv");}
void  ccc::DD3x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x3y83abcEv");}
ccc::DD3x3y8 ::~DD3x3y8(){ note_dtor("_ZN3ccc7DD3x3y8E", this);} // tgen
ccc::DD3x3y8 ::DD3x3y8(){ note_ctor("_ZN3ccc7DD3x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y8E, buf);
    ::ccc::DD3x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y8E);
    dp->::ccc::DD3x3y8::~DD3x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y8E(Test__ZN3ccc7DD3x3y8E, "_ZN3ccc7DD3x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y8C1Ev();
extern void _ZN3ccc7DD3x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y8E[] = {
  NSPAIR(_ZN3ccc7DD3x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y8E[];
extern void _ZN3ccc7DD3x3y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y83efgEv,_ZTv0_n12_N3ccc7DD3x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y83efgEv,_ZThn4_N3ccc7DD3x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x3y83abcEv,_ZTv0_n20_N3ccc7DD3x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y83abcEv,_ZThn4_N3ccc7DD3x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y83efgEv,_ZTv0_n12_N3ccc7DD3x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x3y83abcEv,_ZTv0_n20_N3ccc7DD3x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y8E[] = {
  {&(_ZTVN3ccc7DD3x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y8E[];
static VTBL_ENTRY alt_thunk_names1404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x3y83abcEv,_ZTv0_n20_N3ccc7DD3x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y83abcEv,_ZThn4_N3ccc7DD3x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y83efgEv,_ZTv0_n12_N3ccc7DD3x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y83efgEv,_ZThn4_N3ccc7DD3x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y8E = {  "_ZN3ccc7DD3x3y8E", // class name
  bases__ZN3ccc7DD3x3y8E, 2,
  &(vtc__ZN3ccc7DD3x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1404,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y9  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y93pqrEv
  ~CC3x3y9(); // tgen
  CC3x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y9E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y93efgEv");}
void  ccc::CC3x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y93pqrEv");}
ccc::CC3x3y9 ::~CC3x3y9(){ note_dtor("_ZN3ccc7CC3x3y9E", this);} // tgen
ccc::CC3x3y9 ::CC3x3y9(){ note_ctor("_ZN3ccc7CC3x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y9E, buf);
    ::ccc::CC3x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC3x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y9E);
    dp->::ccc::CC3x3y9::~CC3x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y9E(Test__ZN3ccc7CC3x3y9E, "_ZN3ccc7CC3x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y9C1Ev();
extern void _ZN3ccc7CC3x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y9E[] = {
  NSPAIR(_ZN3ccc7CC3x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y9E[];
extern void _ZN3ccc7CC3x3y93efgEv();
extern void _ZN3ccc7CC3x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x3y93efgEv,_ZTv0_n12_N3ccc7CC3x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y93efgEv,_ZThn4_N3ccc7CC3x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x3y93pqrEv,_ZTv0_n16_N3ccc7CC3x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y93pqrEv,_ZThn4_N3ccc7CC3x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x3y93efgEv,_ZTv0_n12_N3ccc7CC3x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x3y93pqrEv,_ZTv0_n16_N3ccc7CC3x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x3y9E[] = {
  {&(_ZTVN3ccc7CC3x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x3y9E[];
static VTBL_ENTRY alt_thunk_names1405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x3y93pqrEv,_ZTv0_n16_N3ccc7CC3x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y93pqrEv,_ZThn4_N3ccc7CC3x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x3y93efgEv,_ZTv0_n12_N3ccc7CC3x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x3y93efgEv,_ZThn4_N3ccc7CC3x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x3y9E = {  "_ZN3ccc7CC3x3y9E", // class name
  bases__ZN3ccc7CC3x3y9E, 2,
  &(vtc__ZN3ccc7CC3x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x3y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1405,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y9  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD3x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x3y93pqrEv
  ~DD3x3y9(); // tgen
  DD3x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x3y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x3y93efgEv");}
void  ccc::DD3x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x3y93pqrEv");}
ccc::DD3x3y9 ::~DD3x3y9(){ note_dtor("_ZN3ccc7DD3x3y9E", this);} // tgen
ccc::DD3x3y9 ::DD3x3y9(){ note_ctor("_ZN3ccc7DD3x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x3y9E, buf);
    ::ccc::DD3x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x3y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD3x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x3y9E);
    dp->::ccc::DD3x3y9::~DD3x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x3y9E(Test__ZN3ccc7DD3x3y9E, "_ZN3ccc7DD3x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x3y9C1Ev();
extern void _ZN3ccc7DD3x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x3y9E[] = {
  NSPAIR(_ZN3ccc7DD3x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD3x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y9E[];
extern void _ZN3ccc7DD3x3y93efgEv();
extern void _ZN3ccc7DD3x3y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x3y93efgEv,_ZTv0_n12_N3ccc7DD3x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y93efgEv,_ZThn4_N3ccc7DD3x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x3y93pqrEv,_ZTv0_n16_N3ccc7DD3x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x3y93pqrEv,_ZThn4_N3ccc7DD3x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x3y93efgEv,_ZTv0_n12_N3ccc7DD3x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x3y93pqrEv,_ZTv0_n16_N3ccc7DD3x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x3y9E[] = {
  {&(_ZTVN3ccc7DD3x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x3y9E[];
static VTBL_ENTRY alt_thunk_names1406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x3y93pqrEv,_ZTv0_n16_N3ccc7DD3x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y93pqrEv,_ZThn4_N3ccc7DD3x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x3y93efgEv,_ZTv0_n12_N3ccc7DD3x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x3y93efgEv,_ZThn4_N3ccc7DD3x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x3y9E = {  "_ZN3ccc7DD3x3y9E", // class name
  bases__ZN3ccc7DD3x3y9E, 2,
  &(vtc__ZN3ccc7DD3x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x3y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1406,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y10  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x3y103abcEv
  ~CC3x3y10(); // tgen
  CC3x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y10E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y103pqrEv");}
void  ccc::CC3x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x3y103abcEv");}
ccc::CC3x3y10 ::~CC3x3y10(){ note_dtor("_ZN3ccc8CC3x3y10E", this);} // tgen
ccc::CC3x3y10 ::CC3x3y10(){ note_ctor("_ZN3ccc8CC3x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y10E, buf);
    ::ccc::CC3x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y10E);
    dp->::ccc::CC3x3y10::~CC3x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y10E(Test__ZN3ccc8CC3x3y10E, "_ZN3ccc8CC3x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y10C1Ev();
extern void _ZN3ccc8CC3x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y10E[] = {
  NSPAIR(_ZN3ccc8CC3x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC3x3y103pqrEv();
extern void _ZN3ccc8CC3x3y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x3y103pqrEv,_ZTv0_n16_N3ccc8CC3x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y103pqrEv,_ZThn4_N3ccc8CC3x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x3y103abcEv,_ZTv0_n20_N3ccc8CC3x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y103abcEv,_ZThn4_N3ccc8CC3x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x3y103pqrEv,_ZTv0_n16_N3ccc8CC3x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x3y103abcEv,_ZTv0_n20_N3ccc8CC3x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y10E[] = {
  {&(_ZTVN3ccc8CC3x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y10E[];
static VTBL_ENTRY alt_thunk_names1407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x3y103abcEv,_ZTv0_n20_N3ccc8CC3x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y103abcEv,_ZThn4_N3ccc8CC3x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x3y103pqrEv,_ZTv0_n16_N3ccc8CC3x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y103pqrEv,_ZThn4_N3ccc8CC3x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x3y10E = {  "_ZN3ccc8CC3x3y10E", // class name
  bases__ZN3ccc8CC3x3y10E, 2,
  &(vtc__ZN3ccc8CC3x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1407,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y10  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD3x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x3y103abcEv
  ~DD3x3y10(); // tgen
  DD3x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x3y103pqrEv");}
void  ccc::DD3x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x3y103abcEv");}
ccc::DD3x3y10 ::~DD3x3y10(){ note_dtor("_ZN3ccc8DD3x3y10E", this);} // tgen
ccc::DD3x3y10 ::DD3x3y10(){ note_ctor("_ZN3ccc8DD3x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y10E, buf);
    ::ccc::DD3x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y10E);
    dp->::ccc::DD3x3y10::~DD3x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y10E(Test__ZN3ccc8DD3x3y10E, "_ZN3ccc8DD3x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y10C1Ev();
extern void _ZN3ccc8DD3x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y10E[] = {
  NSPAIR(_ZN3ccc8DD3x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x3y103pqrEv();
extern void _ZN3ccc8DD3x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x3y103pqrEv,_ZTv0_n16_N3ccc8DD3x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y103pqrEv,_ZThn4_N3ccc8DD3x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x3y103abcEv,_ZTv0_n20_N3ccc8DD3x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y103abcEv,_ZThn4_N3ccc8DD3x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x3y103pqrEv,_ZTv0_n16_N3ccc8DD3x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x3y103abcEv,_ZTv0_n20_N3ccc8DD3x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y10E[] = {
  {&(_ZTVN3ccc8DD3x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y10E[];
static VTBL_ENTRY alt_thunk_names1408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x3y103abcEv,_ZTv0_n20_N3ccc8DD3x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y103abcEv,_ZThn4_N3ccc8DD3x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x3y103pqrEv,_ZTv0_n16_N3ccc8DD3x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y103pqrEv,_ZThn4_N3ccc8DD3x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x3y10E = {  "_ZN3ccc8DD3x3y10E", // class name
  bases__ZN3ccc8DD3x3y10E, 2,
  &(vtc__ZN3ccc8DD3x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1408,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y11  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x3y113efgEv
  ~CC3x3y11(); // tgen
  CC3x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y11E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y113pqrEv");}
void  ccc::CC3x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x3y113efgEv");}
ccc::CC3x3y11 ::~CC3x3y11(){ note_dtor("_ZN3ccc8CC3x3y11E", this);} // tgen
ccc::CC3x3y11 ::CC3x3y11(){ note_ctor("_ZN3ccc8CC3x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y11E, buf);
    ::ccc::CC3x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y11E);
    dp->::ccc::CC3x3y11::~CC3x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y11E(Test__ZN3ccc8CC3x3y11E, "_ZN3ccc8CC3x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y11C1Ev();
extern void _ZN3ccc8CC3x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y11E[] = {
  NSPAIR(_ZN3ccc8CC3x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y11E[];
extern void _ZN3ccc8CC3x3y113efgEv();
extern void _ZN3ccc8CC3x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x3y113efgEv,_ZTv0_n12_N3ccc8CC3x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y113efgEv,_ZThn4_N3ccc8CC3x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x3y113pqrEv,_ZTv0_n16_N3ccc8CC3x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y113pqrEv,_ZThn4_N3ccc8CC3x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x3y113efgEv,_ZTv0_n12_N3ccc8CC3x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x3y113pqrEv,_ZTv0_n16_N3ccc8CC3x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y11E[] = {
  {&(_ZTVN3ccc8CC3x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y11E[];
static VTBL_ENTRY alt_thunk_names1409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x3y113pqrEv,_ZTv0_n16_N3ccc8CC3x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y113pqrEv,_ZThn4_N3ccc8CC3x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x3y113efgEv,_ZTv0_n12_N3ccc8CC3x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y113efgEv,_ZThn4_N3ccc8CC3x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x3y11E = {  "_ZN3ccc8CC3x3y11E", // class name
  bases__ZN3ccc8CC3x3y11E, 2,
  &(vtc__ZN3ccc8CC3x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1409,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y11  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD3x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x3y113efgEv
  ~DD3x3y11(); // tgen
  DD3x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x3y113pqrEv");}
void  ccc::DD3x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x3y113efgEv");}
ccc::DD3x3y11 ::~DD3x3y11(){ note_dtor("_ZN3ccc8DD3x3y11E", this);} // tgen
ccc::DD3x3y11 ::DD3x3y11(){ note_ctor("_ZN3ccc8DD3x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y11E, buf);
    ::ccc::DD3x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y11E);
    dp->::ccc::DD3x3y11::~DD3x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y11E(Test__ZN3ccc8DD3x3y11E, "_ZN3ccc8DD3x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y11C1Ev();
extern void _ZN3ccc8DD3x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y11E[] = {
  NSPAIR(_ZN3ccc8DD3x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y11E[];
extern void _ZN3ccc8DD3x3y113efgEv();
extern void _ZN3ccc8DD3x3y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x3y113efgEv,_ZTv0_n12_N3ccc8DD3x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y113efgEv,_ZThn4_N3ccc8DD3x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x3y113pqrEv,_ZTv0_n16_N3ccc8DD3x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y113pqrEv,_ZThn4_N3ccc8DD3x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x3y113efgEv,_ZTv0_n12_N3ccc8DD3x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x3y113pqrEv,_ZTv0_n16_N3ccc8DD3x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y11E[] = {
  {&(_ZTVN3ccc8DD3x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y11E[];
static VTBL_ENTRY alt_thunk_names1410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x3y113pqrEv,_ZTv0_n16_N3ccc8DD3x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y113pqrEv,_ZThn4_N3ccc8DD3x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x3y113efgEv,_ZTv0_n12_N3ccc8DD3x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y113efgEv,_ZThn4_N3ccc8DD3x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x3y11E = {  "_ZN3ccc8DD3x3y11E", // class name
  bases__ZN3ccc8DD3x3y11E, 2,
  &(vtc__ZN3ccc8DD3x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1410,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y12  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC3x3y123abcEv
  ~CC3x3y12(); // tgen
  CC3x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x3y123abcEv");}
ccc::CC3x3y12 ::~CC3x3y12(){ note_dtor("_ZN3ccc8CC3x3y12E", this);} // tgen
ccc::CC3x3y12 ::CC3x3y12(){ note_ctor("_ZN3ccc8CC3x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y12E, buf);
    ::ccc::CC3x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y12E);
    dp->::ccc::CC3x3y12::~CC3x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y12E(Test__ZN3ccc8CC3x3y12E, "_ZN3ccc8CC3x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y12C1Ev();
extern void _ZN3ccc8CC3x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y12E[] = {
  NSPAIR(_ZN3ccc8CC3x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC3x3y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x3y123abcEv,_ZTv0_n20_N3ccc8CC3x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y123abcEv,_ZThn4_N3ccc8CC3x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x3y123abcEv,_ZTv0_n20_N3ccc8CC3x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y12E[] = {
  {&(_ZTVN3ccc8CC3x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y12E[];
static VTBL_ENTRY alt_thunk_names1411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x3y123abcEv,_ZTv0_n20_N3ccc8CC3x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y123abcEv,_ZThn4_N3ccc8CC3x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x3y12E = {  "_ZN3ccc8CC3x3y12E", // class name
  bases__ZN3ccc8CC3x3y12E, 2,
  &(vtc__ZN3ccc8CC3x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1411,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y12  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD3x3y123abcEv
  ~DD3x3y12(); // tgen
  DD3x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x3y123abcEv");}
ccc::DD3x3y12 ::~DD3x3y12(){ note_dtor("_ZN3ccc8DD3x3y12E", this);} // tgen
ccc::DD3x3y12 ::DD3x3y12(){ note_ctor("_ZN3ccc8DD3x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y12E, buf);
    ::ccc::DD3x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y12E);
    dp->::ccc::DD3x3y12::~DD3x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y12E(Test__ZN3ccc8DD3x3y12E, "_ZN3ccc8DD3x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y12C1Ev();
extern void _ZN3ccc8DD3x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y12E[] = {
  NSPAIR(_ZN3ccc8DD3x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x3y123abcEv,_ZTv0_n20_N3ccc8DD3x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y123abcEv,_ZThn4_N3ccc8DD3x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x3y123abcEv,_ZTv0_n20_N3ccc8DD3x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y12E[] = {
  {&(_ZTVN3ccc8DD3x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y12E[];
static VTBL_ENTRY alt_thunk_names1412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x3y123abcEv,_ZTv0_n20_N3ccc8DD3x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y123abcEv,_ZThn4_N3ccc8DD3x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x3y12E = {  "_ZN3ccc8DD3x3y12E", // class name
  bases__ZN3ccc8DD3x3y12E, 2,
  &(vtc__ZN3ccc8DD3x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1412,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y13  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC3x3y133efgEv
  ~CC3x3y13(); // tgen
  CC3x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x3y133efgEv");}
ccc::CC3x3y13 ::~CC3x3y13(){ note_dtor("_ZN3ccc8CC3x3y13E", this);} // tgen
ccc::CC3x3y13 ::CC3x3y13(){ note_ctor("_ZN3ccc8CC3x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y13E, buf);
    ::ccc::CC3x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y13E);
    dp->::ccc::CC3x3y13::~CC3x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y13E(Test__ZN3ccc8CC3x3y13E, "_ZN3ccc8CC3x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y13C1Ev();
extern void _ZN3ccc8CC3x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y13E[] = {
  NSPAIR(_ZN3ccc8CC3x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y13E[];
extern void _ZN3ccc8CC3x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x3y133efgEv,_ZTv0_n12_N3ccc8CC3x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y133efgEv,_ZThn4_N3ccc8CC3x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x3y133efgEv,_ZTv0_n12_N3ccc8CC3x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y13E[] = {
  {&(_ZTVN3ccc8CC3x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y13E[];
static VTBL_ENTRY alt_thunk_names1413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x3y133efgEv,_ZTv0_n12_N3ccc8CC3x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y133efgEv,_ZThn4_N3ccc8CC3x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x3y13E = {  "_ZN3ccc8CC3x3y13E", // class name
  bases__ZN3ccc8CC3x3y13E, 2,
  &(vtc__ZN3ccc8CC3x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1413,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y13  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD3x3y133efgEv
  ~DD3x3y13(); // tgen
  DD3x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x3y133efgEv");}
ccc::DD3x3y13 ::~DD3x3y13(){ note_dtor("_ZN3ccc8DD3x3y13E", this);} // tgen
ccc::DD3x3y13 ::DD3x3y13(){ note_ctor("_ZN3ccc8DD3x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y13E, buf);
    ::ccc::DD3x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y13E);
    dp->::ccc::DD3x3y13::~DD3x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y13E(Test__ZN3ccc8DD3x3y13E, "_ZN3ccc8DD3x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y13C1Ev();
extern void _ZN3ccc8DD3x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y13E[] = {
  NSPAIR(_ZN3ccc8DD3x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y13E[];
extern void _ZN3ccc8DD3x3y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x3y133efgEv,_ZTv0_n12_N3ccc8DD3x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y133efgEv,_ZThn4_N3ccc8DD3x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x3y133efgEv,_ZTv0_n12_N3ccc8DD3x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y13E[] = {
  {&(_ZTVN3ccc8DD3x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y13E[];
static VTBL_ENTRY alt_thunk_names1414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x3y133efgEv,_ZTv0_n12_N3ccc8DD3x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y133efgEv,_ZThn4_N3ccc8DD3x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x3y13E = {  "_ZN3ccc8DD3x3y13E", // class name
  bases__ZN3ccc8DD3x3y13E, 2,
  &(vtc__ZN3ccc8DD3x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1414,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y14  : virtual ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y143pqrEv
  ~CC3x3y14(); // tgen
  CC3x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y143pqrEv");}
ccc::CC3x3y14 ::~CC3x3y14(){ note_dtor("_ZN3ccc8CC3x3y14E", this);} // tgen
ccc::CC3x3y14 ::CC3x3y14(){ note_ctor("_ZN3ccc8CC3x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y14E, buf);
    ::ccc::CC3x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y14E);
    dp->::ccc::CC3x3y14::~CC3x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y14E(Test__ZN3ccc8CC3x3y14E, "_ZN3ccc8CC3x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y14C1Ev();
extern void _ZN3ccc8CC3x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y14E[] = {
  NSPAIR(_ZN3ccc8CC3x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC3x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x3y143pqrEv,_ZTv0_n16_N3ccc8CC3x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y143pqrEv,_ZThn4_N3ccc8CC3x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x3y143pqrEv,_ZTv0_n16_N3ccc8CC3x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y14E[] = {
  {&(_ZTVN3ccc8CC3x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y14E[];
static VTBL_ENTRY alt_thunk_names1415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x3y143pqrEv,_ZTv0_n16_N3ccc8CC3x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x3y143pqrEv,_ZThn4_N3ccc8CC3x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x3y14E = {  "_ZN3ccc8CC3x3y14E", // class name
  bases__ZN3ccc8CC3x3y14E, 2,
  &(vtc__ZN3ccc8CC3x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1415,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y14  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD3x3y143pqrEv
  ~DD3x3y14(); // tgen
  DD3x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x3y143pqrEv");}
ccc::DD3x3y14 ::~DD3x3y14(){ note_dtor("_ZN3ccc8DD3x3y14E", this);} // tgen
ccc::DD3x3y14 ::DD3x3y14(){ note_ctor("_ZN3ccc8DD3x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y14E, buf);
    ::ccc::DD3x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y14E);
    dp->::ccc::DD3x3y14::~DD3x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y14E(Test__ZN3ccc8DD3x3y14E, "_ZN3ccc8DD3x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y14C1Ev();
extern void _ZN3ccc8DD3x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y14E[] = {
  NSPAIR(_ZN3ccc8DD3x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x3y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x3y143pqrEv,_ZTv0_n16_N3ccc8DD3x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x3y143pqrEv,_ZThn4_N3ccc8DD3x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x3y143pqrEv,_ZTv0_n16_N3ccc8DD3x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y14E[] = {
  {&(_ZTVN3ccc8DD3x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y14E[];
static VTBL_ENTRY alt_thunk_names1416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x3y143pqrEv,_ZTv0_n16_N3ccc8DD3x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x3y143pqrEv,_ZThn4_N3ccc8DD3x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x3y14E = {  "_ZN3ccc8DD3x3y14E", // class name
  bases__ZN3ccc8DD3x3y14E, 2,
  &(vtc__ZN3ccc8DD3x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1416,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y15  : virtual ::ccc::AA3 , ::ccc::BB3 {
  ~CC3x3y15(); // tgen
  CC3x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x3y15 ::~CC3x3y15(){ note_dtor("_ZN3ccc8CC3x3y15E", this);} // tgen
ccc::CC3x3y15 ::CC3x3y15(){ note_ctor("_ZN3ccc8CC3x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y15E, buf);
    ::ccc::CC3x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC3x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y15E);
    dp->::ccc::CC3x3y15::~CC3x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y15E(Test__ZN3ccc8CC3x3y15E, "_ZN3ccc8CC3x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y15C1Ev();
extern void _ZN3ccc8CC3x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y15E[] = {
  NSPAIR(_ZN3ccc8CC3x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x3y15E[] = {
  {&(_ZTVN3ccc8CC3x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x3y15E[];
Class_Descriptor cd__ZN3ccc8CC3x3y15E = {  "_ZN3ccc8CC3x3y15E", // class name
  bases__ZN3ccc8CC3x3y15E, 2,
  &(vtc__ZN3ccc8CC3x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x3y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x3y15  : virtual ::ccc::AA3 , virtual ::ccc::BB3 {
  ~DD3x3y15(); // tgen
  DD3x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x3y15 ::~DD3x3y15(){ note_dtor("_ZN3ccc8DD3x3y15E", this);} // tgen
ccc::DD3x3y15 ::DD3x3y15(){ note_ctor("_ZN3ccc8DD3x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x3y15E, buf);
    ::ccc::DD3x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x3y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD3x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x3y15E);
    dp->::ccc::DD3x3y15::~DD3x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x3y15E(Test__ZN3ccc8DD3x3y15E, "_ZN3ccc8DD3x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x3y15C1Ev();
extern void _ZN3ccc8DD3x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x3y15E[] = {
  NSPAIR(_ZN3ccc8DD3x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD3x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x3y15E[] = {
  {&(_ZTVN3ccc8DD3x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x3y15E[];
Class_Descriptor cd__ZN3ccc8DD3x3y15E = {  "_ZN3ccc8DD3x3y15E", // class name
  bases__ZN3ccc8DD3x3y15E, 2,
  &(vtc__ZN3ccc8DD3x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x3y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y0  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y03pqrEv
  ~CC3x4y0(); // tgen
  CC3x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y0E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y03abcEv");}
void  ccc::CC3x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y03efgEv");}
void  ccc::CC3x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y03pqrEv");}
ccc::CC3x4y0 ::~CC3x4y0(){ note_dtor("_ZN3ccc7CC3x4y0E", this);} // tgen
ccc::CC3x4y0 ::CC3x4y0(){ note_ctor("_ZN3ccc7CC3x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y0E, buf);
    ::ccc::CC3x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y0E);
    dp->::ccc::CC3x4y0::~CC3x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y0E(Test__ZN3ccc7CC3x4y0E, "_ZN3ccc7CC3x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y0C1Ev();
extern void _ZN3ccc7CC3x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y0E[] = {
  NSPAIR(_ZN3ccc7CC3x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y0E[];
extern void _ZN3ccc7CC3x4y03pqrEv();
extern void _ZN3ccc7CC3x4y03abcEv();
extern void _ZN3ccc7CC3x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y03efgEv,_ZTv0_n12_N3ccc7CC3x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03efgEv,_ZThn4_N3ccc7CC3x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y03pqrEv,_ZTv0_n16_N3ccc7CC3x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03pqrEv,_ZThn4_N3ccc7CC3x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y03abcEv,_ZTv0_n20_N3ccc7CC3x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03abcEv,_ZThn4_N3ccc7CC3x4y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y03efgEv,_ZTv0_n12_N3ccc7CC3x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y03pqrEv,_ZTv0_n16_N3ccc7CC3x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y03abcEv,_ZTv0_n20_N3ccc7CC3x4y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y0E[] = {
  {&(_ZTVN3ccc7CC3x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y0E[];
static VTBL_ENTRY alt_thunk_names1417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y03abcEv,_ZTv0_n20_N3ccc7CC3x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y03abcEv,_ZThn4_N3ccc7CC3x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y03pqrEv,_ZTv0_n16_N3ccc7CC3x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y03pqrEv,_ZThn4_N3ccc7CC3x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y03efgEv,_ZTv0_n12_N3ccc7CC3x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y03efgEv,_ZThn4_N3ccc7CC3x4y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y0E = {  "_ZN3ccc7CC3x4y0E", // class name
  bases__ZN3ccc7CC3x4y0E, 2,
  &(vtc__ZN3ccc7CC3x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1417,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y0  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD3x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y03pqrEv
  ~DD3x4y0(); // tgen
  DD3x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y03abcEv");}
void  ccc::DD3x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y03efgEv");}
void  ccc::DD3x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y03pqrEv");}
ccc::DD3x4y0 ::~DD3x4y0(){ note_dtor("_ZN3ccc7DD3x4y0E", this);} // tgen
ccc::DD3x4y0 ::DD3x4y0(){ note_ctor("_ZN3ccc7DD3x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y0E, buf);
    ::ccc::DD3x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y0E);
    dp->::ccc::DD3x4y0::~DD3x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y0E(Test__ZN3ccc7DD3x4y0E, "_ZN3ccc7DD3x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y0C1Ev();
extern void _ZN3ccc7DD3x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y0E[] = {
  NSPAIR(_ZN3ccc7DD3x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y0E[];
extern void _ZN3ccc7DD3x4y03efgEv();
extern void _ZN3ccc7DD3x4y03pqrEv();
extern void _ZN3ccc7DD3x4y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y03pqrEv,_ZTv0_n12_N3ccc7DD3x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y03pqrEv,_ZThn4_N3ccc7DD3x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y03abcEv,_ZTv0_n16_N3ccc7DD3x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y03abcEv,_ZThn4_N3ccc7DD3x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y03efgEv,_ZTv0_n20_N3ccc7DD3x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y03efgEv,_ZThn4_N3ccc7DD3x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y03pqrEv,_ZTv0_n12_N3ccc7DD3x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y03abcEv,_ZTv0_n16_N3ccc7DD3x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y03efgEv,_ZTv0_n20_N3ccc7DD3x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y0E[] = {
  {&(_ZTVN3ccc7DD3x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y0E[];
static VTBL_ENTRY alt_thunk_names1418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y03efgEv,_ZTv0_n20_N3ccc7DD3x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y03efgEv,_ZThn4_N3ccc7DD3x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y03abcEv,_ZTv0_n16_N3ccc7DD3x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y03abcEv,_ZThn4_N3ccc7DD3x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y03pqrEv,_ZTv0_n12_N3ccc7DD3x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y03pqrEv,_ZThn4_N3ccc7DD3x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y0E = {  "_ZN3ccc7DD3x4y0E", // class name
  bases__ZN3ccc7DD3x4y0E, 2,
  &(vtc__ZN3ccc7DD3x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1418,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y1  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x4y13efgEv
  ~CC3x4y1(); // tgen
  CC3x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y1E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y13abcEv");}
void  ccc::CC3x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y13pqrEv");}
void  ccc::CC3x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y13efgEv");}
ccc::CC3x4y1 ::~CC3x4y1(){ note_dtor("_ZN3ccc7CC3x4y1E", this);} // tgen
ccc::CC3x4y1 ::CC3x4y1(){ note_ctor("_ZN3ccc7CC3x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y1E, buf);
    ::ccc::CC3x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y1E);
    dp->::ccc::CC3x4y1::~CC3x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y1E(Test__ZN3ccc7CC3x4y1E, "_ZN3ccc7CC3x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y1C1Ev();
extern void _ZN3ccc7CC3x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y1E[] = {
  NSPAIR(_ZN3ccc7CC3x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y1E[];
extern void _ZN3ccc7CC3x4y13pqrEv();
extern void _ZN3ccc7CC3x4y13abcEv();
extern void _ZN3ccc7CC3x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y13efgEv,_ZTv0_n12_N3ccc7CC3x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13efgEv,_ZThn4_N3ccc7CC3x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y13pqrEv,_ZTv0_n16_N3ccc7CC3x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13pqrEv,_ZThn4_N3ccc7CC3x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y13abcEv,_ZTv0_n20_N3ccc7CC3x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13abcEv,_ZThn4_N3ccc7CC3x4y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y13efgEv,_ZTv0_n12_N3ccc7CC3x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y13pqrEv,_ZTv0_n16_N3ccc7CC3x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y13abcEv,_ZTv0_n20_N3ccc7CC3x4y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y1E[] = {
  {&(_ZTVN3ccc7CC3x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y1E[];
static VTBL_ENTRY alt_thunk_names1419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y13abcEv,_ZTv0_n20_N3ccc7CC3x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y13abcEv,_ZThn4_N3ccc7CC3x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y13pqrEv,_ZTv0_n16_N3ccc7CC3x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y13pqrEv,_ZThn4_N3ccc7CC3x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y13efgEv,_ZTv0_n12_N3ccc7CC3x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y13efgEv,_ZThn4_N3ccc7CC3x4y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y1E = {  "_ZN3ccc7CC3x4y1E", // class name
  bases__ZN3ccc7CC3x4y1E, 2,
  &(vtc__ZN3ccc7CC3x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1419,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y1  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD3x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x4y13efgEv
  ~DD3x4y1(); // tgen
  DD3x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y13abcEv");}
void  ccc::DD3x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y13pqrEv");}
void  ccc::DD3x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y13efgEv");}
ccc::DD3x4y1 ::~DD3x4y1(){ note_dtor("_ZN3ccc7DD3x4y1E", this);} // tgen
ccc::DD3x4y1 ::DD3x4y1(){ note_ctor("_ZN3ccc7DD3x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y1E, buf);
    ::ccc::DD3x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y1E);
    dp->::ccc::DD3x4y1::~DD3x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y1E(Test__ZN3ccc7DD3x4y1E, "_ZN3ccc7DD3x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y1C1Ev();
extern void _ZN3ccc7DD3x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y1E[] = {
  NSPAIR(_ZN3ccc7DD3x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y1E[];
extern void _ZN3ccc7DD3x4y13efgEv();
extern void _ZN3ccc7DD3x4y13pqrEv();
extern void _ZN3ccc7DD3x4y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y13pqrEv,_ZTv0_n12_N3ccc7DD3x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y13pqrEv,_ZThn4_N3ccc7DD3x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y13abcEv,_ZTv0_n16_N3ccc7DD3x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y13abcEv,_ZThn4_N3ccc7DD3x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y13efgEv,_ZTv0_n20_N3ccc7DD3x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y13efgEv,_ZThn4_N3ccc7DD3x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y13pqrEv,_ZTv0_n12_N3ccc7DD3x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y13abcEv,_ZTv0_n16_N3ccc7DD3x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y13efgEv,_ZTv0_n20_N3ccc7DD3x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y1E[] = {
  {&(_ZTVN3ccc7DD3x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y1E[];
static VTBL_ENTRY alt_thunk_names1420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y13efgEv,_ZTv0_n20_N3ccc7DD3x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y13efgEv,_ZThn4_N3ccc7DD3x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y13abcEv,_ZTv0_n16_N3ccc7DD3x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y13abcEv,_ZThn4_N3ccc7DD3x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y13pqrEv,_ZTv0_n12_N3ccc7DD3x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y13pqrEv,_ZThn4_N3ccc7DD3x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y1E = {  "_ZN3ccc7DD3x4y1E", // class name
  bases__ZN3ccc7DD3x4y1E, 2,
  &(vtc__ZN3ccc7DD3x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1420,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y2  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y23pqrEv
  ~CC3x4y2(); // tgen
  CC3x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y2E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y23efgEv");}
void  ccc::CC3x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y23abcEv");}
void  ccc::CC3x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y23pqrEv");}
ccc::CC3x4y2 ::~CC3x4y2(){ note_dtor("_ZN3ccc7CC3x4y2E", this);} // tgen
ccc::CC3x4y2 ::CC3x4y2(){ note_ctor("_ZN3ccc7CC3x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y2E, buf);
    ::ccc::CC3x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y2E);
    dp->::ccc::CC3x4y2::~CC3x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y2E(Test__ZN3ccc7CC3x4y2E, "_ZN3ccc7CC3x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y2C1Ev();
extern void _ZN3ccc7CC3x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y2E[] = {
  NSPAIR(_ZN3ccc7CC3x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y2E[];
extern void _ZN3ccc7CC3x4y23pqrEv();
extern void _ZN3ccc7CC3x4y23abcEv();
extern void _ZN3ccc7CC3x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y23efgEv,_ZTv0_n12_N3ccc7CC3x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23efgEv,_ZThn4_N3ccc7CC3x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y23pqrEv,_ZTv0_n16_N3ccc7CC3x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23pqrEv,_ZThn4_N3ccc7CC3x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y23abcEv,_ZTv0_n20_N3ccc7CC3x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23abcEv,_ZThn4_N3ccc7CC3x4y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y23efgEv,_ZTv0_n12_N3ccc7CC3x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y23pqrEv,_ZTv0_n16_N3ccc7CC3x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y23abcEv,_ZTv0_n20_N3ccc7CC3x4y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y2E[] = {
  {&(_ZTVN3ccc7CC3x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y2E[];
static VTBL_ENTRY alt_thunk_names1421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y23abcEv,_ZTv0_n20_N3ccc7CC3x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y23abcEv,_ZThn4_N3ccc7CC3x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y23pqrEv,_ZTv0_n16_N3ccc7CC3x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y23pqrEv,_ZThn4_N3ccc7CC3x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y23efgEv,_ZTv0_n12_N3ccc7CC3x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y23efgEv,_ZThn4_N3ccc7CC3x4y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y2E = {  "_ZN3ccc7CC3x4y2E", // class name
  bases__ZN3ccc7CC3x4y2E, 2,
  &(vtc__ZN3ccc7CC3x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1421,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y2  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD3x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y23pqrEv
  ~DD3x4y2(); // tgen
  DD3x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y23efgEv");}
void  ccc::DD3x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y23abcEv");}
void  ccc::DD3x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y23pqrEv");}
ccc::DD3x4y2 ::~DD3x4y2(){ note_dtor("_ZN3ccc7DD3x4y2E", this);} // tgen
ccc::DD3x4y2 ::DD3x4y2(){ note_ctor("_ZN3ccc7DD3x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y2E, buf);
    ::ccc::DD3x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y2E);
    dp->::ccc::DD3x4y2::~DD3x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y2E(Test__ZN3ccc7DD3x4y2E, "_ZN3ccc7DD3x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y2C1Ev();
extern void _ZN3ccc7DD3x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y2E[] = {
  NSPAIR(_ZN3ccc7DD3x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y2E[];
extern void _ZN3ccc7DD3x4y23efgEv();
extern void _ZN3ccc7DD3x4y23pqrEv();
extern void _ZN3ccc7DD3x4y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y23pqrEv,_ZTv0_n12_N3ccc7DD3x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y23pqrEv,_ZThn4_N3ccc7DD3x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y23abcEv,_ZTv0_n16_N3ccc7DD3x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y23abcEv,_ZThn4_N3ccc7DD3x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y23efgEv,_ZTv0_n20_N3ccc7DD3x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y23efgEv,_ZThn4_N3ccc7DD3x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y23pqrEv,_ZTv0_n12_N3ccc7DD3x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y23abcEv,_ZTv0_n16_N3ccc7DD3x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y23efgEv,_ZTv0_n20_N3ccc7DD3x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y2E[] = {
  {&(_ZTVN3ccc7DD3x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y2E[];
static VTBL_ENTRY alt_thunk_names1422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y23efgEv,_ZTv0_n20_N3ccc7DD3x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y23efgEv,_ZThn4_N3ccc7DD3x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y23abcEv,_ZTv0_n16_N3ccc7DD3x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y23abcEv,_ZThn4_N3ccc7DD3x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y23pqrEv,_ZTv0_n12_N3ccc7DD3x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y23pqrEv,_ZThn4_N3ccc7DD3x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y2E = {  "_ZN3ccc7DD3x4y2E", // class name
  bases__ZN3ccc7DD3x4y2E, 2,
  &(vtc__ZN3ccc7DD3x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1422,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y3  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x4y33abcEv
  ~CC3x4y3(); // tgen
  CC3x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y3E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y33efgEv");}
void  ccc::CC3x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y33pqrEv");}
void  ccc::CC3x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y33abcEv");}
ccc::CC3x4y3 ::~CC3x4y3(){ note_dtor("_ZN3ccc7CC3x4y3E", this);} // tgen
ccc::CC3x4y3 ::CC3x4y3(){ note_ctor("_ZN3ccc7CC3x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y3E, buf);
    ::ccc::CC3x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y3E);
    dp->::ccc::CC3x4y3::~CC3x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y3E(Test__ZN3ccc7CC3x4y3E, "_ZN3ccc7CC3x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y3C1Ev();
extern void _ZN3ccc7CC3x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y3E[] = {
  NSPAIR(_ZN3ccc7CC3x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y3E[];
extern void _ZN3ccc7CC3x4y33pqrEv();
extern void _ZN3ccc7CC3x4y33abcEv();
extern void _ZN3ccc7CC3x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y33efgEv,_ZTv0_n12_N3ccc7CC3x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33efgEv,_ZThn4_N3ccc7CC3x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y33pqrEv,_ZTv0_n16_N3ccc7CC3x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33pqrEv,_ZThn4_N3ccc7CC3x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y33abcEv,_ZTv0_n20_N3ccc7CC3x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33abcEv,_ZThn4_N3ccc7CC3x4y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y33efgEv,_ZTv0_n12_N3ccc7CC3x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y33pqrEv,_ZTv0_n16_N3ccc7CC3x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y33abcEv,_ZTv0_n20_N3ccc7CC3x4y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y3E[] = {
  {&(_ZTVN3ccc7CC3x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y3E[];
static VTBL_ENTRY alt_thunk_names1423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y33abcEv,_ZTv0_n20_N3ccc7CC3x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y33abcEv,_ZThn4_N3ccc7CC3x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y33pqrEv,_ZTv0_n16_N3ccc7CC3x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y33pqrEv,_ZThn4_N3ccc7CC3x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y33efgEv,_ZTv0_n12_N3ccc7CC3x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y33efgEv,_ZThn4_N3ccc7CC3x4y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y3E = {  "_ZN3ccc7CC3x4y3E", // class name
  bases__ZN3ccc7CC3x4y3E, 2,
  &(vtc__ZN3ccc7CC3x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1423,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y3  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD3x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x4y33abcEv
  ~DD3x4y3(); // tgen
  DD3x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y33efgEv");}
void  ccc::DD3x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y33pqrEv");}
void  ccc::DD3x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y33abcEv");}
ccc::DD3x4y3 ::~DD3x4y3(){ note_dtor("_ZN3ccc7DD3x4y3E", this);} // tgen
ccc::DD3x4y3 ::DD3x4y3(){ note_ctor("_ZN3ccc7DD3x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y3E, buf);
    ::ccc::DD3x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y3E);
    dp->::ccc::DD3x4y3::~DD3x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y3E(Test__ZN3ccc7DD3x4y3E, "_ZN3ccc7DD3x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y3C1Ev();
extern void _ZN3ccc7DD3x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y3E[] = {
  NSPAIR(_ZN3ccc7DD3x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y3E[];
extern void _ZN3ccc7DD3x4y33efgEv();
extern void _ZN3ccc7DD3x4y33pqrEv();
extern void _ZN3ccc7DD3x4y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y33pqrEv,_ZTv0_n12_N3ccc7DD3x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y33pqrEv,_ZThn4_N3ccc7DD3x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y33abcEv,_ZTv0_n16_N3ccc7DD3x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y33abcEv,_ZThn4_N3ccc7DD3x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y33efgEv,_ZTv0_n20_N3ccc7DD3x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y33efgEv,_ZThn4_N3ccc7DD3x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y33pqrEv,_ZTv0_n12_N3ccc7DD3x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y33abcEv,_ZTv0_n16_N3ccc7DD3x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y33efgEv,_ZTv0_n20_N3ccc7DD3x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y3E[] = {
  {&(_ZTVN3ccc7DD3x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y3E[];
static VTBL_ENTRY alt_thunk_names1424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y33efgEv,_ZTv0_n20_N3ccc7DD3x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y33efgEv,_ZThn4_N3ccc7DD3x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y33abcEv,_ZTv0_n16_N3ccc7DD3x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y33abcEv,_ZThn4_N3ccc7DD3x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y33pqrEv,_ZTv0_n12_N3ccc7DD3x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y33pqrEv,_ZThn4_N3ccc7DD3x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y3E = {  "_ZN3ccc7DD3x4y3E", // class name
  bases__ZN3ccc7DD3x4y3E, 2,
  &(vtc__ZN3ccc7DD3x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1424,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y4  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC3x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y43efgEv
  ~CC3x4y4(); // tgen
  CC3x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y4E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y43pqrEv");}
void  ccc::CC3x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y43abcEv");}
void  ccc::CC3x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y43efgEv");}
ccc::CC3x4y4 ::~CC3x4y4(){ note_dtor("_ZN3ccc7CC3x4y4E", this);} // tgen
ccc::CC3x4y4 ::CC3x4y4(){ note_ctor("_ZN3ccc7CC3x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y4E, buf);
    ::ccc::CC3x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y4E);
    dp->::ccc::CC3x4y4::~CC3x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y4E(Test__ZN3ccc7CC3x4y4E, "_ZN3ccc7CC3x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y4C1Ev();
extern void _ZN3ccc7CC3x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y4E[] = {
  NSPAIR(_ZN3ccc7CC3x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y4E[];
extern void _ZN3ccc7CC3x4y43pqrEv();
extern void _ZN3ccc7CC3x4y43abcEv();
extern void _ZN3ccc7CC3x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y43efgEv,_ZTv0_n12_N3ccc7CC3x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43efgEv,_ZThn4_N3ccc7CC3x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y43pqrEv,_ZTv0_n16_N3ccc7CC3x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43pqrEv,_ZThn4_N3ccc7CC3x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y43abcEv,_ZTv0_n20_N3ccc7CC3x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43abcEv,_ZThn4_N3ccc7CC3x4y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y43efgEv,_ZTv0_n12_N3ccc7CC3x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y43pqrEv,_ZTv0_n16_N3ccc7CC3x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y43abcEv,_ZTv0_n20_N3ccc7CC3x4y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y4E[] = {
  {&(_ZTVN3ccc7CC3x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y4E[];
static VTBL_ENTRY alt_thunk_names1425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y43abcEv,_ZTv0_n20_N3ccc7CC3x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y43abcEv,_ZThn4_N3ccc7CC3x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y43pqrEv,_ZTv0_n16_N3ccc7CC3x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y43pqrEv,_ZThn4_N3ccc7CC3x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y43efgEv,_ZTv0_n12_N3ccc7CC3x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y43efgEv,_ZThn4_N3ccc7CC3x4y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y4E = {  "_ZN3ccc7CC3x4y4E", // class name
  bases__ZN3ccc7CC3x4y4E, 2,
  &(vtc__ZN3ccc7CC3x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1425,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y4  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD3x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x4y43efgEv
  ~DD3x4y4(); // tgen
  DD3x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y43pqrEv");}
void  ccc::DD3x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y43abcEv");}
void  ccc::DD3x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y43efgEv");}
ccc::DD3x4y4 ::~DD3x4y4(){ note_dtor("_ZN3ccc7DD3x4y4E", this);} // tgen
ccc::DD3x4y4 ::DD3x4y4(){ note_ctor("_ZN3ccc7DD3x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y4E, buf);
    ::ccc::DD3x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y4E);
    dp->::ccc::DD3x4y4::~DD3x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y4E(Test__ZN3ccc7DD3x4y4E, "_ZN3ccc7DD3x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y4C1Ev();
extern void _ZN3ccc7DD3x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y4E[] = {
  NSPAIR(_ZN3ccc7DD3x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y4E[];
extern void _ZN3ccc7DD3x4y43efgEv();
extern void _ZN3ccc7DD3x4y43pqrEv();
extern void _ZN3ccc7DD3x4y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y43pqrEv,_ZTv0_n12_N3ccc7DD3x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y43pqrEv,_ZThn4_N3ccc7DD3x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y43abcEv,_ZTv0_n16_N3ccc7DD3x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y43abcEv,_ZThn4_N3ccc7DD3x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y43efgEv,_ZTv0_n20_N3ccc7DD3x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y43efgEv,_ZThn4_N3ccc7DD3x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y43pqrEv,_ZTv0_n12_N3ccc7DD3x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y43abcEv,_ZTv0_n16_N3ccc7DD3x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y43efgEv,_ZTv0_n20_N3ccc7DD3x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y4E[] = {
  {&(_ZTVN3ccc7DD3x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y4E[];
static VTBL_ENTRY alt_thunk_names1426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y43efgEv,_ZTv0_n20_N3ccc7DD3x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y43efgEv,_ZThn4_N3ccc7DD3x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y43abcEv,_ZTv0_n16_N3ccc7DD3x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y43abcEv,_ZThn4_N3ccc7DD3x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y43pqrEv,_ZTv0_n12_N3ccc7DD3x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y43pqrEv,_ZThn4_N3ccc7DD3x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y4E = {  "_ZN3ccc7DD3x4y4E", // class name
  bases__ZN3ccc7DD3x4y4E, 2,
  &(vtc__ZN3ccc7DD3x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1426,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y5  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC3x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y53abcEv
  ~CC3x4y5(); // tgen
  CC3x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y5E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y53pqrEv");}
void  ccc::CC3x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y53efgEv");}
void  ccc::CC3x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y53abcEv");}
ccc::CC3x4y5 ::~CC3x4y5(){ note_dtor("_ZN3ccc7CC3x4y5E", this);} // tgen
ccc::CC3x4y5 ::CC3x4y5(){ note_ctor("_ZN3ccc7CC3x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y5E, buf);
    ::ccc::CC3x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y5E);
    dp->::ccc::CC3x4y5::~CC3x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y5E(Test__ZN3ccc7CC3x4y5E, "_ZN3ccc7CC3x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y5C1Ev();
extern void _ZN3ccc7CC3x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y5E[] = {
  NSPAIR(_ZN3ccc7CC3x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y5E[];
extern void _ZN3ccc7CC3x4y53pqrEv();
extern void _ZN3ccc7CC3x4y53abcEv();
extern void _ZN3ccc7CC3x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y53efgEv,_ZTv0_n12_N3ccc7CC3x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53efgEv,_ZThn4_N3ccc7CC3x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y53pqrEv,_ZTv0_n16_N3ccc7CC3x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53pqrEv,_ZThn4_N3ccc7CC3x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y53abcEv,_ZTv0_n20_N3ccc7CC3x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53abcEv,_ZThn4_N3ccc7CC3x4y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y53efgEv,_ZTv0_n12_N3ccc7CC3x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y53pqrEv,_ZTv0_n16_N3ccc7CC3x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y53abcEv,_ZTv0_n20_N3ccc7CC3x4y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y5E[] = {
  {&(_ZTVN3ccc7CC3x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y5E[];
static VTBL_ENTRY alt_thunk_names1427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y53abcEv,_ZTv0_n20_N3ccc7CC3x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y53abcEv,_ZThn4_N3ccc7CC3x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y53pqrEv,_ZTv0_n16_N3ccc7CC3x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y53pqrEv,_ZThn4_N3ccc7CC3x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y53efgEv,_ZTv0_n12_N3ccc7CC3x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y53efgEv,_ZThn4_N3ccc7CC3x4y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y5E = {  "_ZN3ccc7CC3x4y5E", // class name
  bases__ZN3ccc7CC3x4y5E, 2,
  &(vtc__ZN3ccc7CC3x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1427,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y5  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD3x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x4y53abcEv
  ~DD3x4y5(); // tgen
  DD3x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y53pqrEv");}
void  ccc::DD3x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y53efgEv");}
void  ccc::DD3x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y53abcEv");}
ccc::DD3x4y5 ::~DD3x4y5(){ note_dtor("_ZN3ccc7DD3x4y5E", this);} // tgen
ccc::DD3x4y5 ::DD3x4y5(){ note_ctor("_ZN3ccc7DD3x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y5E, buf);
    ::ccc::DD3x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y5E);
    dp->::ccc::DD3x4y5::~DD3x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y5E(Test__ZN3ccc7DD3x4y5E, "_ZN3ccc7DD3x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y5C1Ev();
extern void _ZN3ccc7DD3x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y5E[] = {
  NSPAIR(_ZN3ccc7DD3x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y5E[];
extern void _ZN3ccc7DD3x4y53efgEv();
extern void _ZN3ccc7DD3x4y53pqrEv();
extern void _ZN3ccc7DD3x4y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y53pqrEv,_ZTv0_n12_N3ccc7DD3x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y53pqrEv,_ZThn4_N3ccc7DD3x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y53abcEv,_ZTv0_n16_N3ccc7DD3x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y53abcEv,_ZThn4_N3ccc7DD3x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y53efgEv,_ZTv0_n20_N3ccc7DD3x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y53efgEv,_ZThn4_N3ccc7DD3x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y53pqrEv,_ZTv0_n12_N3ccc7DD3x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y53abcEv,_ZTv0_n16_N3ccc7DD3x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y53efgEv,_ZTv0_n20_N3ccc7DD3x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y5E[] = {
  {&(_ZTVN3ccc7DD3x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y5E[];
static VTBL_ENTRY alt_thunk_names1428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y53efgEv,_ZTv0_n20_N3ccc7DD3x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y53efgEv,_ZThn4_N3ccc7DD3x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y53abcEv,_ZTv0_n16_N3ccc7DD3x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y53abcEv,_ZThn4_N3ccc7DD3x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y53pqrEv,_ZTv0_n12_N3ccc7DD3x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y53pqrEv,_ZThn4_N3ccc7DD3x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y5E = {  "_ZN3ccc7DD3x4y5E", // class name
  bases__ZN3ccc7DD3x4y5E, 2,
  &(vtc__ZN3ccc7DD3x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1428,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y6  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y63efgEv
  ~CC3x4y6(); // tgen
  CC3x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y6E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y63abcEv");}
void  ccc::CC3x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y63efgEv");}
ccc::CC3x4y6 ::~CC3x4y6(){ note_dtor("_ZN3ccc7CC3x4y6E", this);} // tgen
ccc::CC3x4y6 ::CC3x4y6(){ note_ctor("_ZN3ccc7CC3x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y6E, buf);
    ::ccc::CC3x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y6E);
    dp->::ccc::CC3x4y6::~CC3x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y6E(Test__ZN3ccc7CC3x4y6E, "_ZN3ccc7CC3x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y6C1Ev();
extern void _ZN3ccc7CC3x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y6E[] = {
  NSPAIR(_ZN3ccc7CC3x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC3x4y63abcEv();
extern void _ZN3ccc7CC3x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y63efgEv,_ZTv0_n12_N3ccc7CC3x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y63efgEv,_ZThn4_N3ccc7CC3x4y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y63abcEv,_ZTv0_n20_N3ccc7CC3x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y63abcEv,_ZThn4_N3ccc7CC3x4y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y63efgEv,_ZTv0_n12_N3ccc7CC3x4y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y63abcEv,_ZTv0_n20_N3ccc7CC3x4y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y6E[] = {
  {&(_ZTVN3ccc7CC3x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y6E[];
static VTBL_ENTRY alt_thunk_names1429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y63abcEv,_ZTv0_n20_N3ccc7CC3x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y63abcEv,_ZThn4_N3ccc7CC3x4y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y63efgEv,_ZTv0_n12_N3ccc7CC3x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y63efgEv,_ZThn4_N3ccc7CC3x4y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y6E = {  "_ZN3ccc7CC3x4y6E", // class name
  bases__ZN3ccc7CC3x4y6E, 2,
  &(vtc__ZN3ccc7CC3x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1429,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y6  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD3x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x4y63efgEv
  ~DD3x4y6(); // tgen
  DD3x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y63abcEv");}
void  ccc::DD3x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y63efgEv");}
ccc::DD3x4y6 ::~DD3x4y6(){ note_dtor("_ZN3ccc7DD3x4y6E", this);} // tgen
ccc::DD3x4y6 ::DD3x4y6(){ note_ctor("_ZN3ccc7DD3x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y6E, buf);
    ::ccc::DD3x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y6E);
    dp->::ccc::DD3x4y6::~DD3x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y6E(Test__ZN3ccc7DD3x4y6E, "_ZN3ccc7DD3x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y6C1Ev();
extern void _ZN3ccc7DD3x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y6E[] = {
  NSPAIR(_ZN3ccc7DD3x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y6E[];
extern void _ZN3ccc7DD3x4y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y63abcEv,_ZTv0_n16_N3ccc7DD3x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y63abcEv,_ZThn4_N3ccc7DD3x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y63efgEv,_ZTv0_n20_N3ccc7DD3x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y63efgEv,_ZThn4_N3ccc7DD3x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y63abcEv,_ZTv0_n16_N3ccc7DD3x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y63efgEv,_ZTv0_n20_N3ccc7DD3x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y6E[] = {
  {&(_ZTVN3ccc7DD3x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y6E[];
static VTBL_ENTRY alt_thunk_names1430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y63efgEv,_ZTv0_n20_N3ccc7DD3x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y63efgEv,_ZThn4_N3ccc7DD3x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y63abcEv,_ZTv0_n16_N3ccc7DD3x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y63abcEv,_ZThn4_N3ccc7DD3x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y6E = {  "_ZN3ccc7DD3x4y6E", // class name
  bases__ZN3ccc7DD3x4y6E, 2,
  &(vtc__ZN3ccc7DD3x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1430,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y7  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y73pqrEv
  ~CC3x4y7(); // tgen
  CC3x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y7E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y73abcEv");}
void  ccc::CC3x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y73pqrEv");}
ccc::CC3x4y7 ::~CC3x4y7(){ note_dtor("_ZN3ccc7CC3x4y7E", this);} // tgen
ccc::CC3x4y7 ::CC3x4y7(){ note_ctor("_ZN3ccc7CC3x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y7E, buf);
    ::ccc::CC3x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y7E);
    dp->::ccc::CC3x4y7::~CC3x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y7E(Test__ZN3ccc7CC3x4y7E, "_ZN3ccc7CC3x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y7C1Ev();
extern void _ZN3ccc7CC3x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y7E[] = {
  NSPAIR(_ZN3ccc7CC3x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y7E[];
extern void _ZN3ccc7CC3x4y73pqrEv();
extern void _ZN3ccc7CC3x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y73pqrEv,_ZTv0_n16_N3ccc7CC3x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y73pqrEv,_ZThn4_N3ccc7CC3x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y73abcEv,_ZTv0_n20_N3ccc7CC3x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y73abcEv,_ZThn4_N3ccc7CC3x4y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y73pqrEv,_ZTv0_n16_N3ccc7CC3x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y73abcEv,_ZTv0_n20_N3ccc7CC3x4y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y7E[] = {
  {&(_ZTVN3ccc7CC3x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y7E[];
static VTBL_ENTRY alt_thunk_names1431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y73abcEv,_ZTv0_n20_N3ccc7CC3x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y73abcEv,_ZThn4_N3ccc7CC3x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y73pqrEv,_ZTv0_n16_N3ccc7CC3x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y73pqrEv,_ZThn4_N3ccc7CC3x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y7E = {  "_ZN3ccc7CC3x4y7E", // class name
  bases__ZN3ccc7CC3x4y7E, 2,
  &(vtc__ZN3ccc7CC3x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1431,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y7  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD3x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y73pqrEv
  ~DD3x4y7(); // tgen
  DD3x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y73abcEv");}
void  ccc::DD3x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y73pqrEv");}
ccc::DD3x4y7 ::~DD3x4y7(){ note_dtor("_ZN3ccc7DD3x4y7E", this);} // tgen
ccc::DD3x4y7 ::DD3x4y7(){ note_ctor("_ZN3ccc7DD3x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y7E, buf);
    ::ccc::DD3x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y7E);
    dp->::ccc::DD3x4y7::~DD3x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y7E(Test__ZN3ccc7DD3x4y7E, "_ZN3ccc7DD3x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y7C1Ev();
extern void _ZN3ccc7DD3x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y7E[] = {
  NSPAIR(_ZN3ccc7DD3x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x4y73pqrEv();
extern void _ZN3ccc7DD3x4y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y73pqrEv,_ZTv0_n12_N3ccc7DD3x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y73pqrEv,_ZThn4_N3ccc7DD3x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y73abcEv,_ZTv0_n16_N3ccc7DD3x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y73abcEv,_ZThn4_N3ccc7DD3x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y73pqrEv,_ZTv0_n12_N3ccc7DD3x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y73abcEv,_ZTv0_n16_N3ccc7DD3x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y7E[] = {
  {&(_ZTVN3ccc7DD3x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y7E[];
static VTBL_ENTRY alt_thunk_names1432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y73abcEv,_ZTv0_n16_N3ccc7DD3x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y73abcEv,_ZThn4_N3ccc7DD3x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y73pqrEv,_ZTv0_n12_N3ccc7DD3x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y73pqrEv,_ZThn4_N3ccc7DD3x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y7E = {  "_ZN3ccc7DD3x4y7E", // class name
  bases__ZN3ccc7DD3x4y7E, 2,
  &(vtc__ZN3ccc7DD3x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1432,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y8  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y83abcEv
  ~CC3x4y8(); // tgen
  CC3x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y8E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y83efgEv");}
void  ccc::CC3x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y83abcEv");}
ccc::CC3x4y8 ::~CC3x4y8(){ note_dtor("_ZN3ccc7CC3x4y8E", this);} // tgen
ccc::CC3x4y8 ::CC3x4y8(){ note_ctor("_ZN3ccc7CC3x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y8E, buf);
    ::ccc::CC3x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y8E);
    dp->::ccc::CC3x4y8::~CC3x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y8E(Test__ZN3ccc7CC3x4y8E, "_ZN3ccc7CC3x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y8C1Ev();
extern void _ZN3ccc7CC3x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y8E[] = {
  NSPAIR(_ZN3ccc7CC3x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC3x4y83abcEv();
extern void _ZN3ccc7CC3x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y83efgEv,_ZTv0_n12_N3ccc7CC3x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y83efgEv,_ZThn4_N3ccc7CC3x4y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x4y83abcEv,_ZTv0_n20_N3ccc7CC3x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y83abcEv,_ZThn4_N3ccc7CC3x4y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y83efgEv,_ZTv0_n12_N3ccc7CC3x4y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x4y83abcEv,_ZTv0_n20_N3ccc7CC3x4y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y8E[] = {
  {&(_ZTVN3ccc7CC3x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y8E[];
static VTBL_ENTRY alt_thunk_names1433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x4y83abcEv,_ZTv0_n20_N3ccc7CC3x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y83abcEv,_ZThn4_N3ccc7CC3x4y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y83efgEv,_ZTv0_n12_N3ccc7CC3x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y83efgEv,_ZThn4_N3ccc7CC3x4y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y8E = {  "_ZN3ccc7CC3x4y8E", // class name
  bases__ZN3ccc7CC3x4y8E, 2,
  &(vtc__ZN3ccc7CC3x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1433,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y8  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD3x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x4y83abcEv
  ~DD3x4y8(); // tgen
  DD3x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y83efgEv");}
void  ccc::DD3x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x4y83abcEv");}
ccc::DD3x4y8 ::~DD3x4y8(){ note_dtor("_ZN3ccc7DD3x4y8E", this);} // tgen
ccc::DD3x4y8 ::DD3x4y8(){ note_ctor("_ZN3ccc7DD3x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y8E, buf);
    ::ccc::DD3x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y8E);
    dp->::ccc::DD3x4y8::~DD3x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y8E(Test__ZN3ccc7DD3x4y8E, "_ZN3ccc7DD3x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y8C1Ev();
extern void _ZN3ccc7DD3x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y8E[] = {
  NSPAIR(_ZN3ccc7DD3x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y8E[];
extern void _ZN3ccc7DD3x4y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x4y83abcEv,_ZTv0_n16_N3ccc7DD3x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y83abcEv,_ZThn4_N3ccc7DD3x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y83efgEv,_ZTv0_n20_N3ccc7DD3x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y83efgEv,_ZThn4_N3ccc7DD3x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x4y83abcEv,_ZTv0_n16_N3ccc7DD3x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y83efgEv,_ZTv0_n20_N3ccc7DD3x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y8E[] = {
  {&(_ZTVN3ccc7DD3x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y8E[];
static VTBL_ENTRY alt_thunk_names1434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y83efgEv,_ZTv0_n20_N3ccc7DD3x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y83efgEv,_ZThn4_N3ccc7DD3x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x4y83abcEv,_ZTv0_n16_N3ccc7DD3x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y83abcEv,_ZThn4_N3ccc7DD3x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y8E = {  "_ZN3ccc7DD3x4y8E", // class name
  bases__ZN3ccc7DD3x4y8E, 2,
  &(vtc__ZN3ccc7DD3x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1434,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y9  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y93pqrEv
  ~CC3x4y9(); // tgen
  CC3x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y9E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y93efgEv");}
void  ccc::CC3x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y93pqrEv");}
ccc::CC3x4y9 ::~CC3x4y9(){ note_dtor("_ZN3ccc7CC3x4y9E", this);} // tgen
ccc::CC3x4y9 ::CC3x4y9(){ note_ctor("_ZN3ccc7CC3x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y9E, buf);
    ::ccc::CC3x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC3x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y9E);
    dp->::ccc::CC3x4y9::~CC3x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y9E(Test__ZN3ccc7CC3x4y9E, "_ZN3ccc7CC3x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y9C1Ev();
extern void _ZN3ccc7CC3x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y9E[] = {
  NSPAIR(_ZN3ccc7CC3x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y9E[];
extern void _ZN3ccc7CC3x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC3x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x4y93efgEv,_ZTv0_n12_N3ccc7CC3x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y93efgEv,_ZThn4_N3ccc7CC3x4y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x4y93pqrEv,_ZTv0_n16_N3ccc7CC3x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y93pqrEv,_ZThn4_N3ccc7CC3x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x4y93efgEv,_ZTv0_n12_N3ccc7CC3x4y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x4y93pqrEv,_ZTv0_n16_N3ccc7CC3x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x4y9E[] = {
  {&(_ZTVN3ccc7CC3x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x4y9E[];
static VTBL_ENTRY alt_thunk_names1435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x4y93pqrEv,_ZTv0_n16_N3ccc7CC3x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y93pqrEv,_ZThn4_N3ccc7CC3x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x4y93efgEv,_ZTv0_n12_N3ccc7CC3x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x4y93efgEv,_ZThn4_N3ccc7CC3x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x4y9E = {  "_ZN3ccc7CC3x4y9E", // class name
  bases__ZN3ccc7CC3x4y9E, 2,
  &(vtc__ZN3ccc7CC3x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x4y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1435,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y9  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD3x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x4y93pqrEv
  ~DD3x4y9(); // tgen
  DD3x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x4y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x4y93efgEv");}
void  ccc::DD3x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x4y93pqrEv");}
ccc::DD3x4y9 ::~DD3x4y9(){ note_dtor("_ZN3ccc7DD3x4y9E", this);} // tgen
ccc::DD3x4y9 ::DD3x4y9(){ note_ctor("_ZN3ccc7DD3x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x4y9E, buf);
    ::ccc::DD3x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x4y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD3x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x4y9E);
    dp->::ccc::DD3x4y9::~DD3x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x4y9E(Test__ZN3ccc7DD3x4y9E, "_ZN3ccc7DD3x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x4y9C1Ev();
extern void _ZN3ccc7DD3x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x4y9E[] = {
  NSPAIR(_ZN3ccc7DD3x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD3x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y9E[];
extern void _ZN3ccc7DD3x4y93efgEv();
extern void _ZN3ccc7DD3x4y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x4y93pqrEv,_ZTv0_n12_N3ccc7DD3x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y93pqrEv,_ZThn4_N3ccc7DD3x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x4y93efgEv,_ZTv0_n20_N3ccc7DD3x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x4y93efgEv,_ZThn4_N3ccc7DD3x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x4y93pqrEv,_ZTv0_n12_N3ccc7DD3x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x4y93efgEv,_ZTv0_n20_N3ccc7DD3x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x4y9E[] = {
  {&(_ZTVN3ccc7DD3x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x4y9E[];
static VTBL_ENTRY alt_thunk_names1436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x4y93efgEv,_ZTv0_n20_N3ccc7DD3x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y93efgEv,_ZThn4_N3ccc7DD3x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x4y93pqrEv,_ZTv0_n12_N3ccc7DD3x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x4y93pqrEv,_ZThn4_N3ccc7DD3x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x4y9E = {  "_ZN3ccc7DD3x4y9E", // class name
  bases__ZN3ccc7DD3x4y9E, 2,
  &(vtc__ZN3ccc7DD3x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x4y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1436,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y10  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x4y103abcEv
  ~CC3x4y10(); // tgen
  CC3x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y10E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y103pqrEv");}
void  ccc::CC3x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x4y103abcEv");}
ccc::CC3x4y10 ::~CC3x4y10(){ note_dtor("_ZN3ccc8CC3x4y10E", this);} // tgen
ccc::CC3x4y10 ::CC3x4y10(){ note_ctor("_ZN3ccc8CC3x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y10E, buf);
    ::ccc::CC3x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y10E);
    dp->::ccc::CC3x4y10::~CC3x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y10E(Test__ZN3ccc8CC3x4y10E, "_ZN3ccc8CC3x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y10C1Ev();
extern void _ZN3ccc8CC3x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y10E[] = {
  NSPAIR(_ZN3ccc8CC3x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y10E[];
extern void _ZN3ccc8CC3x4y103pqrEv();
extern void _ZN3ccc8CC3x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x4y103pqrEv,_ZTv0_n16_N3ccc8CC3x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y103pqrEv,_ZThn4_N3ccc8CC3x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x4y103abcEv,_ZTv0_n20_N3ccc8CC3x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y103abcEv,_ZThn4_N3ccc8CC3x4y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x4y103pqrEv,_ZTv0_n16_N3ccc8CC3x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x4y103abcEv,_ZTv0_n20_N3ccc8CC3x4y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y10E[] = {
  {&(_ZTVN3ccc8CC3x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y10E[];
static VTBL_ENTRY alt_thunk_names1437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x4y103abcEv,_ZTv0_n20_N3ccc8CC3x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y103abcEv,_ZThn4_N3ccc8CC3x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x4y103pqrEv,_ZTv0_n16_N3ccc8CC3x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y103pqrEv,_ZThn4_N3ccc8CC3x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x4y10E = {  "_ZN3ccc8CC3x4y10E", // class name
  bases__ZN3ccc8CC3x4y10E, 2,
  &(vtc__ZN3ccc8CC3x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1437,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y10  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD3x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x4y103abcEv
  ~DD3x4y10(); // tgen
  DD3x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x4y103pqrEv");}
void  ccc::DD3x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x4y103abcEv");}
ccc::DD3x4y10 ::~DD3x4y10(){ note_dtor("_ZN3ccc8DD3x4y10E", this);} // tgen
ccc::DD3x4y10 ::DD3x4y10(){ note_ctor("_ZN3ccc8DD3x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y10E, buf);
    ::ccc::DD3x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y10E);
    dp->::ccc::DD3x4y10::~DD3x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y10E(Test__ZN3ccc8DD3x4y10E, "_ZN3ccc8DD3x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y10C1Ev();
extern void _ZN3ccc8DD3x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y10E[] = {
  NSPAIR(_ZN3ccc8DD3x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x4y103pqrEv();
extern void _ZN3ccc8DD3x4y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x4y103pqrEv,_ZTv0_n12_N3ccc8DD3x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y103pqrEv,_ZThn4_N3ccc8DD3x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x4y103abcEv,_ZTv0_n16_N3ccc8DD3x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y103abcEv,_ZThn4_N3ccc8DD3x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x4y103pqrEv,_ZTv0_n12_N3ccc8DD3x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x4y103abcEv,_ZTv0_n16_N3ccc8DD3x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y10E[] = {
  {&(_ZTVN3ccc8DD3x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y10E[];
static VTBL_ENTRY alt_thunk_names1438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x4y103abcEv,_ZTv0_n16_N3ccc8DD3x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y103abcEv,_ZThn4_N3ccc8DD3x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x4y103pqrEv,_ZTv0_n12_N3ccc8DD3x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y103pqrEv,_ZThn4_N3ccc8DD3x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x4y10E = {  "_ZN3ccc8DD3x4y10E", // class name
  bases__ZN3ccc8DD3x4y10E, 2,
  &(vtc__ZN3ccc8DD3x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1438,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y11  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x4y113efgEv
  ~CC3x4y11(); // tgen
  CC3x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y11E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y113pqrEv");}
void  ccc::CC3x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x4y113efgEv");}
ccc::CC3x4y11 ::~CC3x4y11(){ note_dtor("_ZN3ccc8CC3x4y11E", this);} // tgen
ccc::CC3x4y11 ::CC3x4y11(){ note_ctor("_ZN3ccc8CC3x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y11E, buf);
    ::ccc::CC3x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y11E);
    dp->::ccc::CC3x4y11::~CC3x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y11E(Test__ZN3ccc8CC3x4y11E, "_ZN3ccc8CC3x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y11C1Ev();
extern void _ZN3ccc8CC3x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y11E[] = {
  NSPAIR(_ZN3ccc8CC3x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y11E[];
extern void _ZN3ccc8CC3x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC3x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x4y113efgEv,_ZTv0_n12_N3ccc8CC3x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y113efgEv,_ZThn4_N3ccc8CC3x4y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x4y113pqrEv,_ZTv0_n16_N3ccc8CC3x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y113pqrEv,_ZThn4_N3ccc8CC3x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x4y113efgEv,_ZTv0_n12_N3ccc8CC3x4y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x4y113pqrEv,_ZTv0_n16_N3ccc8CC3x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y11E[] = {
  {&(_ZTVN3ccc8CC3x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y11E[];
static VTBL_ENTRY alt_thunk_names1439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x4y113pqrEv,_ZTv0_n16_N3ccc8CC3x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y113pqrEv,_ZThn4_N3ccc8CC3x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x4y113efgEv,_ZTv0_n12_N3ccc8CC3x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y113efgEv,_ZThn4_N3ccc8CC3x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x4y11E = {  "_ZN3ccc8CC3x4y11E", // class name
  bases__ZN3ccc8CC3x4y11E, 2,
  &(vtc__ZN3ccc8CC3x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1439,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y11  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD3x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x4y113efgEv
  ~DD3x4y11(); // tgen
  DD3x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x4y113pqrEv");}
void  ccc::DD3x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x4y113efgEv");}
ccc::DD3x4y11 ::~DD3x4y11(){ note_dtor("_ZN3ccc8DD3x4y11E", this);} // tgen
ccc::DD3x4y11 ::DD3x4y11(){ note_ctor("_ZN3ccc8DD3x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y11E, buf);
    ::ccc::DD3x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y11E);
    dp->::ccc::DD3x4y11::~DD3x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y11E(Test__ZN3ccc8DD3x4y11E, "_ZN3ccc8DD3x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y11C1Ev();
extern void _ZN3ccc8DD3x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y11E[] = {
  NSPAIR(_ZN3ccc8DD3x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y11E[];
extern void _ZN3ccc8DD3x4y113efgEv();
extern void _ZN3ccc8DD3x4y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x4y113pqrEv,_ZTv0_n12_N3ccc8DD3x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y113pqrEv,_ZThn4_N3ccc8DD3x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x4y113efgEv,_ZTv0_n20_N3ccc8DD3x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y113efgEv,_ZThn4_N3ccc8DD3x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x4y113pqrEv,_ZTv0_n12_N3ccc8DD3x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x4y113efgEv,_ZTv0_n20_N3ccc8DD3x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y11E[] = {
  {&(_ZTVN3ccc8DD3x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y11E[];
static VTBL_ENTRY alt_thunk_names1440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x4y113efgEv,_ZTv0_n20_N3ccc8DD3x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y113efgEv,_ZThn4_N3ccc8DD3x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x4y113pqrEv,_ZTv0_n12_N3ccc8DD3x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y113pqrEv,_ZThn4_N3ccc8DD3x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x4y11E = {  "_ZN3ccc8DD3x4y11E", // class name
  bases__ZN3ccc8DD3x4y11E, 2,
  &(vtc__ZN3ccc8DD3x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1440,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y12  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC3x4y123abcEv
  ~CC3x4y12(); // tgen
  CC3x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x4y123abcEv");}
ccc::CC3x4y12 ::~CC3x4y12(){ note_dtor("_ZN3ccc8CC3x4y12E", this);} // tgen
ccc::CC3x4y12 ::CC3x4y12(){ note_ctor("_ZN3ccc8CC3x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y12E, buf);
    ::ccc::CC3x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y12E);
    dp->::ccc::CC3x4y12::~CC3x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y12E(Test__ZN3ccc8CC3x4y12E, "_ZN3ccc8CC3x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y12C1Ev();
extern void _ZN3ccc8CC3x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y12E[] = {
  NSPAIR(_ZN3ccc8CC3x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC3x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x4y123abcEv,_ZTv0_n20_N3ccc8CC3x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y123abcEv,_ZThn4_N3ccc8CC3x4y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x4y123abcEv,_ZTv0_n20_N3ccc8CC3x4y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y12E[] = {
  {&(_ZTVN3ccc8CC3x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y12E[];
static VTBL_ENTRY alt_thunk_names1441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x4y123abcEv,_ZTv0_n20_N3ccc8CC3x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y123abcEv,_ZThn4_N3ccc8CC3x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x4y12E = {  "_ZN3ccc8CC3x4y12E", // class name
  bases__ZN3ccc8CC3x4y12E, 2,
  &(vtc__ZN3ccc8CC3x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1441,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y12  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD3x4y123abcEv
  ~DD3x4y12(); // tgen
  DD3x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x4y123abcEv");}
ccc::DD3x4y12 ::~DD3x4y12(){ note_dtor("_ZN3ccc8DD3x4y12E", this);} // tgen
ccc::DD3x4y12 ::DD3x4y12(){ note_ctor("_ZN3ccc8DD3x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y12E, buf);
    ::ccc::DD3x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y12E);
    dp->::ccc::DD3x4y12::~DD3x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y12E(Test__ZN3ccc8DD3x4y12E, "_ZN3ccc8DD3x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y12C1Ev();
extern void _ZN3ccc8DD3x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y12E[] = {
  NSPAIR(_ZN3ccc8DD3x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x4y123abcEv,_ZTv0_n16_N3ccc8DD3x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y123abcEv,_ZThn4_N3ccc8DD3x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x4y123abcEv,_ZTv0_n16_N3ccc8DD3x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y12E[] = {
  {&(_ZTVN3ccc8DD3x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y12E[];
static VTBL_ENTRY alt_thunk_names1442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x4y123abcEv,_ZTv0_n16_N3ccc8DD3x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y123abcEv,_ZThn4_N3ccc8DD3x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x4y12E = {  "_ZN3ccc8DD3x4y12E", // class name
  bases__ZN3ccc8DD3x4y12E, 2,
  &(vtc__ZN3ccc8DD3x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1442,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y13  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC3x4y133efgEv
  ~CC3x4y13(); // tgen
  CC3x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x4y133efgEv");}
ccc::CC3x4y13 ::~CC3x4y13(){ note_dtor("_ZN3ccc8CC3x4y13E", this);} // tgen
ccc::CC3x4y13 ::CC3x4y13(){ note_ctor("_ZN3ccc8CC3x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y13E, buf);
    ::ccc::CC3x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y13E);
    dp->::ccc::CC3x4y13::~CC3x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y13E(Test__ZN3ccc8CC3x4y13E, "_ZN3ccc8CC3x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y13C1Ev();
extern void _ZN3ccc8CC3x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y13E[] = {
  NSPAIR(_ZN3ccc8CC3x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC3x4y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x4y133efgEv,_ZTv0_n12_N3ccc8CC3x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y133efgEv,_ZThn4_N3ccc8CC3x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x4y133efgEv,_ZTv0_n12_N3ccc8CC3x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y13E[] = {
  {&(_ZTVN3ccc8CC3x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y13E[];
static VTBL_ENTRY alt_thunk_names1443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x4y133efgEv,_ZTv0_n12_N3ccc8CC3x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y133efgEv,_ZThn4_N3ccc8CC3x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x4y13E = {  "_ZN3ccc8CC3x4y13E", // class name
  bases__ZN3ccc8CC3x4y13E, 2,
  &(vtc__ZN3ccc8CC3x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1443,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y13  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD3x4y133efgEv
  ~DD3x4y13(); // tgen
  DD3x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x4y133efgEv");}
ccc::DD3x4y13 ::~DD3x4y13(){ note_dtor("_ZN3ccc8DD3x4y13E", this);} // tgen
ccc::DD3x4y13 ::DD3x4y13(){ note_ctor("_ZN3ccc8DD3x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y13E, buf);
    ::ccc::DD3x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y13E);
    dp->::ccc::DD3x4y13::~DD3x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y13E(Test__ZN3ccc8DD3x4y13E, "_ZN3ccc8DD3x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y13C1Ev();
extern void _ZN3ccc8DD3x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y13E[] = {
  NSPAIR(_ZN3ccc8DD3x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y13E[];
extern void _ZN3ccc8DD3x4y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x4y133efgEv,_ZTv0_n20_N3ccc8DD3x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y133efgEv,_ZThn4_N3ccc8DD3x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x4y133efgEv,_ZTv0_n20_N3ccc8DD3x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y13E[] = {
  {&(_ZTVN3ccc8DD3x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y13E[];
static VTBL_ENTRY alt_thunk_names1444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x4y133efgEv,_ZTv0_n20_N3ccc8DD3x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y133efgEv,_ZThn4_N3ccc8DD3x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x4y13E = {  "_ZN3ccc8DD3x4y13E", // class name
  bases__ZN3ccc8DD3x4y13E, 2,
  &(vtc__ZN3ccc8DD3x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1444,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y14  : virtual ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y143pqrEv
  ~CC3x4y14(); // tgen
  CC3x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y143pqrEv");}
ccc::CC3x4y14 ::~CC3x4y14(){ note_dtor("_ZN3ccc8CC3x4y14E", this);} // tgen
ccc::CC3x4y14 ::CC3x4y14(){ note_ctor("_ZN3ccc8CC3x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y14E, buf);
    ::ccc::CC3x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y14E);
    dp->::ccc::CC3x4y14::~CC3x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y14E(Test__ZN3ccc8CC3x4y14E, "_ZN3ccc8CC3x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y14C1Ev();
extern void _ZN3ccc8CC3x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y14E[] = {
  NSPAIR(_ZN3ccc8CC3x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y14E[];
extern void _ZN3ccc8CC3x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x4y143pqrEv,_ZTv0_n16_N3ccc8CC3x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y143pqrEv,_ZThn4_N3ccc8CC3x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x4y143pqrEv,_ZTv0_n16_N3ccc8CC3x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y14E[] = {
  {&(_ZTVN3ccc8CC3x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y14E[];
static VTBL_ENTRY alt_thunk_names1445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x4y143pqrEv,_ZTv0_n16_N3ccc8CC3x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x4y143pqrEv,_ZThn4_N3ccc8CC3x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x4y14E = {  "_ZN3ccc8CC3x4y14E", // class name
  bases__ZN3ccc8CC3x4y14E, 2,
  &(vtc__ZN3ccc8CC3x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1445,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y14  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD3x4y143pqrEv
  ~DD3x4y14(); // tgen
  DD3x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x4y143pqrEv");}
ccc::DD3x4y14 ::~DD3x4y14(){ note_dtor("_ZN3ccc8DD3x4y14E", this);} // tgen
ccc::DD3x4y14 ::DD3x4y14(){ note_ctor("_ZN3ccc8DD3x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y14E, buf);
    ::ccc::DD3x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y14E);
    dp->::ccc::DD3x4y14::~DD3x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y14E(Test__ZN3ccc8DD3x4y14E, "_ZN3ccc8DD3x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y14C1Ev();
extern void _ZN3ccc8DD3x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y14E[] = {
  NSPAIR(_ZN3ccc8DD3x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x4y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x4y143pqrEv,_ZTv0_n12_N3ccc8DD3x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x4y143pqrEv,_ZThn4_N3ccc8DD3x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x4y143pqrEv,_ZTv0_n12_N3ccc8DD3x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y14E[] = {
  {&(_ZTVN3ccc8DD3x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y14E[];
static VTBL_ENTRY alt_thunk_names1446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x4y143pqrEv,_ZTv0_n12_N3ccc8DD3x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x4y143pqrEv,_ZThn4_N3ccc8DD3x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x4y14E = {  "_ZN3ccc8DD3x4y14E", // class name
  bases__ZN3ccc8DD3x4y14E, 2,
  &(vtc__ZN3ccc8DD3x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1446,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y15  : virtual ::ccc::AA3 , ::ccc::BB4 {
  ~CC3x4y15(); // tgen
  CC3x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x4y15 ::~CC3x4y15(){ note_dtor("_ZN3ccc8CC3x4y15E", this);} // tgen
ccc::CC3x4y15 ::CC3x4y15(){ note_ctor("_ZN3ccc8CC3x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y15E, buf);
    ::ccc::CC3x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC3x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y15E);
    dp->::ccc::CC3x4y15::~CC3x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y15E(Test__ZN3ccc8CC3x4y15E, "_ZN3ccc8CC3x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y15C1Ev();
extern void _ZN3ccc8CC3x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y15E[] = {
  NSPAIR(_ZN3ccc8CC3x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x4y15E[] = {
  {&(_ZTVN3ccc8CC3x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x4y15E[];
Class_Descriptor cd__ZN3ccc8CC3x4y15E = {  "_ZN3ccc8CC3x4y15E", // class name
  bases__ZN3ccc8CC3x4y15E, 2,
  &(vtc__ZN3ccc8CC3x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x4y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x4y15  : virtual ::ccc::AA3 , virtual ::ccc::BB4 {
  ~DD3x4y15(); // tgen
  DD3x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x4y15 ::~DD3x4y15(){ note_dtor("_ZN3ccc8DD3x4y15E", this);} // tgen
ccc::DD3x4y15 ::DD3x4y15(){ note_ctor("_ZN3ccc8DD3x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x4y15E, buf);
    ::ccc::DD3x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x4y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD3x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x4y15E);
    dp->::ccc::DD3x4y15::~DD3x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x4y15E(Test__ZN3ccc8DD3x4y15E, "_ZN3ccc8DD3x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x4y15C1Ev();
extern void _ZN3ccc8DD3x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x4y15E[] = {
  NSPAIR(_ZN3ccc8DD3x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD3x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x4y15E[] = {
  {&(_ZTVN3ccc8DD3x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x4y15E[];
Class_Descriptor cd__ZN3ccc8DD3x4y15E = {  "_ZN3ccc8DD3x4y15E", // class name
  bases__ZN3ccc8DD3x4y15E, 2,
  &(vtc__ZN3ccc8DD3x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x4y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y0  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y03pqrEv
  ~CC3x5y0(); // tgen
  CC3x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y0E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y03abcEv");}
void  ccc::CC3x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y03efgEv");}
void  ccc::CC3x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y03pqrEv");}
ccc::CC3x5y0 ::~CC3x5y0(){ note_dtor("_ZN3ccc7CC3x5y0E", this);} // tgen
ccc::CC3x5y0 ::CC3x5y0(){ note_ctor("_ZN3ccc7CC3x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y0E, buf);
    ::ccc::CC3x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y0E);
    dp->::ccc::CC3x5y0::~CC3x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y0E(Test__ZN3ccc7CC3x5y0E, "_ZN3ccc7CC3x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y0C1Ev();
extern void _ZN3ccc7CC3x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y0E[] = {
  NSPAIR(_ZN3ccc7CC3x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y0E[];
extern void _ZN3ccc7CC3x5y03pqrEv();
extern void _ZN3ccc7CC3x5y03efgEv();
extern void _ZN3ccc7CC3x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y03efgEv,_ZTv0_n12_N3ccc7CC3x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03efgEv,_ZThn4_N3ccc7CC3x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y03pqrEv,_ZTv0_n16_N3ccc7CC3x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03pqrEv,_ZThn4_N3ccc7CC3x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y03abcEv,_ZTv0_n20_N3ccc7CC3x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03abcEv,_ZThn4_N3ccc7CC3x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y03efgEv,_ZTv0_n12_N3ccc7CC3x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y03pqrEv,_ZTv0_n16_N3ccc7CC3x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y03abcEv,_ZTv0_n20_N3ccc7CC3x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y0E[] = {
  {&(_ZTVN3ccc7CC3x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y0E[];
static VTBL_ENTRY alt_thunk_names1447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y03abcEv,_ZTv0_n20_N3ccc7CC3x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y03abcEv,_ZThn4_N3ccc7CC3x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y03pqrEv,_ZTv0_n16_N3ccc7CC3x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y03pqrEv,_ZThn4_N3ccc7CC3x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y03efgEv,_ZTv0_n12_N3ccc7CC3x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y03efgEv,_ZThn4_N3ccc7CC3x5y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y0E = {  "_ZN3ccc7CC3x5y0E", // class name
  bases__ZN3ccc7CC3x5y0E, 2,
  &(vtc__ZN3ccc7CC3x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1447,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y0  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD3x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y03pqrEv
  ~DD3x5y0(); // tgen
  DD3x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y03abcEv");}
void  ccc::DD3x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y03efgEv");}
void  ccc::DD3x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y03pqrEv");}
ccc::DD3x5y0 ::~DD3x5y0(){ note_dtor("_ZN3ccc7DD3x5y0E", this);} // tgen
ccc::DD3x5y0 ::DD3x5y0(){ note_ctor("_ZN3ccc7DD3x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y0E, buf);
    ::ccc::DD3x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y0E);
    dp->::ccc::DD3x5y0::~DD3x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y0E(Test__ZN3ccc7DD3x5y0E, "_ZN3ccc7DD3x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y0C1Ev();
extern void _ZN3ccc7DD3x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y0E[] = {
  NSPAIR(_ZN3ccc7DD3x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y0E[];
extern void _ZN3ccc7DD3x5y03efgEv();
extern void _ZN3ccc7DD3x5y03pqrEv();
extern void _ZN3ccc7DD3x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y03pqrEv,_ZTv0_n12_N3ccc7DD3x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y03pqrEv,_ZThn4_N3ccc7DD3x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y03efgEv,_ZTv0_n16_N3ccc7DD3x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y03efgEv,_ZThn4_N3ccc7DD3x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y03abcEv,_ZTv0_n20_N3ccc7DD3x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y03abcEv,_ZThn4_N3ccc7DD3x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y03pqrEv,_ZTv0_n12_N3ccc7DD3x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y03efgEv,_ZTv0_n16_N3ccc7DD3x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y03abcEv,_ZTv0_n20_N3ccc7DD3x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y0E[] = {
  {&(_ZTVN3ccc7DD3x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y0E[];
static VTBL_ENTRY alt_thunk_names1448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y03abcEv,_ZTv0_n20_N3ccc7DD3x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y03abcEv,_ZThn4_N3ccc7DD3x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y03efgEv,_ZTv0_n16_N3ccc7DD3x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y03efgEv,_ZThn4_N3ccc7DD3x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y03pqrEv,_ZTv0_n12_N3ccc7DD3x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y03pqrEv,_ZThn4_N3ccc7DD3x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y0E = {  "_ZN3ccc7DD3x5y0E", // class name
  bases__ZN3ccc7DD3x5y0E, 2,
  &(vtc__ZN3ccc7DD3x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1448,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y1  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x5y13efgEv
  ~CC3x5y1(); // tgen
  CC3x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y1E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y13abcEv");}
void  ccc::CC3x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y13pqrEv");}
void  ccc::CC3x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y13efgEv");}
ccc::CC3x5y1 ::~CC3x5y1(){ note_dtor("_ZN3ccc7CC3x5y1E", this);} // tgen
ccc::CC3x5y1 ::CC3x5y1(){ note_ctor("_ZN3ccc7CC3x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y1E, buf);
    ::ccc::CC3x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y1E);
    dp->::ccc::CC3x5y1::~CC3x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y1E(Test__ZN3ccc7CC3x5y1E, "_ZN3ccc7CC3x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y1C1Ev();
extern void _ZN3ccc7CC3x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y1E[] = {
  NSPAIR(_ZN3ccc7CC3x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y1E[];
extern void _ZN3ccc7CC3x5y13pqrEv();
extern void _ZN3ccc7CC3x5y13efgEv();
extern void _ZN3ccc7CC3x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y13efgEv,_ZTv0_n12_N3ccc7CC3x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13efgEv,_ZThn4_N3ccc7CC3x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y13pqrEv,_ZTv0_n16_N3ccc7CC3x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13pqrEv,_ZThn4_N3ccc7CC3x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y13abcEv,_ZTv0_n20_N3ccc7CC3x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13abcEv,_ZThn4_N3ccc7CC3x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y13efgEv,_ZTv0_n12_N3ccc7CC3x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y13pqrEv,_ZTv0_n16_N3ccc7CC3x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y13abcEv,_ZTv0_n20_N3ccc7CC3x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y1E[] = {
  {&(_ZTVN3ccc7CC3x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y1E[];
static VTBL_ENTRY alt_thunk_names1449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y13abcEv,_ZTv0_n20_N3ccc7CC3x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y13abcEv,_ZThn4_N3ccc7CC3x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y13pqrEv,_ZTv0_n16_N3ccc7CC3x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y13pqrEv,_ZThn4_N3ccc7CC3x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y13efgEv,_ZTv0_n12_N3ccc7CC3x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y13efgEv,_ZThn4_N3ccc7CC3x5y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y1E = {  "_ZN3ccc7CC3x5y1E", // class name
  bases__ZN3ccc7CC3x5y1E, 2,
  &(vtc__ZN3ccc7CC3x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1449,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y1  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD3x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x5y13efgEv
  ~DD3x5y1(); // tgen
  DD3x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y13abcEv");}
void  ccc::DD3x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y13pqrEv");}
void  ccc::DD3x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y13efgEv");}
ccc::DD3x5y1 ::~DD3x5y1(){ note_dtor("_ZN3ccc7DD3x5y1E", this);} // tgen
ccc::DD3x5y1 ::DD3x5y1(){ note_ctor("_ZN3ccc7DD3x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y1E, buf);
    ::ccc::DD3x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y1E);
    dp->::ccc::DD3x5y1::~DD3x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y1E(Test__ZN3ccc7DD3x5y1E, "_ZN3ccc7DD3x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y1C1Ev();
extern void _ZN3ccc7DD3x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y1E[] = {
  NSPAIR(_ZN3ccc7DD3x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y1E[];
extern void _ZN3ccc7DD3x5y13efgEv();
extern void _ZN3ccc7DD3x5y13pqrEv();
extern void _ZN3ccc7DD3x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y13pqrEv,_ZTv0_n12_N3ccc7DD3x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y13pqrEv,_ZThn4_N3ccc7DD3x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y13efgEv,_ZTv0_n16_N3ccc7DD3x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y13efgEv,_ZThn4_N3ccc7DD3x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y13abcEv,_ZTv0_n20_N3ccc7DD3x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y13abcEv,_ZThn4_N3ccc7DD3x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y13pqrEv,_ZTv0_n12_N3ccc7DD3x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y13efgEv,_ZTv0_n16_N3ccc7DD3x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y13abcEv,_ZTv0_n20_N3ccc7DD3x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y1E[] = {
  {&(_ZTVN3ccc7DD3x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y1E[];
static VTBL_ENTRY alt_thunk_names1450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y13abcEv,_ZTv0_n20_N3ccc7DD3x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y13abcEv,_ZThn4_N3ccc7DD3x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y13efgEv,_ZTv0_n16_N3ccc7DD3x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y13efgEv,_ZThn4_N3ccc7DD3x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y13pqrEv,_ZTv0_n12_N3ccc7DD3x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y13pqrEv,_ZThn4_N3ccc7DD3x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y1E = {  "_ZN3ccc7DD3x5y1E", // class name
  bases__ZN3ccc7DD3x5y1E, 2,
  &(vtc__ZN3ccc7DD3x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1450,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y2  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y23pqrEv
  ~CC3x5y2(); // tgen
  CC3x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y2E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y23efgEv");}
void  ccc::CC3x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y23abcEv");}
void  ccc::CC3x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y23pqrEv");}
ccc::CC3x5y2 ::~CC3x5y2(){ note_dtor("_ZN3ccc7CC3x5y2E", this);} // tgen
ccc::CC3x5y2 ::CC3x5y2(){ note_ctor("_ZN3ccc7CC3x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y2E, buf);
    ::ccc::CC3x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y2E);
    dp->::ccc::CC3x5y2::~CC3x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y2E(Test__ZN3ccc7CC3x5y2E, "_ZN3ccc7CC3x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y2C1Ev();
extern void _ZN3ccc7CC3x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y2E[] = {
  NSPAIR(_ZN3ccc7CC3x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y2E[];
extern void _ZN3ccc7CC3x5y23pqrEv();
extern void _ZN3ccc7CC3x5y23efgEv();
extern void _ZN3ccc7CC3x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y23efgEv,_ZTv0_n12_N3ccc7CC3x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23efgEv,_ZThn4_N3ccc7CC3x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y23pqrEv,_ZTv0_n16_N3ccc7CC3x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23pqrEv,_ZThn4_N3ccc7CC3x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y23abcEv,_ZTv0_n20_N3ccc7CC3x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23abcEv,_ZThn4_N3ccc7CC3x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y23efgEv,_ZTv0_n12_N3ccc7CC3x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y23pqrEv,_ZTv0_n16_N3ccc7CC3x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y23abcEv,_ZTv0_n20_N3ccc7CC3x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y2E[] = {
  {&(_ZTVN3ccc7CC3x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y2E[];
static VTBL_ENTRY alt_thunk_names1451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y23abcEv,_ZTv0_n20_N3ccc7CC3x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y23abcEv,_ZThn4_N3ccc7CC3x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y23pqrEv,_ZTv0_n16_N3ccc7CC3x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y23pqrEv,_ZThn4_N3ccc7CC3x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y23efgEv,_ZTv0_n12_N3ccc7CC3x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y23efgEv,_ZThn4_N3ccc7CC3x5y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y2E = {  "_ZN3ccc7CC3x5y2E", // class name
  bases__ZN3ccc7CC3x5y2E, 2,
  &(vtc__ZN3ccc7CC3x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1451,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y2  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD3x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y23pqrEv
  ~DD3x5y2(); // tgen
  DD3x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y23efgEv");}
void  ccc::DD3x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y23abcEv");}
void  ccc::DD3x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y23pqrEv");}
ccc::DD3x5y2 ::~DD3x5y2(){ note_dtor("_ZN3ccc7DD3x5y2E", this);} // tgen
ccc::DD3x5y2 ::DD3x5y2(){ note_ctor("_ZN3ccc7DD3x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y2E, buf);
    ::ccc::DD3x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y2E);
    dp->::ccc::DD3x5y2::~DD3x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y2E(Test__ZN3ccc7DD3x5y2E, "_ZN3ccc7DD3x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y2C1Ev();
extern void _ZN3ccc7DD3x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y2E[] = {
  NSPAIR(_ZN3ccc7DD3x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y2E[];
extern void _ZN3ccc7DD3x5y23efgEv();
extern void _ZN3ccc7DD3x5y23pqrEv();
extern void _ZN3ccc7DD3x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y23pqrEv,_ZTv0_n12_N3ccc7DD3x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y23pqrEv,_ZThn4_N3ccc7DD3x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y23efgEv,_ZTv0_n16_N3ccc7DD3x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y23efgEv,_ZThn4_N3ccc7DD3x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y23abcEv,_ZTv0_n20_N3ccc7DD3x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y23abcEv,_ZThn4_N3ccc7DD3x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y23pqrEv,_ZTv0_n12_N3ccc7DD3x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y23efgEv,_ZTv0_n16_N3ccc7DD3x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y23abcEv,_ZTv0_n20_N3ccc7DD3x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y2E[] = {
  {&(_ZTVN3ccc7DD3x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y2E[];
static VTBL_ENTRY alt_thunk_names1452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y23abcEv,_ZTv0_n20_N3ccc7DD3x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y23abcEv,_ZThn4_N3ccc7DD3x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y23efgEv,_ZTv0_n16_N3ccc7DD3x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y23efgEv,_ZThn4_N3ccc7DD3x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y23pqrEv,_ZTv0_n12_N3ccc7DD3x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y23pqrEv,_ZThn4_N3ccc7DD3x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y2E = {  "_ZN3ccc7DD3x5y2E", // class name
  bases__ZN3ccc7DD3x5y2E, 2,
  &(vtc__ZN3ccc7DD3x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1452,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y3  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x5y33abcEv
  ~CC3x5y3(); // tgen
  CC3x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y3E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y33efgEv");}
void  ccc::CC3x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y33pqrEv");}
void  ccc::CC3x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y33abcEv");}
ccc::CC3x5y3 ::~CC3x5y3(){ note_dtor("_ZN3ccc7CC3x5y3E", this);} // tgen
ccc::CC3x5y3 ::CC3x5y3(){ note_ctor("_ZN3ccc7CC3x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y3E, buf);
    ::ccc::CC3x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y3E);
    dp->::ccc::CC3x5y3::~CC3x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y3E(Test__ZN3ccc7CC3x5y3E, "_ZN3ccc7CC3x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y3C1Ev();
extern void _ZN3ccc7CC3x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y3E[] = {
  NSPAIR(_ZN3ccc7CC3x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y3E[];
extern void _ZN3ccc7CC3x5y33pqrEv();
extern void _ZN3ccc7CC3x5y33efgEv();
extern void _ZN3ccc7CC3x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y33efgEv,_ZTv0_n12_N3ccc7CC3x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33efgEv,_ZThn4_N3ccc7CC3x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y33pqrEv,_ZTv0_n16_N3ccc7CC3x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33pqrEv,_ZThn4_N3ccc7CC3x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y33abcEv,_ZTv0_n20_N3ccc7CC3x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33abcEv,_ZThn4_N3ccc7CC3x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y33efgEv,_ZTv0_n12_N3ccc7CC3x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y33pqrEv,_ZTv0_n16_N3ccc7CC3x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y33abcEv,_ZTv0_n20_N3ccc7CC3x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y3E[] = {
  {&(_ZTVN3ccc7CC3x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y3E[];
static VTBL_ENTRY alt_thunk_names1453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y33abcEv,_ZTv0_n20_N3ccc7CC3x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y33abcEv,_ZThn4_N3ccc7CC3x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y33pqrEv,_ZTv0_n16_N3ccc7CC3x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y33pqrEv,_ZThn4_N3ccc7CC3x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y33efgEv,_ZTv0_n12_N3ccc7CC3x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y33efgEv,_ZThn4_N3ccc7CC3x5y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y3E = {  "_ZN3ccc7CC3x5y3E", // class name
  bases__ZN3ccc7CC3x5y3E, 2,
  &(vtc__ZN3ccc7CC3x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1453,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y3  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD3x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x5y33abcEv
  ~DD3x5y3(); // tgen
  DD3x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y33efgEv");}
void  ccc::DD3x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y33pqrEv");}
void  ccc::DD3x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y33abcEv");}
ccc::DD3x5y3 ::~DD3x5y3(){ note_dtor("_ZN3ccc7DD3x5y3E", this);} // tgen
ccc::DD3x5y3 ::DD3x5y3(){ note_ctor("_ZN3ccc7DD3x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y3E, buf);
    ::ccc::DD3x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y3E);
    dp->::ccc::DD3x5y3::~DD3x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y3E(Test__ZN3ccc7DD3x5y3E, "_ZN3ccc7DD3x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y3C1Ev();
extern void _ZN3ccc7DD3x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y3E[] = {
  NSPAIR(_ZN3ccc7DD3x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y3E[];
extern void _ZN3ccc7DD3x5y33efgEv();
extern void _ZN3ccc7DD3x5y33pqrEv();
extern void _ZN3ccc7DD3x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y33pqrEv,_ZTv0_n12_N3ccc7DD3x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y33pqrEv,_ZThn4_N3ccc7DD3x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y33efgEv,_ZTv0_n16_N3ccc7DD3x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y33efgEv,_ZThn4_N3ccc7DD3x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y33abcEv,_ZTv0_n20_N3ccc7DD3x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y33abcEv,_ZThn4_N3ccc7DD3x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y33pqrEv,_ZTv0_n12_N3ccc7DD3x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y33efgEv,_ZTv0_n16_N3ccc7DD3x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y33abcEv,_ZTv0_n20_N3ccc7DD3x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y3E[] = {
  {&(_ZTVN3ccc7DD3x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y3E[];
static VTBL_ENTRY alt_thunk_names1454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y33abcEv,_ZTv0_n20_N3ccc7DD3x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y33abcEv,_ZThn4_N3ccc7DD3x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y33efgEv,_ZTv0_n16_N3ccc7DD3x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y33efgEv,_ZThn4_N3ccc7DD3x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y33pqrEv,_ZTv0_n12_N3ccc7DD3x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y33pqrEv,_ZThn4_N3ccc7DD3x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y3E = {  "_ZN3ccc7DD3x5y3E", // class name
  bases__ZN3ccc7DD3x5y3E, 2,
  &(vtc__ZN3ccc7DD3x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1454,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y4  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC3x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y43efgEv
  ~CC3x5y4(); // tgen
  CC3x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y4E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y43pqrEv");}
void  ccc::CC3x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y43abcEv");}
void  ccc::CC3x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y43efgEv");}
ccc::CC3x5y4 ::~CC3x5y4(){ note_dtor("_ZN3ccc7CC3x5y4E", this);} // tgen
ccc::CC3x5y4 ::CC3x5y4(){ note_ctor("_ZN3ccc7CC3x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y4E, buf);
    ::ccc::CC3x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y4E);
    dp->::ccc::CC3x5y4::~CC3x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y4E(Test__ZN3ccc7CC3x5y4E, "_ZN3ccc7CC3x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y4C1Ev();
extern void _ZN3ccc7CC3x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y4E[] = {
  NSPAIR(_ZN3ccc7CC3x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y4E[];
extern void _ZN3ccc7CC3x5y43pqrEv();
extern void _ZN3ccc7CC3x5y43efgEv();
extern void _ZN3ccc7CC3x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y43efgEv,_ZTv0_n12_N3ccc7CC3x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43efgEv,_ZThn4_N3ccc7CC3x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y43pqrEv,_ZTv0_n16_N3ccc7CC3x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43pqrEv,_ZThn4_N3ccc7CC3x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y43abcEv,_ZTv0_n20_N3ccc7CC3x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43abcEv,_ZThn4_N3ccc7CC3x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y43efgEv,_ZTv0_n12_N3ccc7CC3x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y43pqrEv,_ZTv0_n16_N3ccc7CC3x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y43abcEv,_ZTv0_n20_N3ccc7CC3x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y4E[] = {
  {&(_ZTVN3ccc7CC3x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y4E[];
static VTBL_ENTRY alt_thunk_names1455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y43abcEv,_ZTv0_n20_N3ccc7CC3x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y43abcEv,_ZThn4_N3ccc7CC3x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y43pqrEv,_ZTv0_n16_N3ccc7CC3x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y43pqrEv,_ZThn4_N3ccc7CC3x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y43efgEv,_ZTv0_n12_N3ccc7CC3x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y43efgEv,_ZThn4_N3ccc7CC3x5y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y4E = {  "_ZN3ccc7CC3x5y4E", // class name
  bases__ZN3ccc7CC3x5y4E, 2,
  &(vtc__ZN3ccc7CC3x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1455,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y4  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD3x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x5y43efgEv
  ~DD3x5y4(); // tgen
  DD3x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y43pqrEv");}
void  ccc::DD3x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y43abcEv");}
void  ccc::DD3x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y43efgEv");}
ccc::DD3x5y4 ::~DD3x5y4(){ note_dtor("_ZN3ccc7DD3x5y4E", this);} // tgen
ccc::DD3x5y4 ::DD3x5y4(){ note_ctor("_ZN3ccc7DD3x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y4E, buf);
    ::ccc::DD3x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y4E);
    dp->::ccc::DD3x5y4::~DD3x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y4E(Test__ZN3ccc7DD3x5y4E, "_ZN3ccc7DD3x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y4C1Ev();
extern void _ZN3ccc7DD3x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y4E[] = {
  NSPAIR(_ZN3ccc7DD3x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y4E[];
extern void _ZN3ccc7DD3x5y43efgEv();
extern void _ZN3ccc7DD3x5y43pqrEv();
extern void _ZN3ccc7DD3x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y43pqrEv,_ZTv0_n12_N3ccc7DD3x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y43pqrEv,_ZThn4_N3ccc7DD3x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y43efgEv,_ZTv0_n16_N3ccc7DD3x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y43efgEv,_ZThn4_N3ccc7DD3x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y43abcEv,_ZTv0_n20_N3ccc7DD3x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y43abcEv,_ZThn4_N3ccc7DD3x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y43pqrEv,_ZTv0_n12_N3ccc7DD3x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y43efgEv,_ZTv0_n16_N3ccc7DD3x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y43abcEv,_ZTv0_n20_N3ccc7DD3x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y4E[] = {
  {&(_ZTVN3ccc7DD3x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y4E[];
static VTBL_ENTRY alt_thunk_names1456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y43abcEv,_ZTv0_n20_N3ccc7DD3x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y43abcEv,_ZThn4_N3ccc7DD3x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y43efgEv,_ZTv0_n16_N3ccc7DD3x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y43efgEv,_ZThn4_N3ccc7DD3x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y43pqrEv,_ZTv0_n12_N3ccc7DD3x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y43pqrEv,_ZThn4_N3ccc7DD3x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y4E = {  "_ZN3ccc7DD3x5y4E", // class name
  bases__ZN3ccc7DD3x5y4E, 2,
  &(vtc__ZN3ccc7DD3x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1456,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y5  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC3x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y53abcEv
  ~CC3x5y5(); // tgen
  CC3x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y5E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y53pqrEv");}
void  ccc::CC3x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y53efgEv");}
void  ccc::CC3x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y53abcEv");}
ccc::CC3x5y5 ::~CC3x5y5(){ note_dtor("_ZN3ccc7CC3x5y5E", this);} // tgen
ccc::CC3x5y5 ::CC3x5y5(){ note_ctor("_ZN3ccc7CC3x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y5E, buf);
    ::ccc::CC3x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y5E);
    dp->::ccc::CC3x5y5::~CC3x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y5E(Test__ZN3ccc7CC3x5y5E, "_ZN3ccc7CC3x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y5C1Ev();
extern void _ZN3ccc7CC3x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y5E[] = {
  NSPAIR(_ZN3ccc7CC3x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y5E[];
extern void _ZN3ccc7CC3x5y53pqrEv();
extern void _ZN3ccc7CC3x5y53efgEv();
extern void _ZN3ccc7CC3x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y53efgEv,_ZTv0_n12_N3ccc7CC3x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53efgEv,_ZThn4_N3ccc7CC3x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y53pqrEv,_ZTv0_n16_N3ccc7CC3x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53pqrEv,_ZThn4_N3ccc7CC3x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y53abcEv,_ZTv0_n20_N3ccc7CC3x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53abcEv,_ZThn4_N3ccc7CC3x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y53efgEv,_ZTv0_n12_N3ccc7CC3x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y53pqrEv,_ZTv0_n16_N3ccc7CC3x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y53abcEv,_ZTv0_n20_N3ccc7CC3x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y5E[] = {
  {&(_ZTVN3ccc7CC3x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y5E[];
static VTBL_ENTRY alt_thunk_names1457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y53abcEv,_ZTv0_n20_N3ccc7CC3x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y53abcEv,_ZThn4_N3ccc7CC3x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y53pqrEv,_ZTv0_n16_N3ccc7CC3x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y53pqrEv,_ZThn4_N3ccc7CC3x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y53efgEv,_ZTv0_n12_N3ccc7CC3x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y53efgEv,_ZThn4_N3ccc7CC3x5y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y5E = {  "_ZN3ccc7CC3x5y5E", // class name
  bases__ZN3ccc7CC3x5y5E, 2,
  &(vtc__ZN3ccc7CC3x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1457,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y5  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD3x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x5y53abcEv
  ~DD3x5y5(); // tgen
  DD3x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y53pqrEv");}
void  ccc::DD3x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y53efgEv");}
void  ccc::DD3x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y53abcEv");}
ccc::DD3x5y5 ::~DD3x5y5(){ note_dtor("_ZN3ccc7DD3x5y5E", this);} // tgen
ccc::DD3x5y5 ::DD3x5y5(){ note_ctor("_ZN3ccc7DD3x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y5E, buf);
    ::ccc::DD3x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y5E);
    dp->::ccc::DD3x5y5::~DD3x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y5E(Test__ZN3ccc7DD3x5y5E, "_ZN3ccc7DD3x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y5C1Ev();
extern void _ZN3ccc7DD3x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y5E[] = {
  NSPAIR(_ZN3ccc7DD3x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y5E[];
extern void _ZN3ccc7DD3x5y53efgEv();
extern void _ZN3ccc7DD3x5y53pqrEv();
extern void _ZN3ccc7DD3x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y53pqrEv,_ZTv0_n12_N3ccc7DD3x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y53pqrEv,_ZThn4_N3ccc7DD3x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y53efgEv,_ZTv0_n16_N3ccc7DD3x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y53efgEv,_ZThn4_N3ccc7DD3x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y53abcEv,_ZTv0_n20_N3ccc7DD3x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y53abcEv,_ZThn4_N3ccc7DD3x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y53pqrEv,_ZTv0_n12_N3ccc7DD3x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y53efgEv,_ZTv0_n16_N3ccc7DD3x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y53abcEv,_ZTv0_n20_N3ccc7DD3x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y5E[] = {
  {&(_ZTVN3ccc7DD3x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y5E[];
static VTBL_ENTRY alt_thunk_names1458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y53abcEv,_ZTv0_n20_N3ccc7DD3x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y53abcEv,_ZThn4_N3ccc7DD3x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y53efgEv,_ZTv0_n16_N3ccc7DD3x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y53efgEv,_ZThn4_N3ccc7DD3x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y53pqrEv,_ZTv0_n12_N3ccc7DD3x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y53pqrEv,_ZThn4_N3ccc7DD3x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y5E = {  "_ZN3ccc7DD3x5y5E", // class name
  bases__ZN3ccc7DD3x5y5E, 2,
  &(vtc__ZN3ccc7DD3x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1458,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y6  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y63efgEv
  ~CC3x5y6(); // tgen
  CC3x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y6E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y63abcEv");}
void  ccc::CC3x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y63efgEv");}
ccc::CC3x5y6 ::~CC3x5y6(){ note_dtor("_ZN3ccc7CC3x5y6E", this);} // tgen
ccc::CC3x5y6 ::CC3x5y6(){ note_ctor("_ZN3ccc7CC3x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y6E, buf);
    ::ccc::CC3x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y6E);
    dp->::ccc::CC3x5y6::~CC3x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y6E(Test__ZN3ccc7CC3x5y6E, "_ZN3ccc7CC3x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y6C1Ev();
extern void _ZN3ccc7CC3x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y6E[] = {
  NSPAIR(_ZN3ccc7CC3x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC3x5y63efgEv();
extern void _ZN3ccc7CC3x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y63efgEv,_ZTv0_n12_N3ccc7CC3x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y63efgEv,_ZThn4_N3ccc7CC3x5y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y63abcEv,_ZTv0_n20_N3ccc7CC3x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y63abcEv,_ZThn4_N3ccc7CC3x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y63efgEv,_ZTv0_n12_N3ccc7CC3x5y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y63abcEv,_ZTv0_n20_N3ccc7CC3x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y6E[] = {
  {&(_ZTVN3ccc7CC3x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y6E[];
static VTBL_ENTRY alt_thunk_names1459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y63abcEv,_ZTv0_n20_N3ccc7CC3x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y63abcEv,_ZThn4_N3ccc7CC3x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y63efgEv,_ZTv0_n12_N3ccc7CC3x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y63efgEv,_ZThn4_N3ccc7CC3x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y6E = {  "_ZN3ccc7CC3x5y6E", // class name
  bases__ZN3ccc7CC3x5y6E, 2,
  &(vtc__ZN3ccc7CC3x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1459,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y6  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD3x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x5y63efgEv
  ~DD3x5y6(); // tgen
  DD3x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y63abcEv");}
void  ccc::DD3x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y63efgEv");}
ccc::DD3x5y6 ::~DD3x5y6(){ note_dtor("_ZN3ccc7DD3x5y6E", this);} // tgen
ccc::DD3x5y6 ::DD3x5y6(){ note_ctor("_ZN3ccc7DD3x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y6E, buf);
    ::ccc::DD3x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y6E);
    dp->::ccc::DD3x5y6::~DD3x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y6E(Test__ZN3ccc7DD3x5y6E, "_ZN3ccc7DD3x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y6C1Ev();
extern void _ZN3ccc7DD3x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y6E[] = {
  NSPAIR(_ZN3ccc7DD3x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y6E[];
extern void _ZN3ccc7DD3x5y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y63efgEv,_ZTv0_n16_N3ccc7DD3x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y63efgEv,_ZThn4_N3ccc7DD3x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y63abcEv,_ZTv0_n20_N3ccc7DD3x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y63abcEv,_ZThn4_N3ccc7DD3x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y63efgEv,_ZTv0_n16_N3ccc7DD3x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y63abcEv,_ZTv0_n20_N3ccc7DD3x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y6E[] = {
  {&(_ZTVN3ccc7DD3x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y6E[];
static VTBL_ENTRY alt_thunk_names1460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y63abcEv,_ZTv0_n20_N3ccc7DD3x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y63abcEv,_ZThn4_N3ccc7DD3x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y63efgEv,_ZTv0_n16_N3ccc7DD3x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y63efgEv,_ZThn4_N3ccc7DD3x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y6E = {  "_ZN3ccc7DD3x5y6E", // class name
  bases__ZN3ccc7DD3x5y6E, 2,
  &(vtc__ZN3ccc7DD3x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1460,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y7  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y73pqrEv
  ~CC3x5y7(); // tgen
  CC3x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y7E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y73abcEv");}
void  ccc::CC3x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y73pqrEv");}
ccc::CC3x5y7 ::~CC3x5y7(){ note_dtor("_ZN3ccc7CC3x5y7E", this);} // tgen
ccc::CC3x5y7 ::CC3x5y7(){ note_ctor("_ZN3ccc7CC3x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y7E, buf);
    ::ccc::CC3x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y7E);
    dp->::ccc::CC3x5y7::~CC3x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y7E(Test__ZN3ccc7CC3x5y7E, "_ZN3ccc7CC3x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y7C1Ev();
extern void _ZN3ccc7CC3x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y7E[] = {
  NSPAIR(_ZN3ccc7CC3x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y7E[];
extern void _ZN3ccc7CC3x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC3x5y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y73pqrEv,_ZTv0_n16_N3ccc7CC3x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y73pqrEv,_ZThn4_N3ccc7CC3x5y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y73abcEv,_ZTv0_n20_N3ccc7CC3x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y73abcEv,_ZThn4_N3ccc7CC3x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y73pqrEv,_ZTv0_n16_N3ccc7CC3x5y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y73abcEv,_ZTv0_n20_N3ccc7CC3x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y7E[] = {
  {&(_ZTVN3ccc7CC3x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y7E[];
static VTBL_ENTRY alt_thunk_names1461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y73abcEv,_ZTv0_n20_N3ccc7CC3x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y73abcEv,_ZThn4_N3ccc7CC3x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y73pqrEv,_ZTv0_n16_N3ccc7CC3x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y73pqrEv,_ZThn4_N3ccc7CC3x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y7E = {  "_ZN3ccc7CC3x5y7E", // class name
  bases__ZN3ccc7CC3x5y7E, 2,
  &(vtc__ZN3ccc7CC3x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1461,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y7  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD3x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y73pqrEv
  ~DD3x5y7(); // tgen
  DD3x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y73abcEv");}
void  ccc::DD3x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y73pqrEv");}
ccc::DD3x5y7 ::~DD3x5y7(){ note_dtor("_ZN3ccc7DD3x5y7E", this);} // tgen
ccc::DD3x5y7 ::DD3x5y7(){ note_ctor("_ZN3ccc7DD3x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y7E, buf);
    ::ccc::DD3x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y7E);
    dp->::ccc::DD3x5y7::~DD3x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y7E(Test__ZN3ccc7DD3x5y7E, "_ZN3ccc7DD3x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y7C1Ev();
extern void _ZN3ccc7DD3x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y7E[] = {
  NSPAIR(_ZN3ccc7DD3x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x5y73pqrEv();
extern void _ZN3ccc7DD3x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y73pqrEv,_ZTv0_n12_N3ccc7DD3x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y73pqrEv,_ZThn4_N3ccc7DD3x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y73abcEv,_ZTv0_n20_N3ccc7DD3x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y73abcEv,_ZThn4_N3ccc7DD3x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y73pqrEv,_ZTv0_n12_N3ccc7DD3x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y73abcEv,_ZTv0_n20_N3ccc7DD3x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y7E[] = {
  {&(_ZTVN3ccc7DD3x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y7E[];
static VTBL_ENTRY alt_thunk_names1462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y73abcEv,_ZTv0_n20_N3ccc7DD3x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y73abcEv,_ZThn4_N3ccc7DD3x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y73pqrEv,_ZTv0_n12_N3ccc7DD3x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y73pqrEv,_ZThn4_N3ccc7DD3x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y7E = {  "_ZN3ccc7DD3x5y7E", // class name
  bases__ZN3ccc7DD3x5y7E, 2,
  &(vtc__ZN3ccc7DD3x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1462,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y8  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y83abcEv
  ~CC3x5y8(); // tgen
  CC3x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y8E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y83efgEv");}
void  ccc::CC3x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y83abcEv");}
ccc::CC3x5y8 ::~CC3x5y8(){ note_dtor("_ZN3ccc7CC3x5y8E", this);} // tgen
ccc::CC3x5y8 ::CC3x5y8(){ note_ctor("_ZN3ccc7CC3x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y8E, buf);
    ::ccc::CC3x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y8E);
    dp->::ccc::CC3x5y8::~CC3x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y8E(Test__ZN3ccc7CC3x5y8E, "_ZN3ccc7CC3x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y8C1Ev();
extern void _ZN3ccc7CC3x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y8E[] = {
  NSPAIR(_ZN3ccc7CC3x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC3x5y83efgEv();
extern void _ZN3ccc7CC3x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y83efgEv,_ZTv0_n12_N3ccc7CC3x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y83efgEv,_ZThn4_N3ccc7CC3x5y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x5y83abcEv,_ZTv0_n20_N3ccc7CC3x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y83abcEv,_ZThn4_N3ccc7CC3x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y83efgEv,_ZTv0_n12_N3ccc7CC3x5y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x5y83abcEv,_ZTv0_n20_N3ccc7CC3x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y8E[] = {
  {&(_ZTVN3ccc7CC3x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y8E[];
static VTBL_ENTRY alt_thunk_names1463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x5y83abcEv,_ZTv0_n20_N3ccc7CC3x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y83abcEv,_ZThn4_N3ccc7CC3x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y83efgEv,_ZTv0_n12_N3ccc7CC3x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y83efgEv,_ZThn4_N3ccc7CC3x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y8E = {  "_ZN3ccc7CC3x5y8E", // class name
  bases__ZN3ccc7CC3x5y8E, 2,
  &(vtc__ZN3ccc7CC3x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1463,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y8  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD3x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x5y83abcEv
  ~DD3x5y8(); // tgen
  DD3x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y83efgEv");}
void  ccc::DD3x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x5y83abcEv");}
ccc::DD3x5y8 ::~DD3x5y8(){ note_dtor("_ZN3ccc7DD3x5y8E", this);} // tgen
ccc::DD3x5y8 ::DD3x5y8(){ note_ctor("_ZN3ccc7DD3x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y8E, buf);
    ::ccc::DD3x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y8E);
    dp->::ccc::DD3x5y8::~DD3x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y8E(Test__ZN3ccc7DD3x5y8E, "_ZN3ccc7DD3x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y8C1Ev();
extern void _ZN3ccc7DD3x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y8E[] = {
  NSPAIR(_ZN3ccc7DD3x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y8E[];
extern void _ZN3ccc7DD3x5y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y83efgEv,_ZTv0_n16_N3ccc7DD3x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y83efgEv,_ZThn4_N3ccc7DD3x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD3x5y83abcEv,_ZTv0_n20_N3ccc7DD3x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y83abcEv,_ZThn4_N3ccc7DD3x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y83efgEv,_ZTv0_n16_N3ccc7DD3x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD3x5y83abcEv,_ZTv0_n20_N3ccc7DD3x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y8E[] = {
  {&(_ZTVN3ccc7DD3x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y8E[];
static VTBL_ENTRY alt_thunk_names1464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD3x5y83abcEv,_ZTv0_n20_N3ccc7DD3x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y83abcEv,_ZThn4_N3ccc7DD3x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y83efgEv,_ZTv0_n16_N3ccc7DD3x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y83efgEv,_ZThn4_N3ccc7DD3x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y8E = {  "_ZN3ccc7DD3x5y8E", // class name
  bases__ZN3ccc7DD3x5y8E, 2,
  &(vtc__ZN3ccc7DD3x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1464,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y9  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y93pqrEv
  ~CC3x5y9(); // tgen
  CC3x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y9E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y93efgEv");}
void  ccc::CC3x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y93pqrEv");}
ccc::CC3x5y9 ::~CC3x5y9(){ note_dtor("_ZN3ccc7CC3x5y9E", this);} // tgen
ccc::CC3x5y9 ::CC3x5y9(){ note_ctor("_ZN3ccc7CC3x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y9E, buf);
    ::ccc::CC3x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC3x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y9E);
    dp->::ccc::CC3x5y9::~CC3x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y9E(Test__ZN3ccc7CC3x5y9E, "_ZN3ccc7CC3x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y9C1Ev();
extern void _ZN3ccc7CC3x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y9E[] = {
  NSPAIR(_ZN3ccc7CC3x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y9E[];
extern void _ZN3ccc7CC3x5y93pqrEv();
extern void _ZN3ccc7CC3x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x5y93efgEv,_ZTv0_n12_N3ccc7CC3x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y93efgEv,_ZThn4_N3ccc7CC3x5y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x5y93pqrEv,_ZTv0_n16_N3ccc7CC3x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y93pqrEv,_ZThn4_N3ccc7CC3x5y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x5y93efgEv,_ZTv0_n12_N3ccc7CC3x5y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x5y93pqrEv,_ZTv0_n16_N3ccc7CC3x5y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x5y9E[] = {
  {&(_ZTVN3ccc7CC3x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x5y9E[];
static VTBL_ENTRY alt_thunk_names1465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x5y93pqrEv,_ZTv0_n16_N3ccc7CC3x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y93pqrEv,_ZThn4_N3ccc7CC3x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x5y93efgEv,_ZTv0_n12_N3ccc7CC3x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x5y93efgEv,_ZThn4_N3ccc7CC3x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x5y9E = {  "_ZN3ccc7CC3x5y9E", // class name
  bases__ZN3ccc7CC3x5y9E, 2,
  &(vtc__ZN3ccc7CC3x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x5y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1465,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y9  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD3x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x5y93pqrEv
  ~DD3x5y9(); // tgen
  DD3x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x5y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x5y93efgEv");}
void  ccc::DD3x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x5y93pqrEv");}
ccc::DD3x5y9 ::~DD3x5y9(){ note_dtor("_ZN3ccc7DD3x5y9E", this);} // tgen
ccc::DD3x5y9 ::DD3x5y9(){ note_ctor("_ZN3ccc7DD3x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x5y9E, buf);
    ::ccc::DD3x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x5y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD3x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x5y9E);
    dp->::ccc::DD3x5y9::~DD3x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x5y9E(Test__ZN3ccc7DD3x5y9E, "_ZN3ccc7DD3x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x5y9C1Ev();
extern void _ZN3ccc7DD3x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x5y9E[] = {
  NSPAIR(_ZN3ccc7DD3x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD3x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y9E[];
extern void _ZN3ccc7DD3x5y93efgEv();
extern void _ZN3ccc7DD3x5y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x5y93pqrEv,_ZTv0_n12_N3ccc7DD3x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y93pqrEv,_ZThn4_N3ccc7DD3x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x5y93efgEv,_ZTv0_n16_N3ccc7DD3x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x5y93efgEv,_ZThn4_N3ccc7DD3x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x5y93pqrEv,_ZTv0_n12_N3ccc7DD3x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x5y93efgEv,_ZTv0_n16_N3ccc7DD3x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x5y9E[] = {
  {&(_ZTVN3ccc7DD3x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD3x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x5y9E[];
static VTBL_ENTRY alt_thunk_names1466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x5y93efgEv,_ZTv0_n16_N3ccc7DD3x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y93efgEv,_ZThn4_N3ccc7DD3x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x5y93pqrEv,_ZTv0_n12_N3ccc7DD3x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x5y93pqrEv,_ZThn4_N3ccc7DD3x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x5y9E = {  "_ZN3ccc7DD3x5y9E", // class name
  bases__ZN3ccc7DD3x5y9E, 2,
  &(vtc__ZN3ccc7DD3x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x5y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1466,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y10  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x5y103abcEv
  ~CC3x5y10(); // tgen
  CC3x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y10E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y103pqrEv");}
void  ccc::CC3x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x5y103abcEv");}
ccc::CC3x5y10 ::~CC3x5y10(){ note_dtor("_ZN3ccc8CC3x5y10E", this);} // tgen
ccc::CC3x5y10 ::CC3x5y10(){ note_ctor("_ZN3ccc8CC3x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y10E, buf);
    ::ccc::CC3x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y10E);
    dp->::ccc::CC3x5y10::~CC3x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y10E(Test__ZN3ccc8CC3x5y10E, "_ZN3ccc8CC3x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y10C1Ev();
extern void _ZN3ccc8CC3x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y10E[] = {
  NSPAIR(_ZN3ccc8CC3x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y10E[];
extern void _ZN3ccc8CC3x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC3x5y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x5y103pqrEv,_ZTv0_n16_N3ccc8CC3x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y103pqrEv,_ZThn4_N3ccc8CC3x5y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x5y103abcEv,_ZTv0_n20_N3ccc8CC3x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y103abcEv,_ZThn4_N3ccc8CC3x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x5y103pqrEv,_ZTv0_n16_N3ccc8CC3x5y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x5y103abcEv,_ZTv0_n20_N3ccc8CC3x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y10E[] = {
  {&(_ZTVN3ccc8CC3x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y10E[];
static VTBL_ENTRY alt_thunk_names1467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x5y103abcEv,_ZTv0_n20_N3ccc8CC3x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y103abcEv,_ZThn4_N3ccc8CC3x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x5y103pqrEv,_ZTv0_n16_N3ccc8CC3x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y103pqrEv,_ZThn4_N3ccc8CC3x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x5y10E = {  "_ZN3ccc8CC3x5y10E", // class name
  bases__ZN3ccc8CC3x5y10E, 2,
  &(vtc__ZN3ccc8CC3x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1467,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y10  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD3x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x5y103abcEv
  ~DD3x5y10(); // tgen
  DD3x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x5y103pqrEv");}
void  ccc::DD3x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x5y103abcEv");}
ccc::DD3x5y10 ::~DD3x5y10(){ note_dtor("_ZN3ccc8DD3x5y10E", this);} // tgen
ccc::DD3x5y10 ::DD3x5y10(){ note_ctor("_ZN3ccc8DD3x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y10E, buf);
    ::ccc::DD3x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y10E);
    dp->::ccc::DD3x5y10::~DD3x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y10E(Test__ZN3ccc8DD3x5y10E, "_ZN3ccc8DD3x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y10C1Ev();
extern void _ZN3ccc8DD3x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y10E[] = {
  NSPAIR(_ZN3ccc8DD3x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x5y103pqrEv();
extern void _ZN3ccc8DD3x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x5y103pqrEv,_ZTv0_n12_N3ccc8DD3x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y103pqrEv,_ZThn4_N3ccc8DD3x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x5y103abcEv,_ZTv0_n20_N3ccc8DD3x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y103abcEv,_ZThn4_N3ccc8DD3x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x5y103pqrEv,_ZTv0_n12_N3ccc8DD3x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x5y103abcEv,_ZTv0_n20_N3ccc8DD3x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y10E[] = {
  {&(_ZTVN3ccc8DD3x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y10E[];
static VTBL_ENTRY alt_thunk_names1468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x5y103abcEv,_ZTv0_n20_N3ccc8DD3x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y103abcEv,_ZThn4_N3ccc8DD3x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x5y103pqrEv,_ZTv0_n12_N3ccc8DD3x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y103pqrEv,_ZThn4_N3ccc8DD3x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x5y10E = {  "_ZN3ccc8DD3x5y10E", // class name
  bases__ZN3ccc8DD3x5y10E, 2,
  &(vtc__ZN3ccc8DD3x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1468,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y11  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x5y113efgEv
  ~CC3x5y11(); // tgen
  CC3x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y11E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y113pqrEv");}
void  ccc::CC3x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x5y113efgEv");}
ccc::CC3x5y11 ::~CC3x5y11(){ note_dtor("_ZN3ccc8CC3x5y11E", this);} // tgen
ccc::CC3x5y11 ::CC3x5y11(){ note_ctor("_ZN3ccc8CC3x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y11E, buf);
    ::ccc::CC3x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y11E);
    dp->::ccc::CC3x5y11::~CC3x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y11E(Test__ZN3ccc8CC3x5y11E, "_ZN3ccc8CC3x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y11C1Ev();
extern void _ZN3ccc8CC3x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y11E[] = {
  NSPAIR(_ZN3ccc8CC3x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y11E[];
extern void _ZN3ccc8CC3x5y113pqrEv();
extern void _ZN3ccc8CC3x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x5y113efgEv,_ZTv0_n12_N3ccc8CC3x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y113efgEv,_ZThn4_N3ccc8CC3x5y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x5y113pqrEv,_ZTv0_n16_N3ccc8CC3x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y113pqrEv,_ZThn4_N3ccc8CC3x5y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x5y113efgEv,_ZTv0_n12_N3ccc8CC3x5y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x5y113pqrEv,_ZTv0_n16_N3ccc8CC3x5y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y11E[] = {
  {&(_ZTVN3ccc8CC3x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y11E[];
static VTBL_ENTRY alt_thunk_names1469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x5y113pqrEv,_ZTv0_n16_N3ccc8CC3x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y113pqrEv,_ZThn4_N3ccc8CC3x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x5y113efgEv,_ZTv0_n12_N3ccc8CC3x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y113efgEv,_ZThn4_N3ccc8CC3x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x5y11E = {  "_ZN3ccc8CC3x5y11E", // class name
  bases__ZN3ccc8CC3x5y11E, 2,
  &(vtc__ZN3ccc8CC3x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1469,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y11  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD3x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x5y113efgEv
  ~DD3x5y11(); // tgen
  DD3x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x5y113pqrEv");}
void  ccc::DD3x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x5y113efgEv");}
ccc::DD3x5y11 ::~DD3x5y11(){ note_dtor("_ZN3ccc8DD3x5y11E", this);} // tgen
ccc::DD3x5y11 ::DD3x5y11(){ note_ctor("_ZN3ccc8DD3x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y11E, buf);
    ::ccc::DD3x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y11E);
    dp->::ccc::DD3x5y11::~DD3x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y11E(Test__ZN3ccc8DD3x5y11E, "_ZN3ccc8DD3x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y11C1Ev();
extern void _ZN3ccc8DD3x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y11E[] = {
  NSPAIR(_ZN3ccc8DD3x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y11E[];
extern void _ZN3ccc8DD3x5y113efgEv();
extern void _ZN3ccc8DD3x5y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x5y113pqrEv,_ZTv0_n12_N3ccc8DD3x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y113pqrEv,_ZThn4_N3ccc8DD3x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x5y113efgEv,_ZTv0_n16_N3ccc8DD3x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y113efgEv,_ZThn4_N3ccc8DD3x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x5y113pqrEv,_ZTv0_n12_N3ccc8DD3x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x5y113efgEv,_ZTv0_n16_N3ccc8DD3x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y11E[] = {
  {&(_ZTVN3ccc8DD3x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y11E[];
static VTBL_ENTRY alt_thunk_names1470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x5y113efgEv,_ZTv0_n16_N3ccc8DD3x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y113efgEv,_ZThn4_N3ccc8DD3x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x5y113pqrEv,_ZTv0_n12_N3ccc8DD3x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y113pqrEv,_ZThn4_N3ccc8DD3x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x5y11E = {  "_ZN3ccc8DD3x5y11E", // class name
  bases__ZN3ccc8DD3x5y11E, 2,
  &(vtc__ZN3ccc8DD3x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1470,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y12  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC3x5y123abcEv
  ~CC3x5y12(); // tgen
  CC3x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x5y123abcEv");}
ccc::CC3x5y12 ::~CC3x5y12(){ note_dtor("_ZN3ccc8CC3x5y12E", this);} // tgen
ccc::CC3x5y12 ::CC3x5y12(){ note_ctor("_ZN3ccc8CC3x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y12E, buf);
    ::ccc::CC3x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y12E);
    dp->::ccc::CC3x5y12::~CC3x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y12E(Test__ZN3ccc8CC3x5y12E, "_ZN3ccc8CC3x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y12C1Ev();
extern void _ZN3ccc8CC3x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y12E[] = {
  NSPAIR(_ZN3ccc8CC3x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC3x5y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x5y123abcEv,_ZTv0_n20_N3ccc8CC3x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y123abcEv,_ZThn4_N3ccc8CC3x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x5y123abcEv,_ZTv0_n20_N3ccc8CC3x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y12E[] = {
  {&(_ZTVN3ccc8CC3x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y12E[];
static VTBL_ENTRY alt_thunk_names1471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x5y123abcEv,_ZTv0_n20_N3ccc8CC3x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y123abcEv,_ZThn4_N3ccc8CC3x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x5y12E = {  "_ZN3ccc8CC3x5y12E", // class name
  bases__ZN3ccc8CC3x5y12E, 2,
  &(vtc__ZN3ccc8CC3x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1471,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y12  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD3x5y123abcEv
  ~DD3x5y12(); // tgen
  DD3x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD3x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x5y123abcEv");}
ccc::DD3x5y12 ::~DD3x5y12(){ note_dtor("_ZN3ccc8DD3x5y12E", this);} // tgen
ccc::DD3x5y12 ::DD3x5y12(){ note_ctor("_ZN3ccc8DD3x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y12E, buf);
    ::ccc::DD3x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y12E);
    dp->::ccc::DD3x5y12::~DD3x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y12E(Test__ZN3ccc8DD3x5y12E, "_ZN3ccc8DD3x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y12C1Ev();
extern void _ZN3ccc8DD3x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y12E[] = {
  NSPAIR(_ZN3ccc8DD3x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD3x5y123abcEv,_ZTv0_n20_N3ccc8DD3x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y123abcEv,_ZThn4_N3ccc8DD3x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD3x5y123abcEv,_ZTv0_n20_N3ccc8DD3x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y12E[] = {
  {&(_ZTVN3ccc8DD3x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y12E[];
static VTBL_ENTRY alt_thunk_names1472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD3x5y123abcEv,_ZTv0_n20_N3ccc8DD3x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y123abcEv,_ZThn4_N3ccc8DD3x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x5y12E = {  "_ZN3ccc8DD3x5y12E", // class name
  bases__ZN3ccc8DD3x5y12E, 2,
  &(vtc__ZN3ccc8DD3x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1472,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y13  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC3x5y133efgEv
  ~CC3x5y13(); // tgen
  CC3x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x5y133efgEv");}
ccc::CC3x5y13 ::~CC3x5y13(){ note_dtor("_ZN3ccc8CC3x5y13E", this);} // tgen
ccc::CC3x5y13 ::CC3x5y13(){ note_ctor("_ZN3ccc8CC3x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y13E, buf);
    ::ccc::CC3x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y13E);
    dp->::ccc::CC3x5y13::~CC3x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y13E(Test__ZN3ccc8CC3x5y13E, "_ZN3ccc8CC3x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y13C1Ev();
extern void _ZN3ccc8CC3x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y13E[] = {
  NSPAIR(_ZN3ccc8CC3x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC3x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x5y133efgEv,_ZTv0_n12_N3ccc8CC3x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y133efgEv,_ZThn4_N3ccc8CC3x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x5y133efgEv,_ZTv0_n12_N3ccc8CC3x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y13E[] = {
  {&(_ZTVN3ccc8CC3x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y13E[];
static VTBL_ENTRY alt_thunk_names1473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x5y133efgEv,_ZTv0_n12_N3ccc8CC3x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y133efgEv,_ZThn4_N3ccc8CC3x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x5y13E = {  "_ZN3ccc8CC3x5y13E", // class name
  bases__ZN3ccc8CC3x5y13E, 2,
  &(vtc__ZN3ccc8CC3x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1473,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y13  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD3x5y133efgEv
  ~DD3x5y13(); // tgen
  DD3x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD3x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x5y133efgEv");}
ccc::DD3x5y13 ::~DD3x5y13(){ note_dtor("_ZN3ccc8DD3x5y13E", this);} // tgen
ccc::DD3x5y13 ::DD3x5y13(){ note_ctor("_ZN3ccc8DD3x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y13E, buf);
    ::ccc::DD3x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y13E);
    dp->::ccc::DD3x5y13::~DD3x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y13E(Test__ZN3ccc8DD3x5y13E, "_ZN3ccc8DD3x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y13C1Ev();
extern void _ZN3ccc8DD3x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y13E[] = {
  NSPAIR(_ZN3ccc8DD3x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y13E[];
extern void _ZN3ccc8DD3x5y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x5y133efgEv,_ZTv0_n16_N3ccc8DD3x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y133efgEv,_ZThn4_N3ccc8DD3x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x5y133efgEv,_ZTv0_n16_N3ccc8DD3x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y13E[] = {
  {&(_ZTVN3ccc8DD3x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y13E[];
static VTBL_ENTRY alt_thunk_names1474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x5y133efgEv,_ZTv0_n16_N3ccc8DD3x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y133efgEv,_ZThn4_N3ccc8DD3x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x5y13E = {  "_ZN3ccc8DD3x5y13E", // class name
  bases__ZN3ccc8DD3x5y13E, 2,
  &(vtc__ZN3ccc8DD3x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1474,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y14  : virtual ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y143pqrEv
  ~CC3x5y14(); // tgen
  CC3x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y143pqrEv");}
ccc::CC3x5y14 ::~CC3x5y14(){ note_dtor("_ZN3ccc8CC3x5y14E", this);} // tgen
ccc::CC3x5y14 ::CC3x5y14(){ note_ctor("_ZN3ccc8CC3x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y14E, buf);
    ::ccc::CC3x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y14E);
    dp->::ccc::CC3x5y14::~CC3x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y14E(Test__ZN3ccc8CC3x5y14E, "_ZN3ccc8CC3x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y14C1Ev();
extern void _ZN3ccc8CC3x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y14E[] = {
  NSPAIR(_ZN3ccc8CC3x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y14E[];
extern void _ZN3ccc8CC3x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x5y143pqrEv,_ZTv0_n16_N3ccc8CC3x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y143pqrEv,_ZThn4_N3ccc8CC3x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x5y143pqrEv,_ZTv0_n16_N3ccc8CC3x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y14E[] = {
  {&(_ZTVN3ccc8CC3x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y14E[];
static VTBL_ENTRY alt_thunk_names1475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x5y143pqrEv,_ZTv0_n16_N3ccc8CC3x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x5y143pqrEv,_ZThn4_N3ccc8CC3x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x5y14E = {  "_ZN3ccc8CC3x5y14E", // class name
  bases__ZN3ccc8CC3x5y14E, 2,
  &(vtc__ZN3ccc8CC3x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1475,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y14  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD3x5y143pqrEv
  ~DD3x5y14(); // tgen
  DD3x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x5y143pqrEv");}
ccc::DD3x5y14 ::~DD3x5y14(){ note_dtor("_ZN3ccc8DD3x5y14E", this);} // tgen
ccc::DD3x5y14 ::DD3x5y14(){ note_ctor("_ZN3ccc8DD3x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y14E, buf);
    ::ccc::DD3x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y14E);
    dp->::ccc::DD3x5y14::~DD3x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y14E(Test__ZN3ccc8DD3x5y14E, "_ZN3ccc8DD3x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y14C1Ev();
extern void _ZN3ccc8DD3x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y14E[] = {
  NSPAIR(_ZN3ccc8DD3x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x5y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x5y143pqrEv,_ZTv0_n12_N3ccc8DD3x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x5y143pqrEv,_ZThn4_N3ccc8DD3x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x5y143pqrEv,_ZTv0_n12_N3ccc8DD3x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y14E[] = {
  {&(_ZTVN3ccc8DD3x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y14E[];
static VTBL_ENTRY alt_thunk_names1476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x5y143pqrEv,_ZTv0_n12_N3ccc8DD3x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x5y143pqrEv,_ZThn4_N3ccc8DD3x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x5y14E = {  "_ZN3ccc8DD3x5y14E", // class name
  bases__ZN3ccc8DD3x5y14E, 2,
  &(vtc__ZN3ccc8DD3x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1476,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y15  : virtual ::ccc::AA3 , ::ccc::BB5 {
  ~CC3x5y15(); // tgen
  CC3x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x5y15 ::~CC3x5y15(){ note_dtor("_ZN3ccc8CC3x5y15E", this);} // tgen
ccc::CC3x5y15 ::CC3x5y15(){ note_ctor("_ZN3ccc8CC3x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y15E, buf);
    ::ccc::CC3x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC3x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y15E);
    dp->::ccc::CC3x5y15::~CC3x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y15E(Test__ZN3ccc8CC3x5y15E, "_ZN3ccc8CC3x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y15C1Ev();
extern void _ZN3ccc8CC3x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y15E[] = {
  NSPAIR(_ZN3ccc8CC3x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x5y15E[] = {
  {&(_ZTVN3ccc8CC3x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x5y15E[];
Class_Descriptor cd__ZN3ccc8CC3x5y15E = {  "_ZN3ccc8CC3x5y15E", // class name
  bases__ZN3ccc8CC3x5y15E, 2,
  &(vtc__ZN3ccc8CC3x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x5y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x5y15  : virtual ::ccc::AA3 , virtual ::ccc::BB5 {
  ~DD3x5y15(); // tgen
  DD3x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD3x5y15 ::~DD3x5y15(){ note_dtor("_ZN3ccc8DD3x5y15E", this);} // tgen
ccc::DD3x5y15 ::DD3x5y15(){ note_ctor("_ZN3ccc8DD3x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x5y15E, buf);
    ::ccc::DD3x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x5y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD3x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x5y15E);
    dp->::ccc::DD3x5y15::~DD3x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x5y15E(Test__ZN3ccc8DD3x5y15E, "_ZN3ccc8DD3x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x5y15C1Ev();
extern void _ZN3ccc8DD3x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x5y15E[] = {
  NSPAIR(_ZN3ccc8DD3x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD3x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x5y15E[] = {
  {&(_ZTVN3ccc8DD3x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD3x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x5y15E[];
Class_Descriptor cd__ZN3ccc8DD3x5y15E = {  "_ZN3ccc8DD3x5y15E", // class name
  bases__ZN3ccc8DD3x5y15E, 2,
  &(vtc__ZN3ccc8DD3x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x5y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y0  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y03pqrEv
  ~CC3x6y0(); // tgen
  CC3x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y0E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y03abcEv");}
void  ccc::CC3x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y03efgEv");}
void  ccc::CC3x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y03pqrEv");}
ccc::CC3x6y0 ::~CC3x6y0(){ note_dtor("_ZN3ccc7CC3x6y0E", this);} // tgen
ccc::CC3x6y0 ::CC3x6y0(){ note_ctor("_ZN3ccc7CC3x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y0E, buf);
    ::ccc::CC3x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y0E);
    dp->::ccc::CC3x6y0::~CC3x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y0E(Test__ZN3ccc7CC3x6y0E, "_ZN3ccc7CC3x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y0C1Ev();
extern void _ZN3ccc7CC3x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y0E[] = {
  NSPAIR(_ZN3ccc7CC3x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y0E[];
extern void _ZN3ccc7CC3x6y03abcEv();
extern void _ZN3ccc7CC3x6y03efgEv();
extern void _ZN3ccc7CC3x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y03efgEv,_ZTv0_n12_N3ccc7CC3x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y03efgEv,_ZThn4_N3ccc7CC3x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y03pqrEv,_ZTv0_n16_N3ccc7CC3x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y03pqrEv,_ZThn4_N3ccc7CC3x6y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y03abcEv,_ZTv0_n20_N3ccc7CC3x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y03abcEv,_ZThn4_N3ccc7CC3x6y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y03efgEv,_ZTv0_n12_N3ccc7CC3x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y03pqrEv,_ZTv0_n16_N3ccc7CC3x6y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y03abcEv,_ZTv0_n20_N3ccc7CC3x6y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y0E[] = {
  {&(_ZTVN3ccc7CC3x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y0E[];
static VTBL_ENTRY alt_thunk_names1477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y03abcEv,_ZTv0_n20_N3ccc7CC3x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y03abcEv,_ZThn4_N3ccc7CC3x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y03pqrEv,_ZTv0_n16_N3ccc7CC3x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y03pqrEv,_ZThn4_N3ccc7CC3x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y03efgEv,_ZTv0_n12_N3ccc7CC3x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y03efgEv,_ZThn4_N3ccc7CC3x6y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y0E = {  "_ZN3ccc7CC3x6y0E", // class name
  bases__ZN3ccc7CC3x6y0E, 2,
  &(vtc__ZN3ccc7CC3x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1477,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y0  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD3x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y03pqrEv
  ~DD3x6y0(); // tgen
  DD3x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y03abcEv");}
void  ccc::DD3x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y03efgEv");}
void  ccc::DD3x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y03pqrEv");}
ccc::DD3x6y0 ::~DD3x6y0(){ note_dtor("_ZN3ccc7DD3x6y0E", this);} // tgen
ccc::DD3x6y0 ::DD3x6y0(){ note_ctor("_ZN3ccc7DD3x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y0E, buf);
    ::ccc::DD3x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y0E);
    dp->::ccc::DD3x6y0::~DD3x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y0E(Test__ZN3ccc7DD3x6y0E, "_ZN3ccc7DD3x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y0C1Ev();
extern void _ZN3ccc7DD3x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y0E[] = {
  NSPAIR(_ZN3ccc7DD3x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y0E[];
extern void _ZN3ccc7DD3x6y03efgEv();
extern void _ZN3ccc7DD3x6y03pqrEv();
extern void _ZN3ccc7DD3x6y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y03abcEv,_ZTv0_n12_N3ccc7DD3x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y03abcEv,_ZThn4_N3ccc7DD3x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y03efgEv,_ZTv0_n16_N3ccc7DD3x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y03efgEv,_ZThn4_N3ccc7DD3x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y03abcEv,_ZTv0_n12_N3ccc7DD3x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y03efgEv,_ZTv0_n16_N3ccc7DD3x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y0E[] = {
  {&(_ZTVN3ccc7DD3x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y0E[];
static VTBL_ENTRY alt_thunk_names1478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y03efgEv,_ZTv0_n16_N3ccc7DD3x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y03efgEv,_ZThn4_N3ccc7DD3x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y03abcEv,_ZTv0_n12_N3ccc7DD3x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y03abcEv,_ZThn4_N3ccc7DD3x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y0E = {  "_ZN3ccc7DD3x6y0E", // class name
  bases__ZN3ccc7DD3x6y0E, 2,
  &(vtc__ZN3ccc7DD3x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1478,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y1  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x6y13efgEv
  ~CC3x6y1(); // tgen
  CC3x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y1E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y13abcEv");}
void  ccc::CC3x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y13pqrEv");}
void  ccc::CC3x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y13efgEv");}
ccc::CC3x6y1 ::~CC3x6y1(){ note_dtor("_ZN3ccc7CC3x6y1E", this);} // tgen
ccc::CC3x6y1 ::CC3x6y1(){ note_ctor("_ZN3ccc7CC3x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y1E, buf);
    ::ccc::CC3x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y1E);
    dp->::ccc::CC3x6y1::~CC3x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y1E(Test__ZN3ccc7CC3x6y1E, "_ZN3ccc7CC3x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y1C1Ev();
extern void _ZN3ccc7CC3x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y1E[] = {
  NSPAIR(_ZN3ccc7CC3x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y1E[];
extern void _ZN3ccc7CC3x6y13abcEv();
extern void _ZN3ccc7CC3x6y13efgEv();
extern void _ZN3ccc7CC3x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y13efgEv,_ZTv0_n12_N3ccc7CC3x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y13efgEv,_ZThn4_N3ccc7CC3x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y13pqrEv,_ZTv0_n16_N3ccc7CC3x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y13pqrEv,_ZThn4_N3ccc7CC3x6y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y13abcEv,_ZTv0_n20_N3ccc7CC3x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y13abcEv,_ZThn4_N3ccc7CC3x6y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y13efgEv,_ZTv0_n12_N3ccc7CC3x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y13pqrEv,_ZTv0_n16_N3ccc7CC3x6y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y13abcEv,_ZTv0_n20_N3ccc7CC3x6y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y1E[] = {
  {&(_ZTVN3ccc7CC3x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y1E[];
static VTBL_ENTRY alt_thunk_names1479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y13abcEv,_ZTv0_n20_N3ccc7CC3x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y13abcEv,_ZThn4_N3ccc7CC3x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y13pqrEv,_ZTv0_n16_N3ccc7CC3x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y13pqrEv,_ZThn4_N3ccc7CC3x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y13efgEv,_ZTv0_n12_N3ccc7CC3x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y13efgEv,_ZThn4_N3ccc7CC3x6y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y1E = {  "_ZN3ccc7CC3x6y1E", // class name
  bases__ZN3ccc7CC3x6y1E, 2,
  &(vtc__ZN3ccc7CC3x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1479,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y1  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD3x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x6y13efgEv
  ~DD3x6y1(); // tgen
  DD3x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y13abcEv");}
void  ccc::DD3x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y13pqrEv");}
void  ccc::DD3x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y13efgEv");}
ccc::DD3x6y1 ::~DD3x6y1(){ note_dtor("_ZN3ccc7DD3x6y1E", this);} // tgen
ccc::DD3x6y1 ::DD3x6y1(){ note_ctor("_ZN3ccc7DD3x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y1E, buf);
    ::ccc::DD3x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y1E);
    dp->::ccc::DD3x6y1::~DD3x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y1E(Test__ZN3ccc7DD3x6y1E, "_ZN3ccc7DD3x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y1C1Ev();
extern void _ZN3ccc7DD3x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y1E[] = {
  NSPAIR(_ZN3ccc7DD3x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y1E[];
extern void _ZN3ccc7DD3x6y13efgEv();
extern void _ZN3ccc7DD3x6y13pqrEv();
extern void _ZN3ccc7DD3x6y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y13abcEv,_ZTv0_n12_N3ccc7DD3x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y13abcEv,_ZThn4_N3ccc7DD3x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y13efgEv,_ZTv0_n16_N3ccc7DD3x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y13efgEv,_ZThn4_N3ccc7DD3x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y13abcEv,_ZTv0_n12_N3ccc7DD3x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y13efgEv,_ZTv0_n16_N3ccc7DD3x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y1E[] = {
  {&(_ZTVN3ccc7DD3x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y1E[];
static VTBL_ENTRY alt_thunk_names1480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y13efgEv,_ZTv0_n16_N3ccc7DD3x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y13efgEv,_ZThn4_N3ccc7DD3x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y13abcEv,_ZTv0_n12_N3ccc7DD3x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y13abcEv,_ZThn4_N3ccc7DD3x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y1E = {  "_ZN3ccc7DD3x6y1E", // class name
  bases__ZN3ccc7DD3x6y1E, 2,
  &(vtc__ZN3ccc7DD3x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1480,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y2  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y23pqrEv
  ~CC3x6y2(); // tgen
  CC3x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y2E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y23efgEv");}
void  ccc::CC3x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y23abcEv");}
void  ccc::CC3x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y23pqrEv");}
ccc::CC3x6y2 ::~CC3x6y2(){ note_dtor("_ZN3ccc7CC3x6y2E", this);} // tgen
ccc::CC3x6y2 ::CC3x6y2(){ note_ctor("_ZN3ccc7CC3x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y2E, buf);
    ::ccc::CC3x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y2E);
    dp->::ccc::CC3x6y2::~CC3x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y2E(Test__ZN3ccc7CC3x6y2E, "_ZN3ccc7CC3x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y2C1Ev();
extern void _ZN3ccc7CC3x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y2E[] = {
  NSPAIR(_ZN3ccc7CC3x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y2E[];
extern void _ZN3ccc7CC3x6y23abcEv();
extern void _ZN3ccc7CC3x6y23efgEv();
extern void _ZN3ccc7CC3x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y23efgEv,_ZTv0_n12_N3ccc7CC3x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y23efgEv,_ZThn4_N3ccc7CC3x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y23pqrEv,_ZTv0_n16_N3ccc7CC3x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y23pqrEv,_ZThn4_N3ccc7CC3x6y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y23abcEv,_ZTv0_n20_N3ccc7CC3x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y23abcEv,_ZThn4_N3ccc7CC3x6y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y23efgEv,_ZTv0_n12_N3ccc7CC3x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y23pqrEv,_ZTv0_n16_N3ccc7CC3x6y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y23abcEv,_ZTv0_n20_N3ccc7CC3x6y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y2E[] = {
  {&(_ZTVN3ccc7CC3x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y2E[];
static VTBL_ENTRY alt_thunk_names1481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y23abcEv,_ZTv0_n20_N3ccc7CC3x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y23abcEv,_ZThn4_N3ccc7CC3x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y23pqrEv,_ZTv0_n16_N3ccc7CC3x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y23pqrEv,_ZThn4_N3ccc7CC3x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y23efgEv,_ZTv0_n12_N3ccc7CC3x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y23efgEv,_ZThn4_N3ccc7CC3x6y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y2E = {  "_ZN3ccc7CC3x6y2E", // class name
  bases__ZN3ccc7CC3x6y2E, 2,
  &(vtc__ZN3ccc7CC3x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1481,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y2  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD3x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y23pqrEv
  ~DD3x6y2(); // tgen
  DD3x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y23efgEv");}
void  ccc::DD3x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y23abcEv");}
void  ccc::DD3x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y23pqrEv");}
ccc::DD3x6y2 ::~DD3x6y2(){ note_dtor("_ZN3ccc7DD3x6y2E", this);} // tgen
ccc::DD3x6y2 ::DD3x6y2(){ note_ctor("_ZN3ccc7DD3x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y2E, buf);
    ::ccc::DD3x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y2E);
    dp->::ccc::DD3x6y2::~DD3x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y2E(Test__ZN3ccc7DD3x6y2E, "_ZN3ccc7DD3x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y2C1Ev();
extern void _ZN3ccc7DD3x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y2E[] = {
  NSPAIR(_ZN3ccc7DD3x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y2E[];
extern void _ZN3ccc7DD3x6y23efgEv();
extern void _ZN3ccc7DD3x6y23pqrEv();
extern void _ZN3ccc7DD3x6y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y23abcEv,_ZTv0_n12_N3ccc7DD3x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y23abcEv,_ZThn4_N3ccc7DD3x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y23efgEv,_ZTv0_n16_N3ccc7DD3x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y23efgEv,_ZThn4_N3ccc7DD3x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y23abcEv,_ZTv0_n12_N3ccc7DD3x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y23efgEv,_ZTv0_n16_N3ccc7DD3x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y2E[] = {
  {&(_ZTVN3ccc7DD3x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y2E[];
static VTBL_ENTRY alt_thunk_names1482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y23efgEv,_ZTv0_n16_N3ccc7DD3x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y23efgEv,_ZThn4_N3ccc7DD3x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y23abcEv,_ZTv0_n12_N3ccc7DD3x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y23abcEv,_ZThn4_N3ccc7DD3x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y2E = {  "_ZN3ccc7DD3x6y2E", // class name
  bases__ZN3ccc7DD3x6y2E, 2,
  &(vtc__ZN3ccc7DD3x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1482,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y3  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x6y33abcEv
  ~CC3x6y3(); // tgen
  CC3x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y3E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y33efgEv");}
void  ccc::CC3x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y33pqrEv");}
void  ccc::CC3x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y33abcEv");}
ccc::CC3x6y3 ::~CC3x6y3(){ note_dtor("_ZN3ccc7CC3x6y3E", this);} // tgen
ccc::CC3x6y3 ::CC3x6y3(){ note_ctor("_ZN3ccc7CC3x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y3E, buf);
    ::ccc::CC3x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y3E);
    dp->::ccc::CC3x6y3::~CC3x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y3E(Test__ZN3ccc7CC3x6y3E, "_ZN3ccc7CC3x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y3C1Ev();
extern void _ZN3ccc7CC3x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y3E[] = {
  NSPAIR(_ZN3ccc7CC3x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y3E[];
extern void _ZN3ccc7CC3x6y33abcEv();
extern void _ZN3ccc7CC3x6y33efgEv();
extern void _ZN3ccc7CC3x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y33efgEv,_ZTv0_n12_N3ccc7CC3x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y33efgEv,_ZThn4_N3ccc7CC3x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y33pqrEv,_ZTv0_n16_N3ccc7CC3x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y33pqrEv,_ZThn4_N3ccc7CC3x6y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y33abcEv,_ZTv0_n20_N3ccc7CC3x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y33abcEv,_ZThn4_N3ccc7CC3x6y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y33efgEv,_ZTv0_n12_N3ccc7CC3x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y33pqrEv,_ZTv0_n16_N3ccc7CC3x6y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y33abcEv,_ZTv0_n20_N3ccc7CC3x6y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y3E[] = {
  {&(_ZTVN3ccc7CC3x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y3E[];
static VTBL_ENTRY alt_thunk_names1483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y33abcEv,_ZTv0_n20_N3ccc7CC3x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y33abcEv,_ZThn4_N3ccc7CC3x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y33pqrEv,_ZTv0_n16_N3ccc7CC3x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y33pqrEv,_ZThn4_N3ccc7CC3x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y33efgEv,_ZTv0_n12_N3ccc7CC3x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y33efgEv,_ZThn4_N3ccc7CC3x6y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y3E = {  "_ZN3ccc7CC3x6y3E", // class name
  bases__ZN3ccc7CC3x6y3E, 2,
  &(vtc__ZN3ccc7CC3x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1483,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y3  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD3x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x6y33abcEv
  ~DD3x6y3(); // tgen
  DD3x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y33efgEv");}
void  ccc::DD3x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y33pqrEv");}
void  ccc::DD3x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y33abcEv");}
ccc::DD3x6y3 ::~DD3x6y3(){ note_dtor("_ZN3ccc7DD3x6y3E", this);} // tgen
ccc::DD3x6y3 ::DD3x6y3(){ note_ctor("_ZN3ccc7DD3x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y3E, buf);
    ::ccc::DD3x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y3E);
    dp->::ccc::DD3x6y3::~DD3x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y3E(Test__ZN3ccc7DD3x6y3E, "_ZN3ccc7DD3x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y3C1Ev();
extern void _ZN3ccc7DD3x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y3E[] = {
  NSPAIR(_ZN3ccc7DD3x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y3E[];
extern void _ZN3ccc7DD3x6y33efgEv();
extern void _ZN3ccc7DD3x6y33pqrEv();
extern void _ZN3ccc7DD3x6y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y33abcEv,_ZTv0_n12_N3ccc7DD3x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y33abcEv,_ZThn4_N3ccc7DD3x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y33efgEv,_ZTv0_n16_N3ccc7DD3x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y33efgEv,_ZThn4_N3ccc7DD3x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y33abcEv,_ZTv0_n12_N3ccc7DD3x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y33efgEv,_ZTv0_n16_N3ccc7DD3x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y3E[] = {
  {&(_ZTVN3ccc7DD3x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y3E[];
static VTBL_ENTRY alt_thunk_names1484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y33efgEv,_ZTv0_n16_N3ccc7DD3x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y33efgEv,_ZThn4_N3ccc7DD3x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y33abcEv,_ZTv0_n12_N3ccc7DD3x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y33abcEv,_ZThn4_N3ccc7DD3x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y3E = {  "_ZN3ccc7DD3x6y3E", // class name
  bases__ZN3ccc7DD3x6y3E, 2,
  &(vtc__ZN3ccc7DD3x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1484,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y4  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC3x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y43efgEv
  ~CC3x6y4(); // tgen
  CC3x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y4E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y43pqrEv");}
void  ccc::CC3x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y43abcEv");}
void  ccc::CC3x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y43efgEv");}
ccc::CC3x6y4 ::~CC3x6y4(){ note_dtor("_ZN3ccc7CC3x6y4E", this);} // tgen
ccc::CC3x6y4 ::CC3x6y4(){ note_ctor("_ZN3ccc7CC3x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y4E, buf);
    ::ccc::CC3x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y4E);
    dp->::ccc::CC3x6y4::~CC3x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y4E(Test__ZN3ccc7CC3x6y4E, "_ZN3ccc7CC3x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y4C1Ev();
extern void _ZN3ccc7CC3x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y4E[] = {
  NSPAIR(_ZN3ccc7CC3x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y4E[];
extern void _ZN3ccc7CC3x6y43abcEv();
extern void _ZN3ccc7CC3x6y43efgEv();
extern void _ZN3ccc7CC3x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y43efgEv,_ZTv0_n12_N3ccc7CC3x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y43efgEv,_ZThn4_N3ccc7CC3x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y43pqrEv,_ZTv0_n16_N3ccc7CC3x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y43pqrEv,_ZThn4_N3ccc7CC3x6y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y43abcEv,_ZTv0_n20_N3ccc7CC3x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y43abcEv,_ZThn4_N3ccc7CC3x6y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y43efgEv,_ZTv0_n12_N3ccc7CC3x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y43pqrEv,_ZTv0_n16_N3ccc7CC3x6y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y43abcEv,_ZTv0_n20_N3ccc7CC3x6y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y4E[] = {
  {&(_ZTVN3ccc7CC3x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y4E[];
static VTBL_ENTRY alt_thunk_names1485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y43abcEv,_ZTv0_n20_N3ccc7CC3x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y43abcEv,_ZThn4_N3ccc7CC3x6y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y43pqrEv,_ZTv0_n16_N3ccc7CC3x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y43pqrEv,_ZThn4_N3ccc7CC3x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y43efgEv,_ZTv0_n12_N3ccc7CC3x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y43efgEv,_ZThn4_N3ccc7CC3x6y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y4E = {  "_ZN3ccc7CC3x6y4E", // class name
  bases__ZN3ccc7CC3x6y4E, 2,
  &(vtc__ZN3ccc7CC3x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1485,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y4  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD3x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x6y43efgEv
  ~DD3x6y4(); // tgen
  DD3x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y43pqrEv");}
void  ccc::DD3x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y43abcEv");}
void  ccc::DD3x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y43efgEv");}
ccc::DD3x6y4 ::~DD3x6y4(){ note_dtor("_ZN3ccc7DD3x6y4E", this);} // tgen
ccc::DD3x6y4 ::DD3x6y4(){ note_ctor("_ZN3ccc7DD3x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y4E, buf);
    ::ccc::DD3x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y4E);
    dp->::ccc::DD3x6y4::~DD3x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y4E(Test__ZN3ccc7DD3x6y4E, "_ZN3ccc7DD3x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y4C1Ev();
extern void _ZN3ccc7DD3x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y4E[] = {
  NSPAIR(_ZN3ccc7DD3x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y4E[];
extern void _ZN3ccc7DD3x6y43efgEv();
extern void _ZN3ccc7DD3x6y43pqrEv();
extern void _ZN3ccc7DD3x6y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y43abcEv,_ZTv0_n12_N3ccc7DD3x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y43abcEv,_ZThn4_N3ccc7DD3x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y43efgEv,_ZTv0_n16_N3ccc7DD3x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y43efgEv,_ZThn4_N3ccc7DD3x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y43abcEv,_ZTv0_n12_N3ccc7DD3x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y43efgEv,_ZTv0_n16_N3ccc7DD3x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y4E[] = {
  {&(_ZTVN3ccc7DD3x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y4E[];
static VTBL_ENTRY alt_thunk_names1486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y43efgEv,_ZTv0_n16_N3ccc7DD3x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y43efgEv,_ZThn4_N3ccc7DD3x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y43abcEv,_ZTv0_n12_N3ccc7DD3x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y43abcEv,_ZThn4_N3ccc7DD3x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y4E = {  "_ZN3ccc7DD3x6y4E", // class name
  bases__ZN3ccc7DD3x6y4E, 2,
  &(vtc__ZN3ccc7DD3x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1486,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y5  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC3x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y53abcEv
  ~CC3x6y5(); // tgen
  CC3x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y5E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y53pqrEv");}
void  ccc::CC3x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y53efgEv");}
void  ccc::CC3x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y53abcEv");}
ccc::CC3x6y5 ::~CC3x6y5(){ note_dtor("_ZN3ccc7CC3x6y5E", this);} // tgen
ccc::CC3x6y5 ::CC3x6y5(){ note_ctor("_ZN3ccc7CC3x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y5E, buf);
    ::ccc::CC3x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y5E);
    dp->::ccc::CC3x6y5::~CC3x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y5E(Test__ZN3ccc7CC3x6y5E, "_ZN3ccc7CC3x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y5C1Ev();
extern void _ZN3ccc7CC3x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y5E[] = {
  NSPAIR(_ZN3ccc7CC3x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y5E[];
extern void _ZN3ccc7CC3x6y53abcEv();
extern void _ZN3ccc7CC3x6y53efgEv();
extern void _ZN3ccc7CC3x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y53efgEv,_ZTv0_n12_N3ccc7CC3x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y53efgEv,_ZThn4_N3ccc7CC3x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y53pqrEv,_ZTv0_n16_N3ccc7CC3x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y53pqrEv,_ZThn4_N3ccc7CC3x6y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y53abcEv,_ZTv0_n20_N3ccc7CC3x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y53abcEv,_ZThn4_N3ccc7CC3x6y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y53efgEv,_ZTv0_n12_N3ccc7CC3x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y53pqrEv,_ZTv0_n16_N3ccc7CC3x6y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y53abcEv,_ZTv0_n20_N3ccc7CC3x6y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y5E[] = {
  {&(_ZTVN3ccc7CC3x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y5E[];
static VTBL_ENTRY alt_thunk_names1487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y53abcEv,_ZTv0_n20_N3ccc7CC3x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y53abcEv,_ZThn4_N3ccc7CC3x6y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y53pqrEv,_ZTv0_n16_N3ccc7CC3x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y53pqrEv,_ZThn4_N3ccc7CC3x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y53efgEv,_ZTv0_n12_N3ccc7CC3x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y53efgEv,_ZThn4_N3ccc7CC3x6y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y5E = {  "_ZN3ccc7CC3x6y5E", // class name
  bases__ZN3ccc7CC3x6y5E, 2,
  &(vtc__ZN3ccc7CC3x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1487,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y5  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD3x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x6y53abcEv
  ~DD3x6y5(); // tgen
  DD3x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y53pqrEv");}
void  ccc::DD3x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y53efgEv");}
void  ccc::DD3x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y53abcEv");}
ccc::DD3x6y5 ::~DD3x6y5(){ note_dtor("_ZN3ccc7DD3x6y5E", this);} // tgen
ccc::DD3x6y5 ::DD3x6y5(){ note_ctor("_ZN3ccc7DD3x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y5E, buf);
    ::ccc::DD3x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y5E);
    dp->::ccc::DD3x6y5::~DD3x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y5E(Test__ZN3ccc7DD3x6y5E, "_ZN3ccc7DD3x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y5C1Ev();
extern void _ZN3ccc7DD3x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y5E[] = {
  NSPAIR(_ZN3ccc7DD3x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y5E[];
extern void _ZN3ccc7DD3x6y53efgEv();
extern void _ZN3ccc7DD3x6y53pqrEv();
extern void _ZN3ccc7DD3x6y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y53abcEv,_ZTv0_n12_N3ccc7DD3x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y53abcEv,_ZThn4_N3ccc7DD3x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y53efgEv,_ZTv0_n16_N3ccc7DD3x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y53efgEv,_ZThn4_N3ccc7DD3x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y53abcEv,_ZTv0_n12_N3ccc7DD3x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y53efgEv,_ZTv0_n16_N3ccc7DD3x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y5E[] = {
  {&(_ZTVN3ccc7DD3x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y5E[];
static VTBL_ENTRY alt_thunk_names1488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y53efgEv,_ZTv0_n16_N3ccc7DD3x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y53efgEv,_ZThn4_N3ccc7DD3x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y53abcEv,_ZTv0_n12_N3ccc7DD3x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y53abcEv,_ZThn4_N3ccc7DD3x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y5E = {  "_ZN3ccc7DD3x6y5E", // class name
  bases__ZN3ccc7DD3x6y5E, 2,
  &(vtc__ZN3ccc7DD3x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1488,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y6  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y63efgEv
  ~CC3x6y6(); // tgen
  CC3x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y6E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y63abcEv");}
void  ccc::CC3x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y63efgEv");}
ccc::CC3x6y6 ::~CC3x6y6(){ note_dtor("_ZN3ccc7CC3x6y6E", this);} // tgen
ccc::CC3x6y6 ::CC3x6y6(){ note_ctor("_ZN3ccc7CC3x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y6E, buf);
    ::ccc::CC3x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y6E);
    dp->::ccc::CC3x6y6::~CC3x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y6E(Test__ZN3ccc7CC3x6y6E, "_ZN3ccc7CC3x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y6C1Ev();
extern void _ZN3ccc7CC3x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y6E[] = {
  NSPAIR(_ZN3ccc7CC3x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y6E[];
extern void _ZN3ccc7CC3x6y63abcEv();
extern void _ZN3ccc7CC3x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y63efgEv,_ZTv0_n12_N3ccc7CC3x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y63efgEv,_ZThn4_N3ccc7CC3x6y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y63abcEv,_ZTv0_n20_N3ccc7CC3x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y63abcEv,_ZThn4_N3ccc7CC3x6y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y63efgEv,_ZTv0_n12_N3ccc7CC3x6y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y63abcEv,_ZTv0_n20_N3ccc7CC3x6y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y6E[] = {
  {&(_ZTVN3ccc7CC3x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y6E[];
static VTBL_ENTRY alt_thunk_names1489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y63abcEv,_ZTv0_n20_N3ccc7CC3x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y63abcEv,_ZThn4_N3ccc7CC3x6y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y63efgEv,_ZTv0_n12_N3ccc7CC3x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y63efgEv,_ZThn4_N3ccc7CC3x6y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y6E = {  "_ZN3ccc7CC3x6y6E", // class name
  bases__ZN3ccc7CC3x6y6E, 2,
  &(vtc__ZN3ccc7CC3x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1489,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y6  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD3x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x6y63efgEv
  ~DD3x6y6(); // tgen
  DD3x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y63abcEv");}
void  ccc::DD3x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y63efgEv");}
ccc::DD3x6y6 ::~DD3x6y6(){ note_dtor("_ZN3ccc7DD3x6y6E", this);} // tgen
ccc::DD3x6y6 ::DD3x6y6(){ note_ctor("_ZN3ccc7DD3x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y6E, buf);
    ::ccc::DD3x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y6E);
    dp->::ccc::DD3x6y6::~DD3x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y6E(Test__ZN3ccc7DD3x6y6E, "_ZN3ccc7DD3x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y6C1Ev();
extern void _ZN3ccc7DD3x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y6E[] = {
  NSPAIR(_ZN3ccc7DD3x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y6E[];
extern void _ZN3ccc7DD3x6y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x6y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y63abcEv,_ZTv0_n12_N3ccc7DD3x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y63abcEv,_ZThn4_N3ccc7DD3x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y63efgEv,_ZTv0_n16_N3ccc7DD3x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y63efgEv,_ZThn4_N3ccc7DD3x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y63abcEv,_ZTv0_n12_N3ccc7DD3x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y63efgEv,_ZTv0_n16_N3ccc7DD3x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y6E[] = {
  {&(_ZTVN3ccc7DD3x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y6E[];
static VTBL_ENTRY alt_thunk_names1490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y63efgEv,_ZTv0_n16_N3ccc7DD3x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y63efgEv,_ZThn4_N3ccc7DD3x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y63abcEv,_ZTv0_n12_N3ccc7DD3x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y63abcEv,_ZThn4_N3ccc7DD3x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y6E = {  "_ZN3ccc7DD3x6y6E", // class name
  bases__ZN3ccc7DD3x6y6E, 2,
  &(vtc__ZN3ccc7DD3x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1490,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y7  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y73pqrEv
  ~CC3x6y7(); // tgen
  CC3x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y7E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y73abcEv");}
void  ccc::CC3x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y73pqrEv");}
ccc::CC3x6y7 ::~CC3x6y7(){ note_dtor("_ZN3ccc7CC3x6y7E", this);} // tgen
ccc::CC3x6y7 ::CC3x6y7(){ note_ctor("_ZN3ccc7CC3x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y7E, buf);
    ::ccc::CC3x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y7E);
    dp->::ccc::CC3x6y7::~CC3x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y7E(Test__ZN3ccc7CC3x6y7E, "_ZN3ccc7CC3x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y7C1Ev();
extern void _ZN3ccc7CC3x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y7E[] = {
  NSPAIR(_ZN3ccc7CC3x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y7E[];
extern void _ZN3ccc7CC3x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC3x6y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y73pqrEv,_ZTv0_n16_N3ccc7CC3x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y73pqrEv,_ZThn4_N3ccc7CC3x6y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y73abcEv,_ZTv0_n20_N3ccc7CC3x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y73abcEv,_ZThn4_N3ccc7CC3x6y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y73pqrEv,_ZTv0_n16_N3ccc7CC3x6y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y73abcEv,_ZTv0_n20_N3ccc7CC3x6y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y7E[] = {
  {&(_ZTVN3ccc7CC3x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y7E[];
static VTBL_ENTRY alt_thunk_names1491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y73abcEv,_ZTv0_n20_N3ccc7CC3x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y73abcEv,_ZThn4_N3ccc7CC3x6y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y73pqrEv,_ZTv0_n16_N3ccc7CC3x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y73pqrEv,_ZThn4_N3ccc7CC3x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y7E = {  "_ZN3ccc7CC3x6y7E", // class name
  bases__ZN3ccc7CC3x6y7E, 2,
  &(vtc__ZN3ccc7CC3x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1491,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y7  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD3x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y73pqrEv
  ~DD3x6y7(); // tgen
  DD3x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y73abcEv");}
void  ccc::DD3x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y73pqrEv");}
ccc::DD3x6y7 ::~DD3x6y7(){ note_dtor("_ZN3ccc7DD3x6y7E", this);} // tgen
ccc::DD3x6y7 ::DD3x6y7(){ note_ctor("_ZN3ccc7DD3x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y7E, buf);
    ::ccc::DD3x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y7E);
    dp->::ccc::DD3x6y7::~DD3x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y7E(Test__ZN3ccc7DD3x6y7E, "_ZN3ccc7DD3x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y7C1Ev();
extern void _ZN3ccc7DD3x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y7E[] = {
  NSPAIR(_ZN3ccc7DD3x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x6y73pqrEv();
extern void _ZN3ccc7DD3x6y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y73abcEv,_ZTv0_n12_N3ccc7DD3x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y73abcEv,_ZThn4_N3ccc7DD3x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y73abcEv,_ZTv0_n12_N3ccc7DD3x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y7E[] = {
  {&(_ZTVN3ccc7DD3x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y7E[];
static VTBL_ENTRY alt_thunk_names1492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y73abcEv,_ZTv0_n12_N3ccc7DD3x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y73abcEv,_ZThn4_N3ccc7DD3x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y7E = {  "_ZN3ccc7DD3x6y7E", // class name
  bases__ZN3ccc7DD3x6y7E, 2,
  &(vtc__ZN3ccc7DD3x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1492,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y8  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y83abcEv
  ~CC3x6y8(); // tgen
  CC3x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y8E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y83efgEv");}
void  ccc::CC3x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y83abcEv");}
ccc::CC3x6y8 ::~CC3x6y8(){ note_dtor("_ZN3ccc7CC3x6y8E", this);} // tgen
ccc::CC3x6y8 ::CC3x6y8(){ note_ctor("_ZN3ccc7CC3x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y8E, buf);
    ::ccc::CC3x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y8E);
    dp->::ccc::CC3x6y8::~CC3x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y8E(Test__ZN3ccc7CC3x6y8E, "_ZN3ccc7CC3x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y8C1Ev();
extern void _ZN3ccc7CC3x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y8E[] = {
  NSPAIR(_ZN3ccc7CC3x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y8E[];
extern void _ZN3ccc7CC3x6y83abcEv();
extern void _ZN3ccc7CC3x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y83efgEv,_ZTv0_n12_N3ccc7CC3x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y83efgEv,_ZThn4_N3ccc7CC3x6y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x6y83abcEv,_ZTv0_n20_N3ccc7CC3x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y83abcEv,_ZThn4_N3ccc7CC3x6y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y83efgEv,_ZTv0_n12_N3ccc7CC3x6y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x6y83abcEv,_ZTv0_n20_N3ccc7CC3x6y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y8E[] = {
  {&(_ZTVN3ccc7CC3x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y8E[];
static VTBL_ENTRY alt_thunk_names1493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x6y83abcEv,_ZTv0_n20_N3ccc7CC3x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y83abcEv,_ZThn4_N3ccc7CC3x6y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y83efgEv,_ZTv0_n12_N3ccc7CC3x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y83efgEv,_ZThn4_N3ccc7CC3x6y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y8E = {  "_ZN3ccc7CC3x6y8E", // class name
  bases__ZN3ccc7CC3x6y8E, 2,
  &(vtc__ZN3ccc7CC3x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1493,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y8  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD3x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x6y83abcEv
  ~DD3x6y8(); // tgen
  DD3x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y83efgEv");}
void  ccc::DD3x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x6y83abcEv");}
ccc::DD3x6y8 ::~DD3x6y8(){ note_dtor("_ZN3ccc7DD3x6y8E", this);} // tgen
ccc::DD3x6y8 ::DD3x6y8(){ note_ctor("_ZN3ccc7DD3x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y8E, buf);
    ::ccc::DD3x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y8E);
    dp->::ccc::DD3x6y8::~DD3x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y8E(Test__ZN3ccc7DD3x6y8E, "_ZN3ccc7DD3x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y8C1Ev();
extern void _ZN3ccc7DD3x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y8E[] = {
  NSPAIR(_ZN3ccc7DD3x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y8E[];
extern void _ZN3ccc7DD3x6y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x6y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x6y83abcEv,_ZTv0_n12_N3ccc7DD3x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y83abcEv,_ZThn4_N3ccc7DD3x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y83efgEv,_ZTv0_n16_N3ccc7DD3x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y83efgEv,_ZThn4_N3ccc7DD3x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x6y83abcEv,_ZTv0_n12_N3ccc7DD3x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y83efgEv,_ZTv0_n16_N3ccc7DD3x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y8E[] = {
  {&(_ZTVN3ccc7DD3x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y8E[];
static VTBL_ENTRY alt_thunk_names1494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y83efgEv,_ZTv0_n16_N3ccc7DD3x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y83efgEv,_ZThn4_N3ccc7DD3x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x6y83abcEv,_ZTv0_n12_N3ccc7DD3x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y83abcEv,_ZThn4_N3ccc7DD3x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y8E = {  "_ZN3ccc7DD3x6y8E", // class name
  bases__ZN3ccc7DD3x6y8E, 2,
  &(vtc__ZN3ccc7DD3x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1494,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y9  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y93pqrEv
  ~CC3x6y9(); // tgen
  CC3x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y9E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y93efgEv");}
void  ccc::CC3x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y93pqrEv");}
ccc::CC3x6y9 ::~CC3x6y9(){ note_dtor("_ZN3ccc7CC3x6y9E", this);} // tgen
ccc::CC3x6y9 ::CC3x6y9(){ note_ctor("_ZN3ccc7CC3x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y9E, buf);
    ::ccc::CC3x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC3x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y9E);
    dp->::ccc::CC3x6y9::~CC3x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y9E(Test__ZN3ccc7CC3x6y9E, "_ZN3ccc7CC3x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y9C1Ev();
extern void _ZN3ccc7CC3x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y9E[] = {
  NSPAIR(_ZN3ccc7CC3x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC3x6y93efgEv();
extern void _ZN3ccc7CC3x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x6y93efgEv,_ZTv0_n12_N3ccc7CC3x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y93efgEv,_ZThn4_N3ccc7CC3x6y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x6y93pqrEv,_ZTv0_n16_N3ccc7CC3x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y93pqrEv,_ZThn4_N3ccc7CC3x6y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x6y93efgEv,_ZTv0_n12_N3ccc7CC3x6y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x6y93pqrEv,_ZTv0_n16_N3ccc7CC3x6y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x6y9E[] = {
  {&(_ZTVN3ccc7CC3x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x6y9E[];
static VTBL_ENTRY alt_thunk_names1495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x6y93pqrEv,_ZTv0_n16_N3ccc7CC3x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y93pqrEv,_ZThn4_N3ccc7CC3x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x6y93efgEv,_ZTv0_n12_N3ccc7CC3x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x6y93efgEv,_ZThn4_N3ccc7CC3x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x6y9E = {  "_ZN3ccc7CC3x6y9E", // class name
  bases__ZN3ccc7CC3x6y9E, 2,
  &(vtc__ZN3ccc7CC3x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x6y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1495,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y9  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD3x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x6y93pqrEv
  ~DD3x6y9(); // tgen
  DD3x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x6y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x6y93efgEv");}
void  ccc::DD3x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x6y93pqrEv");}
ccc::DD3x6y9 ::~DD3x6y9(){ note_dtor("_ZN3ccc7DD3x6y9E", this);} // tgen
ccc::DD3x6y9 ::DD3x6y9(){ note_ctor("_ZN3ccc7DD3x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x6y9E, buf);
    ::ccc::DD3x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x6y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD3x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x6y9E);
    dp->::ccc::DD3x6y9::~DD3x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x6y9E(Test__ZN3ccc7DD3x6y9E, "_ZN3ccc7DD3x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x6y9C1Ev();
extern void _ZN3ccc7DD3x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x6y9E[] = {
  NSPAIR(_ZN3ccc7DD3x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD3x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y9E[];
extern void _ZN3ccc7DD3x6y93efgEv();
extern void _ZN3ccc7DD3x6y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x6y93efgEv,_ZTv0_n16_N3ccc7DD3x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x6y93efgEv,_ZThn4_N3ccc7DD3x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x6y93efgEv,_ZTv0_n16_N3ccc7DD3x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x6y9E[] = {
  {&(_ZTVN3ccc7DD3x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x6y9E[];
static VTBL_ENTRY alt_thunk_names1496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x6y93efgEv,_ZTv0_n16_N3ccc7DD3x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x6y93efgEv,_ZThn4_N3ccc7DD3x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x6y9E = {  "_ZN3ccc7DD3x6y9E", // class name
  bases__ZN3ccc7DD3x6y9E, 2,
  &(vtc__ZN3ccc7DD3x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x6y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1496,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y10  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x6y103abcEv
  ~CC3x6y10(); // tgen
  CC3x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y10E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y103pqrEv");}
void  ccc::CC3x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x6y103abcEv");}
ccc::CC3x6y10 ::~CC3x6y10(){ note_dtor("_ZN3ccc8CC3x6y10E", this);} // tgen
ccc::CC3x6y10 ::CC3x6y10(){ note_ctor("_ZN3ccc8CC3x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y10E, buf);
    ::ccc::CC3x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y10E);
    dp->::ccc::CC3x6y10::~CC3x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y10E(Test__ZN3ccc8CC3x6y10E, "_ZN3ccc8CC3x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y10C1Ev();
extern void _ZN3ccc8CC3x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y10E[] = {
  NSPAIR(_ZN3ccc8CC3x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y10E[];
extern void _ZN3ccc8CC3x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC3x6y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x6y103pqrEv,_ZTv0_n16_N3ccc8CC3x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y103pqrEv,_ZThn4_N3ccc8CC3x6y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x6y103abcEv,_ZTv0_n20_N3ccc8CC3x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y103abcEv,_ZThn4_N3ccc8CC3x6y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x6y103pqrEv,_ZTv0_n16_N3ccc8CC3x6y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x6y103abcEv,_ZTv0_n20_N3ccc8CC3x6y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y10E[] = {
  {&(_ZTVN3ccc8CC3x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y10E[];
static VTBL_ENTRY alt_thunk_names1497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x6y103abcEv,_ZTv0_n20_N3ccc8CC3x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y103abcEv,_ZThn4_N3ccc8CC3x6y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x6y103pqrEv,_ZTv0_n16_N3ccc8CC3x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y103pqrEv,_ZThn4_N3ccc8CC3x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x6y10E = {  "_ZN3ccc8CC3x6y10E", // class name
  bases__ZN3ccc8CC3x6y10E, 2,
  &(vtc__ZN3ccc8CC3x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1497,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y10  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD3x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x6y103abcEv
  ~DD3x6y10(); // tgen
  DD3x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x6y103pqrEv");}
void  ccc::DD3x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x6y103abcEv");}
ccc::DD3x6y10 ::~DD3x6y10(){ note_dtor("_ZN3ccc8DD3x6y10E", this);} // tgen
ccc::DD3x6y10 ::DD3x6y10(){ note_ctor("_ZN3ccc8DD3x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y10E, buf);
    ::ccc::DD3x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y10E);
    dp->::ccc::DD3x6y10::~DD3x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y10E(Test__ZN3ccc8DD3x6y10E, "_ZN3ccc8DD3x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y10C1Ev();
extern void _ZN3ccc8DD3x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y10E[] = {
  NSPAIR(_ZN3ccc8DD3x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x6y103pqrEv();
extern void _ZN3ccc8DD3x6y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x6y103abcEv,_ZTv0_n12_N3ccc8DD3x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x6y103abcEv,_ZThn4_N3ccc8DD3x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x6y103abcEv,_ZTv0_n12_N3ccc8DD3x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y10E[] = {
  {&(_ZTVN3ccc8DD3x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y10E[];
static VTBL_ENTRY alt_thunk_names1498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x6y103abcEv,_ZTv0_n12_N3ccc8DD3x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x6y103abcEv,_ZThn4_N3ccc8DD3x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x6y10E = {  "_ZN3ccc8DD3x6y10E", // class name
  bases__ZN3ccc8DD3x6y10E, 2,
  &(vtc__ZN3ccc8DD3x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1498,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y11  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x6y113efgEv
  ~CC3x6y11(); // tgen
  CC3x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y11E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y113pqrEv");}
void  ccc::CC3x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x6y113efgEv");}
ccc::CC3x6y11 ::~CC3x6y11(){ note_dtor("_ZN3ccc8CC3x6y11E", this);} // tgen
ccc::CC3x6y11 ::CC3x6y11(){ note_ctor("_ZN3ccc8CC3x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y11E, buf);
    ::ccc::CC3x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y11E);
    dp->::ccc::CC3x6y11::~CC3x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y11E(Test__ZN3ccc8CC3x6y11E, "_ZN3ccc8CC3x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y11C1Ev();
extern void _ZN3ccc8CC3x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y11E[] = {
  NSPAIR(_ZN3ccc8CC3x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC3x6y113efgEv();
extern void _ZN3ccc8CC3x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x6y113efgEv,_ZTv0_n12_N3ccc8CC3x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y113efgEv,_ZThn4_N3ccc8CC3x6y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x6y113pqrEv,_ZTv0_n16_N3ccc8CC3x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y113pqrEv,_ZThn4_N3ccc8CC3x6y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x6y113efgEv,_ZTv0_n12_N3ccc8CC3x6y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x6y113pqrEv,_ZTv0_n16_N3ccc8CC3x6y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y11E[] = {
  {&(_ZTVN3ccc8CC3x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y11E[];
static VTBL_ENTRY alt_thunk_names1499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x6y113pqrEv,_ZTv0_n16_N3ccc8CC3x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y113pqrEv,_ZThn4_N3ccc8CC3x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x6y113efgEv,_ZTv0_n12_N3ccc8CC3x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y113efgEv,_ZThn4_N3ccc8CC3x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x6y11E = {  "_ZN3ccc8CC3x6y11E", // class name
  bases__ZN3ccc8CC3x6y11E, 2,
  &(vtc__ZN3ccc8CC3x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1499,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y11  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD3x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x6y113efgEv
  ~DD3x6y11(); // tgen
  DD3x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x6y113pqrEv");}
void  ccc::DD3x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x6y113efgEv");}
ccc::DD3x6y11 ::~DD3x6y11(){ note_dtor("_ZN3ccc8DD3x6y11E", this);} // tgen
ccc::DD3x6y11 ::DD3x6y11(){ note_ctor("_ZN3ccc8DD3x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y11E, buf);
    ::ccc::DD3x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y11E);
    dp->::ccc::DD3x6y11::~DD3x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y11E(Test__ZN3ccc8DD3x6y11E, "_ZN3ccc8DD3x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y11C1Ev();
extern void _ZN3ccc8DD3x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y11E[] = {
  NSPAIR(_ZN3ccc8DD3x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y11E[];
extern void _ZN3ccc8DD3x6y113efgEv();
extern void _ZN3ccc8DD3x6y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x6y113efgEv,_ZTv0_n16_N3ccc8DD3x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x6y113efgEv,_ZThn4_N3ccc8DD3x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x6y113efgEv,_ZTv0_n16_N3ccc8DD3x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y11E[] = {
  {&(_ZTVN3ccc8DD3x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y11E[];
static VTBL_ENTRY alt_thunk_names1500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x6y113efgEv,_ZTv0_n16_N3ccc8DD3x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x6y113efgEv,_ZThn4_N3ccc8DD3x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x6y11E = {  "_ZN3ccc8DD3x6y11E", // class name
  bases__ZN3ccc8DD3x6y11E, 2,
  &(vtc__ZN3ccc8DD3x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1500,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y12  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC3x6y123abcEv
  ~CC3x6y12(); // tgen
  CC3x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x6y123abcEv");}
ccc::CC3x6y12 ::~CC3x6y12(){ note_dtor("_ZN3ccc8CC3x6y12E", this);} // tgen
ccc::CC3x6y12 ::CC3x6y12(){ note_ctor("_ZN3ccc8CC3x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y12E, buf);
    ::ccc::CC3x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y12E);
    dp->::ccc::CC3x6y12::~CC3x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y12E(Test__ZN3ccc8CC3x6y12E, "_ZN3ccc8CC3x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y12C1Ev();
extern void _ZN3ccc8CC3x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y12E[] = {
  NSPAIR(_ZN3ccc8CC3x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y12E[];
extern void _ZN3ccc8CC3x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x6y123abcEv,_ZTv0_n20_N3ccc8CC3x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y123abcEv,_ZThn4_N3ccc8CC3x6y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x6y123abcEv,_ZTv0_n20_N3ccc8CC3x6y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y12E[] = {
  {&(_ZTVN3ccc8CC3x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y12E[];
static VTBL_ENTRY alt_thunk_names1501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x6y123abcEv,_ZTv0_n20_N3ccc8CC3x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y123abcEv,_ZThn4_N3ccc8CC3x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x6y12E = {  "_ZN3ccc8CC3x6y12E", // class name
  bases__ZN3ccc8CC3x6y12E, 2,
  &(vtc__ZN3ccc8CC3x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1501,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y12  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD3x6y123abcEv
  ~DD3x6y12(); // tgen
  DD3x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x6y123abcEv");}
ccc::DD3x6y12 ::~DD3x6y12(){ note_dtor("_ZN3ccc8DD3x6y12E", this);} // tgen
ccc::DD3x6y12 ::DD3x6y12(){ note_ctor("_ZN3ccc8DD3x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y12E, buf);
    ::ccc::DD3x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y12E);
    dp->::ccc::DD3x6y12::~DD3x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y12E(Test__ZN3ccc8DD3x6y12E, "_ZN3ccc8DD3x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y12C1Ev();
extern void _ZN3ccc8DD3x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y12E[] = {
  NSPAIR(_ZN3ccc8DD3x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x6y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x6y123abcEv,_ZTv0_n12_N3ccc8DD3x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x6y123abcEv,_ZThn4_N3ccc8DD3x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x6y123abcEv,_ZTv0_n12_N3ccc8DD3x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y12E[] = {
  {&(_ZTVN3ccc8DD3x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y12E[];
static VTBL_ENTRY alt_thunk_names1502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x6y123abcEv,_ZTv0_n12_N3ccc8DD3x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x6y123abcEv,_ZThn4_N3ccc8DD3x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x6y12E = {  "_ZN3ccc8DD3x6y12E", // class name
  bases__ZN3ccc8DD3x6y12E, 2,
  &(vtc__ZN3ccc8DD3x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1502,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y13  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC3x6y133efgEv
  ~CC3x6y13(); // tgen
  CC3x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x6y133efgEv");}
ccc::CC3x6y13 ::~CC3x6y13(){ note_dtor("_ZN3ccc8CC3x6y13E", this);} // tgen
ccc::CC3x6y13 ::CC3x6y13(){ note_ctor("_ZN3ccc8CC3x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y13E, buf);
    ::ccc::CC3x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y13E);
    dp->::ccc::CC3x6y13::~CC3x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y13E(Test__ZN3ccc8CC3x6y13E, "_ZN3ccc8CC3x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y13C1Ev();
extern void _ZN3ccc8CC3x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y13E[] = {
  NSPAIR(_ZN3ccc8CC3x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC3x6y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x6y133efgEv,_ZTv0_n12_N3ccc8CC3x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y133efgEv,_ZThn4_N3ccc8CC3x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x6y133efgEv,_ZTv0_n12_N3ccc8CC3x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y13E[] = {
  {&(_ZTVN3ccc8CC3x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y13E[];
static VTBL_ENTRY alt_thunk_names1503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x6y133efgEv,_ZTv0_n12_N3ccc8CC3x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y133efgEv,_ZThn4_N3ccc8CC3x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x6y13E = {  "_ZN3ccc8CC3x6y13E", // class name
  bases__ZN3ccc8CC3x6y13E, 2,
  &(vtc__ZN3ccc8CC3x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1503,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y13  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD3x6y133efgEv
  ~DD3x6y13(); // tgen
  DD3x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x6y133efgEv");}
ccc::DD3x6y13 ::~DD3x6y13(){ note_dtor("_ZN3ccc8DD3x6y13E", this);} // tgen
ccc::DD3x6y13 ::DD3x6y13(){ note_ctor("_ZN3ccc8DD3x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y13E, buf);
    ::ccc::DD3x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y13E);
    dp->::ccc::DD3x6y13::~DD3x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y13E(Test__ZN3ccc8DD3x6y13E, "_ZN3ccc8DD3x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y13C1Ev();
extern void _ZN3ccc8DD3x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y13E[] = {
  NSPAIR(_ZN3ccc8DD3x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y13E[];
extern void _ZN3ccc8DD3x6y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x6y133efgEv,_ZTv0_n16_N3ccc8DD3x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x6y133efgEv,_ZThn4_N3ccc8DD3x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x6y133efgEv,_ZTv0_n16_N3ccc8DD3x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y13E[] = {
  {&(_ZTVN3ccc8DD3x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y13E[];
static VTBL_ENTRY alt_thunk_names1504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x6y133efgEv,_ZTv0_n16_N3ccc8DD3x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x6y133efgEv,_ZThn4_N3ccc8DD3x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x6y13E = {  "_ZN3ccc8DD3x6y13E", // class name
  bases__ZN3ccc8DD3x6y13E, 2,
  &(vtc__ZN3ccc8DD3x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1504,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y14  : virtual ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y143pqrEv
  ~CC3x6y14(); // tgen
  CC3x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y143pqrEv");}
ccc::CC3x6y14 ::~CC3x6y14(){ note_dtor("_ZN3ccc8CC3x6y14E", this);} // tgen
ccc::CC3x6y14 ::CC3x6y14(){ note_ctor("_ZN3ccc8CC3x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y14E, buf);
    ::ccc::CC3x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y14E);
    dp->::ccc::CC3x6y14::~CC3x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y14E(Test__ZN3ccc8CC3x6y14E, "_ZN3ccc8CC3x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y14C1Ev();
extern void _ZN3ccc8CC3x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y14E[] = {
  NSPAIR(_ZN3ccc8CC3x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC3x6y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x6y143pqrEv,_ZTv0_n16_N3ccc8CC3x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y143pqrEv,_ZThn4_N3ccc8CC3x6y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x6y143pqrEv,_ZTv0_n16_N3ccc8CC3x6y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y14E[] = {
  {&(_ZTVN3ccc8CC3x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y14E[];
static VTBL_ENTRY alt_thunk_names1505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x6y143pqrEv,_ZTv0_n16_N3ccc8CC3x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x6y143pqrEv,_ZThn4_N3ccc8CC3x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x6y14E = {  "_ZN3ccc8CC3x6y14E", // class name
  bases__ZN3ccc8CC3x6y14E, 2,
  &(vtc__ZN3ccc8CC3x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1505,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y14  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD3x6y143pqrEv
  ~DD3x6y14(); // tgen
  DD3x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x6y143pqrEv");}
ccc::DD3x6y14 ::~DD3x6y14(){ note_dtor("_ZN3ccc8DD3x6y14E", this);} // tgen
ccc::DD3x6y14 ::DD3x6y14(){ note_ctor("_ZN3ccc8DD3x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y14E, buf);
    ::ccc::DD3x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y14E);
    dp->::ccc::DD3x6y14::~DD3x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y14E(Test__ZN3ccc8DD3x6y14E, "_ZN3ccc8DD3x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y14C1Ev();
extern void _ZN3ccc8DD3x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y14E[] = {
  NSPAIR(_ZN3ccc8DD3x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x6y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y14E[] = {
  {&(_ZTVN3ccc8DD3x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y14E[];
Class_Descriptor cd__ZN3ccc8DD3x6y14E = {  "_ZN3ccc8DD3x6y14E", // class name
  bases__ZN3ccc8DD3x6y14E, 2,
  &(vtc__ZN3ccc8DD3x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y15  : virtual ::ccc::AA3 , ::ccc::BB6 {
  ~CC3x6y15(); // tgen
  CC3x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x6y15 ::~CC3x6y15(){ note_dtor("_ZN3ccc8CC3x6y15E", this);} // tgen
ccc::CC3x6y15 ::CC3x6y15(){ note_ctor("_ZN3ccc8CC3x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y15E, buf);
    ::ccc::CC3x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC3x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y15E);
    dp->::ccc::CC3x6y15::~CC3x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y15E(Test__ZN3ccc8CC3x6y15E, "_ZN3ccc8CC3x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y15C1Ev();
extern void _ZN3ccc8CC3x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y15E[] = {
  NSPAIR(_ZN3ccc8CC3x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x6y15E[] = {
  {&(_ZTVN3ccc8CC3x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x6y15E[];
Class_Descriptor cd__ZN3ccc8CC3x6y15E = {  "_ZN3ccc8CC3x6y15E", // class name
  bases__ZN3ccc8CC3x6y15E, 2,
  &(vtc__ZN3ccc8CC3x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x6y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x6y15  : virtual ::ccc::AA3 , virtual ::ccc::BB6 {
  ~DD3x6y15(); // tgen
  DD3x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x6y15 ::~DD3x6y15(){ note_dtor("_ZN3ccc8DD3x6y15E", this);} // tgen
ccc::DD3x6y15 ::DD3x6y15(){ note_ctor("_ZN3ccc8DD3x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x6y15E, buf);
    ::ccc::DD3x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x6y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD3x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x6y15E);
    dp->::ccc::DD3x6y15::~DD3x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x6y15E(Test__ZN3ccc8DD3x6y15E, "_ZN3ccc8DD3x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x6y15C1Ev();
extern void _ZN3ccc8DD3x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x6y15E[] = {
  NSPAIR(_ZN3ccc8DD3x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD3x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x6y15E[] = {
  {&(_ZTVN3ccc8DD3x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x6y15E[];
Class_Descriptor cd__ZN3ccc8DD3x6y15E = {  "_ZN3ccc8DD3x6y15E", // class name
  bases__ZN3ccc8DD3x6y15E, 2,
  &(vtc__ZN3ccc8DD3x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x6y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y0  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y03pqrEv
  ~CC3x7y0(); // tgen
  CC3x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y0E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y03abcEv");}
void  ccc::CC3x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y03efgEv");}
void  ccc::CC3x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y03pqrEv");}
ccc::CC3x7y0 ::~CC3x7y0(){ note_dtor("_ZN3ccc7CC3x7y0E", this);} // tgen
ccc::CC3x7y0 ::CC3x7y0(){ note_ctor("_ZN3ccc7CC3x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y0E, buf);
    ::ccc::CC3x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y0E);
    dp->::ccc::CC3x7y0::~CC3x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y0E(Test__ZN3ccc7CC3x7y0E, "_ZN3ccc7CC3x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y0C1Ev();
extern void _ZN3ccc7CC3x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y0E[] = {
  NSPAIR(_ZN3ccc7CC3x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y0E[];
extern void _ZN3ccc7CC3x7y03abcEv();
extern void _ZN3ccc7CC3x7y03pqrEv();
extern void _ZN3ccc7CC3x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y03efgEv,_ZTv0_n12_N3ccc7CC3x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y03efgEv,_ZThn4_N3ccc7CC3x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y03pqrEv,_ZTv0_n16_N3ccc7CC3x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y03pqrEv,_ZThn4_N3ccc7CC3x7y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y03abcEv,_ZTv0_n20_N3ccc7CC3x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y03abcEv,_ZThn4_N3ccc7CC3x7y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y03efgEv,_ZTv0_n12_N3ccc7CC3x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y03pqrEv,_ZTv0_n16_N3ccc7CC3x7y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y03abcEv,_ZTv0_n20_N3ccc7CC3x7y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y0E[] = {
  {&(_ZTVN3ccc7CC3x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y0E[];
static VTBL_ENTRY alt_thunk_names1506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y03abcEv,_ZTv0_n20_N3ccc7CC3x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y03abcEv,_ZThn4_N3ccc7CC3x7y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y03pqrEv,_ZTv0_n16_N3ccc7CC3x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y03pqrEv,_ZThn4_N3ccc7CC3x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y03efgEv,_ZTv0_n12_N3ccc7CC3x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y03efgEv,_ZThn4_N3ccc7CC3x7y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y0E = {  "_ZN3ccc7CC3x7y0E", // class name
  bases__ZN3ccc7CC3x7y0E, 2,
  &(vtc__ZN3ccc7CC3x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1506,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y0  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD3x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y03pqrEv
  ~DD3x7y0(); // tgen
  DD3x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y03abcEv");}
void  ccc::DD3x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y03efgEv");}
void  ccc::DD3x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y03pqrEv");}
ccc::DD3x7y0 ::~DD3x7y0(){ note_dtor("_ZN3ccc7DD3x7y0E", this);} // tgen
ccc::DD3x7y0 ::DD3x7y0(){ note_ctor("_ZN3ccc7DD3x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y0E, buf);
    ::ccc::DD3x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y0E);
    dp->::ccc::DD3x7y0::~DD3x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y0E(Test__ZN3ccc7DD3x7y0E, "_ZN3ccc7DD3x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y0C1Ev();
extern void _ZN3ccc7DD3x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y0E[] = {
  NSPAIR(_ZN3ccc7DD3x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y0E[];
extern void _ZN3ccc7DD3x7y03efgEv();
extern void _ZN3ccc7DD3x7y03pqrEv();
extern void _ZN3ccc7DD3x7y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y03abcEv,_ZTv0_n12_N3ccc7DD3x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y03abcEv,_ZThn4_N3ccc7DD3x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y03pqrEv,_ZTv0_n16_N3ccc7DD3x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y03pqrEv,_ZThn4_N3ccc7DD3x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y03abcEv,_ZTv0_n12_N3ccc7DD3x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y03pqrEv,_ZTv0_n16_N3ccc7DD3x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y0E[] = {
  {&(_ZTVN3ccc7DD3x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y0E[];
static VTBL_ENTRY alt_thunk_names1507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y03pqrEv,_ZTv0_n16_N3ccc7DD3x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y03pqrEv,_ZThn4_N3ccc7DD3x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y03abcEv,_ZTv0_n12_N3ccc7DD3x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y03abcEv,_ZThn4_N3ccc7DD3x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y0E = {  "_ZN3ccc7DD3x7y0E", // class name
  bases__ZN3ccc7DD3x7y0E, 2,
  &(vtc__ZN3ccc7DD3x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1507,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y1  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x7y13efgEv
  ~CC3x7y1(); // tgen
  CC3x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y1E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y13abcEv");}
void  ccc::CC3x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y13pqrEv");}
void  ccc::CC3x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y13efgEv");}
ccc::CC3x7y1 ::~CC3x7y1(){ note_dtor("_ZN3ccc7CC3x7y1E", this);} // tgen
ccc::CC3x7y1 ::CC3x7y1(){ note_ctor("_ZN3ccc7CC3x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y1E, buf);
    ::ccc::CC3x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y1E);
    dp->::ccc::CC3x7y1::~CC3x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y1E(Test__ZN3ccc7CC3x7y1E, "_ZN3ccc7CC3x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y1C1Ev();
extern void _ZN3ccc7CC3x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y1E[] = {
  NSPAIR(_ZN3ccc7CC3x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y1E[];
extern void _ZN3ccc7CC3x7y13abcEv();
extern void _ZN3ccc7CC3x7y13pqrEv();
extern void _ZN3ccc7CC3x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y13efgEv,_ZTv0_n12_N3ccc7CC3x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y13efgEv,_ZThn4_N3ccc7CC3x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y13pqrEv,_ZTv0_n16_N3ccc7CC3x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y13pqrEv,_ZThn4_N3ccc7CC3x7y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y13abcEv,_ZTv0_n20_N3ccc7CC3x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y13abcEv,_ZThn4_N3ccc7CC3x7y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y13efgEv,_ZTv0_n12_N3ccc7CC3x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y13pqrEv,_ZTv0_n16_N3ccc7CC3x7y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y13abcEv,_ZTv0_n20_N3ccc7CC3x7y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y1E[] = {
  {&(_ZTVN3ccc7CC3x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y1E[];
static VTBL_ENTRY alt_thunk_names1508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y13abcEv,_ZTv0_n20_N3ccc7CC3x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y13abcEv,_ZThn4_N3ccc7CC3x7y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y13pqrEv,_ZTv0_n16_N3ccc7CC3x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y13pqrEv,_ZThn4_N3ccc7CC3x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y13efgEv,_ZTv0_n12_N3ccc7CC3x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y13efgEv,_ZThn4_N3ccc7CC3x7y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y1E = {  "_ZN3ccc7CC3x7y1E", // class name
  bases__ZN3ccc7CC3x7y1E, 2,
  &(vtc__ZN3ccc7CC3x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1508,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y1  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD3x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x7y13efgEv
  ~DD3x7y1(); // tgen
  DD3x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y13abcEv");}
void  ccc::DD3x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y13pqrEv");}
void  ccc::DD3x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y13efgEv");}
ccc::DD3x7y1 ::~DD3x7y1(){ note_dtor("_ZN3ccc7DD3x7y1E", this);} // tgen
ccc::DD3x7y1 ::DD3x7y1(){ note_ctor("_ZN3ccc7DD3x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y1E, buf);
    ::ccc::DD3x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y1E);
    dp->::ccc::DD3x7y1::~DD3x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y1E(Test__ZN3ccc7DD3x7y1E, "_ZN3ccc7DD3x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y1C1Ev();
extern void _ZN3ccc7DD3x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y1E[] = {
  NSPAIR(_ZN3ccc7DD3x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y1E[];
extern void _ZN3ccc7DD3x7y13efgEv();
extern void _ZN3ccc7DD3x7y13pqrEv();
extern void _ZN3ccc7DD3x7y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y13abcEv,_ZTv0_n12_N3ccc7DD3x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y13abcEv,_ZThn4_N3ccc7DD3x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y13pqrEv,_ZTv0_n16_N3ccc7DD3x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y13pqrEv,_ZThn4_N3ccc7DD3x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y13abcEv,_ZTv0_n12_N3ccc7DD3x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y13pqrEv,_ZTv0_n16_N3ccc7DD3x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y1E[] = {
  {&(_ZTVN3ccc7DD3x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y1E[];
static VTBL_ENTRY alt_thunk_names1509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y13pqrEv,_ZTv0_n16_N3ccc7DD3x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y13pqrEv,_ZThn4_N3ccc7DD3x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y13abcEv,_ZTv0_n12_N3ccc7DD3x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y13abcEv,_ZThn4_N3ccc7DD3x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y1E = {  "_ZN3ccc7DD3x7y1E", // class name
  bases__ZN3ccc7DD3x7y1E, 2,
  &(vtc__ZN3ccc7DD3x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1509,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y2  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y23pqrEv
  ~CC3x7y2(); // tgen
  CC3x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y2E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y23efgEv");}
void  ccc::CC3x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y23abcEv");}
void  ccc::CC3x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y23pqrEv");}
ccc::CC3x7y2 ::~CC3x7y2(){ note_dtor("_ZN3ccc7CC3x7y2E", this);} // tgen
ccc::CC3x7y2 ::CC3x7y2(){ note_ctor("_ZN3ccc7CC3x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y2E, buf);
    ::ccc::CC3x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y2E);
    dp->::ccc::CC3x7y2::~CC3x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y2E(Test__ZN3ccc7CC3x7y2E, "_ZN3ccc7CC3x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y2C1Ev();
extern void _ZN3ccc7CC3x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y2E[] = {
  NSPAIR(_ZN3ccc7CC3x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y2E[];
extern void _ZN3ccc7CC3x7y23abcEv();
extern void _ZN3ccc7CC3x7y23pqrEv();
extern void _ZN3ccc7CC3x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y23efgEv,_ZTv0_n12_N3ccc7CC3x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y23efgEv,_ZThn4_N3ccc7CC3x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y23pqrEv,_ZTv0_n16_N3ccc7CC3x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y23pqrEv,_ZThn4_N3ccc7CC3x7y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y23abcEv,_ZTv0_n20_N3ccc7CC3x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y23abcEv,_ZThn4_N3ccc7CC3x7y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y23efgEv,_ZTv0_n12_N3ccc7CC3x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y23pqrEv,_ZTv0_n16_N3ccc7CC3x7y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y23abcEv,_ZTv0_n20_N3ccc7CC3x7y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y2E[] = {
  {&(_ZTVN3ccc7CC3x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y2E[];
static VTBL_ENTRY alt_thunk_names1510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y23abcEv,_ZTv0_n20_N3ccc7CC3x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y23abcEv,_ZThn4_N3ccc7CC3x7y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y23pqrEv,_ZTv0_n16_N3ccc7CC3x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y23pqrEv,_ZThn4_N3ccc7CC3x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y23efgEv,_ZTv0_n12_N3ccc7CC3x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y23efgEv,_ZThn4_N3ccc7CC3x7y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y2E = {  "_ZN3ccc7CC3x7y2E", // class name
  bases__ZN3ccc7CC3x7y2E, 2,
  &(vtc__ZN3ccc7CC3x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1510,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y2  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD3x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y23pqrEv
  ~DD3x7y2(); // tgen
  DD3x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y23efgEv");}
void  ccc::DD3x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y23abcEv");}
void  ccc::DD3x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y23pqrEv");}
ccc::DD3x7y2 ::~DD3x7y2(){ note_dtor("_ZN3ccc7DD3x7y2E", this);} // tgen
ccc::DD3x7y2 ::DD3x7y2(){ note_ctor("_ZN3ccc7DD3x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y2E, buf);
    ::ccc::DD3x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y2E);
    dp->::ccc::DD3x7y2::~DD3x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y2E(Test__ZN3ccc7DD3x7y2E, "_ZN3ccc7DD3x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y2C1Ev();
extern void _ZN3ccc7DD3x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y2E[] = {
  NSPAIR(_ZN3ccc7DD3x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y2E[];
extern void _ZN3ccc7DD3x7y23efgEv();
extern void _ZN3ccc7DD3x7y23pqrEv();
extern void _ZN3ccc7DD3x7y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y23abcEv,_ZTv0_n12_N3ccc7DD3x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y23abcEv,_ZThn4_N3ccc7DD3x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y23pqrEv,_ZTv0_n16_N3ccc7DD3x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y23pqrEv,_ZThn4_N3ccc7DD3x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y23abcEv,_ZTv0_n12_N3ccc7DD3x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y23pqrEv,_ZTv0_n16_N3ccc7DD3x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y2E[] = {
  {&(_ZTVN3ccc7DD3x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y2E[];
static VTBL_ENTRY alt_thunk_names1511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y23pqrEv,_ZTv0_n16_N3ccc7DD3x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y23pqrEv,_ZThn4_N3ccc7DD3x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y23abcEv,_ZTv0_n12_N3ccc7DD3x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y23abcEv,_ZThn4_N3ccc7DD3x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y2E = {  "_ZN3ccc7DD3x7y2E", // class name
  bases__ZN3ccc7DD3x7y2E, 2,
  &(vtc__ZN3ccc7DD3x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1511,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y3  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x7y33abcEv
  ~CC3x7y3(); // tgen
  CC3x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y3E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y33efgEv");}
void  ccc::CC3x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y33pqrEv");}
void  ccc::CC3x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y33abcEv");}
ccc::CC3x7y3 ::~CC3x7y3(){ note_dtor("_ZN3ccc7CC3x7y3E", this);} // tgen
ccc::CC3x7y3 ::CC3x7y3(){ note_ctor("_ZN3ccc7CC3x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y3E, buf);
    ::ccc::CC3x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y3E);
    dp->::ccc::CC3x7y3::~CC3x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y3E(Test__ZN3ccc7CC3x7y3E, "_ZN3ccc7CC3x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y3C1Ev();
extern void _ZN3ccc7CC3x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y3E[] = {
  NSPAIR(_ZN3ccc7CC3x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y3E[];
extern void _ZN3ccc7CC3x7y33abcEv();
extern void _ZN3ccc7CC3x7y33pqrEv();
extern void _ZN3ccc7CC3x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y33efgEv,_ZTv0_n12_N3ccc7CC3x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y33efgEv,_ZThn4_N3ccc7CC3x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y33pqrEv,_ZTv0_n16_N3ccc7CC3x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y33pqrEv,_ZThn4_N3ccc7CC3x7y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y33abcEv,_ZTv0_n20_N3ccc7CC3x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y33abcEv,_ZThn4_N3ccc7CC3x7y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y33efgEv,_ZTv0_n12_N3ccc7CC3x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y33pqrEv,_ZTv0_n16_N3ccc7CC3x7y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y33abcEv,_ZTv0_n20_N3ccc7CC3x7y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y3E[] = {
  {&(_ZTVN3ccc7CC3x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y3E[];
static VTBL_ENTRY alt_thunk_names1512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y33abcEv,_ZTv0_n20_N3ccc7CC3x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y33abcEv,_ZThn4_N3ccc7CC3x7y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y33pqrEv,_ZTv0_n16_N3ccc7CC3x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y33pqrEv,_ZThn4_N3ccc7CC3x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y33efgEv,_ZTv0_n12_N3ccc7CC3x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y33efgEv,_ZThn4_N3ccc7CC3x7y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y3E = {  "_ZN3ccc7CC3x7y3E", // class name
  bases__ZN3ccc7CC3x7y3E, 2,
  &(vtc__ZN3ccc7CC3x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1512,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y3  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD3x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x7y33abcEv
  ~DD3x7y3(); // tgen
  DD3x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y33efgEv");}
void  ccc::DD3x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y33pqrEv");}
void  ccc::DD3x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y33abcEv");}
ccc::DD3x7y3 ::~DD3x7y3(){ note_dtor("_ZN3ccc7DD3x7y3E", this);} // tgen
ccc::DD3x7y3 ::DD3x7y3(){ note_ctor("_ZN3ccc7DD3x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y3E, buf);
    ::ccc::DD3x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y3E);
    dp->::ccc::DD3x7y3::~DD3x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y3E(Test__ZN3ccc7DD3x7y3E, "_ZN3ccc7DD3x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y3C1Ev();
extern void _ZN3ccc7DD3x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y3E[] = {
  NSPAIR(_ZN3ccc7DD3x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y3E[];
extern void _ZN3ccc7DD3x7y33efgEv();
extern void _ZN3ccc7DD3x7y33pqrEv();
extern void _ZN3ccc7DD3x7y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y33abcEv,_ZTv0_n12_N3ccc7DD3x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y33abcEv,_ZThn4_N3ccc7DD3x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y33pqrEv,_ZTv0_n16_N3ccc7DD3x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y33pqrEv,_ZThn4_N3ccc7DD3x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y33abcEv,_ZTv0_n12_N3ccc7DD3x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y33pqrEv,_ZTv0_n16_N3ccc7DD3x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y3E[] = {
  {&(_ZTVN3ccc7DD3x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y3E[];
static VTBL_ENTRY alt_thunk_names1513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y33pqrEv,_ZTv0_n16_N3ccc7DD3x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y33pqrEv,_ZThn4_N3ccc7DD3x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y33abcEv,_ZTv0_n12_N3ccc7DD3x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y33abcEv,_ZThn4_N3ccc7DD3x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y3E = {  "_ZN3ccc7DD3x7y3E", // class name
  bases__ZN3ccc7DD3x7y3E, 2,
  &(vtc__ZN3ccc7DD3x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1513,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y4  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC3x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y43efgEv
  ~CC3x7y4(); // tgen
  CC3x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y4E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y43pqrEv");}
void  ccc::CC3x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y43abcEv");}
void  ccc::CC3x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y43efgEv");}
ccc::CC3x7y4 ::~CC3x7y4(){ note_dtor("_ZN3ccc7CC3x7y4E", this);} // tgen
ccc::CC3x7y4 ::CC3x7y4(){ note_ctor("_ZN3ccc7CC3x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y4E, buf);
    ::ccc::CC3x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y4E);
    dp->::ccc::CC3x7y4::~CC3x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y4E(Test__ZN3ccc7CC3x7y4E, "_ZN3ccc7CC3x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y4C1Ev();
extern void _ZN3ccc7CC3x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y4E[] = {
  NSPAIR(_ZN3ccc7CC3x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y4E[];
extern void _ZN3ccc7CC3x7y43abcEv();
extern void _ZN3ccc7CC3x7y43pqrEv();
extern void _ZN3ccc7CC3x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y43efgEv,_ZTv0_n12_N3ccc7CC3x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y43efgEv,_ZThn4_N3ccc7CC3x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y43pqrEv,_ZTv0_n16_N3ccc7CC3x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y43pqrEv,_ZThn4_N3ccc7CC3x7y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y43abcEv,_ZTv0_n20_N3ccc7CC3x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y43abcEv,_ZThn4_N3ccc7CC3x7y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y43efgEv,_ZTv0_n12_N3ccc7CC3x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y43pqrEv,_ZTv0_n16_N3ccc7CC3x7y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y43abcEv,_ZTv0_n20_N3ccc7CC3x7y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y4E[] = {
  {&(_ZTVN3ccc7CC3x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y4E[];
static VTBL_ENTRY alt_thunk_names1514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y43abcEv,_ZTv0_n20_N3ccc7CC3x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y43abcEv,_ZThn4_N3ccc7CC3x7y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y43pqrEv,_ZTv0_n16_N3ccc7CC3x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y43pqrEv,_ZThn4_N3ccc7CC3x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y43efgEv,_ZTv0_n12_N3ccc7CC3x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y43efgEv,_ZThn4_N3ccc7CC3x7y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y4E = {  "_ZN3ccc7CC3x7y4E", // class name
  bases__ZN3ccc7CC3x7y4E, 2,
  &(vtc__ZN3ccc7CC3x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1514,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y4  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD3x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x7y43efgEv
  ~DD3x7y4(); // tgen
  DD3x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y43pqrEv");}
void  ccc::DD3x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y43abcEv");}
void  ccc::DD3x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y43efgEv");}
ccc::DD3x7y4 ::~DD3x7y4(){ note_dtor("_ZN3ccc7DD3x7y4E", this);} // tgen
ccc::DD3x7y4 ::DD3x7y4(){ note_ctor("_ZN3ccc7DD3x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y4E, buf);
    ::ccc::DD3x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y4E);
    dp->::ccc::DD3x7y4::~DD3x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y4E(Test__ZN3ccc7DD3x7y4E, "_ZN3ccc7DD3x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y4C1Ev();
extern void _ZN3ccc7DD3x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y4E[] = {
  NSPAIR(_ZN3ccc7DD3x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y4E[];
extern void _ZN3ccc7DD3x7y43efgEv();
extern void _ZN3ccc7DD3x7y43pqrEv();
extern void _ZN3ccc7DD3x7y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y43abcEv,_ZTv0_n12_N3ccc7DD3x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y43abcEv,_ZThn4_N3ccc7DD3x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y43pqrEv,_ZTv0_n16_N3ccc7DD3x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y43pqrEv,_ZThn4_N3ccc7DD3x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y43abcEv,_ZTv0_n12_N3ccc7DD3x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y43pqrEv,_ZTv0_n16_N3ccc7DD3x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y4E[] = {
  {&(_ZTVN3ccc7DD3x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y4E[];
static VTBL_ENTRY alt_thunk_names1515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y43pqrEv,_ZTv0_n16_N3ccc7DD3x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y43pqrEv,_ZThn4_N3ccc7DD3x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y43abcEv,_ZTv0_n12_N3ccc7DD3x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y43abcEv,_ZThn4_N3ccc7DD3x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y4E = {  "_ZN3ccc7DD3x7y4E", // class name
  bases__ZN3ccc7DD3x7y4E, 2,
  &(vtc__ZN3ccc7DD3x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1515,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y5  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC3x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y53abcEv
  ~CC3x7y5(); // tgen
  CC3x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y5E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y53pqrEv");}
void  ccc::CC3x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y53efgEv");}
void  ccc::CC3x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y53abcEv");}
ccc::CC3x7y5 ::~CC3x7y5(){ note_dtor("_ZN3ccc7CC3x7y5E", this);} // tgen
ccc::CC3x7y5 ::CC3x7y5(){ note_ctor("_ZN3ccc7CC3x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y5E, buf);
    ::ccc::CC3x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y5E);
    dp->::ccc::CC3x7y5::~CC3x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y5E(Test__ZN3ccc7CC3x7y5E, "_ZN3ccc7CC3x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y5C1Ev();
extern void _ZN3ccc7CC3x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y5E[] = {
  NSPAIR(_ZN3ccc7CC3x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y5E[];
extern void _ZN3ccc7CC3x7y53abcEv();
extern void _ZN3ccc7CC3x7y53pqrEv();
extern void _ZN3ccc7CC3x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y53efgEv,_ZTv0_n12_N3ccc7CC3x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y53efgEv,_ZThn4_N3ccc7CC3x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y53pqrEv,_ZTv0_n16_N3ccc7CC3x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y53pqrEv,_ZThn4_N3ccc7CC3x7y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y53abcEv,_ZTv0_n20_N3ccc7CC3x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y53abcEv,_ZThn4_N3ccc7CC3x7y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y53efgEv,_ZTv0_n12_N3ccc7CC3x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y53pqrEv,_ZTv0_n16_N3ccc7CC3x7y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y53abcEv,_ZTv0_n20_N3ccc7CC3x7y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y5E[] = {
  {&(_ZTVN3ccc7CC3x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y5E[];
static VTBL_ENTRY alt_thunk_names1516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y53abcEv,_ZTv0_n20_N3ccc7CC3x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y53abcEv,_ZThn4_N3ccc7CC3x7y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y53pqrEv,_ZTv0_n16_N3ccc7CC3x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y53pqrEv,_ZThn4_N3ccc7CC3x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y53efgEv,_ZTv0_n12_N3ccc7CC3x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y53efgEv,_ZThn4_N3ccc7CC3x7y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y5E = {  "_ZN3ccc7CC3x7y5E", // class name
  bases__ZN3ccc7CC3x7y5E, 2,
  &(vtc__ZN3ccc7CC3x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1516,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y5  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD3x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x7y53abcEv
  ~DD3x7y5(); // tgen
  DD3x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y53pqrEv");}
void  ccc::DD3x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y53efgEv");}
void  ccc::DD3x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y53abcEv");}
ccc::DD3x7y5 ::~DD3x7y5(){ note_dtor("_ZN3ccc7DD3x7y5E", this);} // tgen
ccc::DD3x7y5 ::DD3x7y5(){ note_ctor("_ZN3ccc7DD3x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y5E, buf);
    ::ccc::DD3x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y5E);
    dp->::ccc::DD3x7y5::~DD3x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y5E(Test__ZN3ccc7DD3x7y5E, "_ZN3ccc7DD3x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y5C1Ev();
extern void _ZN3ccc7DD3x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y5E[] = {
  NSPAIR(_ZN3ccc7DD3x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y5E[];
extern void _ZN3ccc7DD3x7y53efgEv();
extern void _ZN3ccc7DD3x7y53pqrEv();
extern void _ZN3ccc7DD3x7y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y53abcEv,_ZTv0_n12_N3ccc7DD3x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y53abcEv,_ZThn4_N3ccc7DD3x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y53pqrEv,_ZTv0_n16_N3ccc7DD3x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y53pqrEv,_ZThn4_N3ccc7DD3x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y53abcEv,_ZTv0_n12_N3ccc7DD3x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y53pqrEv,_ZTv0_n16_N3ccc7DD3x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y5E[] = {
  {&(_ZTVN3ccc7DD3x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y5E[];
static VTBL_ENTRY alt_thunk_names1517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y53pqrEv,_ZTv0_n16_N3ccc7DD3x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y53pqrEv,_ZThn4_N3ccc7DD3x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y53abcEv,_ZTv0_n12_N3ccc7DD3x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y53abcEv,_ZThn4_N3ccc7DD3x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y5E = {  "_ZN3ccc7DD3x7y5E", // class name
  bases__ZN3ccc7DD3x7y5E, 2,
  &(vtc__ZN3ccc7DD3x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1517,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y6  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y63efgEv
  ~CC3x7y6(); // tgen
  CC3x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y6E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y63abcEv");}
void  ccc::CC3x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y63efgEv");}
ccc::CC3x7y6 ::~CC3x7y6(){ note_dtor("_ZN3ccc7CC3x7y6E", this);} // tgen
ccc::CC3x7y6 ::CC3x7y6(){ note_ctor("_ZN3ccc7CC3x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y6E, buf);
    ::ccc::CC3x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y6E);
    dp->::ccc::CC3x7y6::~CC3x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y6E(Test__ZN3ccc7CC3x7y6E, "_ZN3ccc7CC3x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y6C1Ev();
extern void _ZN3ccc7CC3x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y6E[] = {
  NSPAIR(_ZN3ccc7CC3x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y6E[];
extern void _ZN3ccc7CC3x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC3x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y63efgEv,_ZTv0_n12_N3ccc7CC3x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y63efgEv,_ZThn4_N3ccc7CC3x7y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y63abcEv,_ZTv0_n20_N3ccc7CC3x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y63abcEv,_ZThn4_N3ccc7CC3x7y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y63efgEv,_ZTv0_n12_N3ccc7CC3x7y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y63abcEv,_ZTv0_n20_N3ccc7CC3x7y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y6E[] = {
  {&(_ZTVN3ccc7CC3x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y6E[];
static VTBL_ENTRY alt_thunk_names1518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y63abcEv,_ZTv0_n20_N3ccc7CC3x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y63abcEv,_ZThn4_N3ccc7CC3x7y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y63efgEv,_ZTv0_n12_N3ccc7CC3x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y63efgEv,_ZThn4_N3ccc7CC3x7y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y6E = {  "_ZN3ccc7CC3x7y6E", // class name
  bases__ZN3ccc7CC3x7y6E, 2,
  &(vtc__ZN3ccc7CC3x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1518,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y6  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD3x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x7y63efgEv
  ~DD3x7y6(); // tgen
  DD3x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y63abcEv");}
void  ccc::DD3x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y63efgEv");}
ccc::DD3x7y6 ::~DD3x7y6(){ note_dtor("_ZN3ccc7DD3x7y6E", this);} // tgen
ccc::DD3x7y6 ::DD3x7y6(){ note_ctor("_ZN3ccc7DD3x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y6E, buf);
    ::ccc::DD3x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y6E);
    dp->::ccc::DD3x7y6::~DD3x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y6E(Test__ZN3ccc7DD3x7y6E, "_ZN3ccc7DD3x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y6C1Ev();
extern void _ZN3ccc7DD3x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y6E[] = {
  NSPAIR(_ZN3ccc7DD3x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y6E[];
extern void _ZN3ccc7DD3x7y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x7y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y63abcEv,_ZTv0_n12_N3ccc7DD3x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y63abcEv,_ZThn4_N3ccc7DD3x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y63abcEv,_ZTv0_n12_N3ccc7DD3x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y6E[] = {
  {&(_ZTVN3ccc7DD3x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y6E[];
static VTBL_ENTRY alt_thunk_names1519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y63abcEv,_ZTv0_n12_N3ccc7DD3x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y63abcEv,_ZThn4_N3ccc7DD3x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y6E = {  "_ZN3ccc7DD3x7y6E", // class name
  bases__ZN3ccc7DD3x7y6E, 2,
  &(vtc__ZN3ccc7DD3x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1519,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y7  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y73pqrEv
  ~CC3x7y7(); // tgen
  CC3x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y7E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y73abcEv");}
void  ccc::CC3x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y73pqrEv");}
ccc::CC3x7y7 ::~CC3x7y7(){ note_dtor("_ZN3ccc7CC3x7y7E", this);} // tgen
ccc::CC3x7y7 ::CC3x7y7(){ note_ctor("_ZN3ccc7CC3x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y7E, buf);
    ::ccc::CC3x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y7E);
    dp->::ccc::CC3x7y7::~CC3x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y7E(Test__ZN3ccc7CC3x7y7E, "_ZN3ccc7CC3x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y7C1Ev();
extern void _ZN3ccc7CC3x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y7E[] = {
  NSPAIR(_ZN3ccc7CC3x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y7E[];
extern void _ZN3ccc7CC3x7y73abcEv();
extern void _ZN3ccc7CC3x7y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y73pqrEv,_ZTv0_n16_N3ccc7CC3x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y73pqrEv,_ZThn4_N3ccc7CC3x7y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y73abcEv,_ZTv0_n20_N3ccc7CC3x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y73abcEv,_ZThn4_N3ccc7CC3x7y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y73pqrEv,_ZTv0_n16_N3ccc7CC3x7y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y73abcEv,_ZTv0_n20_N3ccc7CC3x7y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y7E[] = {
  {&(_ZTVN3ccc7CC3x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y7E[];
static VTBL_ENTRY alt_thunk_names1520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y73abcEv,_ZTv0_n20_N3ccc7CC3x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y73abcEv,_ZThn4_N3ccc7CC3x7y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y73pqrEv,_ZTv0_n16_N3ccc7CC3x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y73pqrEv,_ZThn4_N3ccc7CC3x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y7E = {  "_ZN3ccc7CC3x7y7E", // class name
  bases__ZN3ccc7CC3x7y7E, 2,
  &(vtc__ZN3ccc7CC3x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1520,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y7  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD3x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y73pqrEv
  ~DD3x7y7(); // tgen
  DD3x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y73abcEv");}
void  ccc::DD3x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y73pqrEv");}
ccc::DD3x7y7 ::~DD3x7y7(){ note_dtor("_ZN3ccc7DD3x7y7E", this);} // tgen
ccc::DD3x7y7 ::DD3x7y7(){ note_ctor("_ZN3ccc7DD3x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y7E, buf);
    ::ccc::DD3x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y7E);
    dp->::ccc::DD3x7y7::~DD3x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y7E(Test__ZN3ccc7DD3x7y7E, "_ZN3ccc7DD3x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y7C1Ev();
extern void _ZN3ccc7DD3x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y7E[] = {
  NSPAIR(_ZN3ccc7DD3x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x7y73pqrEv();
extern void _ZN3ccc7DD3x7y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y73abcEv,_ZTv0_n12_N3ccc7DD3x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y73abcEv,_ZThn4_N3ccc7DD3x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y73pqrEv,_ZTv0_n16_N3ccc7DD3x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y73pqrEv,_ZThn4_N3ccc7DD3x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y73abcEv,_ZTv0_n12_N3ccc7DD3x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y73pqrEv,_ZTv0_n16_N3ccc7DD3x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y7E[] = {
  {&(_ZTVN3ccc7DD3x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y7E[];
static VTBL_ENTRY alt_thunk_names1521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y73pqrEv,_ZTv0_n16_N3ccc7DD3x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y73pqrEv,_ZThn4_N3ccc7DD3x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y73abcEv,_ZTv0_n12_N3ccc7DD3x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y73abcEv,_ZThn4_N3ccc7DD3x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y7E = {  "_ZN3ccc7DD3x7y7E", // class name
  bases__ZN3ccc7DD3x7y7E, 2,
  &(vtc__ZN3ccc7DD3x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1521,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y8  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y83abcEv
  ~CC3x7y8(); // tgen
  CC3x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y8E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y83efgEv");}
void  ccc::CC3x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y83abcEv");}
ccc::CC3x7y8 ::~CC3x7y8(){ note_dtor("_ZN3ccc7CC3x7y8E", this);} // tgen
ccc::CC3x7y8 ::CC3x7y8(){ note_ctor("_ZN3ccc7CC3x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y8E, buf);
    ::ccc::CC3x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y8E);
    dp->::ccc::CC3x7y8::~CC3x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y8E(Test__ZN3ccc7CC3x7y8E, "_ZN3ccc7CC3x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y8C1Ev();
extern void _ZN3ccc7CC3x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y8E[] = {
  NSPAIR(_ZN3ccc7CC3x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y8E[];
extern void _ZN3ccc7CC3x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC3x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y83efgEv,_ZTv0_n12_N3ccc7CC3x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y83efgEv,_ZThn4_N3ccc7CC3x7y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x7y83abcEv,_ZTv0_n20_N3ccc7CC3x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y83abcEv,_ZThn4_N3ccc7CC3x7y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y83efgEv,_ZTv0_n12_N3ccc7CC3x7y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x7y83abcEv,_ZTv0_n20_N3ccc7CC3x7y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y8E[] = {
  {&(_ZTVN3ccc7CC3x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y8E[];
static VTBL_ENTRY alt_thunk_names1522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x7y83abcEv,_ZTv0_n20_N3ccc7CC3x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y83abcEv,_ZThn4_N3ccc7CC3x7y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y83efgEv,_ZTv0_n12_N3ccc7CC3x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y83efgEv,_ZThn4_N3ccc7CC3x7y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y8E = {  "_ZN3ccc7CC3x7y8E", // class name
  bases__ZN3ccc7CC3x7y8E, 2,
  &(vtc__ZN3ccc7CC3x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1522,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y8  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD3x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x7y83abcEv
  ~DD3x7y8(); // tgen
  DD3x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y83efgEv");}
void  ccc::DD3x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x7y83abcEv");}
ccc::DD3x7y8 ::~DD3x7y8(){ note_dtor("_ZN3ccc7DD3x7y8E", this);} // tgen
ccc::DD3x7y8 ::DD3x7y8(){ note_ctor("_ZN3ccc7DD3x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y8E, buf);
    ::ccc::DD3x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y8E);
    dp->::ccc::DD3x7y8::~DD3x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y8E(Test__ZN3ccc7DD3x7y8E, "_ZN3ccc7DD3x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y8C1Ev();
extern void _ZN3ccc7DD3x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y8E[] = {
  NSPAIR(_ZN3ccc7DD3x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y8E[];
extern void _ZN3ccc7DD3x7y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x7y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x7y83abcEv,_ZTv0_n12_N3ccc7DD3x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y83abcEv,_ZThn4_N3ccc7DD3x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x7y83abcEv,_ZTv0_n12_N3ccc7DD3x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y8E[] = {
  {&(_ZTVN3ccc7DD3x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y8E[];
static VTBL_ENTRY alt_thunk_names1523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x7y83abcEv,_ZTv0_n12_N3ccc7DD3x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y83abcEv,_ZThn4_N3ccc7DD3x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y8E = {  "_ZN3ccc7DD3x7y8E", // class name
  bases__ZN3ccc7DD3x7y8E, 2,
  &(vtc__ZN3ccc7DD3x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1523,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y9  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y93pqrEv
  ~CC3x7y9(); // tgen
  CC3x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y9E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y93efgEv");}
void  ccc::CC3x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y93pqrEv");}
ccc::CC3x7y9 ::~CC3x7y9(){ note_dtor("_ZN3ccc7CC3x7y9E", this);} // tgen
ccc::CC3x7y9 ::CC3x7y9(){ note_ctor("_ZN3ccc7CC3x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y9E, buf);
    ::ccc::CC3x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC3x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y9E);
    dp->::ccc::CC3x7y9::~CC3x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y9E(Test__ZN3ccc7CC3x7y9E, "_ZN3ccc7CC3x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y9C1Ev();
extern void _ZN3ccc7CC3x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y9E[] = {
  NSPAIR(_ZN3ccc7CC3x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC3x7y93pqrEv();
extern void _ZN3ccc7CC3x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x7y93efgEv,_ZTv0_n12_N3ccc7CC3x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y93efgEv,_ZThn4_N3ccc7CC3x7y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x7y93pqrEv,_ZTv0_n16_N3ccc7CC3x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y93pqrEv,_ZThn4_N3ccc7CC3x7y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x7y93efgEv,_ZTv0_n12_N3ccc7CC3x7y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x7y93pqrEv,_ZTv0_n16_N3ccc7CC3x7y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x7y9E[] = {
  {&(_ZTVN3ccc7CC3x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x7y9E[];
static VTBL_ENTRY alt_thunk_names1524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x7y93pqrEv,_ZTv0_n16_N3ccc7CC3x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y93pqrEv,_ZThn4_N3ccc7CC3x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x7y93efgEv,_ZTv0_n12_N3ccc7CC3x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x7y93efgEv,_ZThn4_N3ccc7CC3x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x7y9E = {  "_ZN3ccc7CC3x7y9E", // class name
  bases__ZN3ccc7CC3x7y9E, 2,
  &(vtc__ZN3ccc7CC3x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x7y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1524,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y9  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD3x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x7y93pqrEv
  ~DD3x7y9(); // tgen
  DD3x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x7y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x7y93efgEv");}
void  ccc::DD3x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x7y93pqrEv");}
ccc::DD3x7y9 ::~DD3x7y9(){ note_dtor("_ZN3ccc7DD3x7y9E", this);} // tgen
ccc::DD3x7y9 ::DD3x7y9(){ note_ctor("_ZN3ccc7DD3x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x7y9E, buf);
    ::ccc::DD3x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x7y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD3x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x7y9E);
    dp->::ccc::DD3x7y9::~DD3x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x7y9E(Test__ZN3ccc7DD3x7y9E, "_ZN3ccc7DD3x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x7y9C1Ev();
extern void _ZN3ccc7DD3x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x7y9E[] = {
  NSPAIR(_ZN3ccc7DD3x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD3x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y9E[];
extern void _ZN3ccc7DD3x7y93efgEv();
extern void _ZN3ccc7DD3x7y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x7y93pqrEv,_ZTv0_n16_N3ccc7DD3x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x7y93pqrEv,_ZThn4_N3ccc7DD3x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x7y93pqrEv,_ZTv0_n16_N3ccc7DD3x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x7y9E[] = {
  {&(_ZTVN3ccc7DD3x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x7y9E[];
static VTBL_ENTRY alt_thunk_names1525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x7y93pqrEv,_ZTv0_n16_N3ccc7DD3x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x7y93pqrEv,_ZThn4_N3ccc7DD3x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x7y9E = {  "_ZN3ccc7DD3x7y9E", // class name
  bases__ZN3ccc7DD3x7y9E, 2,
  &(vtc__ZN3ccc7DD3x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x7y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1525,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y10  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x7y103abcEv
  ~CC3x7y10(); // tgen
  CC3x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y10E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y103pqrEv");}
void  ccc::CC3x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x7y103abcEv");}
ccc::CC3x7y10 ::~CC3x7y10(){ note_dtor("_ZN3ccc8CC3x7y10E", this);} // tgen
ccc::CC3x7y10 ::CC3x7y10(){ note_ctor("_ZN3ccc8CC3x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y10E, buf);
    ::ccc::CC3x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y10E);
    dp->::ccc::CC3x7y10::~CC3x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y10E(Test__ZN3ccc8CC3x7y10E, "_ZN3ccc8CC3x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y10C1Ev();
extern void _ZN3ccc8CC3x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y10E[] = {
  NSPAIR(_ZN3ccc8CC3x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y10E[];
extern void _ZN3ccc8CC3x7y103abcEv();
extern void _ZN3ccc8CC3x7y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x7y103pqrEv,_ZTv0_n16_N3ccc8CC3x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y103pqrEv,_ZThn4_N3ccc8CC3x7y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x7y103abcEv,_ZTv0_n20_N3ccc8CC3x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y103abcEv,_ZThn4_N3ccc8CC3x7y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x7y103pqrEv,_ZTv0_n16_N3ccc8CC3x7y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x7y103abcEv,_ZTv0_n20_N3ccc8CC3x7y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y10E[] = {
  {&(_ZTVN3ccc8CC3x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y10E[];
static VTBL_ENTRY alt_thunk_names1526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x7y103abcEv,_ZTv0_n20_N3ccc8CC3x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y103abcEv,_ZThn4_N3ccc8CC3x7y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x7y103pqrEv,_ZTv0_n16_N3ccc8CC3x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y103pqrEv,_ZThn4_N3ccc8CC3x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x7y10E = {  "_ZN3ccc8CC3x7y10E", // class name
  bases__ZN3ccc8CC3x7y10E, 2,
  &(vtc__ZN3ccc8CC3x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1526,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y10  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD3x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x7y103abcEv
  ~DD3x7y10(); // tgen
  DD3x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x7y103pqrEv");}
void  ccc::DD3x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x7y103abcEv");}
ccc::DD3x7y10 ::~DD3x7y10(){ note_dtor("_ZN3ccc8DD3x7y10E", this);} // tgen
ccc::DD3x7y10 ::DD3x7y10(){ note_ctor("_ZN3ccc8DD3x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y10E, buf);
    ::ccc::DD3x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y10E);
    dp->::ccc::DD3x7y10::~DD3x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y10E(Test__ZN3ccc8DD3x7y10E, "_ZN3ccc8DD3x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y10C1Ev();
extern void _ZN3ccc8DD3x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y10E[] = {
  NSPAIR(_ZN3ccc8DD3x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x7y103pqrEv();
extern void _ZN3ccc8DD3x7y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x7y103abcEv,_ZTv0_n12_N3ccc8DD3x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x7y103abcEv,_ZThn4_N3ccc8DD3x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x7y103pqrEv,_ZTv0_n16_N3ccc8DD3x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x7y103pqrEv,_ZThn4_N3ccc8DD3x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x7y103abcEv,_ZTv0_n12_N3ccc8DD3x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x7y103pqrEv,_ZTv0_n16_N3ccc8DD3x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y10E[] = {
  {&(_ZTVN3ccc8DD3x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y10E[];
static VTBL_ENTRY alt_thunk_names1527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x7y103pqrEv,_ZTv0_n16_N3ccc8DD3x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x7y103pqrEv,_ZThn4_N3ccc8DD3x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x7y103abcEv,_ZTv0_n12_N3ccc8DD3x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x7y103abcEv,_ZThn4_N3ccc8DD3x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x7y10E = {  "_ZN3ccc8DD3x7y10E", // class name
  bases__ZN3ccc8DD3x7y10E, 2,
  &(vtc__ZN3ccc8DD3x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1527,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y11  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x7y113efgEv
  ~CC3x7y11(); // tgen
  CC3x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y11E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y113pqrEv");}
void  ccc::CC3x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x7y113efgEv");}
ccc::CC3x7y11 ::~CC3x7y11(){ note_dtor("_ZN3ccc8CC3x7y11E", this);} // tgen
ccc::CC3x7y11 ::CC3x7y11(){ note_ctor("_ZN3ccc8CC3x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y11E, buf);
    ::ccc::CC3x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y11E);
    dp->::ccc::CC3x7y11::~CC3x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y11E(Test__ZN3ccc8CC3x7y11E, "_ZN3ccc8CC3x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y11C1Ev();
extern void _ZN3ccc8CC3x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y11E[] = {
  NSPAIR(_ZN3ccc8CC3x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC3x7y113pqrEv();
extern void _ZN3ccc8CC3x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x7y113efgEv,_ZTv0_n12_N3ccc8CC3x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y113efgEv,_ZThn4_N3ccc8CC3x7y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x7y113pqrEv,_ZTv0_n16_N3ccc8CC3x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y113pqrEv,_ZThn4_N3ccc8CC3x7y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x7y113efgEv,_ZTv0_n12_N3ccc8CC3x7y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x7y113pqrEv,_ZTv0_n16_N3ccc8CC3x7y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y11E[] = {
  {&(_ZTVN3ccc8CC3x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y11E[];
static VTBL_ENTRY alt_thunk_names1528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x7y113pqrEv,_ZTv0_n16_N3ccc8CC3x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y113pqrEv,_ZThn4_N3ccc8CC3x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x7y113efgEv,_ZTv0_n12_N3ccc8CC3x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y113efgEv,_ZThn4_N3ccc8CC3x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x7y11E = {  "_ZN3ccc8CC3x7y11E", // class name
  bases__ZN3ccc8CC3x7y11E, 2,
  &(vtc__ZN3ccc8CC3x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1528,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y11  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD3x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x7y113efgEv
  ~DD3x7y11(); // tgen
  DD3x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x7y113pqrEv");}
void  ccc::DD3x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x7y113efgEv");}
ccc::DD3x7y11 ::~DD3x7y11(){ note_dtor("_ZN3ccc8DD3x7y11E", this);} // tgen
ccc::DD3x7y11 ::DD3x7y11(){ note_ctor("_ZN3ccc8DD3x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y11E, buf);
    ::ccc::DD3x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y11E);
    dp->::ccc::DD3x7y11::~DD3x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y11E(Test__ZN3ccc8DD3x7y11E, "_ZN3ccc8DD3x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y11C1Ev();
extern void _ZN3ccc8DD3x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y11E[] = {
  NSPAIR(_ZN3ccc8DD3x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y11E[];
extern void _ZN3ccc8DD3x7y113efgEv();
extern void _ZN3ccc8DD3x7y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x7y113pqrEv,_ZTv0_n16_N3ccc8DD3x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x7y113pqrEv,_ZThn4_N3ccc8DD3x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x7y113pqrEv,_ZTv0_n16_N3ccc8DD3x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y11E[] = {
  {&(_ZTVN3ccc8DD3x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y11E[];
static VTBL_ENTRY alt_thunk_names1529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x7y113pqrEv,_ZTv0_n16_N3ccc8DD3x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x7y113pqrEv,_ZThn4_N3ccc8DD3x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x7y11E = {  "_ZN3ccc8DD3x7y11E", // class name
  bases__ZN3ccc8DD3x7y11E, 2,
  &(vtc__ZN3ccc8DD3x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1529,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y12  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC3x7y123abcEv
  ~CC3x7y12(); // tgen
  CC3x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x7y123abcEv");}
ccc::CC3x7y12 ::~CC3x7y12(){ note_dtor("_ZN3ccc8CC3x7y12E", this);} // tgen
ccc::CC3x7y12 ::CC3x7y12(){ note_ctor("_ZN3ccc8CC3x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y12E, buf);
    ::ccc::CC3x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y12E);
    dp->::ccc::CC3x7y12::~CC3x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y12E(Test__ZN3ccc8CC3x7y12E, "_ZN3ccc8CC3x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y12C1Ev();
extern void _ZN3ccc8CC3x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y12E[] = {
  NSPAIR(_ZN3ccc8CC3x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y12E[];
extern void _ZN3ccc8CC3x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x7y123abcEv,_ZTv0_n20_N3ccc8CC3x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y123abcEv,_ZThn4_N3ccc8CC3x7y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x7y123abcEv,_ZTv0_n20_N3ccc8CC3x7y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y12E[] = {
  {&(_ZTVN3ccc8CC3x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y12E[];
static VTBL_ENTRY alt_thunk_names1530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x7y123abcEv,_ZTv0_n20_N3ccc8CC3x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y123abcEv,_ZThn4_N3ccc8CC3x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x7y12E = {  "_ZN3ccc8CC3x7y12E", // class name
  bases__ZN3ccc8CC3x7y12E, 2,
  &(vtc__ZN3ccc8CC3x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1530,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y12  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD3x7y123abcEv
  ~DD3x7y12(); // tgen
  DD3x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x7y123abcEv");}
ccc::DD3x7y12 ::~DD3x7y12(){ note_dtor("_ZN3ccc8DD3x7y12E", this);} // tgen
ccc::DD3x7y12 ::DD3x7y12(){ note_ctor("_ZN3ccc8DD3x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y12E, buf);
    ::ccc::DD3x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y12E);
    dp->::ccc::DD3x7y12::~DD3x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y12E(Test__ZN3ccc8DD3x7y12E, "_ZN3ccc8DD3x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y12C1Ev();
extern void _ZN3ccc8DD3x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y12E[] = {
  NSPAIR(_ZN3ccc8DD3x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x7y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x7y123abcEv,_ZTv0_n12_N3ccc8DD3x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x7y123abcEv,_ZThn4_N3ccc8DD3x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x7y123abcEv,_ZTv0_n12_N3ccc8DD3x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y12E[] = {
  {&(_ZTVN3ccc8DD3x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y12E[];
static VTBL_ENTRY alt_thunk_names1531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x7y123abcEv,_ZTv0_n12_N3ccc8DD3x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x7y123abcEv,_ZThn4_N3ccc8DD3x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x7y12E = {  "_ZN3ccc8DD3x7y12E", // class name
  bases__ZN3ccc8DD3x7y12E, 2,
  &(vtc__ZN3ccc8DD3x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1531,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y13  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC3x7y133efgEv
  ~CC3x7y13(); // tgen
  CC3x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x7y133efgEv");}
ccc::CC3x7y13 ::~CC3x7y13(){ note_dtor("_ZN3ccc8CC3x7y13E", this);} // tgen
ccc::CC3x7y13 ::CC3x7y13(){ note_ctor("_ZN3ccc8CC3x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y13E, buf);
    ::ccc::CC3x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y13E);
    dp->::ccc::CC3x7y13::~CC3x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y13E(Test__ZN3ccc8CC3x7y13E, "_ZN3ccc8CC3x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y13C1Ev();
extern void _ZN3ccc8CC3x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y13E[] = {
  NSPAIR(_ZN3ccc8CC3x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC3x7y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x7y133efgEv,_ZTv0_n12_N3ccc8CC3x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y133efgEv,_ZThn4_N3ccc8CC3x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x7y133efgEv,_ZTv0_n12_N3ccc8CC3x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y13E[] = {
  {&(_ZTVN3ccc8CC3x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y13E[];
static VTBL_ENTRY alt_thunk_names1532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x7y133efgEv,_ZTv0_n12_N3ccc8CC3x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y133efgEv,_ZThn4_N3ccc8CC3x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x7y13E = {  "_ZN3ccc8CC3x7y13E", // class name
  bases__ZN3ccc8CC3x7y13E, 2,
  &(vtc__ZN3ccc8CC3x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1532,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y13  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD3x7y133efgEv
  ~DD3x7y13(); // tgen
  DD3x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x7y133efgEv");}
ccc::DD3x7y13 ::~DD3x7y13(){ note_dtor("_ZN3ccc8DD3x7y13E", this);} // tgen
ccc::DD3x7y13 ::DD3x7y13(){ note_ctor("_ZN3ccc8DD3x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y13E, buf);
    ::ccc::DD3x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y13E);
    dp->::ccc::DD3x7y13::~DD3x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y13E(Test__ZN3ccc8DD3x7y13E, "_ZN3ccc8DD3x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y13C1Ev();
extern void _ZN3ccc8DD3x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y13E[] = {
  NSPAIR(_ZN3ccc8DD3x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y13E[];
extern void _ZN3ccc8DD3x7y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y13E[] = {
  {&(_ZTVN3ccc8DD3x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y13E[];
Class_Descriptor cd__ZN3ccc8DD3x7y13E = {  "_ZN3ccc8DD3x7y13E", // class name
  bases__ZN3ccc8DD3x7y13E, 2,
  &(vtc__ZN3ccc8DD3x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y14  : virtual ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y143pqrEv
  ~CC3x7y14(); // tgen
  CC3x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y143pqrEv");}
ccc::CC3x7y14 ::~CC3x7y14(){ note_dtor("_ZN3ccc8CC3x7y14E", this);} // tgen
ccc::CC3x7y14 ::CC3x7y14(){ note_ctor("_ZN3ccc8CC3x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y14E, buf);
    ::ccc::CC3x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y14E);
    dp->::ccc::CC3x7y14::~CC3x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y14E(Test__ZN3ccc8CC3x7y14E, "_ZN3ccc8CC3x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y14C1Ev();
extern void _ZN3ccc8CC3x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y14E[] = {
  NSPAIR(_ZN3ccc8CC3x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC3x7y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x7y143pqrEv,_ZTv0_n16_N3ccc8CC3x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y143pqrEv,_ZThn4_N3ccc8CC3x7y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x7y143pqrEv,_ZTv0_n16_N3ccc8CC3x7y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y14E[] = {
  {&(_ZTVN3ccc8CC3x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y14E[];
static VTBL_ENTRY alt_thunk_names1533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x7y143pqrEv,_ZTv0_n16_N3ccc8CC3x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x7y143pqrEv,_ZThn4_N3ccc8CC3x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x7y14E = {  "_ZN3ccc8CC3x7y14E", // class name
  bases__ZN3ccc8CC3x7y14E, 2,
  &(vtc__ZN3ccc8CC3x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1533,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y14  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD3x7y143pqrEv
  ~DD3x7y14(); // tgen
  DD3x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x7y143pqrEv");}
ccc::DD3x7y14 ::~DD3x7y14(){ note_dtor("_ZN3ccc8DD3x7y14E", this);} // tgen
ccc::DD3x7y14 ::DD3x7y14(){ note_ctor("_ZN3ccc8DD3x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y14E, buf);
    ::ccc::DD3x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y14E);
    dp->::ccc::DD3x7y14::~DD3x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y14E(Test__ZN3ccc8DD3x7y14E, "_ZN3ccc8DD3x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y14C1Ev();
extern void _ZN3ccc8DD3x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y14E[] = {
  NSPAIR(_ZN3ccc8DD3x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x7y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x7y143pqrEv,_ZTv0_n16_N3ccc8DD3x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x7y143pqrEv,_ZThn4_N3ccc8DD3x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x7y143pqrEv,_ZTv0_n16_N3ccc8DD3x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y14E[] = {
  {&(_ZTVN3ccc8DD3x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y14E[];
static VTBL_ENTRY alt_thunk_names1534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x7y143pqrEv,_ZTv0_n16_N3ccc8DD3x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x7y143pqrEv,_ZThn4_N3ccc8DD3x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x7y14E = {  "_ZN3ccc8DD3x7y14E", // class name
  bases__ZN3ccc8DD3x7y14E, 2,
  &(vtc__ZN3ccc8DD3x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1534,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y15  : virtual ::ccc::AA3 , ::ccc::BB7 {
  ~CC3x7y15(); // tgen
  CC3x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x7y15 ::~CC3x7y15(){ note_dtor("_ZN3ccc8CC3x7y15E", this);} // tgen
ccc::CC3x7y15 ::CC3x7y15(){ note_ctor("_ZN3ccc8CC3x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y15E, buf);
    ::ccc::CC3x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC3x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y15E);
    dp->::ccc::CC3x7y15::~CC3x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y15E(Test__ZN3ccc8CC3x7y15E, "_ZN3ccc8CC3x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y15C1Ev();
extern void _ZN3ccc8CC3x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y15E[] = {
  NSPAIR(_ZN3ccc8CC3x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x7y15E[] = {
  {&(_ZTVN3ccc8CC3x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x7y15E[];
Class_Descriptor cd__ZN3ccc8CC3x7y15E = {  "_ZN3ccc8CC3x7y15E", // class name
  bases__ZN3ccc8CC3x7y15E, 2,
  &(vtc__ZN3ccc8CC3x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x7y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x7y15  : virtual ::ccc::AA3 , virtual ::ccc::BB7 {
  ~DD3x7y15(); // tgen
  DD3x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x7y15 ::~DD3x7y15(){ note_dtor("_ZN3ccc8DD3x7y15E", this);} // tgen
ccc::DD3x7y15 ::DD3x7y15(){ note_ctor("_ZN3ccc8DD3x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x7y15E, buf);
    ::ccc::DD3x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x7y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD3x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x7y15E);
    dp->::ccc::DD3x7y15::~DD3x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x7y15E(Test__ZN3ccc8DD3x7y15E, "_ZN3ccc8DD3x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x7y15C1Ev();
extern void _ZN3ccc8DD3x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x7y15E[] = {
  NSPAIR(_ZN3ccc8DD3x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD3x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x7y15E[] = {
  {&(_ZTVN3ccc8DD3x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x7y15E[];
Class_Descriptor cd__ZN3ccc8DD3x7y15E = {  "_ZN3ccc8DD3x7y15E", // class name
  bases__ZN3ccc8DD3x7y15E, 2,
  &(vtc__ZN3ccc8DD3x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x7y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y0  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y03pqrEv
  ~CC3x8y0(); // tgen
  CC3x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y0E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y03abcEv");}
void  ccc::CC3x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y03efgEv");}
void  ccc::CC3x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y03pqrEv");}
ccc::CC3x8y0 ::~CC3x8y0(){ note_dtor("_ZN3ccc7CC3x8y0E", this);} // tgen
ccc::CC3x8y0 ::CC3x8y0(){ note_ctor("_ZN3ccc7CC3x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y0E, buf);
    ::ccc::CC3x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y0E);
    dp->::ccc::CC3x8y0::~CC3x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y0E(Test__ZN3ccc7CC3x8y0E, "_ZN3ccc7CC3x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y0C1Ev();
extern void _ZN3ccc7CC3x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y0E[] = {
  NSPAIR(_ZN3ccc7CC3x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y0E[];
extern void _ZN3ccc7CC3x8y03efgEv();
extern void _ZN3ccc7CC3x8y03abcEv();
extern void _ZN3ccc7CC3x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y03efgEv,_ZTv0_n12_N3ccc7CC3x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y03efgEv,_ZThn4_N3ccc7CC3x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y03pqrEv,_ZTv0_n16_N3ccc7CC3x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y03pqrEv,_ZThn4_N3ccc7CC3x8y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y03abcEv,_ZTv0_n20_N3ccc7CC3x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y03abcEv,_ZThn4_N3ccc7CC3x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y03efgEv,_ZTv0_n12_N3ccc7CC3x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y03pqrEv,_ZTv0_n16_N3ccc7CC3x8y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y03abcEv,_ZTv0_n20_N3ccc7CC3x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y0E[] = {
  {&(_ZTVN3ccc7CC3x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y0E[];
static VTBL_ENTRY alt_thunk_names1535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y03abcEv,_ZTv0_n20_N3ccc7CC3x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y03abcEv,_ZThn4_N3ccc7CC3x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y03pqrEv,_ZTv0_n16_N3ccc7CC3x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y03pqrEv,_ZThn4_N3ccc7CC3x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y03efgEv,_ZTv0_n12_N3ccc7CC3x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y03efgEv,_ZThn4_N3ccc7CC3x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y0E = {  "_ZN3ccc7CC3x8y0E", // class name
  bases__ZN3ccc7CC3x8y0E, 2,
  &(vtc__ZN3ccc7CC3x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1535,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y0  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD3x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y03pqrEv
  ~DD3x8y0(); // tgen
  DD3x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y03abcEv");}
void  ccc::DD3x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y03efgEv");}
void  ccc::DD3x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y03pqrEv");}
ccc::DD3x8y0 ::~DD3x8y0(){ note_dtor("_ZN3ccc7DD3x8y0E", this);} // tgen
ccc::DD3x8y0 ::DD3x8y0(){ note_ctor("_ZN3ccc7DD3x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y0E, buf);
    ::ccc::DD3x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y0E);
    dp->::ccc::DD3x8y0::~DD3x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y0E(Test__ZN3ccc7DD3x8y0E, "_ZN3ccc7DD3x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y0C1Ev();
extern void _ZN3ccc7DD3x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y0E[] = {
  NSPAIR(_ZN3ccc7DD3x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y0E[];
extern void _ZN3ccc7DD3x8y03efgEv();
extern void _ZN3ccc7DD3x8y03pqrEv();
extern void _ZN3ccc7DD3x8y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y03efgEv,_ZTv0_n12_N3ccc7DD3x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y03efgEv,_ZThn4_N3ccc7DD3x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y03abcEv,_ZTv0_n16_N3ccc7DD3x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y03abcEv,_ZThn4_N3ccc7DD3x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y03efgEv,_ZTv0_n12_N3ccc7DD3x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y03abcEv,_ZTv0_n16_N3ccc7DD3x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y0E[] = {
  {&(_ZTVN3ccc7DD3x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y0E[];
static VTBL_ENTRY alt_thunk_names1536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y03abcEv,_ZTv0_n16_N3ccc7DD3x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y03abcEv,_ZThn4_N3ccc7DD3x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y03efgEv,_ZTv0_n12_N3ccc7DD3x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y03efgEv,_ZThn4_N3ccc7DD3x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y0E = {  "_ZN3ccc7DD3x8y0E", // class name
  bases__ZN3ccc7DD3x8y0E, 2,
  &(vtc__ZN3ccc7DD3x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1536,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y1  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x8y13efgEv
  ~CC3x8y1(); // tgen
  CC3x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y1E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y13abcEv");}
void  ccc::CC3x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y13pqrEv");}
void  ccc::CC3x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y13efgEv");}
ccc::CC3x8y1 ::~CC3x8y1(){ note_dtor("_ZN3ccc7CC3x8y1E", this);} // tgen
ccc::CC3x8y1 ::CC3x8y1(){ note_ctor("_ZN3ccc7CC3x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y1E, buf);
    ::ccc::CC3x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y1E);
    dp->::ccc::CC3x8y1::~CC3x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y1E(Test__ZN3ccc7CC3x8y1E, "_ZN3ccc7CC3x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y1C1Ev();
extern void _ZN3ccc7CC3x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y1E[] = {
  NSPAIR(_ZN3ccc7CC3x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y1E[];
extern void _ZN3ccc7CC3x8y13efgEv();
extern void _ZN3ccc7CC3x8y13abcEv();
extern void _ZN3ccc7CC3x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y13efgEv,_ZTv0_n12_N3ccc7CC3x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y13efgEv,_ZThn4_N3ccc7CC3x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y13pqrEv,_ZTv0_n16_N3ccc7CC3x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y13pqrEv,_ZThn4_N3ccc7CC3x8y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y13abcEv,_ZTv0_n20_N3ccc7CC3x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y13abcEv,_ZThn4_N3ccc7CC3x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y13efgEv,_ZTv0_n12_N3ccc7CC3x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y13pqrEv,_ZTv0_n16_N3ccc7CC3x8y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y13abcEv,_ZTv0_n20_N3ccc7CC3x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y1E[] = {
  {&(_ZTVN3ccc7CC3x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y1E[];
static VTBL_ENTRY alt_thunk_names1537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y13abcEv,_ZTv0_n20_N3ccc7CC3x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y13abcEv,_ZThn4_N3ccc7CC3x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y13pqrEv,_ZTv0_n16_N3ccc7CC3x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y13pqrEv,_ZThn4_N3ccc7CC3x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y13efgEv,_ZTv0_n12_N3ccc7CC3x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y13efgEv,_ZThn4_N3ccc7CC3x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y1E = {  "_ZN3ccc7CC3x8y1E", // class name
  bases__ZN3ccc7CC3x8y1E, 2,
  &(vtc__ZN3ccc7CC3x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1537,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y1  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD3x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x8y13efgEv
  ~DD3x8y1(); // tgen
  DD3x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y13abcEv");}
void  ccc::DD3x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y13pqrEv");}
void  ccc::DD3x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y13efgEv");}
ccc::DD3x8y1 ::~DD3x8y1(){ note_dtor("_ZN3ccc7DD3x8y1E", this);} // tgen
ccc::DD3x8y1 ::DD3x8y1(){ note_ctor("_ZN3ccc7DD3x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y1E, buf);
    ::ccc::DD3x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y1E);
    dp->::ccc::DD3x8y1::~DD3x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y1E(Test__ZN3ccc7DD3x8y1E, "_ZN3ccc7DD3x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y1C1Ev();
extern void _ZN3ccc7DD3x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y1E[] = {
  NSPAIR(_ZN3ccc7DD3x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y1E[];
extern void _ZN3ccc7DD3x8y13efgEv();
extern void _ZN3ccc7DD3x8y13pqrEv();
extern void _ZN3ccc7DD3x8y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y13efgEv,_ZTv0_n12_N3ccc7DD3x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y13efgEv,_ZThn4_N3ccc7DD3x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y13abcEv,_ZTv0_n16_N3ccc7DD3x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y13abcEv,_ZThn4_N3ccc7DD3x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y13efgEv,_ZTv0_n12_N3ccc7DD3x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y13abcEv,_ZTv0_n16_N3ccc7DD3x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y1E[] = {
  {&(_ZTVN3ccc7DD3x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y1E[];
static VTBL_ENTRY alt_thunk_names1538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y13abcEv,_ZTv0_n16_N3ccc7DD3x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y13abcEv,_ZThn4_N3ccc7DD3x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y13efgEv,_ZTv0_n12_N3ccc7DD3x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y13efgEv,_ZThn4_N3ccc7DD3x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y1E = {  "_ZN3ccc7DD3x8y1E", // class name
  bases__ZN3ccc7DD3x8y1E, 2,
  &(vtc__ZN3ccc7DD3x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1538,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y2  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y23pqrEv
  ~CC3x8y2(); // tgen
  CC3x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y2E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y23efgEv");}
void  ccc::CC3x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y23abcEv");}
void  ccc::CC3x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y23pqrEv");}
ccc::CC3x8y2 ::~CC3x8y2(){ note_dtor("_ZN3ccc7CC3x8y2E", this);} // tgen
ccc::CC3x8y2 ::CC3x8y2(){ note_ctor("_ZN3ccc7CC3x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y2E, buf);
    ::ccc::CC3x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y2E);
    dp->::ccc::CC3x8y2::~CC3x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y2E(Test__ZN3ccc7CC3x8y2E, "_ZN3ccc7CC3x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y2C1Ev();
extern void _ZN3ccc7CC3x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y2E[] = {
  NSPAIR(_ZN3ccc7CC3x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y2E[];
extern void _ZN3ccc7CC3x8y23efgEv();
extern void _ZN3ccc7CC3x8y23abcEv();
extern void _ZN3ccc7CC3x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y23efgEv,_ZTv0_n12_N3ccc7CC3x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y23efgEv,_ZThn4_N3ccc7CC3x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y23pqrEv,_ZTv0_n16_N3ccc7CC3x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y23pqrEv,_ZThn4_N3ccc7CC3x8y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y23abcEv,_ZTv0_n20_N3ccc7CC3x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y23abcEv,_ZThn4_N3ccc7CC3x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y23efgEv,_ZTv0_n12_N3ccc7CC3x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y23pqrEv,_ZTv0_n16_N3ccc7CC3x8y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y23abcEv,_ZTv0_n20_N3ccc7CC3x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y2E[] = {
  {&(_ZTVN3ccc7CC3x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y2E[];
static VTBL_ENTRY alt_thunk_names1539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y23abcEv,_ZTv0_n20_N3ccc7CC3x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y23abcEv,_ZThn4_N3ccc7CC3x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y23pqrEv,_ZTv0_n16_N3ccc7CC3x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y23pqrEv,_ZThn4_N3ccc7CC3x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y23efgEv,_ZTv0_n12_N3ccc7CC3x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y23efgEv,_ZThn4_N3ccc7CC3x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y2E = {  "_ZN3ccc7CC3x8y2E", // class name
  bases__ZN3ccc7CC3x8y2E, 2,
  &(vtc__ZN3ccc7CC3x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1539,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y2  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD3x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y23pqrEv
  ~DD3x8y2(); // tgen
  DD3x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y23efgEv");}
void  ccc::DD3x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y23abcEv");}
void  ccc::DD3x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y23pqrEv");}
ccc::DD3x8y2 ::~DD3x8y2(){ note_dtor("_ZN3ccc7DD3x8y2E", this);} // tgen
ccc::DD3x8y2 ::DD3x8y2(){ note_ctor("_ZN3ccc7DD3x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y2E, buf);
    ::ccc::DD3x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y2E);
    dp->::ccc::DD3x8y2::~DD3x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y2E(Test__ZN3ccc7DD3x8y2E, "_ZN3ccc7DD3x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y2C1Ev();
extern void _ZN3ccc7DD3x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y2E[] = {
  NSPAIR(_ZN3ccc7DD3x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y2E[];
extern void _ZN3ccc7DD3x8y23efgEv();
extern void _ZN3ccc7DD3x8y23pqrEv();
extern void _ZN3ccc7DD3x8y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y23efgEv,_ZTv0_n12_N3ccc7DD3x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y23efgEv,_ZThn4_N3ccc7DD3x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y23abcEv,_ZTv0_n16_N3ccc7DD3x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y23abcEv,_ZThn4_N3ccc7DD3x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y23efgEv,_ZTv0_n12_N3ccc7DD3x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y23abcEv,_ZTv0_n16_N3ccc7DD3x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y2E[] = {
  {&(_ZTVN3ccc7DD3x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y2E[];
static VTBL_ENTRY alt_thunk_names1540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y23abcEv,_ZTv0_n16_N3ccc7DD3x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y23abcEv,_ZThn4_N3ccc7DD3x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y23efgEv,_ZTv0_n12_N3ccc7DD3x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y23efgEv,_ZThn4_N3ccc7DD3x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y2E = {  "_ZN3ccc7DD3x8y2E", // class name
  bases__ZN3ccc7DD3x8y2E, 2,
  &(vtc__ZN3ccc7DD3x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1540,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y3  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x8y33abcEv
  ~CC3x8y3(); // tgen
  CC3x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y3E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y33efgEv");}
void  ccc::CC3x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y33pqrEv");}
void  ccc::CC3x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y33abcEv");}
ccc::CC3x8y3 ::~CC3x8y3(){ note_dtor("_ZN3ccc7CC3x8y3E", this);} // tgen
ccc::CC3x8y3 ::CC3x8y3(){ note_ctor("_ZN3ccc7CC3x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y3E, buf);
    ::ccc::CC3x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y3E);
    dp->::ccc::CC3x8y3::~CC3x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y3E(Test__ZN3ccc7CC3x8y3E, "_ZN3ccc7CC3x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y3C1Ev();
extern void _ZN3ccc7CC3x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y3E[] = {
  NSPAIR(_ZN3ccc7CC3x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y3E[];
extern void _ZN3ccc7CC3x8y33efgEv();
extern void _ZN3ccc7CC3x8y33abcEv();
extern void _ZN3ccc7CC3x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y33efgEv,_ZTv0_n12_N3ccc7CC3x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y33efgEv,_ZThn4_N3ccc7CC3x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y33pqrEv,_ZTv0_n16_N3ccc7CC3x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y33pqrEv,_ZThn4_N3ccc7CC3x8y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y33abcEv,_ZTv0_n20_N3ccc7CC3x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y33abcEv,_ZThn4_N3ccc7CC3x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y33efgEv,_ZTv0_n12_N3ccc7CC3x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y33pqrEv,_ZTv0_n16_N3ccc7CC3x8y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y33abcEv,_ZTv0_n20_N3ccc7CC3x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y3E[] = {
  {&(_ZTVN3ccc7CC3x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y3E[];
static VTBL_ENTRY alt_thunk_names1541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y33abcEv,_ZTv0_n20_N3ccc7CC3x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y33abcEv,_ZThn4_N3ccc7CC3x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y33pqrEv,_ZTv0_n16_N3ccc7CC3x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y33pqrEv,_ZThn4_N3ccc7CC3x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y33efgEv,_ZTv0_n12_N3ccc7CC3x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y33efgEv,_ZThn4_N3ccc7CC3x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y3E = {  "_ZN3ccc7CC3x8y3E", // class name
  bases__ZN3ccc7CC3x8y3E, 2,
  &(vtc__ZN3ccc7CC3x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1541,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y3  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD3x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x8y33abcEv
  ~DD3x8y3(); // tgen
  DD3x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y33efgEv");}
void  ccc::DD3x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y33pqrEv");}
void  ccc::DD3x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y33abcEv");}
ccc::DD3x8y3 ::~DD3x8y3(){ note_dtor("_ZN3ccc7DD3x8y3E", this);} // tgen
ccc::DD3x8y3 ::DD3x8y3(){ note_ctor("_ZN3ccc7DD3x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y3E, buf);
    ::ccc::DD3x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y3E);
    dp->::ccc::DD3x8y3::~DD3x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y3E(Test__ZN3ccc7DD3x8y3E, "_ZN3ccc7DD3x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y3C1Ev();
extern void _ZN3ccc7DD3x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y3E[] = {
  NSPAIR(_ZN3ccc7DD3x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y3E[];
extern void _ZN3ccc7DD3x8y33efgEv();
extern void _ZN3ccc7DD3x8y33pqrEv();
extern void _ZN3ccc7DD3x8y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y33efgEv,_ZTv0_n12_N3ccc7DD3x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y33efgEv,_ZThn4_N3ccc7DD3x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y33abcEv,_ZTv0_n16_N3ccc7DD3x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y33abcEv,_ZThn4_N3ccc7DD3x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y33efgEv,_ZTv0_n12_N3ccc7DD3x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y33abcEv,_ZTv0_n16_N3ccc7DD3x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y3E[] = {
  {&(_ZTVN3ccc7DD3x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y3E[];
static VTBL_ENTRY alt_thunk_names1542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y33abcEv,_ZTv0_n16_N3ccc7DD3x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y33abcEv,_ZThn4_N3ccc7DD3x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y33efgEv,_ZTv0_n12_N3ccc7DD3x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y33efgEv,_ZThn4_N3ccc7DD3x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y3E = {  "_ZN3ccc7DD3x8y3E", // class name
  bases__ZN3ccc7DD3x8y3E, 2,
  &(vtc__ZN3ccc7DD3x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1542,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y4  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC3x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y43efgEv
  ~CC3x8y4(); // tgen
  CC3x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y4E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y43pqrEv");}
void  ccc::CC3x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y43abcEv");}
void  ccc::CC3x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y43efgEv");}
ccc::CC3x8y4 ::~CC3x8y4(){ note_dtor("_ZN3ccc7CC3x8y4E", this);} // tgen
ccc::CC3x8y4 ::CC3x8y4(){ note_ctor("_ZN3ccc7CC3x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y4E, buf);
    ::ccc::CC3x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y4E);
    dp->::ccc::CC3x8y4::~CC3x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y4E(Test__ZN3ccc7CC3x8y4E, "_ZN3ccc7CC3x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y4C1Ev();
extern void _ZN3ccc7CC3x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y4E[] = {
  NSPAIR(_ZN3ccc7CC3x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y4E[];
extern void _ZN3ccc7CC3x8y43efgEv();
extern void _ZN3ccc7CC3x8y43abcEv();
extern void _ZN3ccc7CC3x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y43efgEv,_ZTv0_n12_N3ccc7CC3x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y43efgEv,_ZThn4_N3ccc7CC3x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y43pqrEv,_ZTv0_n16_N3ccc7CC3x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y43pqrEv,_ZThn4_N3ccc7CC3x8y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y43abcEv,_ZTv0_n20_N3ccc7CC3x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y43abcEv,_ZThn4_N3ccc7CC3x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y43efgEv,_ZTv0_n12_N3ccc7CC3x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y43pqrEv,_ZTv0_n16_N3ccc7CC3x8y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y43abcEv,_ZTv0_n20_N3ccc7CC3x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y4E[] = {
  {&(_ZTVN3ccc7CC3x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y4E[];
static VTBL_ENTRY alt_thunk_names1543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y43abcEv,_ZTv0_n20_N3ccc7CC3x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y43abcEv,_ZThn4_N3ccc7CC3x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y43pqrEv,_ZTv0_n16_N3ccc7CC3x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y43pqrEv,_ZThn4_N3ccc7CC3x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y43efgEv,_ZTv0_n12_N3ccc7CC3x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y43efgEv,_ZThn4_N3ccc7CC3x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y4E = {  "_ZN3ccc7CC3x8y4E", // class name
  bases__ZN3ccc7CC3x8y4E, 2,
  &(vtc__ZN3ccc7CC3x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1543,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y4  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD3x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x8y43efgEv
  ~DD3x8y4(); // tgen
  DD3x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y43pqrEv");}
void  ccc::DD3x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y43abcEv");}
void  ccc::DD3x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y43efgEv");}
ccc::DD3x8y4 ::~DD3x8y4(){ note_dtor("_ZN3ccc7DD3x8y4E", this);} // tgen
ccc::DD3x8y4 ::DD3x8y4(){ note_ctor("_ZN3ccc7DD3x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y4E, buf);
    ::ccc::DD3x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y4E);
    dp->::ccc::DD3x8y4::~DD3x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y4E(Test__ZN3ccc7DD3x8y4E, "_ZN3ccc7DD3x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y4C1Ev();
extern void _ZN3ccc7DD3x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y4E[] = {
  NSPAIR(_ZN3ccc7DD3x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y4E[];
extern void _ZN3ccc7DD3x8y43efgEv();
extern void _ZN3ccc7DD3x8y43pqrEv();
extern void _ZN3ccc7DD3x8y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y43efgEv,_ZTv0_n12_N3ccc7DD3x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y43efgEv,_ZThn4_N3ccc7DD3x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y43abcEv,_ZTv0_n16_N3ccc7DD3x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y43abcEv,_ZThn4_N3ccc7DD3x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y43efgEv,_ZTv0_n12_N3ccc7DD3x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y43abcEv,_ZTv0_n16_N3ccc7DD3x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y4E[] = {
  {&(_ZTVN3ccc7DD3x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y4E[];
static VTBL_ENTRY alt_thunk_names1544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y43abcEv,_ZTv0_n16_N3ccc7DD3x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y43abcEv,_ZThn4_N3ccc7DD3x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y43efgEv,_ZTv0_n12_N3ccc7DD3x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y43efgEv,_ZThn4_N3ccc7DD3x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y4E = {  "_ZN3ccc7DD3x8y4E", // class name
  bases__ZN3ccc7DD3x8y4E, 2,
  &(vtc__ZN3ccc7DD3x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1544,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y5  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC3x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y53abcEv
  ~CC3x8y5(); // tgen
  CC3x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y5E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y53pqrEv");}
void  ccc::CC3x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y53efgEv");}
void  ccc::CC3x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y53abcEv");}
ccc::CC3x8y5 ::~CC3x8y5(){ note_dtor("_ZN3ccc7CC3x8y5E", this);} // tgen
ccc::CC3x8y5 ::CC3x8y5(){ note_ctor("_ZN3ccc7CC3x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y5E, buf);
    ::ccc::CC3x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y5E);
    dp->::ccc::CC3x8y5::~CC3x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y5E(Test__ZN3ccc7CC3x8y5E, "_ZN3ccc7CC3x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y5C1Ev();
extern void _ZN3ccc7CC3x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y5E[] = {
  NSPAIR(_ZN3ccc7CC3x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y5E[];
extern void _ZN3ccc7CC3x8y53efgEv();
extern void _ZN3ccc7CC3x8y53abcEv();
extern void _ZN3ccc7CC3x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y53efgEv,_ZTv0_n12_N3ccc7CC3x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y53efgEv,_ZThn4_N3ccc7CC3x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y53pqrEv,_ZTv0_n16_N3ccc7CC3x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y53pqrEv,_ZThn4_N3ccc7CC3x8y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y53abcEv,_ZTv0_n20_N3ccc7CC3x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y53abcEv,_ZThn4_N3ccc7CC3x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y53efgEv,_ZTv0_n12_N3ccc7CC3x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y53pqrEv,_ZTv0_n16_N3ccc7CC3x8y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y53abcEv,_ZTv0_n20_N3ccc7CC3x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y5E[] = {
  {&(_ZTVN3ccc7CC3x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y5E[];
static VTBL_ENTRY alt_thunk_names1545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y53abcEv,_ZTv0_n20_N3ccc7CC3x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y53abcEv,_ZThn4_N3ccc7CC3x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y53pqrEv,_ZTv0_n16_N3ccc7CC3x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y53pqrEv,_ZThn4_N3ccc7CC3x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y53efgEv,_ZTv0_n12_N3ccc7CC3x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y53efgEv,_ZThn4_N3ccc7CC3x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y5E = {  "_ZN3ccc7CC3x8y5E", // class name
  bases__ZN3ccc7CC3x8y5E, 2,
  &(vtc__ZN3ccc7CC3x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1545,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y5  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD3x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x8y53abcEv
  ~DD3x8y5(); // tgen
  DD3x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y53pqrEv");}
void  ccc::DD3x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y53efgEv");}
void  ccc::DD3x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y53abcEv");}
ccc::DD3x8y5 ::~DD3x8y5(){ note_dtor("_ZN3ccc7DD3x8y5E", this);} // tgen
ccc::DD3x8y5 ::DD3x8y5(){ note_ctor("_ZN3ccc7DD3x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y5E, buf);
    ::ccc::DD3x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y5E);
    dp->::ccc::DD3x8y5::~DD3x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y5E(Test__ZN3ccc7DD3x8y5E, "_ZN3ccc7DD3x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y5C1Ev();
extern void _ZN3ccc7DD3x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y5E[] = {
  NSPAIR(_ZN3ccc7DD3x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y5E[];
extern void _ZN3ccc7DD3x8y53efgEv();
extern void _ZN3ccc7DD3x8y53pqrEv();
extern void _ZN3ccc7DD3x8y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y53efgEv,_ZTv0_n12_N3ccc7DD3x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y53efgEv,_ZThn4_N3ccc7DD3x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y53abcEv,_ZTv0_n16_N3ccc7DD3x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y53abcEv,_ZThn4_N3ccc7DD3x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y53efgEv,_ZTv0_n12_N3ccc7DD3x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y53abcEv,_ZTv0_n16_N3ccc7DD3x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y5E[] = {
  {&(_ZTVN3ccc7DD3x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y5E[];
static VTBL_ENTRY alt_thunk_names1546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y53abcEv,_ZTv0_n16_N3ccc7DD3x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y53abcEv,_ZThn4_N3ccc7DD3x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y53efgEv,_ZTv0_n12_N3ccc7DD3x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y53efgEv,_ZThn4_N3ccc7DD3x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y5E = {  "_ZN3ccc7DD3x8y5E", // class name
  bases__ZN3ccc7DD3x8y5E, 2,
  &(vtc__ZN3ccc7DD3x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1546,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y6  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y63efgEv
  ~CC3x8y6(); // tgen
  CC3x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y6E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y63abcEv");}
void  ccc::CC3x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y63efgEv");}
ccc::CC3x8y6 ::~CC3x8y6(){ note_dtor("_ZN3ccc7CC3x8y6E", this);} // tgen
ccc::CC3x8y6 ::CC3x8y6(){ note_ctor("_ZN3ccc7CC3x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y6E, buf);
    ::ccc::CC3x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y6E);
    dp->::ccc::CC3x8y6::~CC3x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y6E(Test__ZN3ccc7CC3x8y6E, "_ZN3ccc7CC3x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y6C1Ev();
extern void _ZN3ccc7CC3x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y6E[] = {
  NSPAIR(_ZN3ccc7CC3x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y6E[];
extern void _ZN3ccc7CC3x8y63efgEv();
extern void _ZN3ccc7CC3x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y63efgEv,_ZTv0_n12_N3ccc7CC3x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y63efgEv,_ZThn4_N3ccc7CC3x8y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y63abcEv,_ZTv0_n20_N3ccc7CC3x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y63abcEv,_ZThn4_N3ccc7CC3x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y63efgEv,_ZTv0_n12_N3ccc7CC3x8y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y63abcEv,_ZTv0_n20_N3ccc7CC3x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y6E[] = {
  {&(_ZTVN3ccc7CC3x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y6E[];
static VTBL_ENTRY alt_thunk_names1547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y63abcEv,_ZTv0_n20_N3ccc7CC3x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y63abcEv,_ZThn4_N3ccc7CC3x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y63efgEv,_ZTv0_n12_N3ccc7CC3x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y63efgEv,_ZThn4_N3ccc7CC3x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y6E = {  "_ZN3ccc7CC3x8y6E", // class name
  bases__ZN3ccc7CC3x8y6E, 2,
  &(vtc__ZN3ccc7CC3x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1547,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y6  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD3x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x8y63efgEv
  ~DD3x8y6(); // tgen
  DD3x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y63abcEv");}
void  ccc::DD3x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y63efgEv");}
ccc::DD3x8y6 ::~DD3x8y6(){ note_dtor("_ZN3ccc7DD3x8y6E", this);} // tgen
ccc::DD3x8y6 ::DD3x8y6(){ note_ctor("_ZN3ccc7DD3x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y6E, buf);
    ::ccc::DD3x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y6E);
    dp->::ccc::DD3x8y6::~DD3x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y6E(Test__ZN3ccc7DD3x8y6E, "_ZN3ccc7DD3x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y6C1Ev();
extern void _ZN3ccc7DD3x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y6E[] = {
  NSPAIR(_ZN3ccc7DD3x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y6E[];
extern void _ZN3ccc7DD3x8y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y63efgEv,_ZTv0_n12_N3ccc7DD3x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y63efgEv,_ZThn4_N3ccc7DD3x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y63abcEv,_ZTv0_n16_N3ccc7DD3x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y63abcEv,_ZThn4_N3ccc7DD3x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y63efgEv,_ZTv0_n12_N3ccc7DD3x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y63abcEv,_ZTv0_n16_N3ccc7DD3x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y6E[] = {
  {&(_ZTVN3ccc7DD3x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y6E[];
static VTBL_ENTRY alt_thunk_names1548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y63abcEv,_ZTv0_n16_N3ccc7DD3x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y63abcEv,_ZThn4_N3ccc7DD3x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y63efgEv,_ZTv0_n12_N3ccc7DD3x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y63efgEv,_ZThn4_N3ccc7DD3x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y6E = {  "_ZN3ccc7DD3x8y6E", // class name
  bases__ZN3ccc7DD3x8y6E, 2,
  &(vtc__ZN3ccc7DD3x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1548,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y7  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y73pqrEv
  ~CC3x8y7(); // tgen
  CC3x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y7E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y73abcEv");}
void  ccc::CC3x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y73pqrEv");}
ccc::CC3x8y7 ::~CC3x8y7(){ note_dtor("_ZN3ccc7CC3x8y7E", this);} // tgen
ccc::CC3x8y7 ::CC3x8y7(){ note_ctor("_ZN3ccc7CC3x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y7E, buf);
    ::ccc::CC3x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y7E);
    dp->::ccc::CC3x8y7::~CC3x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y7E(Test__ZN3ccc7CC3x8y7E, "_ZN3ccc7CC3x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y7C1Ev();
extern void _ZN3ccc7CC3x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y7E[] = {
  NSPAIR(_ZN3ccc7CC3x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC3x8y73abcEv();
extern void _ZN3ccc7CC3x8y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y73pqrEv,_ZTv0_n16_N3ccc7CC3x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y73pqrEv,_ZThn4_N3ccc7CC3x8y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y73abcEv,_ZTv0_n20_N3ccc7CC3x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y73abcEv,_ZThn4_N3ccc7CC3x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y73pqrEv,_ZTv0_n16_N3ccc7CC3x8y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y73abcEv,_ZTv0_n20_N3ccc7CC3x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y7E[] = {
  {&(_ZTVN3ccc7CC3x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y7E[];
static VTBL_ENTRY alt_thunk_names1549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y73abcEv,_ZTv0_n20_N3ccc7CC3x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y73abcEv,_ZThn4_N3ccc7CC3x8y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y73pqrEv,_ZTv0_n16_N3ccc7CC3x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y73pqrEv,_ZThn4_N3ccc7CC3x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y7E = {  "_ZN3ccc7CC3x8y7E", // class name
  bases__ZN3ccc7CC3x8y7E, 2,
  &(vtc__ZN3ccc7CC3x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1549,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y7  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD3x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y73pqrEv
  ~DD3x8y7(); // tgen
  DD3x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y73abcEv");}
void  ccc::DD3x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y73pqrEv");}
ccc::DD3x8y7 ::~DD3x8y7(){ note_dtor("_ZN3ccc7DD3x8y7E", this);} // tgen
ccc::DD3x8y7 ::DD3x8y7(){ note_ctor("_ZN3ccc7DD3x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y7E, buf);
    ::ccc::DD3x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y7E);
    dp->::ccc::DD3x8y7::~DD3x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y7E(Test__ZN3ccc7DD3x8y7E, "_ZN3ccc7DD3x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y7C1Ev();
extern void _ZN3ccc7DD3x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y7E[] = {
  NSPAIR(_ZN3ccc7DD3x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x8y73pqrEv();
extern void _ZN3ccc7DD3x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y73abcEv,_ZTv0_n16_N3ccc7DD3x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y73abcEv,_ZThn4_N3ccc7DD3x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y73abcEv,_ZTv0_n16_N3ccc7DD3x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y7E[] = {
  {&(_ZTVN3ccc7DD3x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y7E[];
static VTBL_ENTRY alt_thunk_names1550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y73abcEv,_ZTv0_n16_N3ccc7DD3x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y73abcEv,_ZThn4_N3ccc7DD3x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y7E = {  "_ZN3ccc7DD3x8y7E", // class name
  bases__ZN3ccc7DD3x8y7E, 2,
  &(vtc__ZN3ccc7DD3x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1550,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y8  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y83abcEv
  ~CC3x8y8(); // tgen
  CC3x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y8E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y83efgEv");}
void  ccc::CC3x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y83abcEv");}
ccc::CC3x8y8 ::~CC3x8y8(){ note_dtor("_ZN3ccc7CC3x8y8E", this);} // tgen
ccc::CC3x8y8 ::CC3x8y8(){ note_ctor("_ZN3ccc7CC3x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y8E, buf);
    ::ccc::CC3x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y8E);
    dp->::ccc::CC3x8y8::~CC3x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y8E(Test__ZN3ccc7CC3x8y8E, "_ZN3ccc7CC3x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y8C1Ev();
extern void _ZN3ccc7CC3x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y8E[] = {
  NSPAIR(_ZN3ccc7CC3x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y8E[];
extern void _ZN3ccc7CC3x8y83efgEv();
extern void _ZN3ccc7CC3x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y83efgEv,_ZTv0_n12_N3ccc7CC3x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y83efgEv,_ZThn4_N3ccc7CC3x8y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x8y83abcEv,_ZTv0_n20_N3ccc7CC3x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y83abcEv,_ZThn4_N3ccc7CC3x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y83efgEv,_ZTv0_n12_N3ccc7CC3x8y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x8y83abcEv,_ZTv0_n20_N3ccc7CC3x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y8E[] = {
  {&(_ZTVN3ccc7CC3x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y8E[];
static VTBL_ENTRY alt_thunk_names1551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x8y83abcEv,_ZTv0_n20_N3ccc7CC3x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y83abcEv,_ZThn4_N3ccc7CC3x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y83efgEv,_ZTv0_n12_N3ccc7CC3x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y83efgEv,_ZThn4_N3ccc7CC3x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y8E = {  "_ZN3ccc7CC3x8y8E", // class name
  bases__ZN3ccc7CC3x8y8E, 2,
  &(vtc__ZN3ccc7CC3x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1551,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y8  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD3x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x8y83abcEv
  ~DD3x8y8(); // tgen
  DD3x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y83efgEv");}
void  ccc::DD3x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x8y83abcEv");}
ccc::DD3x8y8 ::~DD3x8y8(){ note_dtor("_ZN3ccc7DD3x8y8E", this);} // tgen
ccc::DD3x8y8 ::DD3x8y8(){ note_ctor("_ZN3ccc7DD3x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y8E, buf);
    ::ccc::DD3x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y8E);
    dp->::ccc::DD3x8y8::~DD3x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y8E(Test__ZN3ccc7DD3x8y8E, "_ZN3ccc7DD3x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y8C1Ev();
extern void _ZN3ccc7DD3x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y8E[] = {
  NSPAIR(_ZN3ccc7DD3x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y8E[];
extern void _ZN3ccc7DD3x8y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y83efgEv,_ZTv0_n12_N3ccc7DD3x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y83efgEv,_ZThn4_N3ccc7DD3x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x8y83abcEv,_ZTv0_n16_N3ccc7DD3x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y83abcEv,_ZThn4_N3ccc7DD3x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y83efgEv,_ZTv0_n12_N3ccc7DD3x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x8y83abcEv,_ZTv0_n16_N3ccc7DD3x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y8E[] = {
  {&(_ZTVN3ccc7DD3x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y8E[];
static VTBL_ENTRY alt_thunk_names1552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x8y83abcEv,_ZTv0_n16_N3ccc7DD3x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y83abcEv,_ZThn4_N3ccc7DD3x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y83efgEv,_ZTv0_n12_N3ccc7DD3x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y83efgEv,_ZThn4_N3ccc7DD3x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y8E = {  "_ZN3ccc7DD3x8y8E", // class name
  bases__ZN3ccc7DD3x8y8E, 2,
  &(vtc__ZN3ccc7DD3x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1552,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y9  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y93pqrEv
  ~CC3x8y9(); // tgen
  CC3x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y9E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y93efgEv");}
void  ccc::CC3x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y93pqrEv");}
ccc::CC3x8y9 ::~CC3x8y9(){ note_dtor("_ZN3ccc7CC3x8y9E", this);} // tgen
ccc::CC3x8y9 ::CC3x8y9(){ note_ctor("_ZN3ccc7CC3x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y9E, buf);
    ::ccc::CC3x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC3x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y9E);
    dp->::ccc::CC3x8y9::~CC3x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y9E(Test__ZN3ccc7CC3x8y9E, "_ZN3ccc7CC3x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y9C1Ev();
extern void _ZN3ccc7CC3x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y9E[] = {
  NSPAIR(_ZN3ccc7CC3x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y9E[];
extern void _ZN3ccc7CC3x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC3x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x8y93efgEv,_ZTv0_n12_N3ccc7CC3x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y93efgEv,_ZThn4_N3ccc7CC3x8y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x8y93pqrEv,_ZTv0_n16_N3ccc7CC3x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y93pqrEv,_ZThn4_N3ccc7CC3x8y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x8y93efgEv,_ZTv0_n12_N3ccc7CC3x8y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x8y93pqrEv,_ZTv0_n16_N3ccc7CC3x8y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x8y9E[] = {
  {&(_ZTVN3ccc7CC3x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x8y9E[];
static VTBL_ENTRY alt_thunk_names1553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x8y93pqrEv,_ZTv0_n16_N3ccc7CC3x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y93pqrEv,_ZThn4_N3ccc7CC3x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x8y93efgEv,_ZTv0_n12_N3ccc7CC3x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x8y93efgEv,_ZThn4_N3ccc7CC3x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x8y9E = {  "_ZN3ccc7CC3x8y9E", // class name
  bases__ZN3ccc7CC3x8y9E, 2,
  &(vtc__ZN3ccc7CC3x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x8y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1553,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y9  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD3x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x8y93pqrEv
  ~DD3x8y9(); // tgen
  DD3x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x8y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x8y93efgEv");}
void  ccc::DD3x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x8y93pqrEv");}
ccc::DD3x8y9 ::~DD3x8y9(){ note_dtor("_ZN3ccc7DD3x8y9E", this);} // tgen
ccc::DD3x8y9 ::DD3x8y9(){ note_ctor("_ZN3ccc7DD3x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x8y9E, buf);
    ::ccc::DD3x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x8y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD3x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x8y9E);
    dp->::ccc::DD3x8y9::~DD3x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x8y9E(Test__ZN3ccc7DD3x8y9E, "_ZN3ccc7DD3x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x8y9C1Ev();
extern void _ZN3ccc7DD3x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x8y9E[] = {
  NSPAIR(_ZN3ccc7DD3x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD3x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y9E[];
extern void _ZN3ccc7DD3x8y93efgEv();
extern void _ZN3ccc7DD3x8y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x8y93efgEv,_ZTv0_n12_N3ccc7DD3x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x8y93efgEv,_ZThn4_N3ccc7DD3x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x8y93efgEv,_ZTv0_n12_N3ccc7DD3x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x8y9E[] = {
  {&(_ZTVN3ccc7DD3x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x8y9E[];
static VTBL_ENTRY alt_thunk_names1554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x8y93efgEv,_ZTv0_n12_N3ccc7DD3x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x8y93efgEv,_ZThn4_N3ccc7DD3x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x8y9E = {  "_ZN3ccc7DD3x8y9E", // class name
  bases__ZN3ccc7DD3x8y9E, 2,
  &(vtc__ZN3ccc7DD3x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x8y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1554,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y10  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x8y103abcEv
  ~CC3x8y10(); // tgen
  CC3x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y10E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y103pqrEv");}
void  ccc::CC3x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x8y103abcEv");}
ccc::CC3x8y10 ::~CC3x8y10(){ note_dtor("_ZN3ccc8CC3x8y10E", this);} // tgen
ccc::CC3x8y10 ::CC3x8y10(){ note_ctor("_ZN3ccc8CC3x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y10E, buf);
    ::ccc::CC3x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y10E);
    dp->::ccc::CC3x8y10::~CC3x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y10E(Test__ZN3ccc8CC3x8y10E, "_ZN3ccc8CC3x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y10C1Ev();
extern void _ZN3ccc8CC3x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y10E[] = {
  NSPAIR(_ZN3ccc8CC3x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC3x8y103abcEv();
extern void _ZN3ccc8CC3x8y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x8y103pqrEv,_ZTv0_n16_N3ccc8CC3x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y103pqrEv,_ZThn4_N3ccc8CC3x8y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x8y103abcEv,_ZTv0_n20_N3ccc8CC3x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y103abcEv,_ZThn4_N3ccc8CC3x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x8y103pqrEv,_ZTv0_n16_N3ccc8CC3x8y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x8y103abcEv,_ZTv0_n20_N3ccc8CC3x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y10E[] = {
  {&(_ZTVN3ccc8CC3x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y10E[];
static VTBL_ENTRY alt_thunk_names1555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x8y103abcEv,_ZTv0_n20_N3ccc8CC3x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y103abcEv,_ZThn4_N3ccc8CC3x8y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x8y103pqrEv,_ZTv0_n16_N3ccc8CC3x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y103pqrEv,_ZThn4_N3ccc8CC3x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x8y10E = {  "_ZN3ccc8CC3x8y10E", // class name
  bases__ZN3ccc8CC3x8y10E, 2,
  &(vtc__ZN3ccc8CC3x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1555,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y10  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD3x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x8y103abcEv
  ~DD3x8y10(); // tgen
  DD3x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x8y103pqrEv");}
void  ccc::DD3x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x8y103abcEv");}
ccc::DD3x8y10 ::~DD3x8y10(){ note_dtor("_ZN3ccc8DD3x8y10E", this);} // tgen
ccc::DD3x8y10 ::DD3x8y10(){ note_ctor("_ZN3ccc8DD3x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y10E, buf);
    ::ccc::DD3x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y10E);
    dp->::ccc::DD3x8y10::~DD3x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y10E(Test__ZN3ccc8DD3x8y10E, "_ZN3ccc8DD3x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y10C1Ev();
extern void _ZN3ccc8DD3x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y10E[] = {
  NSPAIR(_ZN3ccc8DD3x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x8y103pqrEv();
extern void _ZN3ccc8DD3x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x8y103abcEv,_ZTv0_n16_N3ccc8DD3x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x8y103abcEv,_ZThn4_N3ccc8DD3x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x8y103abcEv,_ZTv0_n16_N3ccc8DD3x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y10E[] = {
  {&(_ZTVN3ccc8DD3x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y10E[];
static VTBL_ENTRY alt_thunk_names1556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x8y103abcEv,_ZTv0_n16_N3ccc8DD3x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x8y103abcEv,_ZThn4_N3ccc8DD3x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x8y10E = {  "_ZN3ccc8DD3x8y10E", // class name
  bases__ZN3ccc8DD3x8y10E, 2,
  &(vtc__ZN3ccc8DD3x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1556,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y11  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x8y113efgEv
  ~CC3x8y11(); // tgen
  CC3x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y11E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y113pqrEv");}
void  ccc::CC3x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x8y113efgEv");}
ccc::CC3x8y11 ::~CC3x8y11(){ note_dtor("_ZN3ccc8CC3x8y11E", this);} // tgen
ccc::CC3x8y11 ::CC3x8y11(){ note_ctor("_ZN3ccc8CC3x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y11E, buf);
    ::ccc::CC3x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y11E);
    dp->::ccc::CC3x8y11::~CC3x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y11E(Test__ZN3ccc8CC3x8y11E, "_ZN3ccc8CC3x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y11C1Ev();
extern void _ZN3ccc8CC3x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y11E[] = {
  NSPAIR(_ZN3ccc8CC3x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y11E[];
extern void _ZN3ccc8CC3x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC3x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x8y113efgEv,_ZTv0_n12_N3ccc8CC3x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y113efgEv,_ZThn4_N3ccc8CC3x8y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x8y113pqrEv,_ZTv0_n16_N3ccc8CC3x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y113pqrEv,_ZThn4_N3ccc8CC3x8y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x8y113efgEv,_ZTv0_n12_N3ccc8CC3x8y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x8y113pqrEv,_ZTv0_n16_N3ccc8CC3x8y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y11E[] = {
  {&(_ZTVN3ccc8CC3x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y11E[];
static VTBL_ENTRY alt_thunk_names1557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x8y113pqrEv,_ZTv0_n16_N3ccc8CC3x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y113pqrEv,_ZThn4_N3ccc8CC3x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x8y113efgEv,_ZTv0_n12_N3ccc8CC3x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y113efgEv,_ZThn4_N3ccc8CC3x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x8y11E = {  "_ZN3ccc8CC3x8y11E", // class name
  bases__ZN3ccc8CC3x8y11E, 2,
  &(vtc__ZN3ccc8CC3x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1557,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y11  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD3x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x8y113efgEv
  ~DD3x8y11(); // tgen
  DD3x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x8y113pqrEv");}
void  ccc::DD3x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x8y113efgEv");}
ccc::DD3x8y11 ::~DD3x8y11(){ note_dtor("_ZN3ccc8DD3x8y11E", this);} // tgen
ccc::DD3x8y11 ::DD3x8y11(){ note_ctor("_ZN3ccc8DD3x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y11E, buf);
    ::ccc::DD3x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y11E);
    dp->::ccc::DD3x8y11::~DD3x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y11E(Test__ZN3ccc8DD3x8y11E, "_ZN3ccc8DD3x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y11C1Ev();
extern void _ZN3ccc8DD3x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y11E[] = {
  NSPAIR(_ZN3ccc8DD3x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y11E[];
extern void _ZN3ccc8DD3x8y113efgEv();
extern void _ZN3ccc8DD3x8y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x8y113efgEv,_ZTv0_n12_N3ccc8DD3x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x8y113efgEv,_ZThn4_N3ccc8DD3x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x8y113efgEv,_ZTv0_n12_N3ccc8DD3x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y11E[] = {
  {&(_ZTVN3ccc8DD3x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y11E[];
static VTBL_ENTRY alt_thunk_names1558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x8y113efgEv,_ZTv0_n12_N3ccc8DD3x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x8y113efgEv,_ZThn4_N3ccc8DD3x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x8y11E = {  "_ZN3ccc8DD3x8y11E", // class name
  bases__ZN3ccc8DD3x8y11E, 2,
  &(vtc__ZN3ccc8DD3x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1558,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y12  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC3x8y123abcEv
  ~CC3x8y12(); // tgen
  CC3x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x8y123abcEv");}
ccc::CC3x8y12 ::~CC3x8y12(){ note_dtor("_ZN3ccc8CC3x8y12E", this);} // tgen
ccc::CC3x8y12 ::CC3x8y12(){ note_ctor("_ZN3ccc8CC3x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y12E, buf);
    ::ccc::CC3x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y12E);
    dp->::ccc::CC3x8y12::~CC3x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y12E(Test__ZN3ccc8CC3x8y12E, "_ZN3ccc8CC3x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y12C1Ev();
extern void _ZN3ccc8CC3x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y12E[] = {
  NSPAIR(_ZN3ccc8CC3x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC3x8y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x8y123abcEv,_ZTv0_n20_N3ccc8CC3x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y123abcEv,_ZThn4_N3ccc8CC3x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x8y123abcEv,_ZTv0_n20_N3ccc8CC3x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y12E[] = {
  {&(_ZTVN3ccc8CC3x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y12E[];
static VTBL_ENTRY alt_thunk_names1559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x8y123abcEv,_ZTv0_n20_N3ccc8CC3x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y123abcEv,_ZThn4_N3ccc8CC3x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x8y12E = {  "_ZN3ccc8CC3x8y12E", // class name
  bases__ZN3ccc8CC3x8y12E, 2,
  &(vtc__ZN3ccc8CC3x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1559,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y12  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD3x8y123abcEv
  ~DD3x8y12(); // tgen
  DD3x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x8y123abcEv");}
ccc::DD3x8y12 ::~DD3x8y12(){ note_dtor("_ZN3ccc8DD3x8y12E", this);} // tgen
ccc::DD3x8y12 ::DD3x8y12(){ note_ctor("_ZN3ccc8DD3x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y12E, buf);
    ::ccc::DD3x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y12E);
    dp->::ccc::DD3x8y12::~DD3x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y12E(Test__ZN3ccc8DD3x8y12E, "_ZN3ccc8DD3x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y12C1Ev();
extern void _ZN3ccc8DD3x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y12E[] = {
  NSPAIR(_ZN3ccc8DD3x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x8y123abcEv,_ZTv0_n16_N3ccc8DD3x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x8y123abcEv,_ZThn4_N3ccc8DD3x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x8y123abcEv,_ZTv0_n16_N3ccc8DD3x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y12E[] = {
  {&(_ZTVN3ccc8DD3x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y12E[];
static VTBL_ENTRY alt_thunk_names1560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x8y123abcEv,_ZTv0_n16_N3ccc8DD3x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x8y123abcEv,_ZThn4_N3ccc8DD3x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x8y12E = {  "_ZN3ccc8DD3x8y12E", // class name
  bases__ZN3ccc8DD3x8y12E, 2,
  &(vtc__ZN3ccc8DD3x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1560,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y13  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC3x8y133efgEv
  ~CC3x8y13(); // tgen
  CC3x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x8y133efgEv");}
ccc::CC3x8y13 ::~CC3x8y13(){ note_dtor("_ZN3ccc8CC3x8y13E", this);} // tgen
ccc::CC3x8y13 ::CC3x8y13(){ note_ctor("_ZN3ccc8CC3x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y13E, buf);
    ::ccc::CC3x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y13E);
    dp->::ccc::CC3x8y13::~CC3x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y13E(Test__ZN3ccc8CC3x8y13E, "_ZN3ccc8CC3x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y13C1Ev();
extern void _ZN3ccc8CC3x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y13E[] = {
  NSPAIR(_ZN3ccc8CC3x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y13E[];
extern void _ZN3ccc8CC3x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x8y133efgEv,_ZTv0_n12_N3ccc8CC3x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y133efgEv,_ZThn4_N3ccc8CC3x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x8y133efgEv,_ZTv0_n12_N3ccc8CC3x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y13E[] = {
  {&(_ZTVN3ccc8CC3x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y13E[];
static VTBL_ENTRY alt_thunk_names1561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x8y133efgEv,_ZTv0_n12_N3ccc8CC3x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y133efgEv,_ZThn4_N3ccc8CC3x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x8y13E = {  "_ZN3ccc8CC3x8y13E", // class name
  bases__ZN3ccc8CC3x8y13E, 2,
  &(vtc__ZN3ccc8CC3x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1561,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y13  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD3x8y133efgEv
  ~DD3x8y13(); // tgen
  DD3x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x8y133efgEv");}
ccc::DD3x8y13 ::~DD3x8y13(){ note_dtor("_ZN3ccc8DD3x8y13E", this);} // tgen
ccc::DD3x8y13 ::DD3x8y13(){ note_ctor("_ZN3ccc8DD3x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y13E, buf);
    ::ccc::DD3x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y13E);
    dp->::ccc::DD3x8y13::~DD3x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y13E(Test__ZN3ccc8DD3x8y13E, "_ZN3ccc8DD3x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y13C1Ev();
extern void _ZN3ccc8DD3x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y13E[] = {
  NSPAIR(_ZN3ccc8DD3x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y13E[];
extern void _ZN3ccc8DD3x8y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x8y133efgEv,_ZTv0_n12_N3ccc8DD3x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x8y133efgEv,_ZThn4_N3ccc8DD3x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x8y133efgEv,_ZTv0_n12_N3ccc8DD3x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y13E[] = {
  {&(_ZTVN3ccc8DD3x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y13E[];
static VTBL_ENTRY alt_thunk_names1562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x8y133efgEv,_ZTv0_n12_N3ccc8DD3x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x8y133efgEv,_ZThn4_N3ccc8DD3x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x8y13E = {  "_ZN3ccc8DD3x8y13E", // class name
  bases__ZN3ccc8DD3x8y13E, 2,
  &(vtc__ZN3ccc8DD3x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1562,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y14  : virtual ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y143pqrEv
  ~CC3x8y14(); // tgen
  CC3x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y143pqrEv");}
ccc::CC3x8y14 ::~CC3x8y14(){ note_dtor("_ZN3ccc8CC3x8y14E", this);} // tgen
ccc::CC3x8y14 ::CC3x8y14(){ note_ctor("_ZN3ccc8CC3x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y14E, buf);
    ::ccc::CC3x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y14E);
    dp->::ccc::CC3x8y14::~CC3x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y14E(Test__ZN3ccc8CC3x8y14E, "_ZN3ccc8CC3x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y14C1Ev();
extern void _ZN3ccc8CC3x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y14E[] = {
  NSPAIR(_ZN3ccc8CC3x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC3x8y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x8y143pqrEv,_ZTv0_n16_N3ccc8CC3x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y143pqrEv,_ZThn4_N3ccc8CC3x8y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x8y143pqrEv,_ZTv0_n16_N3ccc8CC3x8y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y14E[] = {
  {&(_ZTVN3ccc8CC3x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y14E[];
static VTBL_ENTRY alt_thunk_names1563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x8y143pqrEv,_ZTv0_n16_N3ccc8CC3x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x8y143pqrEv,_ZThn4_N3ccc8CC3x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x8y14E = {  "_ZN3ccc8CC3x8y14E", // class name
  bases__ZN3ccc8CC3x8y14E, 2,
  &(vtc__ZN3ccc8CC3x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1563,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y14  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD3x8y143pqrEv
  ~DD3x8y14(); // tgen
  DD3x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x8y143pqrEv");}
ccc::DD3x8y14 ::~DD3x8y14(){ note_dtor("_ZN3ccc8DD3x8y14E", this);} // tgen
ccc::DD3x8y14 ::DD3x8y14(){ note_ctor("_ZN3ccc8DD3x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y14E, buf);
    ::ccc::DD3x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y14E);
    dp->::ccc::DD3x8y14::~DD3x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y14E(Test__ZN3ccc8DD3x8y14E, "_ZN3ccc8DD3x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y14C1Ev();
extern void _ZN3ccc8DD3x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y14E[] = {
  NSPAIR(_ZN3ccc8DD3x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x8y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y14E[] = {
  {&(_ZTVN3ccc8DD3x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y14E[];
Class_Descriptor cd__ZN3ccc8DD3x8y14E = {  "_ZN3ccc8DD3x8y14E", // class name
  bases__ZN3ccc8DD3x8y14E, 2,
  &(vtc__ZN3ccc8DD3x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y15  : virtual ::ccc::AA3 , ::ccc::BB8 {
  ~CC3x8y15(); // tgen
  CC3x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x8y15 ::~CC3x8y15(){ note_dtor("_ZN3ccc8CC3x8y15E", this);} // tgen
ccc::CC3x8y15 ::CC3x8y15(){ note_ctor("_ZN3ccc8CC3x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y15E, buf);
    ::ccc::CC3x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC3x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y15E);
    dp->::ccc::CC3x8y15::~CC3x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y15E(Test__ZN3ccc8CC3x8y15E, "_ZN3ccc8CC3x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y15C1Ev();
extern void _ZN3ccc8CC3x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y15E[] = {
  NSPAIR(_ZN3ccc8CC3x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x8y15E[] = {
  {&(_ZTVN3ccc8CC3x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x8y15E[];
Class_Descriptor cd__ZN3ccc8CC3x8y15E = {  "_ZN3ccc8CC3x8y15E", // class name
  bases__ZN3ccc8CC3x8y15E, 2,
  &(vtc__ZN3ccc8CC3x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x8y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x8y15  : virtual ::ccc::AA3 , virtual ::ccc::BB8 {
  ~DD3x8y15(); // tgen
  DD3x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x8y15 ::~DD3x8y15(){ note_dtor("_ZN3ccc8DD3x8y15E", this);} // tgen
ccc::DD3x8y15 ::DD3x8y15(){ note_ctor("_ZN3ccc8DD3x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x8y15E, buf);
    ::ccc::DD3x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x8y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD3x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x8y15E);
    dp->::ccc::DD3x8y15::~DD3x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x8y15E(Test__ZN3ccc8DD3x8y15E, "_ZN3ccc8DD3x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x8y15C1Ev();
extern void _ZN3ccc8DD3x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x8y15E[] = {
  NSPAIR(_ZN3ccc8DD3x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD3x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x8y15E[] = {
  {&(_ZTVN3ccc8DD3x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x8y15E[];
Class_Descriptor cd__ZN3ccc8DD3x8y15E = {  "_ZN3ccc8DD3x8y15E", // class name
  bases__ZN3ccc8DD3x8y15E, 2,
  &(vtc__ZN3ccc8DD3x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x8y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y0  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y03pqrEv
  ~CC3x9y0(); // tgen
  CC3x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y0E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y03abcEv");}
void  ccc::CC3x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y03efgEv");}
void  ccc::CC3x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y03pqrEv");}
ccc::CC3x9y0 ::~CC3x9y0(){ note_dtor("_ZN3ccc7CC3x9y0E", this);} // tgen
ccc::CC3x9y0 ::CC3x9y0(){ note_ctor("_ZN3ccc7CC3x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y0E, buf);
    ::ccc::CC3x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y0E);
    dp->::ccc::CC3x9y0::~CC3x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y0E(Test__ZN3ccc7CC3x9y0E, "_ZN3ccc7CC3x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y0C1Ev();
extern void _ZN3ccc7CC3x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y0E[] = {
  NSPAIR(_ZN3ccc7CC3x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y0E[];
extern void _ZN3ccc7CC3x9y03efgEv();
extern void _ZN3ccc7CC3x9y03pqrEv();
extern void _ZN3ccc7CC3x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y03efgEv,_ZTv0_n12_N3ccc7CC3x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y03efgEv,_ZThn4_N3ccc7CC3x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y03pqrEv,_ZTv0_n16_N3ccc7CC3x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y03pqrEv,_ZThn4_N3ccc7CC3x9y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y03abcEv,_ZTv0_n20_N3ccc7CC3x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y03abcEv,_ZThn4_N3ccc7CC3x9y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y03efgEv,_ZTv0_n12_N3ccc7CC3x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y03pqrEv,_ZTv0_n16_N3ccc7CC3x9y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y03abcEv,_ZTv0_n20_N3ccc7CC3x9y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y0E[] = {
  {&(_ZTVN3ccc7CC3x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y0E[];
static VTBL_ENTRY alt_thunk_names1564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y03abcEv,_ZTv0_n20_N3ccc7CC3x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y03abcEv,_ZThn4_N3ccc7CC3x9y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y03pqrEv,_ZTv0_n16_N3ccc7CC3x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y03pqrEv,_ZThn4_N3ccc7CC3x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y03efgEv,_ZTv0_n12_N3ccc7CC3x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y03efgEv,_ZThn4_N3ccc7CC3x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y0E = {  "_ZN3ccc7CC3x9y0E", // class name
  bases__ZN3ccc7CC3x9y0E, 2,
  &(vtc__ZN3ccc7CC3x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1564,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y0  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD3x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD3x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y03pqrEv
  ~DD3x9y0(); // tgen
  DD3x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y03abcEv");}
void  ccc::DD3x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y03efgEv");}
void  ccc::DD3x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y03pqrEv");}
ccc::DD3x9y0 ::~DD3x9y0(){ note_dtor("_ZN3ccc7DD3x9y0E", this);} // tgen
ccc::DD3x9y0 ::DD3x9y0(){ note_ctor("_ZN3ccc7DD3x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y0E, buf);
    ::ccc::DD3x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y0E);
    dp->::ccc::DD3x9y0::~DD3x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y0E(Test__ZN3ccc7DD3x9y0E, "_ZN3ccc7DD3x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y0C1Ev();
extern void _ZN3ccc7DD3x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y0E[] = {
  NSPAIR(_ZN3ccc7DD3x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y0E[];
extern void _ZN3ccc7DD3x9y03efgEv();
extern void _ZN3ccc7DD3x9y03pqrEv();
extern void _ZN3ccc7DD3x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y03efgEv,_ZTv0_n12_N3ccc7DD3x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y03efgEv,_ZThn4_N3ccc7DD3x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y03pqrEv,_ZTv0_n16_N3ccc7DD3x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y03pqrEv,_ZThn4_N3ccc7DD3x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y03efgEv,_ZTv0_n12_N3ccc7DD3x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y03pqrEv,_ZTv0_n16_N3ccc7DD3x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y0E[] = {
  {&(_ZTVN3ccc7DD3x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y0E[];
static VTBL_ENTRY alt_thunk_names1565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y03pqrEv,_ZTv0_n16_N3ccc7DD3x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y03pqrEv,_ZThn4_N3ccc7DD3x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y03efgEv,_ZTv0_n12_N3ccc7DD3x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y03efgEv,_ZThn4_N3ccc7DD3x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y0E = {  "_ZN3ccc7DD3x9y0E", // class name
  bases__ZN3ccc7DD3x9y0E, 2,
  &(vtc__ZN3ccc7DD3x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1565,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y1  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x9y13efgEv
  ~CC3x9y1(); // tgen
  CC3x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y1E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y13abcEv");}
void  ccc::CC3x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y13pqrEv");}
void  ccc::CC3x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y13efgEv");}
ccc::CC3x9y1 ::~CC3x9y1(){ note_dtor("_ZN3ccc7CC3x9y1E", this);} // tgen
ccc::CC3x9y1 ::CC3x9y1(){ note_ctor("_ZN3ccc7CC3x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y1E, buf);
    ::ccc::CC3x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y1E);
    dp->::ccc::CC3x9y1::~CC3x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y1E(Test__ZN3ccc7CC3x9y1E, "_ZN3ccc7CC3x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y1C1Ev();
extern void _ZN3ccc7CC3x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y1E[] = {
  NSPAIR(_ZN3ccc7CC3x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y1E[];
extern void _ZN3ccc7CC3x9y13efgEv();
extern void _ZN3ccc7CC3x9y13pqrEv();
extern void _ZN3ccc7CC3x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y13efgEv,_ZTv0_n12_N3ccc7CC3x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y13efgEv,_ZThn4_N3ccc7CC3x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y13pqrEv,_ZTv0_n16_N3ccc7CC3x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y13pqrEv,_ZThn4_N3ccc7CC3x9y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y13abcEv,_ZTv0_n20_N3ccc7CC3x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y13abcEv,_ZThn4_N3ccc7CC3x9y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y13efgEv,_ZTv0_n12_N3ccc7CC3x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y13pqrEv,_ZTv0_n16_N3ccc7CC3x9y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y13abcEv,_ZTv0_n20_N3ccc7CC3x9y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y1E[] = {
  {&(_ZTVN3ccc7CC3x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y1E[];
static VTBL_ENTRY alt_thunk_names1566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y13abcEv,_ZTv0_n20_N3ccc7CC3x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y13abcEv,_ZThn4_N3ccc7CC3x9y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y13pqrEv,_ZTv0_n16_N3ccc7CC3x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y13pqrEv,_ZThn4_N3ccc7CC3x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y13efgEv,_ZTv0_n12_N3ccc7CC3x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y13efgEv,_ZThn4_N3ccc7CC3x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y1E = {  "_ZN3ccc7CC3x9y1E", // class name
  bases__ZN3ccc7CC3x9y1E, 2,
  &(vtc__ZN3ccc7CC3x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1566,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y1  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD3x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x9y13efgEv
  ~DD3x9y1(); // tgen
  DD3x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y13abcEv");}
void  ccc::DD3x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y13pqrEv");}
void  ccc::DD3x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y13efgEv");}
ccc::DD3x9y1 ::~DD3x9y1(){ note_dtor("_ZN3ccc7DD3x9y1E", this);} // tgen
ccc::DD3x9y1 ::DD3x9y1(){ note_ctor("_ZN3ccc7DD3x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y1E, buf);
    ::ccc::DD3x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y1E);
    dp->::ccc::DD3x9y1::~DD3x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y1E(Test__ZN3ccc7DD3x9y1E, "_ZN3ccc7DD3x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y1C1Ev();
extern void _ZN3ccc7DD3x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y1E[] = {
  NSPAIR(_ZN3ccc7DD3x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y1E[];
extern void _ZN3ccc7DD3x9y13efgEv();
extern void _ZN3ccc7DD3x9y13pqrEv();
extern void _ZN3ccc7DD3x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y13efgEv,_ZTv0_n12_N3ccc7DD3x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y13efgEv,_ZThn4_N3ccc7DD3x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y13pqrEv,_ZTv0_n16_N3ccc7DD3x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y13pqrEv,_ZThn4_N3ccc7DD3x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y13efgEv,_ZTv0_n12_N3ccc7DD3x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y13pqrEv,_ZTv0_n16_N3ccc7DD3x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y1E[] = {
  {&(_ZTVN3ccc7DD3x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y1E[];
static VTBL_ENTRY alt_thunk_names1567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y13pqrEv,_ZTv0_n16_N3ccc7DD3x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y13pqrEv,_ZThn4_N3ccc7DD3x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y13efgEv,_ZTv0_n12_N3ccc7DD3x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y13efgEv,_ZThn4_N3ccc7DD3x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y1E = {  "_ZN3ccc7DD3x9y1E", // class name
  bases__ZN3ccc7DD3x9y1E, 2,
  &(vtc__ZN3ccc7DD3x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1567,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y2  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y23pqrEv
  ~CC3x9y2(); // tgen
  CC3x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y2E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y23efgEv");}
void  ccc::CC3x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y23abcEv");}
void  ccc::CC3x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y23pqrEv");}
ccc::CC3x9y2 ::~CC3x9y2(){ note_dtor("_ZN3ccc7CC3x9y2E", this);} // tgen
ccc::CC3x9y2 ::CC3x9y2(){ note_ctor("_ZN3ccc7CC3x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y2E, buf);
    ::ccc::CC3x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y2E);
    dp->::ccc::CC3x9y2::~CC3x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y2E(Test__ZN3ccc7CC3x9y2E, "_ZN3ccc7CC3x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y2C1Ev();
extern void _ZN3ccc7CC3x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y2E[] = {
  NSPAIR(_ZN3ccc7CC3x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y2E[];
extern void _ZN3ccc7CC3x9y23efgEv();
extern void _ZN3ccc7CC3x9y23pqrEv();
extern void _ZN3ccc7CC3x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y23efgEv,_ZTv0_n12_N3ccc7CC3x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y23efgEv,_ZThn4_N3ccc7CC3x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y23pqrEv,_ZTv0_n16_N3ccc7CC3x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y23pqrEv,_ZThn4_N3ccc7CC3x9y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y23abcEv,_ZTv0_n20_N3ccc7CC3x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y23abcEv,_ZThn4_N3ccc7CC3x9y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y23efgEv,_ZTv0_n12_N3ccc7CC3x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y23pqrEv,_ZTv0_n16_N3ccc7CC3x9y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y23abcEv,_ZTv0_n20_N3ccc7CC3x9y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y2E[] = {
  {&(_ZTVN3ccc7CC3x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y2E[];
static VTBL_ENTRY alt_thunk_names1568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y23abcEv,_ZTv0_n20_N3ccc7CC3x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y23abcEv,_ZThn4_N3ccc7CC3x9y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y23pqrEv,_ZTv0_n16_N3ccc7CC3x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y23pqrEv,_ZThn4_N3ccc7CC3x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y23efgEv,_ZTv0_n12_N3ccc7CC3x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y23efgEv,_ZThn4_N3ccc7CC3x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y2E = {  "_ZN3ccc7CC3x9y2E", // class name
  bases__ZN3ccc7CC3x9y2E, 2,
  &(vtc__ZN3ccc7CC3x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1568,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y2  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD3x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD3x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y23pqrEv
  ~DD3x9y2(); // tgen
  DD3x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y23efgEv");}
void  ccc::DD3x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y23abcEv");}
void  ccc::DD3x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y23pqrEv");}
ccc::DD3x9y2 ::~DD3x9y2(){ note_dtor("_ZN3ccc7DD3x9y2E", this);} // tgen
ccc::DD3x9y2 ::DD3x9y2(){ note_ctor("_ZN3ccc7DD3x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y2E, buf);
    ::ccc::DD3x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y2E);
    dp->::ccc::DD3x9y2::~DD3x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y2E(Test__ZN3ccc7DD3x9y2E, "_ZN3ccc7DD3x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y2C1Ev();
extern void _ZN3ccc7DD3x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y2E[] = {
  NSPAIR(_ZN3ccc7DD3x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y2E[];
extern void _ZN3ccc7DD3x9y23efgEv();
extern void _ZN3ccc7DD3x9y23pqrEv();
extern void _ZN3ccc7DD3x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y23efgEv,_ZTv0_n12_N3ccc7DD3x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y23efgEv,_ZThn4_N3ccc7DD3x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y23pqrEv,_ZTv0_n16_N3ccc7DD3x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y23pqrEv,_ZThn4_N3ccc7DD3x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y23efgEv,_ZTv0_n12_N3ccc7DD3x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y23pqrEv,_ZTv0_n16_N3ccc7DD3x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y2E[] = {
  {&(_ZTVN3ccc7DD3x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y2E[];
static VTBL_ENTRY alt_thunk_names1569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y23pqrEv,_ZTv0_n16_N3ccc7DD3x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y23pqrEv,_ZThn4_N3ccc7DD3x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y23efgEv,_ZTv0_n12_N3ccc7DD3x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y23efgEv,_ZThn4_N3ccc7DD3x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y2E = {  "_ZN3ccc7DD3x9y2E", // class name
  bases__ZN3ccc7DD3x9y2E, 2,
  &(vtc__ZN3ccc7DD3x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1569,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y3  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x9y33abcEv
  ~CC3x9y3(); // tgen
  CC3x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y3E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y33efgEv");}
void  ccc::CC3x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y33pqrEv");}
void  ccc::CC3x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y33abcEv");}
ccc::CC3x9y3 ::~CC3x9y3(){ note_dtor("_ZN3ccc7CC3x9y3E", this);} // tgen
ccc::CC3x9y3 ::CC3x9y3(){ note_ctor("_ZN3ccc7CC3x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y3E, buf);
    ::ccc::CC3x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y3E);
    dp->::ccc::CC3x9y3::~CC3x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y3E(Test__ZN3ccc7CC3x9y3E, "_ZN3ccc7CC3x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y3C1Ev();
extern void _ZN3ccc7CC3x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y3E[] = {
  NSPAIR(_ZN3ccc7CC3x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y3E[];
extern void _ZN3ccc7CC3x9y33efgEv();
extern void _ZN3ccc7CC3x9y33pqrEv();
extern void _ZN3ccc7CC3x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y33efgEv,_ZTv0_n12_N3ccc7CC3x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y33efgEv,_ZThn4_N3ccc7CC3x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y33pqrEv,_ZTv0_n16_N3ccc7CC3x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y33pqrEv,_ZThn4_N3ccc7CC3x9y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y33abcEv,_ZTv0_n20_N3ccc7CC3x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y33abcEv,_ZThn4_N3ccc7CC3x9y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y33efgEv,_ZTv0_n12_N3ccc7CC3x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y33pqrEv,_ZTv0_n16_N3ccc7CC3x9y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y33abcEv,_ZTv0_n20_N3ccc7CC3x9y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y3E[] = {
  {&(_ZTVN3ccc7CC3x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y3E[];
static VTBL_ENTRY alt_thunk_names1570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y33abcEv,_ZTv0_n20_N3ccc7CC3x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y33abcEv,_ZThn4_N3ccc7CC3x9y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y33pqrEv,_ZTv0_n16_N3ccc7CC3x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y33pqrEv,_ZThn4_N3ccc7CC3x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y33efgEv,_ZTv0_n12_N3ccc7CC3x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y33efgEv,_ZThn4_N3ccc7CC3x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y3E = {  "_ZN3ccc7CC3x9y3E", // class name
  bases__ZN3ccc7CC3x9y3E, 2,
  &(vtc__ZN3ccc7CC3x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1570,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y3  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD3x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x9y33abcEv
  ~DD3x9y3(); // tgen
  DD3x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y33efgEv");}
void  ccc::DD3x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y33pqrEv");}
void  ccc::DD3x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y33abcEv");}
ccc::DD3x9y3 ::~DD3x9y3(){ note_dtor("_ZN3ccc7DD3x9y3E", this);} // tgen
ccc::DD3x9y3 ::DD3x9y3(){ note_ctor("_ZN3ccc7DD3x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y3E, buf);
    ::ccc::DD3x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y3E);
    dp->::ccc::DD3x9y3::~DD3x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y3E(Test__ZN3ccc7DD3x9y3E, "_ZN3ccc7DD3x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y3C1Ev();
extern void _ZN3ccc7DD3x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y3E[] = {
  NSPAIR(_ZN3ccc7DD3x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y3E[];
extern void _ZN3ccc7DD3x9y33efgEv();
extern void _ZN3ccc7DD3x9y33pqrEv();
extern void _ZN3ccc7DD3x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y33efgEv,_ZTv0_n12_N3ccc7DD3x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y33efgEv,_ZThn4_N3ccc7DD3x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y33pqrEv,_ZTv0_n16_N3ccc7DD3x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y33pqrEv,_ZThn4_N3ccc7DD3x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y33efgEv,_ZTv0_n12_N3ccc7DD3x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y33pqrEv,_ZTv0_n16_N3ccc7DD3x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y3E[] = {
  {&(_ZTVN3ccc7DD3x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y3E[];
static VTBL_ENTRY alt_thunk_names1571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y33pqrEv,_ZTv0_n16_N3ccc7DD3x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y33pqrEv,_ZThn4_N3ccc7DD3x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y33efgEv,_ZTv0_n12_N3ccc7DD3x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y33efgEv,_ZThn4_N3ccc7DD3x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y3E = {  "_ZN3ccc7DD3x9y3E", // class name
  bases__ZN3ccc7DD3x9y3E, 2,
  &(vtc__ZN3ccc7DD3x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1571,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y4  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC3x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y43efgEv
  ~CC3x9y4(); // tgen
  CC3x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y4E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y43pqrEv");}
void  ccc::CC3x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y43abcEv");}
void  ccc::CC3x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y43efgEv");}
ccc::CC3x9y4 ::~CC3x9y4(){ note_dtor("_ZN3ccc7CC3x9y4E", this);} // tgen
ccc::CC3x9y4 ::CC3x9y4(){ note_ctor("_ZN3ccc7CC3x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y4E, buf);
    ::ccc::CC3x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y4E);
    dp->::ccc::CC3x9y4::~CC3x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y4E(Test__ZN3ccc7CC3x9y4E, "_ZN3ccc7CC3x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y4C1Ev();
extern void _ZN3ccc7CC3x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y4E[] = {
  NSPAIR(_ZN3ccc7CC3x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y4E[];
extern void _ZN3ccc7CC3x9y43efgEv();
extern void _ZN3ccc7CC3x9y43pqrEv();
extern void _ZN3ccc7CC3x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y43efgEv,_ZTv0_n12_N3ccc7CC3x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y43efgEv,_ZThn4_N3ccc7CC3x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y43pqrEv,_ZTv0_n16_N3ccc7CC3x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y43pqrEv,_ZThn4_N3ccc7CC3x9y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y43abcEv,_ZTv0_n20_N3ccc7CC3x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y43abcEv,_ZThn4_N3ccc7CC3x9y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y43efgEv,_ZTv0_n12_N3ccc7CC3x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y43pqrEv,_ZTv0_n16_N3ccc7CC3x9y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y43abcEv,_ZTv0_n20_N3ccc7CC3x9y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y4E[] = {
  {&(_ZTVN3ccc7CC3x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y4E[];
static VTBL_ENTRY alt_thunk_names1572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y43abcEv,_ZTv0_n20_N3ccc7CC3x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y43abcEv,_ZThn4_N3ccc7CC3x9y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y43pqrEv,_ZTv0_n16_N3ccc7CC3x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y43pqrEv,_ZThn4_N3ccc7CC3x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y43efgEv,_ZTv0_n12_N3ccc7CC3x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y43efgEv,_ZThn4_N3ccc7CC3x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y4E = {  "_ZN3ccc7CC3x9y4E", // class name
  bases__ZN3ccc7CC3x9y4E, 2,
  &(vtc__ZN3ccc7CC3x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1572,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y4  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD3x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD3x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD3x9y43efgEv
  ~DD3x9y4(); // tgen
  DD3x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y43pqrEv");}
void  ccc::DD3x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y43abcEv");}
void  ccc::DD3x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y43efgEv");}
ccc::DD3x9y4 ::~DD3x9y4(){ note_dtor("_ZN3ccc7DD3x9y4E", this);} // tgen
ccc::DD3x9y4 ::DD3x9y4(){ note_ctor("_ZN3ccc7DD3x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y4E, buf);
    ::ccc::DD3x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y4E);
    dp->::ccc::DD3x9y4::~DD3x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y4E(Test__ZN3ccc7DD3x9y4E, "_ZN3ccc7DD3x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y4C1Ev();
extern void _ZN3ccc7DD3x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y4E[] = {
  NSPAIR(_ZN3ccc7DD3x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y4E[];
extern void _ZN3ccc7DD3x9y43efgEv();
extern void _ZN3ccc7DD3x9y43pqrEv();
extern void _ZN3ccc7DD3x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y43efgEv,_ZTv0_n12_N3ccc7DD3x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y43efgEv,_ZThn4_N3ccc7DD3x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y43pqrEv,_ZTv0_n16_N3ccc7DD3x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y43pqrEv,_ZThn4_N3ccc7DD3x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y43efgEv,_ZTv0_n12_N3ccc7DD3x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y43pqrEv,_ZTv0_n16_N3ccc7DD3x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y4E[] = {
  {&(_ZTVN3ccc7DD3x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y4E[];
static VTBL_ENTRY alt_thunk_names1573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y43pqrEv,_ZTv0_n16_N3ccc7DD3x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y43pqrEv,_ZThn4_N3ccc7DD3x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y43efgEv,_ZTv0_n12_N3ccc7DD3x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y43efgEv,_ZThn4_N3ccc7DD3x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y4E = {  "_ZN3ccc7DD3x9y4E", // class name
  bases__ZN3ccc7DD3x9y4E, 2,
  &(vtc__ZN3ccc7DD3x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1573,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y5  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC3x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y53abcEv
  ~CC3x9y5(); // tgen
  CC3x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y5E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y53pqrEv");}
void  ccc::CC3x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y53efgEv");}
void  ccc::CC3x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y53abcEv");}
ccc::CC3x9y5 ::~CC3x9y5(){ note_dtor("_ZN3ccc7CC3x9y5E", this);} // tgen
ccc::CC3x9y5 ::CC3x9y5(){ note_ctor("_ZN3ccc7CC3x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y5E, buf);
    ::ccc::CC3x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y5E);
    dp->::ccc::CC3x9y5::~CC3x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y5E(Test__ZN3ccc7CC3x9y5E, "_ZN3ccc7CC3x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y5C1Ev();
extern void _ZN3ccc7CC3x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y5E[] = {
  NSPAIR(_ZN3ccc7CC3x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y5E[];
extern void _ZN3ccc7CC3x9y53efgEv();
extern void _ZN3ccc7CC3x9y53pqrEv();
extern void _ZN3ccc7CC3x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y53efgEv,_ZTv0_n12_N3ccc7CC3x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y53efgEv,_ZThn4_N3ccc7CC3x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y53pqrEv,_ZTv0_n16_N3ccc7CC3x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y53pqrEv,_ZThn4_N3ccc7CC3x9y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y53abcEv,_ZTv0_n20_N3ccc7CC3x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y53abcEv,_ZThn4_N3ccc7CC3x9y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y53efgEv,_ZTv0_n12_N3ccc7CC3x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y53pqrEv,_ZTv0_n16_N3ccc7CC3x9y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y53abcEv,_ZTv0_n20_N3ccc7CC3x9y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y5E[] = {
  {&(_ZTVN3ccc7CC3x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y5E[];
static VTBL_ENTRY alt_thunk_names1574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y53abcEv,_ZTv0_n20_N3ccc7CC3x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y53abcEv,_ZThn4_N3ccc7CC3x9y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y53pqrEv,_ZTv0_n16_N3ccc7CC3x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y53pqrEv,_ZThn4_N3ccc7CC3x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y53efgEv,_ZTv0_n12_N3ccc7CC3x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y53efgEv,_ZThn4_N3ccc7CC3x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y5E = {  "_ZN3ccc7CC3x9y5E", // class name
  bases__ZN3ccc7CC3x9y5E, 2,
  &(vtc__ZN3ccc7CC3x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1574,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y5  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD3x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD3x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD3x9y53abcEv
  ~DD3x9y5(); // tgen
  DD3x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y53pqrEv");}
void  ccc::DD3x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y53efgEv");}
void  ccc::DD3x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y53abcEv");}
ccc::DD3x9y5 ::~DD3x9y5(){ note_dtor("_ZN3ccc7DD3x9y5E", this);} // tgen
ccc::DD3x9y5 ::DD3x9y5(){ note_ctor("_ZN3ccc7DD3x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y5E, buf);
    ::ccc::DD3x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y5E);
    dp->::ccc::DD3x9y5::~DD3x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y5E(Test__ZN3ccc7DD3x9y5E, "_ZN3ccc7DD3x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y5C1Ev();
extern void _ZN3ccc7DD3x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y5E[] = {
  NSPAIR(_ZN3ccc7DD3x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y5E[];
extern void _ZN3ccc7DD3x9y53efgEv();
extern void _ZN3ccc7DD3x9y53pqrEv();
extern void _ZN3ccc7DD3x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y53efgEv,_ZTv0_n12_N3ccc7DD3x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y53efgEv,_ZThn4_N3ccc7DD3x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y53pqrEv,_ZTv0_n16_N3ccc7DD3x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y53pqrEv,_ZThn4_N3ccc7DD3x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y53efgEv,_ZTv0_n12_N3ccc7DD3x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y53pqrEv,_ZTv0_n16_N3ccc7DD3x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y5E[] = {
  {&(_ZTVN3ccc7DD3x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y5E[];
static VTBL_ENTRY alt_thunk_names1575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y53pqrEv,_ZTv0_n16_N3ccc7DD3x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y53pqrEv,_ZThn4_N3ccc7DD3x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y53efgEv,_ZTv0_n12_N3ccc7DD3x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y53efgEv,_ZThn4_N3ccc7DD3x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y5E = {  "_ZN3ccc7DD3x9y5E", // class name
  bases__ZN3ccc7DD3x9y5E, 2,
  &(vtc__ZN3ccc7DD3x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1575,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y6  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y63efgEv
  ~CC3x9y6(); // tgen
  CC3x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y6E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y63abcEv");}
void  ccc::CC3x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y63efgEv");}
ccc::CC3x9y6 ::~CC3x9y6(){ note_dtor("_ZN3ccc7CC3x9y6E", this);} // tgen
ccc::CC3x9y6 ::CC3x9y6(){ note_ctor("_ZN3ccc7CC3x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y6E, buf);
    ::ccc::CC3x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y6E);
    dp->::ccc::CC3x9y6::~CC3x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y6E(Test__ZN3ccc7CC3x9y6E, "_ZN3ccc7CC3x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y6C1Ev();
extern void _ZN3ccc7CC3x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y6E[] = {
  NSPAIR(_ZN3ccc7CC3x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y6E[];
extern void _ZN3ccc7CC3x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC3x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y63efgEv,_ZTv0_n12_N3ccc7CC3x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y63efgEv,_ZThn4_N3ccc7CC3x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y63abcEv,_ZTv0_n20_N3ccc7CC3x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y63abcEv,_ZThn4_N3ccc7CC3x9y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y63efgEv,_ZTv0_n12_N3ccc7CC3x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y63abcEv,_ZTv0_n20_N3ccc7CC3x9y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y6E[] = {
  {&(_ZTVN3ccc7CC3x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y6E[];
static VTBL_ENTRY alt_thunk_names1576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y63abcEv,_ZTv0_n20_N3ccc7CC3x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y63abcEv,_ZThn4_N3ccc7CC3x9y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y63efgEv,_ZTv0_n12_N3ccc7CC3x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y63efgEv,_ZThn4_N3ccc7CC3x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y6E = {  "_ZN3ccc7CC3x9y6E", // class name
  bases__ZN3ccc7CC3x9y6E, 2,
  &(vtc__ZN3ccc7CC3x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1576,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y6  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD3x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD3x9y63efgEv
  ~DD3x9y6(); // tgen
  DD3x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y63abcEv");}
void  ccc::DD3x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y63efgEv");}
ccc::DD3x9y6 ::~DD3x9y6(){ note_dtor("_ZN3ccc7DD3x9y6E", this);} // tgen
ccc::DD3x9y6 ::DD3x9y6(){ note_ctor("_ZN3ccc7DD3x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y6E, buf);
    ::ccc::DD3x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y6E);
    dp->::ccc::DD3x9y6::~DD3x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y6E(Test__ZN3ccc7DD3x9y6E, "_ZN3ccc7DD3x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y6C1Ev();
extern void _ZN3ccc7DD3x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y6E[] = {
  NSPAIR(_ZN3ccc7DD3x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y6E[];
extern void _ZN3ccc7DD3x9y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y63efgEv,_ZTv0_n12_N3ccc7DD3x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y63efgEv,_ZThn4_N3ccc7DD3x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y63efgEv,_ZTv0_n12_N3ccc7DD3x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y6E[] = {
  {&(_ZTVN3ccc7DD3x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y6E[];
static VTBL_ENTRY alt_thunk_names1577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y63efgEv,_ZTv0_n12_N3ccc7DD3x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y63efgEv,_ZThn4_N3ccc7DD3x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y6E = {  "_ZN3ccc7DD3x9y6E", // class name
  bases__ZN3ccc7DD3x9y6E, 2,
  &(vtc__ZN3ccc7DD3x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1577,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y7  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y73pqrEv
  ~CC3x9y7(); // tgen
  CC3x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y7E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y73abcEv");}
void  ccc::CC3x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y73pqrEv");}
ccc::CC3x9y7 ::~CC3x9y7(){ note_dtor("_ZN3ccc7CC3x9y7E", this);} // tgen
ccc::CC3x9y7 ::CC3x9y7(){ note_ctor("_ZN3ccc7CC3x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y7E, buf);
    ::ccc::CC3x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y7E);
    dp->::ccc::CC3x9y7::~CC3x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y7E(Test__ZN3ccc7CC3x9y7E, "_ZN3ccc7CC3x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y7C1Ev();
extern void _ZN3ccc7CC3x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y7E[] = {
  NSPAIR(_ZN3ccc7CC3x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC3x9y73pqrEv();
extern void _ZN3ccc7CC3x9y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y73pqrEv,_ZTv0_n16_N3ccc7CC3x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y73pqrEv,_ZThn4_N3ccc7CC3x9y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y73abcEv,_ZTv0_n20_N3ccc7CC3x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y73abcEv,_ZThn4_N3ccc7CC3x9y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y73pqrEv,_ZTv0_n16_N3ccc7CC3x9y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y73abcEv,_ZTv0_n20_N3ccc7CC3x9y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y7E[] = {
  {&(_ZTVN3ccc7CC3x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y7E[];
static VTBL_ENTRY alt_thunk_names1578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y73abcEv,_ZTv0_n20_N3ccc7CC3x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y73abcEv,_ZThn4_N3ccc7CC3x9y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y73pqrEv,_ZTv0_n16_N3ccc7CC3x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y73pqrEv,_ZThn4_N3ccc7CC3x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y7E = {  "_ZN3ccc7CC3x9y7E", // class name
  bases__ZN3ccc7CC3x9y7E, 2,
  &(vtc__ZN3ccc7CC3x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1578,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y7  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD3x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y73pqrEv
  ~DD3x9y7(); // tgen
  DD3x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y73abcEv");}
void  ccc::DD3x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y73pqrEv");}
ccc::DD3x9y7 ::~DD3x9y7(){ note_dtor("_ZN3ccc7DD3x9y7E", this);} // tgen
ccc::DD3x9y7 ::DD3x9y7(){ note_ctor("_ZN3ccc7DD3x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y7E, buf);
    ::ccc::DD3x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y7E);
    dp->::ccc::DD3x9y7::~DD3x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y7E(Test__ZN3ccc7DD3x9y7E, "_ZN3ccc7DD3x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y7C1Ev();
extern void _ZN3ccc7DD3x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y7E[] = {
  NSPAIR(_ZN3ccc7DD3x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7DD3x9y73pqrEv();
extern void _ZN3ccc7DD3x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y73pqrEv,_ZTv0_n16_N3ccc7DD3x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y73pqrEv,_ZThn4_N3ccc7DD3x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y73pqrEv,_ZTv0_n16_N3ccc7DD3x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y7E[] = {
  {&(_ZTVN3ccc7DD3x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y7E[];
static VTBL_ENTRY alt_thunk_names1579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y73pqrEv,_ZTv0_n16_N3ccc7DD3x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y73pqrEv,_ZThn4_N3ccc7DD3x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y7E = {  "_ZN3ccc7DD3x9y7E", // class name
  bases__ZN3ccc7DD3x9y7E, 2,
  &(vtc__ZN3ccc7DD3x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1579,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y8  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y83abcEv
  ~CC3x9y8(); // tgen
  CC3x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y8E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y83efgEv");}
void  ccc::CC3x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y83abcEv");}
ccc::CC3x9y8 ::~CC3x9y8(){ note_dtor("_ZN3ccc7CC3x9y8E", this);} // tgen
ccc::CC3x9y8 ::CC3x9y8(){ note_ctor("_ZN3ccc7CC3x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y8E, buf);
    ::ccc::CC3x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y8E);
    dp->::ccc::CC3x9y8::~CC3x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y8E(Test__ZN3ccc7CC3x9y8E, "_ZN3ccc7CC3x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y8C1Ev();
extern void _ZN3ccc7CC3x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y8E[] = {
  NSPAIR(_ZN3ccc7CC3x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y8E[];
extern void _ZN3ccc7CC3x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC3x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y83efgEv,_ZTv0_n12_N3ccc7CC3x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y83efgEv,_ZThn4_N3ccc7CC3x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC3x9y83abcEv,_ZTv0_n20_N3ccc7CC3x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y83abcEv,_ZThn4_N3ccc7CC3x9y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y83efgEv,_ZTv0_n12_N3ccc7CC3x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC3x9y83abcEv,_ZTv0_n20_N3ccc7CC3x9y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y8E[] = {
  {&(_ZTVN3ccc7CC3x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC3x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y8E[];
static VTBL_ENTRY alt_thunk_names1580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC3x9y83abcEv,_ZTv0_n20_N3ccc7CC3x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y83abcEv,_ZThn4_N3ccc7CC3x9y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y83efgEv,_ZTv0_n12_N3ccc7CC3x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y83efgEv,_ZThn4_N3ccc7CC3x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y8E = {  "_ZN3ccc7CC3x9y8E", // class name
  bases__ZN3ccc7CC3x9y8E, 2,
  &(vtc__ZN3ccc7CC3x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1580,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y8  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD3x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD3x9y83abcEv
  ~DD3x9y8(); // tgen
  DD3x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y83efgEv");}
void  ccc::DD3x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD3x9y83abcEv");}
ccc::DD3x9y8 ::~DD3x9y8(){ note_dtor("_ZN3ccc7DD3x9y8E", this);} // tgen
ccc::DD3x9y8 ::DD3x9y8(){ note_ctor("_ZN3ccc7DD3x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y8E, buf);
    ::ccc::DD3x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y8E);
    dp->::ccc::DD3x9y8::~DD3x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y8E(Test__ZN3ccc7DD3x9y8E, "_ZN3ccc7DD3x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y8C1Ev();
extern void _ZN3ccc7DD3x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y8E[] = {
  NSPAIR(_ZN3ccc7DD3x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y8E[];
extern void _ZN3ccc7DD3x9y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7DD3x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y83efgEv,_ZTv0_n12_N3ccc7DD3x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y83efgEv,_ZThn4_N3ccc7DD3x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y83efgEv,_ZTv0_n12_N3ccc7DD3x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y8E[] = {
  {&(_ZTVN3ccc7DD3x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y8E[];
static VTBL_ENTRY alt_thunk_names1581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y83efgEv,_ZTv0_n12_N3ccc7DD3x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y83efgEv,_ZThn4_N3ccc7DD3x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y8E = {  "_ZN3ccc7DD3x9y8E", // class name
  bases__ZN3ccc7DD3x9y8E, 2,
  &(vtc__ZN3ccc7DD3x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1581,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y9  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y93pqrEv
  ~CC3x9y9(); // tgen
  CC3x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y9E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y93efgEv");}
void  ccc::CC3x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y93pqrEv");}
ccc::CC3x9y9 ::~CC3x9y9(){ note_dtor("_ZN3ccc7CC3x9y9E", this);} // tgen
ccc::CC3x9y9 ::CC3x9y9(){ note_ctor("_ZN3ccc7CC3x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y9E, buf);
    ::ccc::CC3x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc7CC3x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC3x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y9E);
    dp->::ccc::CC3x9y9::~CC3x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y9E(Test__ZN3ccc7CC3x9y9E, "_ZN3ccc7CC3x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y9C1Ev();
extern void _ZN3ccc7CC3x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y9E[] = {
  NSPAIR(_ZN3ccc7CC3x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y9E[];
extern void _ZN3ccc7CC3x9y93efgEv();
extern void _ZN3ccc7CC3x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC3x9y93efgEv,_ZTv0_n12_N3ccc7CC3x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y93efgEv,_ZThn4_N3ccc7CC3x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC3x9y93pqrEv,_ZTv0_n16_N3ccc7CC3x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y93pqrEv,_ZThn4_N3ccc7CC3x9y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC3x9y93efgEv,_ZTv0_n12_N3ccc7CC3x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC3x9y93pqrEv,_ZTv0_n16_N3ccc7CC3x9y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC3x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC3x9y9E[] = {
  {&(_ZTVN3ccc7CC3x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC3x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC3x9y9E[];
static VTBL_ENTRY alt_thunk_names1582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC3x9y93pqrEv,_ZTv0_n16_N3ccc7CC3x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y93pqrEv,_ZThn4_N3ccc7CC3x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC3x9y93efgEv,_ZTv0_n12_N3ccc7CC3x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC3x9y93efgEv,_ZThn4_N3ccc7CC3x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC3x9y9E = {  "_ZN3ccc7CC3x9y9E", // class name
  bases__ZN3ccc7CC3x9y9E, 2,
  &(vtc__ZN3ccc7CC3x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC3x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC3x9y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1582,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y9  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD3x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD3x9y93pqrEv
  ~DD3x9y9(); // tgen
  DD3x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD3x9y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD3x9y93efgEv");}
void  ccc::DD3x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD3x9y93pqrEv");}
ccc::DD3x9y9 ::~DD3x9y9(){ note_dtor("_ZN3ccc7DD3x9y9E", this);} // tgen
ccc::DD3x9y9 ::DD3x9y9(){ note_ctor("_ZN3ccc7DD3x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD3x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD3x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD3x9y9E, buf);
    ::ccc::DD3x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD3x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD3x9y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7DD3x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD3x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD3x9y9E);
    dp->::ccc::DD3x9y9::~DD3x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD3x9y9E(Test__ZN3ccc7DD3x9y9E, "_ZN3ccc7DD3x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD3x9y9C1Ev();
extern void _ZN3ccc7DD3x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD3x9y9E[] = {
  NSPAIR(_ZN3ccc7DD3x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD3x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD3x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y9E[];
extern void _ZN3ccc7DD3x9y93efgEv();
extern void _ZN3ccc7DD3x9y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD3x9y93efgEv,_ZTv0_n12_N3ccc7DD3x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y93efgEv,_ZThn4_N3ccc7DD3x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD3x9y93pqrEv,_ZTv0_n16_N3ccc7DD3x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD3x9y93pqrEv,_ZThn4_N3ccc7DD3x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD3x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD3x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD3x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD3x9y93efgEv,_ZTv0_n12_N3ccc7DD3x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD3x9y93pqrEv,_ZTv0_n16_N3ccc7DD3x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD3x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD3x9y9E[] = {
  {&(_ZTVN3ccc7DD3x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD3x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD3x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD3x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD3x9y9E[];
static VTBL_ENTRY alt_thunk_names1583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD3x9y93pqrEv,_ZTv0_n16_N3ccc7DD3x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y93pqrEv,_ZThn4_N3ccc7DD3x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD3x9y93efgEv,_ZTv0_n12_N3ccc7DD3x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD3x9y93efgEv,_ZThn4_N3ccc7DD3x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD3x9y9E = {  "_ZN3ccc7DD3x9y9E", // class name
  bases__ZN3ccc7DD3x9y9E, 2,
  &(vtc__ZN3ccc7DD3x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD3x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD3x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD3x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD3x9y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1583,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y10  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x9y103abcEv
  ~CC3x9y10(); // tgen
  CC3x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y10E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y103pqrEv");}
void  ccc::CC3x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x9y103abcEv");}
ccc::CC3x9y10 ::~CC3x9y10(){ note_dtor("_ZN3ccc8CC3x9y10E", this);} // tgen
ccc::CC3x9y10 ::CC3x9y10(){ note_ctor("_ZN3ccc8CC3x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y10E, buf);
    ::ccc::CC3x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y10E);
    dp->::ccc::CC3x9y10::~CC3x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y10E(Test__ZN3ccc8CC3x9y10E, "_ZN3ccc8CC3x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y10C1Ev();
extern void _ZN3ccc8CC3x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y10E[] = {
  NSPAIR(_ZN3ccc8CC3x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC3x9y103pqrEv();
extern void _ZN3ccc8CC3x9y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x9y103pqrEv,_ZTv0_n16_N3ccc8CC3x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y103pqrEv,_ZThn4_N3ccc8CC3x9y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x9y103abcEv,_ZTv0_n20_N3ccc8CC3x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y103abcEv,_ZThn4_N3ccc8CC3x9y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x9y103pqrEv,_ZTv0_n16_N3ccc8CC3x9y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x9y103abcEv,_ZTv0_n20_N3ccc8CC3x9y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y10E[] = {
  {&(_ZTVN3ccc8CC3x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y10E[];
static VTBL_ENTRY alt_thunk_names1584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x9y103abcEv,_ZTv0_n20_N3ccc8CC3x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y103abcEv,_ZThn4_N3ccc8CC3x9y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x9y103pqrEv,_ZTv0_n16_N3ccc8CC3x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y103pqrEv,_ZThn4_N3ccc8CC3x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x9y10E = {  "_ZN3ccc8CC3x9y10E", // class name
  bases__ZN3ccc8CC3x9y10E, 2,
  &(vtc__ZN3ccc8CC3x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1584,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y10  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD3x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x9y103abcEv
  ~DD3x9y10(); // tgen
  DD3x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x9y103pqrEv");}
void  ccc::DD3x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x9y103abcEv");}
ccc::DD3x9y10 ::~DD3x9y10(){ note_dtor("_ZN3ccc8DD3x9y10E", this);} // tgen
ccc::DD3x9y10 ::DD3x9y10(){ note_ctor("_ZN3ccc8DD3x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y10E, buf);
    ::ccc::DD3x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y10E);
    dp->::ccc::DD3x9y10::~DD3x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y10E(Test__ZN3ccc8DD3x9y10E, "_ZN3ccc8DD3x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y10C1Ev();
extern void _ZN3ccc8DD3x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y10E[] = {
  NSPAIR(_ZN3ccc8DD3x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x9y103pqrEv();
extern void _ZN3ccc8DD3x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x9y103pqrEv,_ZTv0_n16_N3ccc8DD3x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x9y103pqrEv,_ZThn4_N3ccc8DD3x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x9y103pqrEv,_ZTv0_n16_N3ccc8DD3x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y10E[] = {
  {&(_ZTVN3ccc8DD3x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y10E[];
static VTBL_ENTRY alt_thunk_names1585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x9y103pqrEv,_ZTv0_n16_N3ccc8DD3x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x9y103pqrEv,_ZThn4_N3ccc8DD3x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x9y10E = {  "_ZN3ccc8DD3x9y10E", // class name
  bases__ZN3ccc8DD3x9y10E, 2,
  &(vtc__ZN3ccc8DD3x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1585,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y11  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x9y113efgEv
  ~CC3x9y11(); // tgen
  CC3x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y11E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y113pqrEv");}
void  ccc::CC3x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x9y113efgEv");}
ccc::CC3x9y11 ::~CC3x9y11(){ note_dtor("_ZN3ccc8CC3x9y11E", this);} // tgen
ccc::CC3x9y11 ::CC3x9y11(){ note_ctor("_ZN3ccc8CC3x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y11E, buf);
    ::ccc::CC3x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y11E);
    dp->::ccc::CC3x9y11::~CC3x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y11E(Test__ZN3ccc8CC3x9y11E, "_ZN3ccc8CC3x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y11C1Ev();
extern void _ZN3ccc8CC3x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y11E[] = {
  NSPAIR(_ZN3ccc8CC3x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y11E[];
extern void _ZN3ccc8CC3x9y113efgEv();
extern void _ZN3ccc8CC3x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x9y113efgEv,_ZTv0_n12_N3ccc8CC3x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y113efgEv,_ZThn4_N3ccc8CC3x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x9y113pqrEv,_ZTv0_n16_N3ccc8CC3x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y113pqrEv,_ZThn4_N3ccc8CC3x9y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x9y113efgEv,_ZTv0_n12_N3ccc8CC3x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x9y113pqrEv,_ZTv0_n16_N3ccc8CC3x9y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y11E[] = {
  {&(_ZTVN3ccc8CC3x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y11E[];
static VTBL_ENTRY alt_thunk_names1586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x9y113pqrEv,_ZTv0_n16_N3ccc8CC3x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y113pqrEv,_ZThn4_N3ccc8CC3x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x9y113efgEv,_ZTv0_n12_N3ccc8CC3x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y113efgEv,_ZThn4_N3ccc8CC3x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x9y11E = {  "_ZN3ccc8CC3x9y11E", // class name
  bases__ZN3ccc8CC3x9y11E, 2,
  &(vtc__ZN3ccc8CC3x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1586,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y11  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD3x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x9y113efgEv
  ~DD3x9y11(); // tgen
  DD3x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x9y113pqrEv");}
void  ccc::DD3x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x9y113efgEv");}
ccc::DD3x9y11 ::~DD3x9y11(){ note_dtor("_ZN3ccc8DD3x9y11E", this);} // tgen
ccc::DD3x9y11 ::DD3x9y11(){ note_ctor("_ZN3ccc8DD3x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y11E, buf);
    ::ccc::DD3x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y11E);
    dp->::ccc::DD3x9y11::~DD3x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y11E(Test__ZN3ccc8DD3x9y11E, "_ZN3ccc8DD3x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y11C1Ev();
extern void _ZN3ccc8DD3x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y11E[] = {
  NSPAIR(_ZN3ccc8DD3x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y11E[];
extern void _ZN3ccc8DD3x9y113efgEv();
extern void _ZN3ccc8DD3x9y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x9y113efgEv,_ZTv0_n12_N3ccc8DD3x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x9y113efgEv,_ZThn4_N3ccc8DD3x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x9y113pqrEv,_ZTv0_n16_N3ccc8DD3x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x9y113pqrEv,_ZThn4_N3ccc8DD3x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x9y113efgEv,_ZTv0_n12_N3ccc8DD3x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x9y113pqrEv,_ZTv0_n16_N3ccc8DD3x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y11E[] = {
  {&(_ZTVN3ccc8DD3x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y11E[];
static VTBL_ENTRY alt_thunk_names1587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x9y113pqrEv,_ZTv0_n16_N3ccc8DD3x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x9y113pqrEv,_ZThn4_N3ccc8DD3x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x9y113efgEv,_ZTv0_n12_N3ccc8DD3x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x9y113efgEv,_ZThn4_N3ccc8DD3x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x9y11E = {  "_ZN3ccc8DD3x9y11E", // class name
  bases__ZN3ccc8DD3x9y11E, 2,
  &(vtc__ZN3ccc8DD3x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1587,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y12  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC3x9y123abcEv
  ~CC3x9y12(); // tgen
  CC3x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x9y123abcEv");}
ccc::CC3x9y12 ::~CC3x9y12(){ note_dtor("_ZN3ccc8CC3x9y12E", this);} // tgen
ccc::CC3x9y12 ::CC3x9y12(){ note_ctor("_ZN3ccc8CC3x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y12E, buf);
    ::ccc::CC3x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y12E);
    dp->::ccc::CC3x9y12::~CC3x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y12E(Test__ZN3ccc8CC3x9y12E, "_ZN3ccc8CC3x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y12C1Ev();
extern void _ZN3ccc8CC3x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y12E[] = {
  NSPAIR(_ZN3ccc8CC3x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC3x9y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x9y123abcEv,_ZTv0_n20_N3ccc8CC3x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y123abcEv,_ZThn4_N3ccc8CC3x9y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x9y123abcEv,_ZTv0_n20_N3ccc8CC3x9y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y12E[] = {
  {&(_ZTVN3ccc8CC3x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y12E[];
static VTBL_ENTRY alt_thunk_names1588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x9y123abcEv,_ZTv0_n20_N3ccc8CC3x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y123abcEv,_ZThn4_N3ccc8CC3x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x9y12E = {  "_ZN3ccc8CC3x9y12E", // class name
  bases__ZN3ccc8CC3x9y12E, 2,
  &(vtc__ZN3ccc8CC3x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1588,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y12  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD3x9y123abcEv
  ~DD3x9y12(); // tgen
  DD3x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x9y123abcEv");}
ccc::DD3x9y12 ::~DD3x9y12(){ note_dtor("_ZN3ccc8DD3x9y12E", this);} // tgen
ccc::DD3x9y12 ::DD3x9y12(){ note_ctor("_ZN3ccc8DD3x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y12E, buf);
    ::ccc::DD3x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y12E);
    dp->::ccc::DD3x9y12::~DD3x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y12E(Test__ZN3ccc8DD3x9y12E, "_ZN3ccc8DD3x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y12C1Ev();
extern void _ZN3ccc8DD3x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y12E[] = {
  NSPAIR(_ZN3ccc8DD3x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y12E[] = {
  {&(_ZTVN3ccc8DD3x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y12E[];
Class_Descriptor cd__ZN3ccc8DD3x9y12E = {  "_ZN3ccc8DD3x9y12E", // class name
  bases__ZN3ccc8DD3x9y12E, 2,
  &(vtc__ZN3ccc8DD3x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y13  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC3x9y133efgEv
  ~CC3x9y13(); // tgen
  CC3x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x9y133efgEv");}
ccc::CC3x9y13 ::~CC3x9y13(){ note_dtor("_ZN3ccc8CC3x9y13E", this);} // tgen
ccc::CC3x9y13 ::CC3x9y13(){ note_ctor("_ZN3ccc8CC3x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y13E, buf);
    ::ccc::CC3x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y13E);
    dp->::ccc::CC3x9y13::~CC3x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y13E(Test__ZN3ccc8CC3x9y13E, "_ZN3ccc8CC3x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y13C1Ev();
extern void _ZN3ccc8CC3x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y13E[] = {
  NSPAIR(_ZN3ccc8CC3x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y13E[];
extern void _ZN3ccc8CC3x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x9y133efgEv,_ZTv0_n12_N3ccc8CC3x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y133efgEv,_ZThn4_N3ccc8CC3x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x9y133efgEv,_ZTv0_n12_N3ccc8CC3x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y13E[] = {
  {&(_ZTVN3ccc8CC3x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y13E[];
static VTBL_ENTRY alt_thunk_names1589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x9y133efgEv,_ZTv0_n12_N3ccc8CC3x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y133efgEv,_ZThn4_N3ccc8CC3x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x9y13E = {  "_ZN3ccc8CC3x9y13E", // class name
  bases__ZN3ccc8CC3x9y13E, 2,
  &(vtc__ZN3ccc8CC3x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1589,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y13  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD3x9y133efgEv
  ~DD3x9y13(); // tgen
  DD3x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x9y133efgEv");}
ccc::DD3x9y13 ::~DD3x9y13(){ note_dtor("_ZN3ccc8DD3x9y13E", this);} // tgen
ccc::DD3x9y13 ::DD3x9y13(){ note_ctor("_ZN3ccc8DD3x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y13E, buf);
    ::ccc::DD3x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y13E);
    dp->::ccc::DD3x9y13::~DD3x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y13E(Test__ZN3ccc8DD3x9y13E, "_ZN3ccc8DD3x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y13C1Ev();
extern void _ZN3ccc8DD3x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y13E[] = {
  NSPAIR(_ZN3ccc8DD3x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y13E[];
extern void _ZN3ccc8DD3x9y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x9y133efgEv,_ZTv0_n12_N3ccc8DD3x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x9y133efgEv,_ZThn4_N3ccc8DD3x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x9y133efgEv,_ZTv0_n12_N3ccc8DD3x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y13E[] = {
  {&(_ZTVN3ccc8DD3x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y13E[];
static VTBL_ENTRY alt_thunk_names1590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x9y133efgEv,_ZTv0_n12_N3ccc8DD3x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x9y133efgEv,_ZThn4_N3ccc8DD3x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x9y13E = {  "_ZN3ccc8DD3x9y13E", // class name
  bases__ZN3ccc8DD3x9y13E, 2,
  &(vtc__ZN3ccc8DD3x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1590,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y14  : virtual ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y143pqrEv
  ~CC3x9y14(); // tgen
  CC3x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y143pqrEv");}
ccc::CC3x9y14 ::~CC3x9y14(){ note_dtor("_ZN3ccc8CC3x9y14E", this);} // tgen
ccc::CC3x9y14 ::CC3x9y14(){ note_ctor("_ZN3ccc8CC3x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y14E, buf);
    ::ccc::CC3x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y14E);
    dp->::ccc::CC3x9y14::~CC3x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y14E(Test__ZN3ccc8CC3x9y14E, "_ZN3ccc8CC3x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y14C1Ev();
extern void _ZN3ccc8CC3x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y14E[] = {
  NSPAIR(_ZN3ccc8CC3x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC3x9y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x9y143pqrEv,_ZTv0_n16_N3ccc8CC3x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y143pqrEv,_ZThn4_N3ccc8CC3x9y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x9y143pqrEv,_ZTv0_n16_N3ccc8CC3x9y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y14E[] = {
  {&(_ZTVN3ccc8CC3x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y14E[];
static VTBL_ENTRY alt_thunk_names1591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x9y143pqrEv,_ZTv0_n16_N3ccc8CC3x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x9y143pqrEv,_ZThn4_N3ccc8CC3x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x9y14E = {  "_ZN3ccc8CC3x9y14E", // class name
  bases__ZN3ccc8CC3x9y14E, 2,
  &(vtc__ZN3ccc8CC3x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1591,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y14  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD3x9y143pqrEv
  ~DD3x9y14(); // tgen
  DD3x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x9y143pqrEv");}
ccc::DD3x9y14 ::~DD3x9y14(){ note_dtor("_ZN3ccc8DD3x9y14E", this);} // tgen
ccc::DD3x9y14 ::DD3x9y14(){ note_ctor("_ZN3ccc8DD3x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y14E, buf);
    ::ccc::DD3x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y14E);
    dp->::ccc::DD3x9y14::~DD3x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y14E(Test__ZN3ccc8DD3x9y14E, "_ZN3ccc8DD3x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y14C1Ev();
extern void _ZN3ccc8DD3x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y14E[] = {
  NSPAIR(_ZN3ccc8DD3x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x9y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x9y143pqrEv,_ZTv0_n16_N3ccc8DD3x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x9y143pqrEv,_ZThn4_N3ccc8DD3x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x9y143pqrEv,_ZTv0_n16_N3ccc8DD3x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y14E[] = {
  {&(_ZTVN3ccc8DD3x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y14E[];
static VTBL_ENTRY alt_thunk_names1592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x9y143pqrEv,_ZTv0_n16_N3ccc8DD3x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x9y143pqrEv,_ZThn4_N3ccc8DD3x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x9y14E = {  "_ZN3ccc8DD3x9y14E", // class name
  bases__ZN3ccc8DD3x9y14E, 2,
  &(vtc__ZN3ccc8DD3x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1592,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y15  : virtual ::ccc::AA3 , ::ccc::BB9 {
  ~CC3x9y15(); // tgen
  CC3x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x9y15 ::~CC3x9y15(){ note_dtor("_ZN3ccc8CC3x9y15E", this);} // tgen
ccc::CC3x9y15 ::CC3x9y15(){ note_ctor("_ZN3ccc8CC3x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y15E, buf);
    ::ccc::CC3x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC3x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y15E);
    dp->::ccc::CC3x9y15::~CC3x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y15E(Test__ZN3ccc8CC3x9y15E, "_ZN3ccc8CC3x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y15C1Ev();
extern void _ZN3ccc8CC3x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y15E[] = {
  NSPAIR(_ZN3ccc8CC3x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x9y15E[] = {
  {&(_ZTVN3ccc8CC3x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x9y15E[];
Class_Descriptor cd__ZN3ccc8CC3x9y15E = {  "_ZN3ccc8CC3x9y15E", // class name
  bases__ZN3ccc8CC3x9y15E, 2,
  &(vtc__ZN3ccc8CC3x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x9y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x9y15  : virtual ::ccc::AA3 , virtual ::ccc::BB9 {
  ~DD3x9y15(); // tgen
  DD3x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD3x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x9y15 ::~DD3x9y15(){ note_dtor("_ZN3ccc8DD3x9y15E", this);} // tgen
ccc::DD3x9y15 ::DD3x9y15(){ note_ctor("_ZN3ccc8DD3x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD3x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x9y15E, buf);
    ::ccc::DD3x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x9y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD3x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x9y15E);
    dp->::ccc::DD3x9y15::~DD3x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x9y15E(Test__ZN3ccc8DD3x9y15E, "_ZN3ccc8DD3x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x9y15C1Ev();
extern void _ZN3ccc8DD3x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD3x9y15E[] = {
  NSPAIR(_ZN3ccc8DD3x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD3x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD3x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x9y15E[] = {
  {&(_ZTVN3ccc8DD3x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x9y15E[];
Class_Descriptor cd__ZN3ccc8DD3x9y15E = {  "_ZN3ccc8DD3x9y15E", // class name
  bases__ZN3ccc8DD3x9y15E, 2,
  &(vtc__ZN3ccc8DD3x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x9y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y0  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y03pqrEv
  ~CC3x10y0(); // tgen
  CC3x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y0E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y03abcEv");}
void  ccc::CC3x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y03efgEv");}
void  ccc::CC3x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y03pqrEv");}
ccc::CC3x10y0 ::~CC3x10y0(){ note_dtor("_ZN3ccc8CC3x10y0E", this);} // tgen
ccc::CC3x10y0 ::CC3x10y0(){ note_ctor("_ZN3ccc8CC3x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y0E, buf);
    ::ccc::CC3x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y0E);
    dp->::ccc::CC3x10y0::~CC3x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y0E(Test__ZN3ccc8CC3x10y0E, "_ZN3ccc8CC3x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y0C1Ev();
extern void _ZN3ccc8CC3x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y0E[] = {
  NSPAIR(_ZN3ccc8CC3x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y0E[];
extern void _ZN3ccc8CC3x10y03pqrEv();
extern void _ZN3ccc8CC3x10y03abcEv();
extern void _ZN3ccc8CC3x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y03efgEv,_ZTv0_n12_N3ccc8CC3x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y03efgEv,_ZThn4_N3ccc8CC3x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y03pqrEv,_ZTv0_n16_N3ccc8CC3x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y03pqrEv,_ZThn4_N3ccc8CC3x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y03abcEv,_ZTv0_n20_N3ccc8CC3x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y03abcEv,_ZThn4_N3ccc8CC3x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y03efgEv,_ZTv0_n12_N3ccc8CC3x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y03pqrEv,_ZTv0_n16_N3ccc8CC3x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y03abcEv,_ZTv0_n20_N3ccc8CC3x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y0E[] = {
  {&(_ZTVN3ccc8CC3x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y0E[];
static VTBL_ENTRY alt_thunk_names1593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y03abcEv,_ZTv0_n20_N3ccc8CC3x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y03abcEv,_ZThn4_N3ccc8CC3x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y03pqrEv,_ZTv0_n16_N3ccc8CC3x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y03pqrEv,_ZThn4_N3ccc8CC3x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y03efgEv,_ZTv0_n12_N3ccc8CC3x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y03efgEv,_ZThn4_N3ccc8CC3x10y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y0E = {  "_ZN3ccc8CC3x10y0E", // class name
  bases__ZN3ccc8CC3x10y0E, 2,
  &(vtc__ZN3ccc8CC3x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1593,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y0  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD3x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y03pqrEv
  ~DD3x10y0(); // tgen
  DD3x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y03abcEv");}
void  ccc::DD3x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y03efgEv");}
void  ccc::DD3x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y03pqrEv");}
ccc::DD3x10y0 ::~DD3x10y0(){ note_dtor("_ZN3ccc8DD3x10y0E", this);} // tgen
ccc::DD3x10y0 ::DD3x10y0(){ note_ctor("_ZN3ccc8DD3x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y0E, buf);
    ::ccc::DD3x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y0E);
    dp->::ccc::DD3x10y0::~DD3x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y0E(Test__ZN3ccc8DD3x10y0E, "_ZN3ccc8DD3x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y0C1Ev();
extern void _ZN3ccc8DD3x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y0E[] = {
  NSPAIR(_ZN3ccc8DD3x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y0E[];
extern void _ZN3ccc8DD3x10y03efgEv();
extern void _ZN3ccc8DD3x10y03pqrEv();
extern void _ZN3ccc8DD3x10y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y03pqrEv,_ZTv0_n12_N3ccc8DD3x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y03pqrEv,_ZThn4_N3ccc8DD3x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y03abcEv,_ZTv0_n16_N3ccc8DD3x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y03abcEv,_ZThn4_N3ccc8DD3x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y03pqrEv,_ZTv0_n12_N3ccc8DD3x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y03abcEv,_ZTv0_n16_N3ccc8DD3x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y0E[] = {
  {&(_ZTVN3ccc8DD3x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y0E[];
static VTBL_ENTRY alt_thunk_names1594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y03abcEv,_ZTv0_n16_N3ccc8DD3x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y03abcEv,_ZThn4_N3ccc8DD3x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y03pqrEv,_ZTv0_n12_N3ccc8DD3x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y03pqrEv,_ZThn4_N3ccc8DD3x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y0E = {  "_ZN3ccc8DD3x10y0E", // class name
  bases__ZN3ccc8DD3x10y0E, 2,
  &(vtc__ZN3ccc8DD3x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1594,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y1  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x10y13efgEv
  ~CC3x10y1(); // tgen
  CC3x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y1E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y13abcEv");}
void  ccc::CC3x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y13pqrEv");}
void  ccc::CC3x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y13efgEv");}
ccc::CC3x10y1 ::~CC3x10y1(){ note_dtor("_ZN3ccc8CC3x10y1E", this);} // tgen
ccc::CC3x10y1 ::CC3x10y1(){ note_ctor("_ZN3ccc8CC3x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y1E, buf);
    ::ccc::CC3x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y1E);
    dp->::ccc::CC3x10y1::~CC3x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y1E(Test__ZN3ccc8CC3x10y1E, "_ZN3ccc8CC3x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y1C1Ev();
extern void _ZN3ccc8CC3x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y1E[] = {
  NSPAIR(_ZN3ccc8CC3x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y1E[];
extern void _ZN3ccc8CC3x10y13pqrEv();
extern void _ZN3ccc8CC3x10y13abcEv();
extern void _ZN3ccc8CC3x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y13efgEv,_ZTv0_n12_N3ccc8CC3x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y13efgEv,_ZThn4_N3ccc8CC3x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y13pqrEv,_ZTv0_n16_N3ccc8CC3x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y13pqrEv,_ZThn4_N3ccc8CC3x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y13abcEv,_ZTv0_n20_N3ccc8CC3x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y13abcEv,_ZThn4_N3ccc8CC3x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y13efgEv,_ZTv0_n12_N3ccc8CC3x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y13pqrEv,_ZTv0_n16_N3ccc8CC3x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y13abcEv,_ZTv0_n20_N3ccc8CC3x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y1E[] = {
  {&(_ZTVN3ccc8CC3x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y1E[];
static VTBL_ENTRY alt_thunk_names1595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y13abcEv,_ZTv0_n20_N3ccc8CC3x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y13abcEv,_ZThn4_N3ccc8CC3x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y13pqrEv,_ZTv0_n16_N3ccc8CC3x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y13pqrEv,_ZThn4_N3ccc8CC3x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y13efgEv,_ZTv0_n12_N3ccc8CC3x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y13efgEv,_ZThn4_N3ccc8CC3x10y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y1E = {  "_ZN3ccc8CC3x10y1E", // class name
  bases__ZN3ccc8CC3x10y1E, 2,
  &(vtc__ZN3ccc8CC3x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1595,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y1  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD3x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x10y13efgEv
  ~DD3x10y1(); // tgen
  DD3x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y13abcEv");}
void  ccc::DD3x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y13pqrEv");}
void  ccc::DD3x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y13efgEv");}
ccc::DD3x10y1 ::~DD3x10y1(){ note_dtor("_ZN3ccc8DD3x10y1E", this);} // tgen
ccc::DD3x10y1 ::DD3x10y1(){ note_ctor("_ZN3ccc8DD3x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y1E, buf);
    ::ccc::DD3x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y1E);
    dp->::ccc::DD3x10y1::~DD3x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y1E(Test__ZN3ccc8DD3x10y1E, "_ZN3ccc8DD3x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y1C1Ev();
extern void _ZN3ccc8DD3x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y1E[] = {
  NSPAIR(_ZN3ccc8DD3x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y1E[];
extern void _ZN3ccc8DD3x10y13efgEv();
extern void _ZN3ccc8DD3x10y13pqrEv();
extern void _ZN3ccc8DD3x10y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y13pqrEv,_ZTv0_n12_N3ccc8DD3x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y13pqrEv,_ZThn4_N3ccc8DD3x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y13abcEv,_ZTv0_n16_N3ccc8DD3x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y13abcEv,_ZThn4_N3ccc8DD3x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y13pqrEv,_ZTv0_n12_N3ccc8DD3x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y13abcEv,_ZTv0_n16_N3ccc8DD3x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y1E[] = {
  {&(_ZTVN3ccc8DD3x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y1E[];
static VTBL_ENTRY alt_thunk_names1596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y13abcEv,_ZTv0_n16_N3ccc8DD3x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y13abcEv,_ZThn4_N3ccc8DD3x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y13pqrEv,_ZTv0_n12_N3ccc8DD3x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y13pqrEv,_ZThn4_N3ccc8DD3x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y1E = {  "_ZN3ccc8DD3x10y1E", // class name
  bases__ZN3ccc8DD3x10y1E, 2,
  &(vtc__ZN3ccc8DD3x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1596,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y2  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y23pqrEv
  ~CC3x10y2(); // tgen
  CC3x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y2E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y23efgEv");}
void  ccc::CC3x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y23abcEv");}
void  ccc::CC3x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y23pqrEv");}
ccc::CC3x10y2 ::~CC3x10y2(){ note_dtor("_ZN3ccc8CC3x10y2E", this);} // tgen
ccc::CC3x10y2 ::CC3x10y2(){ note_ctor("_ZN3ccc8CC3x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y2E, buf);
    ::ccc::CC3x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y2E);
    dp->::ccc::CC3x10y2::~CC3x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y2E(Test__ZN3ccc8CC3x10y2E, "_ZN3ccc8CC3x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y2C1Ev();
extern void _ZN3ccc8CC3x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y2E[] = {
  NSPAIR(_ZN3ccc8CC3x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y2E[];
extern void _ZN3ccc8CC3x10y23pqrEv();
extern void _ZN3ccc8CC3x10y23abcEv();
extern void _ZN3ccc8CC3x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y23efgEv,_ZTv0_n12_N3ccc8CC3x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y23efgEv,_ZThn4_N3ccc8CC3x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y23pqrEv,_ZTv0_n16_N3ccc8CC3x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y23pqrEv,_ZThn4_N3ccc8CC3x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y23abcEv,_ZTv0_n20_N3ccc8CC3x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y23abcEv,_ZThn4_N3ccc8CC3x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y23efgEv,_ZTv0_n12_N3ccc8CC3x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y23pqrEv,_ZTv0_n16_N3ccc8CC3x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y23abcEv,_ZTv0_n20_N3ccc8CC3x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y2E[] = {
  {&(_ZTVN3ccc8CC3x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y2E[];
static VTBL_ENTRY alt_thunk_names1597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y23abcEv,_ZTv0_n20_N3ccc8CC3x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y23abcEv,_ZThn4_N3ccc8CC3x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y23pqrEv,_ZTv0_n16_N3ccc8CC3x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y23pqrEv,_ZThn4_N3ccc8CC3x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y23efgEv,_ZTv0_n12_N3ccc8CC3x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y23efgEv,_ZThn4_N3ccc8CC3x10y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y2E = {  "_ZN3ccc8CC3x10y2E", // class name
  bases__ZN3ccc8CC3x10y2E, 2,
  &(vtc__ZN3ccc8CC3x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1597,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y2  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD3x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y23pqrEv
  ~DD3x10y2(); // tgen
  DD3x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y23efgEv");}
void  ccc::DD3x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y23abcEv");}
void  ccc::DD3x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y23pqrEv");}
ccc::DD3x10y2 ::~DD3x10y2(){ note_dtor("_ZN3ccc8DD3x10y2E", this);} // tgen
ccc::DD3x10y2 ::DD3x10y2(){ note_ctor("_ZN3ccc8DD3x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y2E, buf);
    ::ccc::DD3x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y2E);
    dp->::ccc::DD3x10y2::~DD3x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y2E(Test__ZN3ccc8DD3x10y2E, "_ZN3ccc8DD3x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y2C1Ev();
extern void _ZN3ccc8DD3x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y2E[] = {
  NSPAIR(_ZN3ccc8DD3x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y2E[];
extern void _ZN3ccc8DD3x10y23efgEv();
extern void _ZN3ccc8DD3x10y23pqrEv();
extern void _ZN3ccc8DD3x10y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y23pqrEv,_ZTv0_n12_N3ccc8DD3x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y23pqrEv,_ZThn4_N3ccc8DD3x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y23abcEv,_ZTv0_n16_N3ccc8DD3x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y23abcEv,_ZThn4_N3ccc8DD3x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y23pqrEv,_ZTv0_n12_N3ccc8DD3x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y23abcEv,_ZTv0_n16_N3ccc8DD3x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y2E[] = {
  {&(_ZTVN3ccc8DD3x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y2E[];
static VTBL_ENTRY alt_thunk_names1598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y23abcEv,_ZTv0_n16_N3ccc8DD3x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y23abcEv,_ZThn4_N3ccc8DD3x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y23pqrEv,_ZTv0_n12_N3ccc8DD3x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y23pqrEv,_ZThn4_N3ccc8DD3x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y2E = {  "_ZN3ccc8DD3x10y2E", // class name
  bases__ZN3ccc8DD3x10y2E, 2,
  &(vtc__ZN3ccc8DD3x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1598,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y3  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x10y33abcEv
  ~CC3x10y3(); // tgen
  CC3x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y3E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y33efgEv");}
void  ccc::CC3x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y33pqrEv");}
void  ccc::CC3x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y33abcEv");}
ccc::CC3x10y3 ::~CC3x10y3(){ note_dtor("_ZN3ccc8CC3x10y3E", this);} // tgen
ccc::CC3x10y3 ::CC3x10y3(){ note_ctor("_ZN3ccc8CC3x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y3E, buf);
    ::ccc::CC3x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y3E);
    dp->::ccc::CC3x10y3::~CC3x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y3E(Test__ZN3ccc8CC3x10y3E, "_ZN3ccc8CC3x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y3C1Ev();
extern void _ZN3ccc8CC3x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y3E[] = {
  NSPAIR(_ZN3ccc8CC3x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y3E[];
extern void _ZN3ccc8CC3x10y33pqrEv();
extern void _ZN3ccc8CC3x10y33abcEv();
extern void _ZN3ccc8CC3x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y33efgEv,_ZTv0_n12_N3ccc8CC3x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y33efgEv,_ZThn4_N3ccc8CC3x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y33pqrEv,_ZTv0_n16_N3ccc8CC3x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y33pqrEv,_ZThn4_N3ccc8CC3x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y33abcEv,_ZTv0_n20_N3ccc8CC3x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y33abcEv,_ZThn4_N3ccc8CC3x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y33efgEv,_ZTv0_n12_N3ccc8CC3x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y33pqrEv,_ZTv0_n16_N3ccc8CC3x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y33abcEv,_ZTv0_n20_N3ccc8CC3x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y3E[] = {
  {&(_ZTVN3ccc8CC3x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y3E[];
static VTBL_ENTRY alt_thunk_names1599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y33abcEv,_ZTv0_n20_N3ccc8CC3x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y33abcEv,_ZThn4_N3ccc8CC3x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y33pqrEv,_ZTv0_n16_N3ccc8CC3x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y33pqrEv,_ZThn4_N3ccc8CC3x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y33efgEv,_ZTv0_n12_N3ccc8CC3x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y33efgEv,_ZThn4_N3ccc8CC3x10y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y3E = {  "_ZN3ccc8CC3x10y3E", // class name
  bases__ZN3ccc8CC3x10y3E, 2,
  &(vtc__ZN3ccc8CC3x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1599,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y3  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD3x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x10y33abcEv
  ~DD3x10y3(); // tgen
  DD3x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y33efgEv");}
void  ccc::DD3x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y33pqrEv");}
void  ccc::DD3x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y33abcEv");}
ccc::DD3x10y3 ::~DD3x10y3(){ note_dtor("_ZN3ccc8DD3x10y3E", this);} // tgen
ccc::DD3x10y3 ::DD3x10y3(){ note_ctor("_ZN3ccc8DD3x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y3E, buf);
    ::ccc::DD3x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y3E);
    dp->::ccc::DD3x10y3::~DD3x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y3E(Test__ZN3ccc8DD3x10y3E, "_ZN3ccc8DD3x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y3C1Ev();
extern void _ZN3ccc8DD3x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y3E[] = {
  NSPAIR(_ZN3ccc8DD3x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y3E[];
extern void _ZN3ccc8DD3x10y33efgEv();
extern void _ZN3ccc8DD3x10y33pqrEv();
extern void _ZN3ccc8DD3x10y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y33pqrEv,_ZTv0_n12_N3ccc8DD3x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y33pqrEv,_ZThn4_N3ccc8DD3x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y33abcEv,_ZTv0_n16_N3ccc8DD3x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y33abcEv,_ZThn4_N3ccc8DD3x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y33pqrEv,_ZTv0_n12_N3ccc8DD3x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y33abcEv,_ZTv0_n16_N3ccc8DD3x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y3E[] = {
  {&(_ZTVN3ccc8DD3x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y3E[];
static VTBL_ENTRY alt_thunk_names1600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y33abcEv,_ZTv0_n16_N3ccc8DD3x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y33abcEv,_ZThn4_N3ccc8DD3x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y33pqrEv,_ZTv0_n12_N3ccc8DD3x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y33pqrEv,_ZThn4_N3ccc8DD3x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y3E = {  "_ZN3ccc8DD3x10y3E", // class name
  bases__ZN3ccc8DD3x10y3E, 2,
  &(vtc__ZN3ccc8DD3x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1600,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y4  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC3x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y43efgEv
  ~CC3x10y4(); // tgen
  CC3x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y4E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y43pqrEv");}
void  ccc::CC3x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y43abcEv");}
void  ccc::CC3x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y43efgEv");}
ccc::CC3x10y4 ::~CC3x10y4(){ note_dtor("_ZN3ccc8CC3x10y4E", this);} // tgen
ccc::CC3x10y4 ::CC3x10y4(){ note_ctor("_ZN3ccc8CC3x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y4E, buf);
    ::ccc::CC3x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y4E);
    dp->::ccc::CC3x10y4::~CC3x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y4E(Test__ZN3ccc8CC3x10y4E, "_ZN3ccc8CC3x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y4C1Ev();
extern void _ZN3ccc8CC3x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y4E[] = {
  NSPAIR(_ZN3ccc8CC3x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y4E[];
extern void _ZN3ccc8CC3x10y43pqrEv();
extern void _ZN3ccc8CC3x10y43abcEv();
extern void _ZN3ccc8CC3x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y43efgEv,_ZTv0_n12_N3ccc8CC3x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y43efgEv,_ZThn4_N3ccc8CC3x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y43pqrEv,_ZTv0_n16_N3ccc8CC3x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y43pqrEv,_ZThn4_N3ccc8CC3x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y43abcEv,_ZTv0_n20_N3ccc8CC3x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y43abcEv,_ZThn4_N3ccc8CC3x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y43efgEv,_ZTv0_n12_N3ccc8CC3x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y43pqrEv,_ZTv0_n16_N3ccc8CC3x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y43abcEv,_ZTv0_n20_N3ccc8CC3x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y4E[] = {
  {&(_ZTVN3ccc8CC3x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y4E[];
static VTBL_ENTRY alt_thunk_names1601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y43abcEv,_ZTv0_n20_N3ccc8CC3x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y43abcEv,_ZThn4_N3ccc8CC3x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y43pqrEv,_ZTv0_n16_N3ccc8CC3x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y43pqrEv,_ZThn4_N3ccc8CC3x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y43efgEv,_ZTv0_n12_N3ccc8CC3x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y43efgEv,_ZThn4_N3ccc8CC3x10y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y4E = {  "_ZN3ccc8CC3x10y4E", // class name
  bases__ZN3ccc8CC3x10y4E, 2,
  &(vtc__ZN3ccc8CC3x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1601,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y4  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD3x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x10y43efgEv
  ~DD3x10y4(); // tgen
  DD3x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y43pqrEv");}
void  ccc::DD3x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y43abcEv");}
void  ccc::DD3x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y43efgEv");}
ccc::DD3x10y4 ::~DD3x10y4(){ note_dtor("_ZN3ccc8DD3x10y4E", this);} // tgen
ccc::DD3x10y4 ::DD3x10y4(){ note_ctor("_ZN3ccc8DD3x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y4E, buf);
    ::ccc::DD3x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y4E);
    dp->::ccc::DD3x10y4::~DD3x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y4E(Test__ZN3ccc8DD3x10y4E, "_ZN3ccc8DD3x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y4C1Ev();
extern void _ZN3ccc8DD3x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y4E[] = {
  NSPAIR(_ZN3ccc8DD3x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y4E[];
extern void _ZN3ccc8DD3x10y43efgEv();
extern void _ZN3ccc8DD3x10y43pqrEv();
extern void _ZN3ccc8DD3x10y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y43pqrEv,_ZTv0_n12_N3ccc8DD3x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y43pqrEv,_ZThn4_N3ccc8DD3x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y43abcEv,_ZTv0_n16_N3ccc8DD3x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y43abcEv,_ZThn4_N3ccc8DD3x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y43pqrEv,_ZTv0_n12_N3ccc8DD3x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y43abcEv,_ZTv0_n16_N3ccc8DD3x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y4E[] = {
  {&(_ZTVN3ccc8DD3x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y4E[];
static VTBL_ENTRY alt_thunk_names1602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y43abcEv,_ZTv0_n16_N3ccc8DD3x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y43abcEv,_ZThn4_N3ccc8DD3x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y43pqrEv,_ZTv0_n12_N3ccc8DD3x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y43pqrEv,_ZThn4_N3ccc8DD3x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y4E = {  "_ZN3ccc8DD3x10y4E", // class name
  bases__ZN3ccc8DD3x10y4E, 2,
  &(vtc__ZN3ccc8DD3x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1602,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y5  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC3x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y53abcEv
  ~CC3x10y5(); // tgen
  CC3x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y5E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y53pqrEv");}
void  ccc::CC3x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y53efgEv");}
void  ccc::CC3x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y53abcEv");}
ccc::CC3x10y5 ::~CC3x10y5(){ note_dtor("_ZN3ccc8CC3x10y5E", this);} // tgen
ccc::CC3x10y5 ::CC3x10y5(){ note_ctor("_ZN3ccc8CC3x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y5E, buf);
    ::ccc::CC3x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y5E);
    dp->::ccc::CC3x10y5::~CC3x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y5E(Test__ZN3ccc8CC3x10y5E, "_ZN3ccc8CC3x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y5C1Ev();
extern void _ZN3ccc8CC3x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y5E[] = {
  NSPAIR(_ZN3ccc8CC3x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y5E[];
extern void _ZN3ccc8CC3x10y53pqrEv();
extern void _ZN3ccc8CC3x10y53abcEv();
extern void _ZN3ccc8CC3x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y53efgEv,_ZTv0_n12_N3ccc8CC3x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y53efgEv,_ZThn4_N3ccc8CC3x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y53pqrEv,_ZTv0_n16_N3ccc8CC3x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y53pqrEv,_ZThn4_N3ccc8CC3x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y53abcEv,_ZTv0_n20_N3ccc8CC3x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y53abcEv,_ZThn4_N3ccc8CC3x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y53efgEv,_ZTv0_n12_N3ccc8CC3x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y53pqrEv,_ZTv0_n16_N3ccc8CC3x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y53abcEv,_ZTv0_n20_N3ccc8CC3x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y5E[] = {
  {&(_ZTVN3ccc8CC3x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y5E[];
static VTBL_ENTRY alt_thunk_names1603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y53abcEv,_ZTv0_n20_N3ccc8CC3x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y53abcEv,_ZThn4_N3ccc8CC3x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y53pqrEv,_ZTv0_n16_N3ccc8CC3x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y53pqrEv,_ZThn4_N3ccc8CC3x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y53efgEv,_ZTv0_n12_N3ccc8CC3x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y53efgEv,_ZThn4_N3ccc8CC3x10y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y5E = {  "_ZN3ccc8CC3x10y5E", // class name
  bases__ZN3ccc8CC3x10y5E, 2,
  &(vtc__ZN3ccc8CC3x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1603,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y5  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD3x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x10y53abcEv
  ~DD3x10y5(); // tgen
  DD3x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y53pqrEv");}
void  ccc::DD3x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y53efgEv");}
void  ccc::DD3x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y53abcEv");}
ccc::DD3x10y5 ::~DD3x10y5(){ note_dtor("_ZN3ccc8DD3x10y5E", this);} // tgen
ccc::DD3x10y5 ::DD3x10y5(){ note_ctor("_ZN3ccc8DD3x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y5E, buf);
    ::ccc::DD3x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y5E);
    dp->::ccc::DD3x10y5::~DD3x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y5E(Test__ZN3ccc8DD3x10y5E, "_ZN3ccc8DD3x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y5C1Ev();
extern void _ZN3ccc8DD3x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y5E[] = {
  NSPAIR(_ZN3ccc8DD3x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y5E[];
extern void _ZN3ccc8DD3x10y53efgEv();
extern void _ZN3ccc8DD3x10y53pqrEv();
extern void _ZN3ccc8DD3x10y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y53pqrEv,_ZTv0_n12_N3ccc8DD3x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y53pqrEv,_ZThn4_N3ccc8DD3x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y53abcEv,_ZTv0_n16_N3ccc8DD3x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y53abcEv,_ZThn4_N3ccc8DD3x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y53pqrEv,_ZTv0_n12_N3ccc8DD3x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y53abcEv,_ZTv0_n16_N3ccc8DD3x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y5E[] = {
  {&(_ZTVN3ccc8DD3x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y5E[];
static VTBL_ENTRY alt_thunk_names1604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y53abcEv,_ZTv0_n16_N3ccc8DD3x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y53abcEv,_ZThn4_N3ccc8DD3x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y53pqrEv,_ZTv0_n12_N3ccc8DD3x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y53pqrEv,_ZThn4_N3ccc8DD3x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y5E = {  "_ZN3ccc8DD3x10y5E", // class name
  bases__ZN3ccc8DD3x10y5E, 2,
  &(vtc__ZN3ccc8DD3x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1604,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y6  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y63efgEv
  ~CC3x10y6(); // tgen
  CC3x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y6E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y63abcEv");}
void  ccc::CC3x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y63efgEv");}
ccc::CC3x10y6 ::~CC3x10y6(){ note_dtor("_ZN3ccc8CC3x10y6E", this);} // tgen
ccc::CC3x10y6 ::CC3x10y6(){ note_ctor("_ZN3ccc8CC3x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y6E, buf);
    ::ccc::CC3x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y6E);
    dp->::ccc::CC3x10y6::~CC3x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y6E(Test__ZN3ccc8CC3x10y6E, "_ZN3ccc8CC3x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y6C1Ev();
extern void _ZN3ccc8CC3x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y6E[] = {
  NSPAIR(_ZN3ccc8CC3x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC3x10y63abcEv();
extern void _ZN3ccc8CC3x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y63efgEv,_ZTv0_n12_N3ccc8CC3x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y63efgEv,_ZThn4_N3ccc8CC3x10y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y63abcEv,_ZTv0_n20_N3ccc8CC3x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y63abcEv,_ZThn4_N3ccc8CC3x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y63efgEv,_ZTv0_n12_N3ccc8CC3x10y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y63abcEv,_ZTv0_n20_N3ccc8CC3x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y6E[] = {
  {&(_ZTVN3ccc8CC3x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y6E[];
static VTBL_ENTRY alt_thunk_names1605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y63abcEv,_ZTv0_n20_N3ccc8CC3x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y63abcEv,_ZThn4_N3ccc8CC3x10y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y63efgEv,_ZTv0_n12_N3ccc8CC3x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y63efgEv,_ZThn4_N3ccc8CC3x10y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y6E = {  "_ZN3ccc8CC3x10y6E", // class name
  bases__ZN3ccc8CC3x10y6E, 2,
  &(vtc__ZN3ccc8CC3x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1605,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y6  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD3x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x10y63efgEv
  ~DD3x10y6(); // tgen
  DD3x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y63abcEv");}
void  ccc::DD3x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y63efgEv");}
ccc::DD3x10y6 ::~DD3x10y6(){ note_dtor("_ZN3ccc8DD3x10y6E", this);} // tgen
ccc::DD3x10y6 ::DD3x10y6(){ note_ctor("_ZN3ccc8DD3x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y6E, buf);
    ::ccc::DD3x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y6E);
    dp->::ccc::DD3x10y6::~DD3x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y6E(Test__ZN3ccc8DD3x10y6E, "_ZN3ccc8DD3x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y6C1Ev();
extern void _ZN3ccc8DD3x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y6E[] = {
  NSPAIR(_ZN3ccc8DD3x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y6E[];
extern void _ZN3ccc8DD3x10y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y63abcEv,_ZTv0_n16_N3ccc8DD3x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y63abcEv,_ZThn4_N3ccc8DD3x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y63abcEv,_ZTv0_n16_N3ccc8DD3x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y6E[] = {
  {&(_ZTVN3ccc8DD3x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y6E[];
static VTBL_ENTRY alt_thunk_names1606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y63abcEv,_ZTv0_n16_N3ccc8DD3x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y63abcEv,_ZThn4_N3ccc8DD3x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y6E = {  "_ZN3ccc8DD3x10y6E", // class name
  bases__ZN3ccc8DD3x10y6E, 2,
  &(vtc__ZN3ccc8DD3x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1606,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y7  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y73pqrEv
  ~CC3x10y7(); // tgen
  CC3x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y7E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y73abcEv");}
void  ccc::CC3x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y73pqrEv");}
ccc::CC3x10y7 ::~CC3x10y7(){ note_dtor("_ZN3ccc8CC3x10y7E", this);} // tgen
ccc::CC3x10y7 ::CC3x10y7(){ note_ctor("_ZN3ccc8CC3x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y7E, buf);
    ::ccc::CC3x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y7E);
    dp->::ccc::CC3x10y7::~CC3x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y7E(Test__ZN3ccc8CC3x10y7E, "_ZN3ccc8CC3x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y7C1Ev();
extern void _ZN3ccc8CC3x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y7E[] = {
  NSPAIR(_ZN3ccc8CC3x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y7E[];
extern void _ZN3ccc8CC3x10y73pqrEv();
extern void _ZN3ccc8CC3x10y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y73pqrEv,_ZTv0_n16_N3ccc8CC3x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y73pqrEv,_ZThn4_N3ccc8CC3x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y73abcEv,_ZTv0_n20_N3ccc8CC3x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y73abcEv,_ZThn4_N3ccc8CC3x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y73pqrEv,_ZTv0_n16_N3ccc8CC3x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y73abcEv,_ZTv0_n20_N3ccc8CC3x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y7E[] = {
  {&(_ZTVN3ccc8CC3x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y7E[];
static VTBL_ENTRY alt_thunk_names1607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y73abcEv,_ZTv0_n20_N3ccc8CC3x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y73abcEv,_ZThn4_N3ccc8CC3x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y73pqrEv,_ZTv0_n16_N3ccc8CC3x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y73pqrEv,_ZThn4_N3ccc8CC3x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y7E = {  "_ZN3ccc8CC3x10y7E", // class name
  bases__ZN3ccc8CC3x10y7E, 2,
  &(vtc__ZN3ccc8CC3x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1607,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y7  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD3x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y73pqrEv
  ~DD3x10y7(); // tgen
  DD3x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y73abcEv");}
void  ccc::DD3x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y73pqrEv");}
ccc::DD3x10y7 ::~DD3x10y7(){ note_dtor("_ZN3ccc8DD3x10y7E", this);} // tgen
ccc::DD3x10y7 ::DD3x10y7(){ note_ctor("_ZN3ccc8DD3x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y7E, buf);
    ::ccc::DD3x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y7E);
    dp->::ccc::DD3x10y7::~DD3x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y7E(Test__ZN3ccc8DD3x10y7E, "_ZN3ccc8DD3x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y7C1Ev();
extern void _ZN3ccc8DD3x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y7E[] = {
  NSPAIR(_ZN3ccc8DD3x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x10y73pqrEv();
extern void _ZN3ccc8DD3x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y73pqrEv,_ZTv0_n12_N3ccc8DD3x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y73pqrEv,_ZThn4_N3ccc8DD3x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y73abcEv,_ZTv0_n16_N3ccc8DD3x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y73abcEv,_ZThn4_N3ccc8DD3x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y73pqrEv,_ZTv0_n12_N3ccc8DD3x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y73abcEv,_ZTv0_n16_N3ccc8DD3x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y7E[] = {
  {&(_ZTVN3ccc8DD3x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y7E[];
static VTBL_ENTRY alt_thunk_names1608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y73abcEv,_ZTv0_n16_N3ccc8DD3x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y73abcEv,_ZThn4_N3ccc8DD3x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y73pqrEv,_ZTv0_n12_N3ccc8DD3x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y73pqrEv,_ZThn4_N3ccc8DD3x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y7E = {  "_ZN3ccc8DD3x10y7E", // class name
  bases__ZN3ccc8DD3x10y7E, 2,
  &(vtc__ZN3ccc8DD3x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1608,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y8  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y83abcEv
  ~CC3x10y8(); // tgen
  CC3x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y8E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y83efgEv");}
void  ccc::CC3x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y83abcEv");}
ccc::CC3x10y8 ::~CC3x10y8(){ note_dtor("_ZN3ccc8CC3x10y8E", this);} // tgen
ccc::CC3x10y8 ::CC3x10y8(){ note_ctor("_ZN3ccc8CC3x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y8E, buf);
    ::ccc::CC3x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y8E);
    dp->::ccc::CC3x10y8::~CC3x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y8E(Test__ZN3ccc8CC3x10y8E, "_ZN3ccc8CC3x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y8C1Ev();
extern void _ZN3ccc8CC3x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y8E[] = {
  NSPAIR(_ZN3ccc8CC3x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC3x10y83abcEv();
extern void _ZN3ccc8CC3x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y83efgEv,_ZTv0_n12_N3ccc8CC3x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y83efgEv,_ZThn4_N3ccc8CC3x10y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x10y83abcEv,_ZTv0_n20_N3ccc8CC3x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y83abcEv,_ZThn4_N3ccc8CC3x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y83efgEv,_ZTv0_n12_N3ccc8CC3x10y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x10y83abcEv,_ZTv0_n20_N3ccc8CC3x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y8E[] = {
  {&(_ZTVN3ccc8CC3x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y8E[];
static VTBL_ENTRY alt_thunk_names1609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x10y83abcEv,_ZTv0_n20_N3ccc8CC3x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y83abcEv,_ZThn4_N3ccc8CC3x10y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y83efgEv,_ZTv0_n12_N3ccc8CC3x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y83efgEv,_ZThn4_N3ccc8CC3x10y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y8E = {  "_ZN3ccc8CC3x10y8E", // class name
  bases__ZN3ccc8CC3x10y8E, 2,
  &(vtc__ZN3ccc8CC3x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1609,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y8  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD3x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x10y83abcEv
  ~DD3x10y8(); // tgen
  DD3x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y83efgEv");}
void  ccc::DD3x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x10y83abcEv");}
ccc::DD3x10y8 ::~DD3x10y8(){ note_dtor("_ZN3ccc8DD3x10y8E", this);} // tgen
ccc::DD3x10y8 ::DD3x10y8(){ note_ctor("_ZN3ccc8DD3x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y8E, buf);
    ::ccc::DD3x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y8E);
    dp->::ccc::DD3x10y8::~DD3x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y8E(Test__ZN3ccc8DD3x10y8E, "_ZN3ccc8DD3x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y8C1Ev();
extern void _ZN3ccc8DD3x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y8E[] = {
  NSPAIR(_ZN3ccc8DD3x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y8E[];
extern void _ZN3ccc8DD3x10y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x10y83abcEv,_ZTv0_n16_N3ccc8DD3x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y83abcEv,_ZThn4_N3ccc8DD3x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x10y83abcEv,_ZTv0_n16_N3ccc8DD3x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y8E[] = {
  {&(_ZTVN3ccc8DD3x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y8E[];
static VTBL_ENTRY alt_thunk_names1610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x10y83abcEv,_ZTv0_n16_N3ccc8DD3x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y83abcEv,_ZThn4_N3ccc8DD3x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y8E = {  "_ZN3ccc8DD3x10y8E", // class name
  bases__ZN3ccc8DD3x10y8E, 2,
  &(vtc__ZN3ccc8DD3x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1610,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y9  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y93pqrEv
  ~CC3x10y9(); // tgen
  CC3x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y9E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y93efgEv");}
void  ccc::CC3x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y93pqrEv");}
ccc::CC3x10y9 ::~CC3x10y9(){ note_dtor("_ZN3ccc8CC3x10y9E", this);} // tgen
ccc::CC3x10y9 ::CC3x10y9(){ note_ctor("_ZN3ccc8CC3x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y9E, buf);
    ::ccc::CC3x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC3x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y9E);
    dp->::ccc::CC3x10y9::~CC3x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y9E(Test__ZN3ccc8CC3x10y9E, "_ZN3ccc8CC3x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y9C1Ev();
extern void _ZN3ccc8CC3x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y9E[] = {
  NSPAIR(_ZN3ccc8CC3x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y9E[];
extern void _ZN3ccc8CC3x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC3x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x10y93efgEv,_ZTv0_n12_N3ccc8CC3x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y93efgEv,_ZThn4_N3ccc8CC3x10y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x10y93pqrEv,_ZTv0_n16_N3ccc8CC3x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y93pqrEv,_ZThn4_N3ccc8CC3x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x10y93efgEv,_ZTv0_n12_N3ccc8CC3x10y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x10y93pqrEv,_ZTv0_n16_N3ccc8CC3x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x10y9E[] = {
  {&(_ZTVN3ccc8CC3x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x10y9E[];
static VTBL_ENTRY alt_thunk_names1611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x10y93pqrEv,_ZTv0_n16_N3ccc8CC3x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y93pqrEv,_ZThn4_N3ccc8CC3x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x10y93efgEv,_ZTv0_n12_N3ccc8CC3x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x10y93efgEv,_ZThn4_N3ccc8CC3x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x10y9E = {  "_ZN3ccc8CC3x10y9E", // class name
  bases__ZN3ccc8CC3x10y9E, 2,
  &(vtc__ZN3ccc8CC3x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x10y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1611,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y9  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD3x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x10y93pqrEv
  ~DD3x10y9(); // tgen
  DD3x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x10y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x10y93efgEv");}
void  ccc::DD3x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x10y93pqrEv");}
ccc::DD3x10y9 ::~DD3x10y9(){ note_dtor("_ZN3ccc8DD3x10y9E", this);} // tgen
ccc::DD3x10y9 ::DD3x10y9(){ note_ctor("_ZN3ccc8DD3x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x10y9E, buf);
    ::ccc::DD3x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x10y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD3x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x10y9E);
    dp->::ccc::DD3x10y9::~DD3x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x10y9E(Test__ZN3ccc8DD3x10y9E, "_ZN3ccc8DD3x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x10y9C1Ev();
extern void _ZN3ccc8DD3x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x10y9E[] = {
  NSPAIR(_ZN3ccc8DD3x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD3x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y9E[];
extern void _ZN3ccc8DD3x10y93efgEv();
extern void _ZN3ccc8DD3x10y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x10y93pqrEv,_ZTv0_n12_N3ccc8DD3x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x10y93pqrEv,_ZThn4_N3ccc8DD3x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x10y93pqrEv,_ZTv0_n12_N3ccc8DD3x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x10y9E[] = {
  {&(_ZTVN3ccc8DD3x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x10y9E[];
static VTBL_ENTRY alt_thunk_names1612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x10y93pqrEv,_ZTv0_n12_N3ccc8DD3x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x10y93pqrEv,_ZThn4_N3ccc8DD3x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x10y9E = {  "_ZN3ccc8DD3x10y9E", // class name
  bases__ZN3ccc8DD3x10y9E, 2,
  &(vtc__ZN3ccc8DD3x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x10y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1612,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y10  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x10y103abcEv
  ~CC3x10y10(); // tgen
  CC3x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y10E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y103pqrEv");}
void  ccc::CC3x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x10y103abcEv");}
ccc::CC3x10y10 ::~CC3x10y10(){ note_dtor("_ZN3ccc9CC3x10y10E", this);} // tgen
ccc::CC3x10y10 ::CC3x10y10(){ note_ctor("_ZN3ccc9CC3x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y10E, buf);
    ::ccc::CC3x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y10E);
    dp->::ccc::CC3x10y10::~CC3x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y10E(Test__ZN3ccc9CC3x10y10E, "_ZN3ccc9CC3x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y10C1Ev();
extern void _ZN3ccc9CC3x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y10E[] = {
  NSPAIR(_ZN3ccc9CC3x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y10E[];
extern void _ZN3ccc9CC3x10y103pqrEv();
extern void _ZN3ccc9CC3x10y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x10y103pqrEv,_ZTv0_n16_N3ccc9CC3x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y103pqrEv,_ZThn4_N3ccc9CC3x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x10y103abcEv,_ZTv0_n20_N3ccc9CC3x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y103abcEv,_ZThn4_N3ccc9CC3x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x10y103pqrEv,_ZTv0_n16_N3ccc9CC3x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x10y103abcEv,_ZTv0_n20_N3ccc9CC3x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y10E[] = {
  {&(_ZTVN3ccc9CC3x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y10E[];
static VTBL_ENTRY alt_thunk_names1613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x10y103abcEv,_ZTv0_n20_N3ccc9CC3x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y103abcEv,_ZThn4_N3ccc9CC3x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x10y103pqrEv,_ZTv0_n16_N3ccc9CC3x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y103pqrEv,_ZThn4_N3ccc9CC3x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x10y10E = {  "_ZN3ccc9CC3x10y10E", // class name
  bases__ZN3ccc9CC3x10y10E, 2,
  &(vtc__ZN3ccc9CC3x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1613,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y10  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD3x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x10y103abcEv
  ~DD3x10y10(); // tgen
  DD3x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x10y103pqrEv");}
void  ccc::DD3x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x10y103abcEv");}
ccc::DD3x10y10 ::~DD3x10y10(){ note_dtor("_ZN3ccc9DD3x10y10E", this);} // tgen
ccc::DD3x10y10 ::DD3x10y10(){ note_ctor("_ZN3ccc9DD3x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y10E, buf);
    ::ccc::DD3x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y10E);
    dp->::ccc::DD3x10y10::~DD3x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y10E(Test__ZN3ccc9DD3x10y10E, "_ZN3ccc9DD3x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y10C1Ev();
extern void _ZN3ccc9DD3x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y10E[] = {
  NSPAIR(_ZN3ccc9DD3x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x10y103pqrEv();
extern void _ZN3ccc9DD3x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x10y103pqrEv,_ZTv0_n12_N3ccc9DD3x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x10y103pqrEv,_ZThn4_N3ccc9DD3x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD3x10y103abcEv,_ZTv0_n16_N3ccc9DD3x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x10y103abcEv,_ZThn4_N3ccc9DD3x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x10y103pqrEv,_ZTv0_n12_N3ccc9DD3x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD3x10y103abcEv,_ZTv0_n16_N3ccc9DD3x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y10E[] = {
  {&(_ZTVN3ccc9DD3x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y10E[];
static VTBL_ENTRY alt_thunk_names1614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD3x10y103abcEv,_ZTv0_n16_N3ccc9DD3x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x10y103abcEv,_ZThn4_N3ccc9DD3x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x10y103pqrEv,_ZTv0_n12_N3ccc9DD3x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x10y103pqrEv,_ZThn4_N3ccc9DD3x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x10y10E = {  "_ZN3ccc9DD3x10y10E", // class name
  bases__ZN3ccc9DD3x10y10E, 2,
  &(vtc__ZN3ccc9DD3x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1614,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y11  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x10y113efgEv
  ~CC3x10y11(); // tgen
  CC3x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y11E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y113pqrEv");}
void  ccc::CC3x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x10y113efgEv");}
ccc::CC3x10y11 ::~CC3x10y11(){ note_dtor("_ZN3ccc9CC3x10y11E", this);} // tgen
ccc::CC3x10y11 ::CC3x10y11(){ note_ctor("_ZN3ccc9CC3x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y11E, buf);
    ::ccc::CC3x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y11E);
    dp->::ccc::CC3x10y11::~CC3x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y11E(Test__ZN3ccc9CC3x10y11E, "_ZN3ccc9CC3x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y11C1Ev();
extern void _ZN3ccc9CC3x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y11E[] = {
  NSPAIR(_ZN3ccc9CC3x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y11E[];
extern void _ZN3ccc9CC3x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC3x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x10y113efgEv,_ZTv0_n12_N3ccc9CC3x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y113efgEv,_ZThn4_N3ccc9CC3x10y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x10y113pqrEv,_ZTv0_n16_N3ccc9CC3x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y113pqrEv,_ZThn4_N3ccc9CC3x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x10y113efgEv,_ZTv0_n12_N3ccc9CC3x10y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x10y113pqrEv,_ZTv0_n16_N3ccc9CC3x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y11E[] = {
  {&(_ZTVN3ccc9CC3x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y11E[];
static VTBL_ENTRY alt_thunk_names1615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x10y113pqrEv,_ZTv0_n16_N3ccc9CC3x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y113pqrEv,_ZThn4_N3ccc9CC3x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x10y113efgEv,_ZTv0_n12_N3ccc9CC3x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y113efgEv,_ZThn4_N3ccc9CC3x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x10y11E = {  "_ZN3ccc9CC3x10y11E", // class name
  bases__ZN3ccc9CC3x10y11E, 2,
  &(vtc__ZN3ccc9CC3x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1615,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y11  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD3x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x10y113efgEv
  ~DD3x10y11(); // tgen
  DD3x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x10y113pqrEv");}
void  ccc::DD3x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x10y113efgEv");}
ccc::DD3x10y11 ::~DD3x10y11(){ note_dtor("_ZN3ccc9DD3x10y11E", this);} // tgen
ccc::DD3x10y11 ::DD3x10y11(){ note_ctor("_ZN3ccc9DD3x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y11E, buf);
    ::ccc::DD3x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y11E);
    dp->::ccc::DD3x10y11::~DD3x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y11E(Test__ZN3ccc9DD3x10y11E, "_ZN3ccc9DD3x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y11C1Ev();
extern void _ZN3ccc9DD3x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y11E[] = {
  NSPAIR(_ZN3ccc9DD3x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y11E[];
extern void _ZN3ccc9DD3x10y113efgEv();
extern void _ZN3ccc9DD3x10y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x10y113pqrEv,_ZTv0_n12_N3ccc9DD3x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x10y113pqrEv,_ZThn4_N3ccc9DD3x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x10y113pqrEv,_ZTv0_n12_N3ccc9DD3x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y11E[] = {
  {&(_ZTVN3ccc9DD3x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y11E[];
static VTBL_ENTRY alt_thunk_names1616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x10y113pqrEv,_ZTv0_n12_N3ccc9DD3x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x10y113pqrEv,_ZThn4_N3ccc9DD3x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x10y11E = {  "_ZN3ccc9DD3x10y11E", // class name
  bases__ZN3ccc9DD3x10y11E, 2,
  &(vtc__ZN3ccc9DD3x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1616,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y12  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC3x10y123abcEv
  ~CC3x10y12(); // tgen
  CC3x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x10y123abcEv");}
ccc::CC3x10y12 ::~CC3x10y12(){ note_dtor("_ZN3ccc9CC3x10y12E", this);} // tgen
ccc::CC3x10y12 ::CC3x10y12(){ note_ctor("_ZN3ccc9CC3x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y12E, buf);
    ::ccc::CC3x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y12E);
    dp->::ccc::CC3x10y12::~CC3x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y12E(Test__ZN3ccc9CC3x10y12E, "_ZN3ccc9CC3x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y12C1Ev();
extern void _ZN3ccc9CC3x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y12E[] = {
  NSPAIR(_ZN3ccc9CC3x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC3x10y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x10y123abcEv,_ZTv0_n20_N3ccc9CC3x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y123abcEv,_ZThn4_N3ccc9CC3x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x10y123abcEv,_ZTv0_n20_N3ccc9CC3x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y12E[] = {
  {&(_ZTVN3ccc9CC3x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y12E[];
static VTBL_ENTRY alt_thunk_names1617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x10y123abcEv,_ZTv0_n20_N3ccc9CC3x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y123abcEv,_ZThn4_N3ccc9CC3x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x10y12E = {  "_ZN3ccc9CC3x10y12E", // class name
  bases__ZN3ccc9CC3x10y12E, 2,
  &(vtc__ZN3ccc9CC3x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1617,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y12  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD3x10y123abcEv
  ~DD3x10y12(); // tgen
  DD3x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x10y123abcEv");}
ccc::DD3x10y12 ::~DD3x10y12(){ note_dtor("_ZN3ccc9DD3x10y12E", this);} // tgen
ccc::DD3x10y12 ::DD3x10y12(){ note_ctor("_ZN3ccc9DD3x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y12E, buf);
    ::ccc::DD3x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y12E);
    dp->::ccc::DD3x10y12::~DD3x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y12E(Test__ZN3ccc9DD3x10y12E, "_ZN3ccc9DD3x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y12C1Ev();
extern void _ZN3ccc9DD3x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y12E[] = {
  NSPAIR(_ZN3ccc9DD3x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD3x10y123abcEv,_ZTv0_n16_N3ccc9DD3x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x10y123abcEv,_ZThn4_N3ccc9DD3x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD3x10y123abcEv,_ZTv0_n16_N3ccc9DD3x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y12E[] = {
  {&(_ZTVN3ccc9DD3x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y12E[];
static VTBL_ENTRY alt_thunk_names1618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD3x10y123abcEv,_ZTv0_n16_N3ccc9DD3x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x10y123abcEv,_ZThn4_N3ccc9DD3x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x10y12E = {  "_ZN3ccc9DD3x10y12E", // class name
  bases__ZN3ccc9DD3x10y12E, 2,
  &(vtc__ZN3ccc9DD3x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1618,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y13  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC3x10y133efgEv
  ~CC3x10y13(); // tgen
  CC3x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x10y133efgEv");}
ccc::CC3x10y13 ::~CC3x10y13(){ note_dtor("_ZN3ccc9CC3x10y13E", this);} // tgen
ccc::CC3x10y13 ::CC3x10y13(){ note_ctor("_ZN3ccc9CC3x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y13E, buf);
    ::ccc::CC3x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y13E);
    dp->::ccc::CC3x10y13::~CC3x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y13E(Test__ZN3ccc9CC3x10y13E, "_ZN3ccc9CC3x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y13C1Ev();
extern void _ZN3ccc9CC3x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y13E[] = {
  NSPAIR(_ZN3ccc9CC3x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC3x10y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x10y133efgEv,_ZTv0_n12_N3ccc9CC3x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y133efgEv,_ZThn4_N3ccc9CC3x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x10y133efgEv,_ZTv0_n12_N3ccc9CC3x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y13E[] = {
  {&(_ZTVN3ccc9CC3x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y13E[];
static VTBL_ENTRY alt_thunk_names1619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x10y133efgEv,_ZTv0_n12_N3ccc9CC3x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y133efgEv,_ZThn4_N3ccc9CC3x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x10y13E = {  "_ZN3ccc9CC3x10y13E", // class name
  bases__ZN3ccc9CC3x10y13E, 2,
  &(vtc__ZN3ccc9CC3x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1619,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y13  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD3x10y133efgEv
  ~DD3x10y13(); // tgen
  DD3x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x10y133efgEv");}
ccc::DD3x10y13 ::~DD3x10y13(){ note_dtor("_ZN3ccc9DD3x10y13E", this);} // tgen
ccc::DD3x10y13 ::DD3x10y13(){ note_ctor("_ZN3ccc9DD3x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y13E, buf);
    ::ccc::DD3x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y13E);
    dp->::ccc::DD3x10y13::~DD3x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y13E(Test__ZN3ccc9DD3x10y13E, "_ZN3ccc9DD3x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y13C1Ev();
extern void _ZN3ccc9DD3x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y13E[] = {
  NSPAIR(_ZN3ccc9DD3x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y13E[];
extern void _ZN3ccc9DD3x10y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y13E[] = {
  {&(_ZTVN3ccc9DD3x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y13E[];
Class_Descriptor cd__ZN3ccc9DD3x10y13E = {  "_ZN3ccc9DD3x10y13E", // class name
  bases__ZN3ccc9DD3x10y13E, 2,
  &(vtc__ZN3ccc9DD3x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y14  : virtual ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y143pqrEv
  ~CC3x10y14(); // tgen
  CC3x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y143pqrEv");}
ccc::CC3x10y14 ::~CC3x10y14(){ note_dtor("_ZN3ccc9CC3x10y14E", this);} // tgen
ccc::CC3x10y14 ::CC3x10y14(){ note_ctor("_ZN3ccc9CC3x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y14E, buf);
    ::ccc::CC3x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y14E);
    dp->::ccc::CC3x10y14::~CC3x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y14E(Test__ZN3ccc9CC3x10y14E, "_ZN3ccc9CC3x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y14C1Ev();
extern void _ZN3ccc9CC3x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y14E[] = {
  NSPAIR(_ZN3ccc9CC3x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y14E[];
extern void _ZN3ccc9CC3x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x10y143pqrEv,_ZTv0_n16_N3ccc9CC3x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y143pqrEv,_ZThn4_N3ccc9CC3x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x10y143pqrEv,_ZTv0_n16_N3ccc9CC3x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y14E[] = {
  {&(_ZTVN3ccc9CC3x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y14E[];
static VTBL_ENTRY alt_thunk_names1620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x10y143pqrEv,_ZTv0_n16_N3ccc9CC3x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x10y143pqrEv,_ZThn4_N3ccc9CC3x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x10y14E = {  "_ZN3ccc9CC3x10y14E", // class name
  bases__ZN3ccc9CC3x10y14E, 2,
  &(vtc__ZN3ccc9CC3x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1620,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y14  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD3x10y143pqrEv
  ~DD3x10y14(); // tgen
  DD3x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x10y143pqrEv");}
ccc::DD3x10y14 ::~DD3x10y14(){ note_dtor("_ZN3ccc9DD3x10y14E", this);} // tgen
ccc::DD3x10y14 ::DD3x10y14(){ note_ctor("_ZN3ccc9DD3x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y14E, buf);
    ::ccc::DD3x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y14E);
    dp->::ccc::DD3x10y14::~DD3x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y14E(Test__ZN3ccc9DD3x10y14E, "_ZN3ccc9DD3x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y14C1Ev();
extern void _ZN3ccc9DD3x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y14E[] = {
  NSPAIR(_ZN3ccc9DD3x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x10y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x10y143pqrEv,_ZTv0_n12_N3ccc9DD3x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x10y143pqrEv,_ZThn4_N3ccc9DD3x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x10y143pqrEv,_ZTv0_n12_N3ccc9DD3x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y14E[] = {
  {&(_ZTVN3ccc9DD3x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y14E[];
static VTBL_ENTRY alt_thunk_names1621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x10y143pqrEv,_ZTv0_n12_N3ccc9DD3x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x10y143pqrEv,_ZThn4_N3ccc9DD3x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x10y14E = {  "_ZN3ccc9DD3x10y14E", // class name
  bases__ZN3ccc9DD3x10y14E, 2,
  &(vtc__ZN3ccc9DD3x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1621,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y15  : virtual ::ccc::AA3 , ::ccc::BB10 {
  ~CC3x10y15(); // tgen
  CC3x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x10y15 ::~CC3x10y15(){ note_dtor("_ZN3ccc9CC3x10y15E", this);} // tgen
ccc::CC3x10y15 ::CC3x10y15(){ note_ctor("_ZN3ccc9CC3x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y15E, buf);
    ::ccc::CC3x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC3x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y15E);
    dp->::ccc::CC3x10y15::~CC3x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y15E(Test__ZN3ccc9CC3x10y15E, "_ZN3ccc9CC3x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y15C1Ev();
extern void _ZN3ccc9CC3x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y15E[] = {
  NSPAIR(_ZN3ccc9CC3x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x10y15E[] = {
  {&(_ZTVN3ccc9CC3x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x10y15E[];
Class_Descriptor cd__ZN3ccc9CC3x10y15E = {  "_ZN3ccc9CC3x10y15E", // class name
  bases__ZN3ccc9CC3x10y15E, 2,
  &(vtc__ZN3ccc9CC3x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x10y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x10y15  : virtual ::ccc::AA3 , virtual ::ccc::BB10 {
  ~DD3x10y15(); // tgen
  DD3x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x10y15 ::~DD3x10y15(){ note_dtor("_ZN3ccc9DD3x10y15E", this);} // tgen
ccc::DD3x10y15 ::DD3x10y15(){ note_ctor("_ZN3ccc9DD3x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x10y15E, buf);
    ::ccc::DD3x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x10y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD3x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x10y15E);
    dp->::ccc::DD3x10y15::~DD3x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x10y15E(Test__ZN3ccc9DD3x10y15E, "_ZN3ccc9DD3x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x10y15C1Ev();
extern void _ZN3ccc9DD3x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x10y15E[] = {
  NSPAIR(_ZN3ccc9DD3x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD3x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x10y15E[] = {
  {&(_ZTVN3ccc9DD3x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x10y15E[];
Class_Descriptor cd__ZN3ccc9DD3x10y15E = {  "_ZN3ccc9DD3x10y15E", // class name
  bases__ZN3ccc9DD3x10y15E, 2,
  &(vtc__ZN3ccc9DD3x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x10y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y0  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y03pqrEv
  ~CC3x11y0(); // tgen
  CC3x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y0E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y03abcEv");}
void  ccc::CC3x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y03efgEv");}
void  ccc::CC3x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y03pqrEv");}
ccc::CC3x11y0 ::~CC3x11y0(){ note_dtor("_ZN3ccc8CC3x11y0E", this);} // tgen
ccc::CC3x11y0 ::CC3x11y0(){ note_ctor("_ZN3ccc8CC3x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y0E, buf);
    ::ccc::CC3x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y0E);
    dp->::ccc::CC3x11y0::~CC3x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y0E(Test__ZN3ccc8CC3x11y0E, "_ZN3ccc8CC3x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y0C1Ev();
extern void _ZN3ccc8CC3x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y0E[] = {
  NSPAIR(_ZN3ccc8CC3x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y0E[];
extern void _ZN3ccc8CC3x11y03pqrEv();
extern void _ZN3ccc8CC3x11y03efgEv();
extern void _ZN3ccc8CC3x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y03efgEv,_ZTv0_n12_N3ccc8CC3x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y03efgEv,_ZThn4_N3ccc8CC3x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y03pqrEv,_ZTv0_n16_N3ccc8CC3x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y03pqrEv,_ZThn4_N3ccc8CC3x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y03abcEv,_ZTv0_n20_N3ccc8CC3x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y03abcEv,_ZThn4_N3ccc8CC3x11y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y03efgEv,_ZTv0_n12_N3ccc8CC3x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y03pqrEv,_ZTv0_n16_N3ccc8CC3x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y03abcEv,_ZTv0_n20_N3ccc8CC3x11y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y0E[] = {
  {&(_ZTVN3ccc8CC3x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y0E[];
static VTBL_ENTRY alt_thunk_names1622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y03abcEv,_ZTv0_n20_N3ccc8CC3x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y03abcEv,_ZThn4_N3ccc8CC3x11y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y03pqrEv,_ZTv0_n16_N3ccc8CC3x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y03pqrEv,_ZThn4_N3ccc8CC3x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y03efgEv,_ZTv0_n12_N3ccc8CC3x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y03efgEv,_ZThn4_N3ccc8CC3x11y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y0E = {  "_ZN3ccc8CC3x11y0E", // class name
  bases__ZN3ccc8CC3x11y0E, 2,
  &(vtc__ZN3ccc8CC3x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1622,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y0  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD3x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y03pqrEv
  ~DD3x11y0(); // tgen
  DD3x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y03abcEv");}
void  ccc::DD3x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y03efgEv");}
void  ccc::DD3x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y03pqrEv");}
ccc::DD3x11y0 ::~DD3x11y0(){ note_dtor("_ZN3ccc8DD3x11y0E", this);} // tgen
ccc::DD3x11y0 ::DD3x11y0(){ note_ctor("_ZN3ccc8DD3x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y0E, buf);
    ::ccc::DD3x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y0E);
    dp->::ccc::DD3x11y0::~DD3x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y0E(Test__ZN3ccc8DD3x11y0E, "_ZN3ccc8DD3x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y0C1Ev();
extern void _ZN3ccc8DD3x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y0E[] = {
  NSPAIR(_ZN3ccc8DD3x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y0E[];
extern void _ZN3ccc8DD3x11y03efgEv();
extern void _ZN3ccc8DD3x11y03pqrEv();
extern void _ZN3ccc8DD3x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y03pqrEv,_ZTv0_n12_N3ccc8DD3x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y03pqrEv,_ZThn4_N3ccc8DD3x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y03efgEv,_ZTv0_n16_N3ccc8DD3x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y03efgEv,_ZThn4_N3ccc8DD3x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y03pqrEv,_ZTv0_n12_N3ccc8DD3x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y03efgEv,_ZTv0_n16_N3ccc8DD3x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y0E[] = {
  {&(_ZTVN3ccc8DD3x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y0E[];
static VTBL_ENTRY alt_thunk_names1623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y03efgEv,_ZTv0_n16_N3ccc8DD3x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y03efgEv,_ZThn4_N3ccc8DD3x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y03pqrEv,_ZTv0_n12_N3ccc8DD3x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y03pqrEv,_ZThn4_N3ccc8DD3x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y0E = {  "_ZN3ccc8DD3x11y0E", // class name
  bases__ZN3ccc8DD3x11y0E, 2,
  &(vtc__ZN3ccc8DD3x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1623,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y1  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x11y13efgEv
  ~CC3x11y1(); // tgen
  CC3x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y1E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y13abcEv");}
void  ccc::CC3x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y13pqrEv");}
void  ccc::CC3x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y13efgEv");}
ccc::CC3x11y1 ::~CC3x11y1(){ note_dtor("_ZN3ccc8CC3x11y1E", this);} // tgen
ccc::CC3x11y1 ::CC3x11y1(){ note_ctor("_ZN3ccc8CC3x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y1E, buf);
    ::ccc::CC3x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y1E);
    dp->::ccc::CC3x11y1::~CC3x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y1E(Test__ZN3ccc8CC3x11y1E, "_ZN3ccc8CC3x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y1C1Ev();
extern void _ZN3ccc8CC3x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y1E[] = {
  NSPAIR(_ZN3ccc8CC3x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y1E[];
extern void _ZN3ccc8CC3x11y13pqrEv();
extern void _ZN3ccc8CC3x11y13efgEv();
extern void _ZN3ccc8CC3x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y13efgEv,_ZTv0_n12_N3ccc8CC3x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y13efgEv,_ZThn4_N3ccc8CC3x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y13pqrEv,_ZTv0_n16_N3ccc8CC3x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y13pqrEv,_ZThn4_N3ccc8CC3x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y13abcEv,_ZTv0_n20_N3ccc8CC3x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y13abcEv,_ZThn4_N3ccc8CC3x11y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y13efgEv,_ZTv0_n12_N3ccc8CC3x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y13pqrEv,_ZTv0_n16_N3ccc8CC3x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y13abcEv,_ZTv0_n20_N3ccc8CC3x11y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y1E[] = {
  {&(_ZTVN3ccc8CC3x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y1E[];
static VTBL_ENTRY alt_thunk_names1624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y13abcEv,_ZTv0_n20_N3ccc8CC3x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y13abcEv,_ZThn4_N3ccc8CC3x11y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y13pqrEv,_ZTv0_n16_N3ccc8CC3x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y13pqrEv,_ZThn4_N3ccc8CC3x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y13efgEv,_ZTv0_n12_N3ccc8CC3x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y13efgEv,_ZThn4_N3ccc8CC3x11y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y1E = {  "_ZN3ccc8CC3x11y1E", // class name
  bases__ZN3ccc8CC3x11y1E, 2,
  &(vtc__ZN3ccc8CC3x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1624,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y1  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD3x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x11y13efgEv
  ~DD3x11y1(); // tgen
  DD3x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y13abcEv");}
void  ccc::DD3x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y13pqrEv");}
void  ccc::DD3x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y13efgEv");}
ccc::DD3x11y1 ::~DD3x11y1(){ note_dtor("_ZN3ccc8DD3x11y1E", this);} // tgen
ccc::DD3x11y1 ::DD3x11y1(){ note_ctor("_ZN3ccc8DD3x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y1E, buf);
    ::ccc::DD3x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y1E);
    dp->::ccc::DD3x11y1::~DD3x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y1E(Test__ZN3ccc8DD3x11y1E, "_ZN3ccc8DD3x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y1C1Ev();
extern void _ZN3ccc8DD3x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y1E[] = {
  NSPAIR(_ZN3ccc8DD3x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y1E[];
extern void _ZN3ccc8DD3x11y13efgEv();
extern void _ZN3ccc8DD3x11y13pqrEv();
extern void _ZN3ccc8DD3x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y13pqrEv,_ZTv0_n12_N3ccc8DD3x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y13pqrEv,_ZThn4_N3ccc8DD3x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y13efgEv,_ZTv0_n16_N3ccc8DD3x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y13efgEv,_ZThn4_N3ccc8DD3x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y13pqrEv,_ZTv0_n12_N3ccc8DD3x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y13efgEv,_ZTv0_n16_N3ccc8DD3x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y1E[] = {
  {&(_ZTVN3ccc8DD3x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y1E[];
static VTBL_ENTRY alt_thunk_names1625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y13efgEv,_ZTv0_n16_N3ccc8DD3x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y13efgEv,_ZThn4_N3ccc8DD3x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y13pqrEv,_ZTv0_n12_N3ccc8DD3x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y13pqrEv,_ZThn4_N3ccc8DD3x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y1E = {  "_ZN3ccc8DD3x11y1E", // class name
  bases__ZN3ccc8DD3x11y1E, 2,
  &(vtc__ZN3ccc8DD3x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1625,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y2  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y23pqrEv
  ~CC3x11y2(); // tgen
  CC3x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y2E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y23efgEv");}
void  ccc::CC3x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y23abcEv");}
void  ccc::CC3x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y23pqrEv");}
ccc::CC3x11y2 ::~CC3x11y2(){ note_dtor("_ZN3ccc8CC3x11y2E", this);} // tgen
ccc::CC3x11y2 ::CC3x11y2(){ note_ctor("_ZN3ccc8CC3x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y2E, buf);
    ::ccc::CC3x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y2E);
    dp->::ccc::CC3x11y2::~CC3x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y2E(Test__ZN3ccc8CC3x11y2E, "_ZN3ccc8CC3x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y2C1Ev();
extern void _ZN3ccc8CC3x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y2E[] = {
  NSPAIR(_ZN3ccc8CC3x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y2E[];
extern void _ZN3ccc8CC3x11y23pqrEv();
extern void _ZN3ccc8CC3x11y23efgEv();
extern void _ZN3ccc8CC3x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y23efgEv,_ZTv0_n12_N3ccc8CC3x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y23efgEv,_ZThn4_N3ccc8CC3x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y23pqrEv,_ZTv0_n16_N3ccc8CC3x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y23pqrEv,_ZThn4_N3ccc8CC3x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y23abcEv,_ZTv0_n20_N3ccc8CC3x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y23abcEv,_ZThn4_N3ccc8CC3x11y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y23efgEv,_ZTv0_n12_N3ccc8CC3x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y23pqrEv,_ZTv0_n16_N3ccc8CC3x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y23abcEv,_ZTv0_n20_N3ccc8CC3x11y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y2E[] = {
  {&(_ZTVN3ccc8CC3x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y2E[];
static VTBL_ENTRY alt_thunk_names1626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y23abcEv,_ZTv0_n20_N3ccc8CC3x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y23abcEv,_ZThn4_N3ccc8CC3x11y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y23pqrEv,_ZTv0_n16_N3ccc8CC3x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y23pqrEv,_ZThn4_N3ccc8CC3x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y23efgEv,_ZTv0_n12_N3ccc8CC3x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y23efgEv,_ZThn4_N3ccc8CC3x11y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y2E = {  "_ZN3ccc8CC3x11y2E", // class name
  bases__ZN3ccc8CC3x11y2E, 2,
  &(vtc__ZN3ccc8CC3x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1626,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y2  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD3x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y23pqrEv
  ~DD3x11y2(); // tgen
  DD3x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y23efgEv");}
void  ccc::DD3x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y23abcEv");}
void  ccc::DD3x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y23pqrEv");}
ccc::DD3x11y2 ::~DD3x11y2(){ note_dtor("_ZN3ccc8DD3x11y2E", this);} // tgen
ccc::DD3x11y2 ::DD3x11y2(){ note_ctor("_ZN3ccc8DD3x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y2E, buf);
    ::ccc::DD3x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y2E);
    dp->::ccc::DD3x11y2::~DD3x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y2E(Test__ZN3ccc8DD3x11y2E, "_ZN3ccc8DD3x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y2C1Ev();
extern void _ZN3ccc8DD3x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y2E[] = {
  NSPAIR(_ZN3ccc8DD3x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y2E[];
extern void _ZN3ccc8DD3x11y23efgEv();
extern void _ZN3ccc8DD3x11y23pqrEv();
extern void _ZN3ccc8DD3x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y23pqrEv,_ZTv0_n12_N3ccc8DD3x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y23pqrEv,_ZThn4_N3ccc8DD3x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y23efgEv,_ZTv0_n16_N3ccc8DD3x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y23efgEv,_ZThn4_N3ccc8DD3x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y23pqrEv,_ZTv0_n12_N3ccc8DD3x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y23efgEv,_ZTv0_n16_N3ccc8DD3x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y2E[] = {
  {&(_ZTVN3ccc8DD3x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y2E[];
static VTBL_ENTRY alt_thunk_names1627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y23efgEv,_ZTv0_n16_N3ccc8DD3x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y23efgEv,_ZThn4_N3ccc8DD3x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y23pqrEv,_ZTv0_n12_N3ccc8DD3x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y23pqrEv,_ZThn4_N3ccc8DD3x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y2E = {  "_ZN3ccc8DD3x11y2E", // class name
  bases__ZN3ccc8DD3x11y2E, 2,
  &(vtc__ZN3ccc8DD3x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1627,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y3  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x11y33abcEv
  ~CC3x11y3(); // tgen
  CC3x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y3E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y33efgEv");}
void  ccc::CC3x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y33pqrEv");}
void  ccc::CC3x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y33abcEv");}
ccc::CC3x11y3 ::~CC3x11y3(){ note_dtor("_ZN3ccc8CC3x11y3E", this);} // tgen
ccc::CC3x11y3 ::CC3x11y3(){ note_ctor("_ZN3ccc8CC3x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y3E, buf);
    ::ccc::CC3x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y3E);
    dp->::ccc::CC3x11y3::~CC3x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y3E(Test__ZN3ccc8CC3x11y3E, "_ZN3ccc8CC3x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y3C1Ev();
extern void _ZN3ccc8CC3x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y3E[] = {
  NSPAIR(_ZN3ccc8CC3x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y3E[];
extern void _ZN3ccc8CC3x11y33pqrEv();
extern void _ZN3ccc8CC3x11y33efgEv();
extern void _ZN3ccc8CC3x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y33efgEv,_ZTv0_n12_N3ccc8CC3x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y33efgEv,_ZThn4_N3ccc8CC3x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y33pqrEv,_ZTv0_n16_N3ccc8CC3x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y33pqrEv,_ZThn4_N3ccc8CC3x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y33abcEv,_ZTv0_n20_N3ccc8CC3x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y33abcEv,_ZThn4_N3ccc8CC3x11y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y33efgEv,_ZTv0_n12_N3ccc8CC3x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y33pqrEv,_ZTv0_n16_N3ccc8CC3x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y33abcEv,_ZTv0_n20_N3ccc8CC3x11y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y3E[] = {
  {&(_ZTVN3ccc8CC3x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y3E[];
static VTBL_ENTRY alt_thunk_names1628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y33abcEv,_ZTv0_n20_N3ccc8CC3x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y33abcEv,_ZThn4_N3ccc8CC3x11y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y33pqrEv,_ZTv0_n16_N3ccc8CC3x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y33pqrEv,_ZThn4_N3ccc8CC3x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y33efgEv,_ZTv0_n12_N3ccc8CC3x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y33efgEv,_ZThn4_N3ccc8CC3x11y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y3E = {  "_ZN3ccc8CC3x11y3E", // class name
  bases__ZN3ccc8CC3x11y3E, 2,
  &(vtc__ZN3ccc8CC3x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1628,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y3  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD3x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x11y33abcEv
  ~DD3x11y3(); // tgen
  DD3x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y33efgEv");}
void  ccc::DD3x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y33pqrEv");}
void  ccc::DD3x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y33abcEv");}
ccc::DD3x11y3 ::~DD3x11y3(){ note_dtor("_ZN3ccc8DD3x11y3E", this);} // tgen
ccc::DD3x11y3 ::DD3x11y3(){ note_ctor("_ZN3ccc8DD3x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y3E, buf);
    ::ccc::DD3x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y3E);
    dp->::ccc::DD3x11y3::~DD3x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y3E(Test__ZN3ccc8DD3x11y3E, "_ZN3ccc8DD3x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y3C1Ev();
extern void _ZN3ccc8DD3x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y3E[] = {
  NSPAIR(_ZN3ccc8DD3x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y3E[];
extern void _ZN3ccc8DD3x11y33efgEv();
extern void _ZN3ccc8DD3x11y33pqrEv();
extern void _ZN3ccc8DD3x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y33pqrEv,_ZTv0_n12_N3ccc8DD3x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y33pqrEv,_ZThn4_N3ccc8DD3x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y33efgEv,_ZTv0_n16_N3ccc8DD3x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y33efgEv,_ZThn4_N3ccc8DD3x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y33pqrEv,_ZTv0_n12_N3ccc8DD3x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y33efgEv,_ZTv0_n16_N3ccc8DD3x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y3E[] = {
  {&(_ZTVN3ccc8DD3x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y3E[];
static VTBL_ENTRY alt_thunk_names1629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y33efgEv,_ZTv0_n16_N3ccc8DD3x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y33efgEv,_ZThn4_N3ccc8DD3x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y33pqrEv,_ZTv0_n12_N3ccc8DD3x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y33pqrEv,_ZThn4_N3ccc8DD3x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y3E = {  "_ZN3ccc8DD3x11y3E", // class name
  bases__ZN3ccc8DD3x11y3E, 2,
  &(vtc__ZN3ccc8DD3x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1629,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y4  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC3x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y43efgEv
  ~CC3x11y4(); // tgen
  CC3x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y4E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y43pqrEv");}
void  ccc::CC3x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y43abcEv");}
void  ccc::CC3x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y43efgEv");}
ccc::CC3x11y4 ::~CC3x11y4(){ note_dtor("_ZN3ccc8CC3x11y4E", this);} // tgen
ccc::CC3x11y4 ::CC3x11y4(){ note_ctor("_ZN3ccc8CC3x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y4E, buf);
    ::ccc::CC3x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y4E);
    dp->::ccc::CC3x11y4::~CC3x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y4E(Test__ZN3ccc8CC3x11y4E, "_ZN3ccc8CC3x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y4C1Ev();
extern void _ZN3ccc8CC3x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y4E[] = {
  NSPAIR(_ZN3ccc8CC3x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y4E[];
extern void _ZN3ccc8CC3x11y43pqrEv();
extern void _ZN3ccc8CC3x11y43efgEv();
extern void _ZN3ccc8CC3x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y43efgEv,_ZTv0_n12_N3ccc8CC3x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y43efgEv,_ZThn4_N3ccc8CC3x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y43pqrEv,_ZTv0_n16_N3ccc8CC3x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y43pqrEv,_ZThn4_N3ccc8CC3x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y43abcEv,_ZTv0_n20_N3ccc8CC3x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y43abcEv,_ZThn4_N3ccc8CC3x11y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y43efgEv,_ZTv0_n12_N3ccc8CC3x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y43pqrEv,_ZTv0_n16_N3ccc8CC3x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y43abcEv,_ZTv0_n20_N3ccc8CC3x11y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y4E[] = {
  {&(_ZTVN3ccc8CC3x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y4E[];
static VTBL_ENTRY alt_thunk_names1630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y43abcEv,_ZTv0_n20_N3ccc8CC3x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y43abcEv,_ZThn4_N3ccc8CC3x11y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y43pqrEv,_ZTv0_n16_N3ccc8CC3x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y43pqrEv,_ZThn4_N3ccc8CC3x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y43efgEv,_ZTv0_n12_N3ccc8CC3x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y43efgEv,_ZThn4_N3ccc8CC3x11y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y4E = {  "_ZN3ccc8CC3x11y4E", // class name
  bases__ZN3ccc8CC3x11y4E, 2,
  &(vtc__ZN3ccc8CC3x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1630,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y4  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD3x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x11y43efgEv
  ~DD3x11y4(); // tgen
  DD3x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y43pqrEv");}
void  ccc::DD3x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y43abcEv");}
void  ccc::DD3x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y43efgEv");}
ccc::DD3x11y4 ::~DD3x11y4(){ note_dtor("_ZN3ccc8DD3x11y4E", this);} // tgen
ccc::DD3x11y4 ::DD3x11y4(){ note_ctor("_ZN3ccc8DD3x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y4E, buf);
    ::ccc::DD3x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y4E);
    dp->::ccc::DD3x11y4::~DD3x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y4E(Test__ZN3ccc8DD3x11y4E, "_ZN3ccc8DD3x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y4C1Ev();
extern void _ZN3ccc8DD3x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y4E[] = {
  NSPAIR(_ZN3ccc8DD3x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y4E[];
extern void _ZN3ccc8DD3x11y43efgEv();
extern void _ZN3ccc8DD3x11y43pqrEv();
extern void _ZN3ccc8DD3x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y43pqrEv,_ZTv0_n12_N3ccc8DD3x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y43pqrEv,_ZThn4_N3ccc8DD3x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y43efgEv,_ZTv0_n16_N3ccc8DD3x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y43efgEv,_ZThn4_N3ccc8DD3x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y43pqrEv,_ZTv0_n12_N3ccc8DD3x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y43efgEv,_ZTv0_n16_N3ccc8DD3x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y4E[] = {
  {&(_ZTVN3ccc8DD3x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y4E[];
static VTBL_ENTRY alt_thunk_names1631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y43efgEv,_ZTv0_n16_N3ccc8DD3x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y43efgEv,_ZThn4_N3ccc8DD3x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y43pqrEv,_ZTv0_n12_N3ccc8DD3x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y43pqrEv,_ZThn4_N3ccc8DD3x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y4E = {  "_ZN3ccc8DD3x11y4E", // class name
  bases__ZN3ccc8DD3x11y4E, 2,
  &(vtc__ZN3ccc8DD3x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1631,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y5  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC3x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y53abcEv
  ~CC3x11y5(); // tgen
  CC3x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y5E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y53pqrEv");}
void  ccc::CC3x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y53efgEv");}
void  ccc::CC3x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y53abcEv");}
ccc::CC3x11y5 ::~CC3x11y5(){ note_dtor("_ZN3ccc8CC3x11y5E", this);} // tgen
ccc::CC3x11y5 ::CC3x11y5(){ note_ctor("_ZN3ccc8CC3x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y5E, buf);
    ::ccc::CC3x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y5E);
    dp->::ccc::CC3x11y5::~CC3x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y5E(Test__ZN3ccc8CC3x11y5E, "_ZN3ccc8CC3x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y5C1Ev();
extern void _ZN3ccc8CC3x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y5E[] = {
  NSPAIR(_ZN3ccc8CC3x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y5E[];
extern void _ZN3ccc8CC3x11y53pqrEv();
extern void _ZN3ccc8CC3x11y53efgEv();
extern void _ZN3ccc8CC3x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y53efgEv,_ZTv0_n12_N3ccc8CC3x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y53efgEv,_ZThn4_N3ccc8CC3x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y53pqrEv,_ZTv0_n16_N3ccc8CC3x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y53pqrEv,_ZThn4_N3ccc8CC3x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y53abcEv,_ZTv0_n20_N3ccc8CC3x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y53abcEv,_ZThn4_N3ccc8CC3x11y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y53efgEv,_ZTv0_n12_N3ccc8CC3x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y53pqrEv,_ZTv0_n16_N3ccc8CC3x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y53abcEv,_ZTv0_n20_N3ccc8CC3x11y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y5E[] = {
  {&(_ZTVN3ccc8CC3x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y5E[];
static VTBL_ENTRY alt_thunk_names1632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y53abcEv,_ZTv0_n20_N3ccc8CC3x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y53abcEv,_ZThn4_N3ccc8CC3x11y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y53pqrEv,_ZTv0_n16_N3ccc8CC3x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y53pqrEv,_ZThn4_N3ccc8CC3x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y53efgEv,_ZTv0_n12_N3ccc8CC3x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y53efgEv,_ZThn4_N3ccc8CC3x11y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y5E = {  "_ZN3ccc8CC3x11y5E", // class name
  bases__ZN3ccc8CC3x11y5E, 2,
  &(vtc__ZN3ccc8CC3x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1632,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y5  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD3x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x11y53abcEv
  ~DD3x11y5(); // tgen
  DD3x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y53pqrEv");}
void  ccc::DD3x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y53efgEv");}
void  ccc::DD3x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y53abcEv");}
ccc::DD3x11y5 ::~DD3x11y5(){ note_dtor("_ZN3ccc8DD3x11y5E", this);} // tgen
ccc::DD3x11y5 ::DD3x11y5(){ note_ctor("_ZN3ccc8DD3x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y5E, buf);
    ::ccc::DD3x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y5E);
    dp->::ccc::DD3x11y5::~DD3x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y5E(Test__ZN3ccc8DD3x11y5E, "_ZN3ccc8DD3x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y5C1Ev();
extern void _ZN3ccc8DD3x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y5E[] = {
  NSPAIR(_ZN3ccc8DD3x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y5E[];
extern void _ZN3ccc8DD3x11y53efgEv();
extern void _ZN3ccc8DD3x11y53pqrEv();
extern void _ZN3ccc8DD3x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y53pqrEv,_ZTv0_n12_N3ccc8DD3x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y53pqrEv,_ZThn4_N3ccc8DD3x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y53efgEv,_ZTv0_n16_N3ccc8DD3x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y53efgEv,_ZThn4_N3ccc8DD3x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y53pqrEv,_ZTv0_n12_N3ccc8DD3x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y53efgEv,_ZTv0_n16_N3ccc8DD3x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y5E[] = {
  {&(_ZTVN3ccc8DD3x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y5E[];
static VTBL_ENTRY alt_thunk_names1633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y53efgEv,_ZTv0_n16_N3ccc8DD3x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y53efgEv,_ZThn4_N3ccc8DD3x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y53pqrEv,_ZTv0_n12_N3ccc8DD3x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y53pqrEv,_ZThn4_N3ccc8DD3x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y5E = {  "_ZN3ccc8DD3x11y5E", // class name
  bases__ZN3ccc8DD3x11y5E, 2,
  &(vtc__ZN3ccc8DD3x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1633,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y6  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y63efgEv
  ~CC3x11y6(); // tgen
  CC3x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y6E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y63abcEv");}
void  ccc::CC3x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y63efgEv");}
ccc::CC3x11y6 ::~CC3x11y6(){ note_dtor("_ZN3ccc8CC3x11y6E", this);} // tgen
ccc::CC3x11y6 ::CC3x11y6(){ note_ctor("_ZN3ccc8CC3x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y6E, buf);
    ::ccc::CC3x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y6E);
    dp->::ccc::CC3x11y6::~CC3x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y6E(Test__ZN3ccc8CC3x11y6E, "_ZN3ccc8CC3x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y6C1Ev();
extern void _ZN3ccc8CC3x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y6E[] = {
  NSPAIR(_ZN3ccc8CC3x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC3x11y63efgEv();
extern void _ZN3ccc8CC3x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y63efgEv,_ZTv0_n12_N3ccc8CC3x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y63efgEv,_ZThn4_N3ccc8CC3x11y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y63abcEv,_ZTv0_n20_N3ccc8CC3x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y63abcEv,_ZThn4_N3ccc8CC3x11y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y63efgEv,_ZTv0_n12_N3ccc8CC3x11y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y63abcEv,_ZTv0_n20_N3ccc8CC3x11y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y6E[] = {
  {&(_ZTVN3ccc8CC3x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y6E[];
static VTBL_ENTRY alt_thunk_names1634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y63abcEv,_ZTv0_n20_N3ccc8CC3x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y63abcEv,_ZThn4_N3ccc8CC3x11y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y63efgEv,_ZTv0_n12_N3ccc8CC3x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y63efgEv,_ZThn4_N3ccc8CC3x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y6E = {  "_ZN3ccc8CC3x11y6E", // class name
  bases__ZN3ccc8CC3x11y6E, 2,
  &(vtc__ZN3ccc8CC3x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1634,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y6  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD3x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x11y63efgEv
  ~DD3x11y6(); // tgen
  DD3x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y63abcEv");}
void  ccc::DD3x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y63efgEv");}
ccc::DD3x11y6 ::~DD3x11y6(){ note_dtor("_ZN3ccc8DD3x11y6E", this);} // tgen
ccc::DD3x11y6 ::DD3x11y6(){ note_ctor("_ZN3ccc8DD3x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y6E, buf);
    ::ccc::DD3x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y6E);
    dp->::ccc::DD3x11y6::~DD3x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y6E(Test__ZN3ccc8DD3x11y6E, "_ZN3ccc8DD3x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y6C1Ev();
extern void _ZN3ccc8DD3x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y6E[] = {
  NSPAIR(_ZN3ccc8DD3x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y6E[];
extern void _ZN3ccc8DD3x11y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y63efgEv,_ZTv0_n16_N3ccc8DD3x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y63efgEv,_ZThn4_N3ccc8DD3x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y63efgEv,_ZTv0_n16_N3ccc8DD3x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y6E[] = {
  {&(_ZTVN3ccc8DD3x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y6E[];
static VTBL_ENTRY alt_thunk_names1635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y63efgEv,_ZTv0_n16_N3ccc8DD3x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y63efgEv,_ZThn4_N3ccc8DD3x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y6E = {  "_ZN3ccc8DD3x11y6E", // class name
  bases__ZN3ccc8DD3x11y6E, 2,
  &(vtc__ZN3ccc8DD3x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1635,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y7  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y73pqrEv
  ~CC3x11y7(); // tgen
  CC3x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y7E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y73abcEv");}
void  ccc::CC3x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y73pqrEv");}
ccc::CC3x11y7 ::~CC3x11y7(){ note_dtor("_ZN3ccc8CC3x11y7E", this);} // tgen
ccc::CC3x11y7 ::CC3x11y7(){ note_ctor("_ZN3ccc8CC3x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y7E, buf);
    ::ccc::CC3x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y7E);
    dp->::ccc::CC3x11y7::~CC3x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y7E(Test__ZN3ccc8CC3x11y7E, "_ZN3ccc8CC3x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y7C1Ev();
extern void _ZN3ccc8CC3x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y7E[] = {
  NSPAIR(_ZN3ccc8CC3x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y7E[];
extern void _ZN3ccc8CC3x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC3x11y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y73pqrEv,_ZTv0_n16_N3ccc8CC3x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y73pqrEv,_ZThn4_N3ccc8CC3x11y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y73abcEv,_ZTv0_n20_N3ccc8CC3x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y73abcEv,_ZThn4_N3ccc8CC3x11y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y73pqrEv,_ZTv0_n16_N3ccc8CC3x11y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y73abcEv,_ZTv0_n20_N3ccc8CC3x11y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y7E[] = {
  {&(_ZTVN3ccc8CC3x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y7E[];
static VTBL_ENTRY alt_thunk_names1636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y73abcEv,_ZTv0_n20_N3ccc8CC3x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y73abcEv,_ZThn4_N3ccc8CC3x11y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y73pqrEv,_ZTv0_n16_N3ccc8CC3x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y73pqrEv,_ZThn4_N3ccc8CC3x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y7E = {  "_ZN3ccc8CC3x11y7E", // class name
  bases__ZN3ccc8CC3x11y7E, 2,
  &(vtc__ZN3ccc8CC3x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1636,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y7  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD3x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y73pqrEv
  ~DD3x11y7(); // tgen
  DD3x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y73abcEv");}
void  ccc::DD3x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y73pqrEv");}
ccc::DD3x11y7 ::~DD3x11y7(){ note_dtor("_ZN3ccc8DD3x11y7E", this);} // tgen
ccc::DD3x11y7 ::DD3x11y7(){ note_ctor("_ZN3ccc8DD3x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y7E, buf);
    ::ccc::DD3x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y7E);
    dp->::ccc::DD3x11y7::~DD3x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y7E(Test__ZN3ccc8DD3x11y7E, "_ZN3ccc8DD3x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y7C1Ev();
extern void _ZN3ccc8DD3x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y7E[] = {
  NSPAIR(_ZN3ccc8DD3x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x11y73pqrEv();
extern void _ZN3ccc8DD3x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y73pqrEv,_ZTv0_n12_N3ccc8DD3x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y73pqrEv,_ZThn4_N3ccc8DD3x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y73pqrEv,_ZTv0_n12_N3ccc8DD3x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y7E[] = {
  {&(_ZTVN3ccc8DD3x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y7E[];
static VTBL_ENTRY alt_thunk_names1637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y73pqrEv,_ZTv0_n12_N3ccc8DD3x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y73pqrEv,_ZThn4_N3ccc8DD3x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y7E = {  "_ZN3ccc8DD3x11y7E", // class name
  bases__ZN3ccc8DD3x11y7E, 2,
  &(vtc__ZN3ccc8DD3x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1637,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y8  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y83abcEv
  ~CC3x11y8(); // tgen
  CC3x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y8E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y83efgEv");}
void  ccc::CC3x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y83abcEv");}
ccc::CC3x11y8 ::~CC3x11y8(){ note_dtor("_ZN3ccc8CC3x11y8E", this);} // tgen
ccc::CC3x11y8 ::CC3x11y8(){ note_ctor("_ZN3ccc8CC3x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y8E, buf);
    ::ccc::CC3x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y8E);
    dp->::ccc::CC3x11y8::~CC3x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y8E(Test__ZN3ccc8CC3x11y8E, "_ZN3ccc8CC3x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y8C1Ev();
extern void _ZN3ccc8CC3x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y8E[] = {
  NSPAIR(_ZN3ccc8CC3x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC3x11y83efgEv();
extern void _ZN3ccc8CC3x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y83efgEv,_ZTv0_n12_N3ccc8CC3x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y83efgEv,_ZThn4_N3ccc8CC3x11y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x11y83abcEv,_ZTv0_n20_N3ccc8CC3x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y83abcEv,_ZThn4_N3ccc8CC3x11y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y83efgEv,_ZTv0_n12_N3ccc8CC3x11y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x11y83abcEv,_ZTv0_n20_N3ccc8CC3x11y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y8E[] = {
  {&(_ZTVN3ccc8CC3x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y8E[];
static VTBL_ENTRY alt_thunk_names1638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x11y83abcEv,_ZTv0_n20_N3ccc8CC3x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y83abcEv,_ZThn4_N3ccc8CC3x11y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y83efgEv,_ZTv0_n12_N3ccc8CC3x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y83efgEv,_ZThn4_N3ccc8CC3x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y8E = {  "_ZN3ccc8CC3x11y8E", // class name
  bases__ZN3ccc8CC3x11y8E, 2,
  &(vtc__ZN3ccc8CC3x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1638,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y8  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD3x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x11y83abcEv
  ~DD3x11y8(); // tgen
  DD3x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y83efgEv");}
void  ccc::DD3x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x11y83abcEv");}
ccc::DD3x11y8 ::~DD3x11y8(){ note_dtor("_ZN3ccc8DD3x11y8E", this);} // tgen
ccc::DD3x11y8 ::DD3x11y8(){ note_ctor("_ZN3ccc8DD3x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y8E, buf);
    ::ccc::DD3x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y8E);
    dp->::ccc::DD3x11y8::~DD3x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y8E(Test__ZN3ccc8DD3x11y8E, "_ZN3ccc8DD3x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y8C1Ev();
extern void _ZN3ccc8DD3x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y8E[] = {
  NSPAIR(_ZN3ccc8DD3x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y8E[];
extern void _ZN3ccc8DD3x11y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y83efgEv,_ZTv0_n16_N3ccc8DD3x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y83efgEv,_ZThn4_N3ccc8DD3x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y83efgEv,_ZTv0_n16_N3ccc8DD3x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y8E[] = {
  {&(_ZTVN3ccc8DD3x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y8E[];
static VTBL_ENTRY alt_thunk_names1639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y83efgEv,_ZTv0_n16_N3ccc8DD3x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y83efgEv,_ZThn4_N3ccc8DD3x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y8E = {  "_ZN3ccc8DD3x11y8E", // class name
  bases__ZN3ccc8DD3x11y8E, 2,
  &(vtc__ZN3ccc8DD3x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1639,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y9  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y93pqrEv
  ~CC3x11y9(); // tgen
  CC3x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y9E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y93efgEv");}
void  ccc::CC3x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y93pqrEv");}
ccc::CC3x11y9 ::~CC3x11y9(){ note_dtor("_ZN3ccc8CC3x11y9E", this);} // tgen
ccc::CC3x11y9 ::CC3x11y9(){ note_ctor("_ZN3ccc8CC3x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y9E, buf);
    ::ccc::CC3x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC3x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y9E);
    dp->::ccc::CC3x11y9::~CC3x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y9E(Test__ZN3ccc8CC3x11y9E, "_ZN3ccc8CC3x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y9C1Ev();
extern void _ZN3ccc8CC3x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y9E[] = {
  NSPAIR(_ZN3ccc8CC3x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y9E[];
extern void _ZN3ccc8CC3x11y93pqrEv();
extern void _ZN3ccc8CC3x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x11y93efgEv,_ZTv0_n12_N3ccc8CC3x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y93efgEv,_ZThn4_N3ccc8CC3x11y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x11y93pqrEv,_ZTv0_n16_N3ccc8CC3x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y93pqrEv,_ZThn4_N3ccc8CC3x11y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x11y93efgEv,_ZTv0_n12_N3ccc8CC3x11y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x11y93pqrEv,_ZTv0_n16_N3ccc8CC3x11y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x11y9E[] = {
  {&(_ZTVN3ccc8CC3x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x11y9E[];
static VTBL_ENTRY alt_thunk_names1640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x11y93pqrEv,_ZTv0_n16_N3ccc8CC3x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y93pqrEv,_ZThn4_N3ccc8CC3x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x11y93efgEv,_ZTv0_n12_N3ccc8CC3x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x11y93efgEv,_ZThn4_N3ccc8CC3x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x11y9E = {  "_ZN3ccc8CC3x11y9E", // class name
  bases__ZN3ccc8CC3x11y9E, 2,
  &(vtc__ZN3ccc8CC3x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x11y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1640,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y9  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD3x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x11y93pqrEv
  ~DD3x11y9(); // tgen
  DD3x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x11y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x11y93efgEv");}
void  ccc::DD3x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x11y93pqrEv");}
ccc::DD3x11y9 ::~DD3x11y9(){ note_dtor("_ZN3ccc8DD3x11y9E", this);} // tgen
ccc::DD3x11y9 ::DD3x11y9(){ note_ctor("_ZN3ccc8DD3x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x11y9E, buf);
    ::ccc::DD3x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x11y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD3x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x11y9E);
    dp->::ccc::DD3x11y9::~DD3x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x11y9E(Test__ZN3ccc8DD3x11y9E, "_ZN3ccc8DD3x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x11y9C1Ev();
extern void _ZN3ccc8DD3x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x11y9E[] = {
  NSPAIR(_ZN3ccc8DD3x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD3x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y9E[];
extern void _ZN3ccc8DD3x11y93efgEv();
extern void _ZN3ccc8DD3x11y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x11y93pqrEv,_ZTv0_n12_N3ccc8DD3x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y93pqrEv,_ZThn4_N3ccc8DD3x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD3x11y93efgEv,_ZTv0_n16_N3ccc8DD3x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x11y93efgEv,_ZThn4_N3ccc8DD3x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x11y93pqrEv,_ZTv0_n12_N3ccc8DD3x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD3x11y93efgEv,_ZTv0_n16_N3ccc8DD3x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x11y9E[] = {
  {&(_ZTVN3ccc8DD3x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD3x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x11y9E[];
static VTBL_ENTRY alt_thunk_names1641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD3x11y93efgEv,_ZTv0_n16_N3ccc8DD3x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y93efgEv,_ZThn4_N3ccc8DD3x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x11y93pqrEv,_ZTv0_n12_N3ccc8DD3x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x11y93pqrEv,_ZThn4_N3ccc8DD3x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x11y9E = {  "_ZN3ccc8DD3x11y9E", // class name
  bases__ZN3ccc8DD3x11y9E, 2,
  &(vtc__ZN3ccc8DD3x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x11y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1641,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y10  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x11y103abcEv
  ~CC3x11y10(); // tgen
  CC3x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y10E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y103pqrEv");}
void  ccc::CC3x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x11y103abcEv");}
ccc::CC3x11y10 ::~CC3x11y10(){ note_dtor("_ZN3ccc9CC3x11y10E", this);} // tgen
ccc::CC3x11y10 ::CC3x11y10(){ note_ctor("_ZN3ccc9CC3x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y10E, buf);
    ::ccc::CC3x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y10E);
    dp->::ccc::CC3x11y10::~CC3x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y10E(Test__ZN3ccc9CC3x11y10E, "_ZN3ccc9CC3x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y10C1Ev();
extern void _ZN3ccc9CC3x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y10E[] = {
  NSPAIR(_ZN3ccc9CC3x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y10E[];
extern void _ZN3ccc9CC3x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC3x11y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x11y103pqrEv,_ZTv0_n16_N3ccc9CC3x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y103pqrEv,_ZThn4_N3ccc9CC3x11y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x11y103abcEv,_ZTv0_n20_N3ccc9CC3x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y103abcEv,_ZThn4_N3ccc9CC3x11y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x11y103pqrEv,_ZTv0_n16_N3ccc9CC3x11y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x11y103abcEv,_ZTv0_n20_N3ccc9CC3x11y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y10E[] = {
  {&(_ZTVN3ccc9CC3x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y10E[];
static VTBL_ENTRY alt_thunk_names1642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x11y103abcEv,_ZTv0_n20_N3ccc9CC3x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y103abcEv,_ZThn4_N3ccc9CC3x11y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x11y103pqrEv,_ZTv0_n16_N3ccc9CC3x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y103pqrEv,_ZThn4_N3ccc9CC3x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x11y10E = {  "_ZN3ccc9CC3x11y10E", // class name
  bases__ZN3ccc9CC3x11y10E, 2,
  &(vtc__ZN3ccc9CC3x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1642,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y10  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD3x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x11y103abcEv
  ~DD3x11y10(); // tgen
  DD3x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x11y103pqrEv");}
void  ccc::DD3x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x11y103abcEv");}
ccc::DD3x11y10 ::~DD3x11y10(){ note_dtor("_ZN3ccc9DD3x11y10E", this);} // tgen
ccc::DD3x11y10 ::DD3x11y10(){ note_ctor("_ZN3ccc9DD3x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y10E, buf);
    ::ccc::DD3x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y10E);
    dp->::ccc::DD3x11y10::~DD3x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y10E(Test__ZN3ccc9DD3x11y10E, "_ZN3ccc9DD3x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y10C1Ev();
extern void _ZN3ccc9DD3x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y10E[] = {
  NSPAIR(_ZN3ccc9DD3x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x11y103pqrEv();
extern void _ZN3ccc9DD3x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x11y103pqrEv,_ZTv0_n12_N3ccc9DD3x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x11y103pqrEv,_ZThn4_N3ccc9DD3x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x11y103pqrEv,_ZTv0_n12_N3ccc9DD3x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y10E[] = {
  {&(_ZTVN3ccc9DD3x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y10E[];
static VTBL_ENTRY alt_thunk_names1643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x11y103pqrEv,_ZTv0_n12_N3ccc9DD3x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x11y103pqrEv,_ZThn4_N3ccc9DD3x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x11y10E = {  "_ZN3ccc9DD3x11y10E", // class name
  bases__ZN3ccc9DD3x11y10E, 2,
  &(vtc__ZN3ccc9DD3x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1643,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y11  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x11y113efgEv
  ~CC3x11y11(); // tgen
  CC3x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y11E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y113pqrEv");}
void  ccc::CC3x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x11y113efgEv");}
ccc::CC3x11y11 ::~CC3x11y11(){ note_dtor("_ZN3ccc9CC3x11y11E", this);} // tgen
ccc::CC3x11y11 ::CC3x11y11(){ note_ctor("_ZN3ccc9CC3x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y11E, buf);
    ::ccc::CC3x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y11E);
    dp->::ccc::CC3x11y11::~CC3x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y11E(Test__ZN3ccc9CC3x11y11E, "_ZN3ccc9CC3x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y11C1Ev();
extern void _ZN3ccc9CC3x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y11E[] = {
  NSPAIR(_ZN3ccc9CC3x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y11E[];
extern void _ZN3ccc9CC3x11y113pqrEv();
extern void _ZN3ccc9CC3x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x11y113efgEv,_ZTv0_n12_N3ccc9CC3x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y113efgEv,_ZThn4_N3ccc9CC3x11y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x11y113pqrEv,_ZTv0_n16_N3ccc9CC3x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y113pqrEv,_ZThn4_N3ccc9CC3x11y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x11y113efgEv,_ZTv0_n12_N3ccc9CC3x11y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x11y113pqrEv,_ZTv0_n16_N3ccc9CC3x11y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y11E[] = {
  {&(_ZTVN3ccc9CC3x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y11E[];
static VTBL_ENTRY alt_thunk_names1644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x11y113pqrEv,_ZTv0_n16_N3ccc9CC3x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y113pqrEv,_ZThn4_N3ccc9CC3x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x11y113efgEv,_ZTv0_n12_N3ccc9CC3x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y113efgEv,_ZThn4_N3ccc9CC3x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x11y11E = {  "_ZN3ccc9CC3x11y11E", // class name
  bases__ZN3ccc9CC3x11y11E, 2,
  &(vtc__ZN3ccc9CC3x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1644,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y11  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD3x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x11y113efgEv
  ~DD3x11y11(); // tgen
  DD3x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x11y113pqrEv");}
void  ccc::DD3x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x11y113efgEv");}
ccc::DD3x11y11 ::~DD3x11y11(){ note_dtor("_ZN3ccc9DD3x11y11E", this);} // tgen
ccc::DD3x11y11 ::DD3x11y11(){ note_ctor("_ZN3ccc9DD3x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y11E, buf);
    ::ccc::DD3x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y11E);
    dp->::ccc::DD3x11y11::~DD3x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y11E(Test__ZN3ccc9DD3x11y11E, "_ZN3ccc9DD3x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y11C1Ev();
extern void _ZN3ccc9DD3x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y11E[] = {
  NSPAIR(_ZN3ccc9DD3x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y11E[];
extern void _ZN3ccc9DD3x11y113efgEv();
extern void _ZN3ccc9DD3x11y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x11y113pqrEv,_ZTv0_n12_N3ccc9DD3x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x11y113pqrEv,_ZThn4_N3ccc9DD3x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD3x11y113efgEv,_ZTv0_n16_N3ccc9DD3x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x11y113efgEv,_ZThn4_N3ccc9DD3x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x11y113pqrEv,_ZTv0_n12_N3ccc9DD3x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD3x11y113efgEv,_ZTv0_n16_N3ccc9DD3x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y11E[] = {
  {&(_ZTVN3ccc9DD3x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y11E[];
static VTBL_ENTRY alt_thunk_names1645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD3x11y113efgEv,_ZTv0_n16_N3ccc9DD3x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x11y113efgEv,_ZThn4_N3ccc9DD3x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x11y113pqrEv,_ZTv0_n12_N3ccc9DD3x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x11y113pqrEv,_ZThn4_N3ccc9DD3x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x11y11E = {  "_ZN3ccc9DD3x11y11E", // class name
  bases__ZN3ccc9DD3x11y11E, 2,
  &(vtc__ZN3ccc9DD3x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1645,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y12  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC3x11y123abcEv
  ~CC3x11y12(); // tgen
  CC3x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x11y123abcEv");}
ccc::CC3x11y12 ::~CC3x11y12(){ note_dtor("_ZN3ccc9CC3x11y12E", this);} // tgen
ccc::CC3x11y12 ::CC3x11y12(){ note_ctor("_ZN3ccc9CC3x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y12E, buf);
    ::ccc::CC3x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y12E);
    dp->::ccc::CC3x11y12::~CC3x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y12E(Test__ZN3ccc9CC3x11y12E, "_ZN3ccc9CC3x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y12C1Ev();
extern void _ZN3ccc9CC3x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y12E[] = {
  NSPAIR(_ZN3ccc9CC3x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC3x11y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x11y123abcEv,_ZTv0_n20_N3ccc9CC3x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y123abcEv,_ZThn4_N3ccc9CC3x11y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x11y123abcEv,_ZTv0_n20_N3ccc9CC3x11y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y12E[] = {
  {&(_ZTVN3ccc9CC3x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y12E[];
static VTBL_ENTRY alt_thunk_names1646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x11y123abcEv,_ZTv0_n20_N3ccc9CC3x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y123abcEv,_ZThn4_N3ccc9CC3x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x11y12E = {  "_ZN3ccc9CC3x11y12E", // class name
  bases__ZN3ccc9CC3x11y12E, 2,
  &(vtc__ZN3ccc9CC3x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1646,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y12  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD3x11y123abcEv
  ~DD3x11y12(); // tgen
  DD3x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD3x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x11y123abcEv");}
ccc::DD3x11y12 ::~DD3x11y12(){ note_dtor("_ZN3ccc9DD3x11y12E", this);} // tgen
ccc::DD3x11y12 ::DD3x11y12(){ note_ctor("_ZN3ccc9DD3x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y12E, buf);
    ::ccc::DD3x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y12E);
    dp->::ccc::DD3x11y12::~DD3x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y12E(Test__ZN3ccc9DD3x11y12E, "_ZN3ccc9DD3x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y12C1Ev();
extern void _ZN3ccc9DD3x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y12E[] = {
  NSPAIR(_ZN3ccc9DD3x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y12E[] = {
  {&(_ZTVN3ccc9DD3x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y12E[];
Class_Descriptor cd__ZN3ccc9DD3x11y12E = {  "_ZN3ccc9DD3x11y12E", // class name
  bases__ZN3ccc9DD3x11y12E, 2,
  &(vtc__ZN3ccc9DD3x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y13  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC3x11y133efgEv
  ~CC3x11y13(); // tgen
  CC3x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x11y133efgEv");}
ccc::CC3x11y13 ::~CC3x11y13(){ note_dtor("_ZN3ccc9CC3x11y13E", this);} // tgen
ccc::CC3x11y13 ::CC3x11y13(){ note_ctor("_ZN3ccc9CC3x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y13E, buf);
    ::ccc::CC3x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y13E);
    dp->::ccc::CC3x11y13::~CC3x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y13E(Test__ZN3ccc9CC3x11y13E, "_ZN3ccc9CC3x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y13C1Ev();
extern void _ZN3ccc9CC3x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y13E[] = {
  NSPAIR(_ZN3ccc9CC3x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC3x11y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x11y133efgEv,_ZTv0_n12_N3ccc9CC3x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y133efgEv,_ZThn4_N3ccc9CC3x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x11y133efgEv,_ZTv0_n12_N3ccc9CC3x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y13E[] = {
  {&(_ZTVN3ccc9CC3x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y13E[];
static VTBL_ENTRY alt_thunk_names1647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x11y133efgEv,_ZTv0_n12_N3ccc9CC3x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y133efgEv,_ZThn4_N3ccc9CC3x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x11y13E = {  "_ZN3ccc9CC3x11y13E", // class name
  bases__ZN3ccc9CC3x11y13E, 2,
  &(vtc__ZN3ccc9CC3x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1647,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y13  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD3x11y133efgEv
  ~DD3x11y13(); // tgen
  DD3x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD3x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x11y133efgEv");}
ccc::DD3x11y13 ::~DD3x11y13(){ note_dtor("_ZN3ccc9DD3x11y13E", this);} // tgen
ccc::DD3x11y13 ::DD3x11y13(){ note_ctor("_ZN3ccc9DD3x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y13E, buf);
    ::ccc::DD3x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y13E);
    dp->::ccc::DD3x11y13::~DD3x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y13E(Test__ZN3ccc9DD3x11y13E, "_ZN3ccc9DD3x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y13C1Ev();
extern void _ZN3ccc9DD3x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y13E[] = {
  NSPAIR(_ZN3ccc9DD3x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y13E[];
extern void _ZN3ccc9DD3x11y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD3x11y133efgEv,_ZTv0_n16_N3ccc9DD3x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x11y133efgEv,_ZThn4_N3ccc9DD3x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD3x11y133efgEv,_ZTv0_n16_N3ccc9DD3x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y13E[] = {
  {&(_ZTVN3ccc9DD3x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y13E[];
static VTBL_ENTRY alt_thunk_names1648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD3x11y133efgEv,_ZTv0_n16_N3ccc9DD3x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x11y133efgEv,_ZThn4_N3ccc9DD3x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x11y13E = {  "_ZN3ccc9DD3x11y13E", // class name
  bases__ZN3ccc9DD3x11y13E, 2,
  &(vtc__ZN3ccc9DD3x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1648,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y14  : virtual ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y143pqrEv
  ~CC3x11y14(); // tgen
  CC3x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y143pqrEv");}
ccc::CC3x11y14 ::~CC3x11y14(){ note_dtor("_ZN3ccc9CC3x11y14E", this);} // tgen
ccc::CC3x11y14 ::CC3x11y14(){ note_ctor("_ZN3ccc9CC3x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y14E, buf);
    ::ccc::CC3x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y14E);
    dp->::ccc::CC3x11y14::~CC3x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y14E(Test__ZN3ccc9CC3x11y14E, "_ZN3ccc9CC3x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y14C1Ev();
extern void _ZN3ccc9CC3x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y14E[] = {
  NSPAIR(_ZN3ccc9CC3x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y14E[];
extern void _ZN3ccc9CC3x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x11y143pqrEv,_ZTv0_n16_N3ccc9CC3x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y143pqrEv,_ZThn4_N3ccc9CC3x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x11y143pqrEv,_ZTv0_n16_N3ccc9CC3x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y14E[] = {
  {&(_ZTVN3ccc9CC3x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y14E[];
static VTBL_ENTRY alt_thunk_names1649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x11y143pqrEv,_ZTv0_n16_N3ccc9CC3x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x11y143pqrEv,_ZThn4_N3ccc9CC3x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x11y14E = {  "_ZN3ccc9CC3x11y14E", // class name
  bases__ZN3ccc9CC3x11y14E, 2,
  &(vtc__ZN3ccc9CC3x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1649,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y14  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD3x11y143pqrEv
  ~DD3x11y14(); // tgen
  DD3x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD3x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x11y143pqrEv");}
ccc::DD3x11y14 ::~DD3x11y14(){ note_dtor("_ZN3ccc9DD3x11y14E", this);} // tgen
ccc::DD3x11y14 ::DD3x11y14(){ note_ctor("_ZN3ccc9DD3x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y14E, buf);
    ::ccc::DD3x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y14E);
    dp->::ccc::DD3x11y14::~DD3x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y14E(Test__ZN3ccc9DD3x11y14E, "_ZN3ccc9DD3x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y14C1Ev();
extern void _ZN3ccc9DD3x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y14E[] = {
  NSPAIR(_ZN3ccc9DD3x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x11y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x11y143pqrEv,_ZTv0_n12_N3ccc9DD3x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x11y143pqrEv,_ZThn4_N3ccc9DD3x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x11y143pqrEv,_ZTv0_n12_N3ccc9DD3x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y14E[] = {
  {&(_ZTVN3ccc9DD3x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y14E[];
static VTBL_ENTRY alt_thunk_names1650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x11y143pqrEv,_ZTv0_n12_N3ccc9DD3x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x11y143pqrEv,_ZThn4_N3ccc9DD3x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x11y14E = {  "_ZN3ccc9DD3x11y14E", // class name
  bases__ZN3ccc9DD3x11y14E, 2,
  &(vtc__ZN3ccc9DD3x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1650,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y15  : virtual ::ccc::AA3 , ::ccc::BB11 {
  ~CC3x11y15(); // tgen
  CC3x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x11y15 ::~CC3x11y15(){ note_dtor("_ZN3ccc9CC3x11y15E", this);} // tgen
ccc::CC3x11y15 ::CC3x11y15(){ note_ctor("_ZN3ccc9CC3x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y15E, buf);
    ::ccc::CC3x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC3x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y15E);
    dp->::ccc::CC3x11y15::~CC3x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y15E(Test__ZN3ccc9CC3x11y15E, "_ZN3ccc9CC3x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y15C1Ev();
extern void _ZN3ccc9CC3x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y15E[] = {
  NSPAIR(_ZN3ccc9CC3x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x11y15E[] = {
  {&(_ZTVN3ccc9CC3x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x11y15E[];
Class_Descriptor cd__ZN3ccc9CC3x11y15E = {  "_ZN3ccc9CC3x11y15E", // class name
  bases__ZN3ccc9CC3x11y15E, 2,
  &(vtc__ZN3ccc9CC3x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x11y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x11y15  : virtual ::ccc::AA3 , virtual ::ccc::BB11 {
  ~DD3x11y15(); // tgen
  DD3x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD3x11y15 ::~DD3x11y15(){ note_dtor("_ZN3ccc9DD3x11y15E", this);} // tgen
ccc::DD3x11y15 ::DD3x11y15(){ note_ctor("_ZN3ccc9DD3x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x11y15E, buf);
    ::ccc::DD3x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x11y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD3x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x11y15E);
    dp->::ccc::DD3x11y15::~DD3x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x11y15E(Test__ZN3ccc9DD3x11y15E, "_ZN3ccc9DD3x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x11y15C1Ev();
extern void _ZN3ccc9DD3x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x11y15E[] = {
  NSPAIR(_ZN3ccc9DD3x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD3x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x11y15E[] = {
  {&(_ZTVN3ccc9DD3x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD3x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x11y15E[];
Class_Descriptor cd__ZN3ccc9DD3x11y15E = {  "_ZN3ccc9DD3x11y15E", // class name
  bases__ZN3ccc9DD3x11y15E, 2,
  &(vtc__ZN3ccc9DD3x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x11y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y0  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y03pqrEv
  ~CC3x12y0(); // tgen
  CC3x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y0E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y03abcEv");}
void  ccc::CC3x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y03efgEv");}
void  ccc::CC3x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y03pqrEv");}
ccc::CC3x12y0 ::~CC3x12y0(){ note_dtor("_ZN3ccc8CC3x12y0E", this);} // tgen
ccc::CC3x12y0 ::CC3x12y0(){ note_ctor("_ZN3ccc8CC3x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y0E, buf);
    ::ccc::CC3x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y0E);
    dp->::ccc::CC3x12y0::~CC3x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y0E(Test__ZN3ccc8CC3x12y0E, "_ZN3ccc8CC3x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y0C1Ev();
extern void _ZN3ccc8CC3x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y0E[] = {
  NSPAIR(_ZN3ccc8CC3x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y0E[];
extern void _ZN3ccc8CC3x12y03abcEv();
extern void _ZN3ccc8CC3x12y03efgEv();
extern void _ZN3ccc8CC3x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y03efgEv,_ZTv0_n12_N3ccc8CC3x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y03efgEv,_ZThn4_N3ccc8CC3x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y03pqrEv,_ZTv0_n16_N3ccc8CC3x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y03pqrEv,_ZThn4_N3ccc8CC3x12y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y03abcEv,_ZTv0_n20_N3ccc8CC3x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y03abcEv,_ZThn4_N3ccc8CC3x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y03efgEv,_ZTv0_n12_N3ccc8CC3x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y03pqrEv,_ZTv0_n16_N3ccc8CC3x12y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y03abcEv,_ZTv0_n20_N3ccc8CC3x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y0E[] = {
  {&(_ZTVN3ccc8CC3x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y0E[];
static VTBL_ENTRY alt_thunk_names1651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y03abcEv,_ZTv0_n20_N3ccc8CC3x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y03abcEv,_ZThn4_N3ccc8CC3x12y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y03pqrEv,_ZTv0_n16_N3ccc8CC3x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y03pqrEv,_ZThn4_N3ccc8CC3x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y03efgEv,_ZTv0_n12_N3ccc8CC3x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y03efgEv,_ZThn4_N3ccc8CC3x12y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y0E = {  "_ZN3ccc8CC3x12y0E", // class name
  bases__ZN3ccc8CC3x12y0E, 2,
  &(vtc__ZN3ccc8CC3x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1651,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y0  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD3x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y03pqrEv
  ~DD3x12y0(); // tgen
  DD3x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y03abcEv");}
void  ccc::DD3x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y03efgEv");}
void  ccc::DD3x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y03pqrEv");}
ccc::DD3x12y0 ::~DD3x12y0(){ note_dtor("_ZN3ccc8DD3x12y0E", this);} // tgen
ccc::DD3x12y0 ::DD3x12y0(){ note_ctor("_ZN3ccc8DD3x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y0E, buf);
    ::ccc::DD3x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y0E);
    dp->::ccc::DD3x12y0::~DD3x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y0E(Test__ZN3ccc8DD3x12y0E, "_ZN3ccc8DD3x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y0C1Ev();
extern void _ZN3ccc8DD3x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y0E[] = {
  NSPAIR(_ZN3ccc8DD3x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y0E[];
extern void _ZN3ccc8DD3x12y03efgEv();
extern void _ZN3ccc8DD3x12y03pqrEv();
extern void _ZN3ccc8DD3x12y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y03abcEv,_ZTv0_n12_N3ccc8DD3x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y03abcEv,_ZThn4_N3ccc8DD3x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y03abcEv,_ZTv0_n12_N3ccc8DD3x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y0E[] = {
  {&(_ZTVN3ccc8DD3x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y0E[];
static VTBL_ENTRY alt_thunk_names1652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y03abcEv,_ZTv0_n12_N3ccc8DD3x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y03abcEv,_ZThn4_N3ccc8DD3x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y0E = {  "_ZN3ccc8DD3x12y0E", // class name
  bases__ZN3ccc8DD3x12y0E, 2,
  &(vtc__ZN3ccc8DD3x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1652,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y1  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x12y13efgEv
  ~CC3x12y1(); // tgen
  CC3x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y1E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y13abcEv");}
void  ccc::CC3x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y13pqrEv");}
void  ccc::CC3x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y13efgEv");}
ccc::CC3x12y1 ::~CC3x12y1(){ note_dtor("_ZN3ccc8CC3x12y1E", this);} // tgen
ccc::CC3x12y1 ::CC3x12y1(){ note_ctor("_ZN3ccc8CC3x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y1E, buf);
    ::ccc::CC3x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y1E);
    dp->::ccc::CC3x12y1::~CC3x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y1E(Test__ZN3ccc8CC3x12y1E, "_ZN3ccc8CC3x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y1C1Ev();
extern void _ZN3ccc8CC3x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y1E[] = {
  NSPAIR(_ZN3ccc8CC3x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y1E[];
extern void _ZN3ccc8CC3x12y13abcEv();
extern void _ZN3ccc8CC3x12y13pqrEv();
extern void _ZN3ccc8CC3x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y13efgEv,_ZTv0_n12_N3ccc8CC3x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y13efgEv,_ZThn4_N3ccc8CC3x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y13pqrEv,_ZTv0_n16_N3ccc8CC3x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y13pqrEv,_ZThn4_N3ccc8CC3x12y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y13abcEv,_ZTv0_n20_N3ccc8CC3x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y13abcEv,_ZThn4_N3ccc8CC3x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y13efgEv,_ZTv0_n12_N3ccc8CC3x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y13pqrEv,_ZTv0_n16_N3ccc8CC3x12y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y13abcEv,_ZTv0_n20_N3ccc8CC3x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y1E[] = {
  {&(_ZTVN3ccc8CC3x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y1E[];
static VTBL_ENTRY alt_thunk_names1653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y13abcEv,_ZTv0_n20_N3ccc8CC3x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y13abcEv,_ZThn4_N3ccc8CC3x12y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y13pqrEv,_ZTv0_n16_N3ccc8CC3x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y13pqrEv,_ZThn4_N3ccc8CC3x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y13efgEv,_ZTv0_n12_N3ccc8CC3x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y13efgEv,_ZThn4_N3ccc8CC3x12y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y1E = {  "_ZN3ccc8CC3x12y1E", // class name
  bases__ZN3ccc8CC3x12y1E, 2,
  &(vtc__ZN3ccc8CC3x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1653,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y1  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD3x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x12y13efgEv
  ~DD3x12y1(); // tgen
  DD3x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y13abcEv");}
void  ccc::DD3x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y13pqrEv");}
void  ccc::DD3x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y13efgEv");}
ccc::DD3x12y1 ::~DD3x12y1(){ note_dtor("_ZN3ccc8DD3x12y1E", this);} // tgen
ccc::DD3x12y1 ::DD3x12y1(){ note_ctor("_ZN3ccc8DD3x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y1E, buf);
    ::ccc::DD3x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y1E);
    dp->::ccc::DD3x12y1::~DD3x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y1E(Test__ZN3ccc8DD3x12y1E, "_ZN3ccc8DD3x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y1C1Ev();
extern void _ZN3ccc8DD3x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y1E[] = {
  NSPAIR(_ZN3ccc8DD3x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y1E[];
extern void _ZN3ccc8DD3x12y13efgEv();
extern void _ZN3ccc8DD3x12y13pqrEv();
extern void _ZN3ccc8DD3x12y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y13abcEv,_ZTv0_n12_N3ccc8DD3x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y13abcEv,_ZThn4_N3ccc8DD3x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y13abcEv,_ZTv0_n12_N3ccc8DD3x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y1E[] = {
  {&(_ZTVN3ccc8DD3x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y1E[];
static VTBL_ENTRY alt_thunk_names1654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y13abcEv,_ZTv0_n12_N3ccc8DD3x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y13abcEv,_ZThn4_N3ccc8DD3x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y1E = {  "_ZN3ccc8DD3x12y1E", // class name
  bases__ZN3ccc8DD3x12y1E, 2,
  &(vtc__ZN3ccc8DD3x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1654,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y2  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y23pqrEv
  ~CC3x12y2(); // tgen
  CC3x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y2E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y23efgEv");}
void  ccc::CC3x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y23abcEv");}
void  ccc::CC3x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y23pqrEv");}
ccc::CC3x12y2 ::~CC3x12y2(){ note_dtor("_ZN3ccc8CC3x12y2E", this);} // tgen
ccc::CC3x12y2 ::CC3x12y2(){ note_ctor("_ZN3ccc8CC3x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y2E, buf);
    ::ccc::CC3x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y2E);
    dp->::ccc::CC3x12y2::~CC3x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y2E(Test__ZN3ccc8CC3x12y2E, "_ZN3ccc8CC3x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y2C1Ev();
extern void _ZN3ccc8CC3x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y2E[] = {
  NSPAIR(_ZN3ccc8CC3x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y2E[];
extern void _ZN3ccc8CC3x12y23abcEv();
extern void _ZN3ccc8CC3x12y23efgEv();
extern void _ZN3ccc8CC3x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y23efgEv,_ZTv0_n12_N3ccc8CC3x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y23efgEv,_ZThn4_N3ccc8CC3x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y23pqrEv,_ZTv0_n16_N3ccc8CC3x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y23pqrEv,_ZThn4_N3ccc8CC3x12y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y23abcEv,_ZTv0_n20_N3ccc8CC3x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y23abcEv,_ZThn4_N3ccc8CC3x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y23efgEv,_ZTv0_n12_N3ccc8CC3x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y23pqrEv,_ZTv0_n16_N3ccc8CC3x12y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y23abcEv,_ZTv0_n20_N3ccc8CC3x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y2E[] = {
  {&(_ZTVN3ccc8CC3x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y2E[];
static VTBL_ENTRY alt_thunk_names1655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y23abcEv,_ZTv0_n20_N3ccc8CC3x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y23abcEv,_ZThn4_N3ccc8CC3x12y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y23pqrEv,_ZTv0_n16_N3ccc8CC3x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y23pqrEv,_ZThn4_N3ccc8CC3x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y23efgEv,_ZTv0_n12_N3ccc8CC3x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y23efgEv,_ZThn4_N3ccc8CC3x12y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y2E = {  "_ZN3ccc8CC3x12y2E", // class name
  bases__ZN3ccc8CC3x12y2E, 2,
  &(vtc__ZN3ccc8CC3x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1655,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y2  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD3x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y23pqrEv
  ~DD3x12y2(); // tgen
  DD3x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y23efgEv");}
void  ccc::DD3x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y23abcEv");}
void  ccc::DD3x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y23pqrEv");}
ccc::DD3x12y2 ::~DD3x12y2(){ note_dtor("_ZN3ccc8DD3x12y2E", this);} // tgen
ccc::DD3x12y2 ::DD3x12y2(){ note_ctor("_ZN3ccc8DD3x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y2E, buf);
    ::ccc::DD3x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y2E);
    dp->::ccc::DD3x12y2::~DD3x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y2E(Test__ZN3ccc8DD3x12y2E, "_ZN3ccc8DD3x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y2C1Ev();
extern void _ZN3ccc8DD3x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y2E[] = {
  NSPAIR(_ZN3ccc8DD3x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y2E[];
extern void _ZN3ccc8DD3x12y23efgEv();
extern void _ZN3ccc8DD3x12y23pqrEv();
extern void _ZN3ccc8DD3x12y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y23abcEv,_ZTv0_n12_N3ccc8DD3x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y23abcEv,_ZThn4_N3ccc8DD3x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y23abcEv,_ZTv0_n12_N3ccc8DD3x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y2E[] = {
  {&(_ZTVN3ccc8DD3x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y2E[];
static VTBL_ENTRY alt_thunk_names1656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y23abcEv,_ZTv0_n12_N3ccc8DD3x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y23abcEv,_ZThn4_N3ccc8DD3x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y2E = {  "_ZN3ccc8DD3x12y2E", // class name
  bases__ZN3ccc8DD3x12y2E, 2,
  &(vtc__ZN3ccc8DD3x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1656,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y3  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x12y33abcEv
  ~CC3x12y3(); // tgen
  CC3x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y3E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y33efgEv");}
void  ccc::CC3x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y33pqrEv");}
void  ccc::CC3x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y33abcEv");}
ccc::CC3x12y3 ::~CC3x12y3(){ note_dtor("_ZN3ccc8CC3x12y3E", this);} // tgen
ccc::CC3x12y3 ::CC3x12y3(){ note_ctor("_ZN3ccc8CC3x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y3E, buf);
    ::ccc::CC3x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y3E);
    dp->::ccc::CC3x12y3::~CC3x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y3E(Test__ZN3ccc8CC3x12y3E, "_ZN3ccc8CC3x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y3C1Ev();
extern void _ZN3ccc8CC3x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y3E[] = {
  NSPAIR(_ZN3ccc8CC3x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y3E[];
extern void _ZN3ccc8CC3x12y33abcEv();
extern void _ZN3ccc8CC3x12y33efgEv();
extern void _ZN3ccc8CC3x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y33efgEv,_ZTv0_n12_N3ccc8CC3x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y33efgEv,_ZThn4_N3ccc8CC3x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y33pqrEv,_ZTv0_n16_N3ccc8CC3x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y33pqrEv,_ZThn4_N3ccc8CC3x12y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y33abcEv,_ZTv0_n20_N3ccc8CC3x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y33abcEv,_ZThn4_N3ccc8CC3x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y33efgEv,_ZTv0_n12_N3ccc8CC3x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y33pqrEv,_ZTv0_n16_N3ccc8CC3x12y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y33abcEv,_ZTv0_n20_N3ccc8CC3x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y3E[] = {
  {&(_ZTVN3ccc8CC3x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y3E[];
static VTBL_ENTRY alt_thunk_names1657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y33abcEv,_ZTv0_n20_N3ccc8CC3x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y33abcEv,_ZThn4_N3ccc8CC3x12y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y33pqrEv,_ZTv0_n16_N3ccc8CC3x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y33pqrEv,_ZThn4_N3ccc8CC3x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y33efgEv,_ZTv0_n12_N3ccc8CC3x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y33efgEv,_ZThn4_N3ccc8CC3x12y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y3E = {  "_ZN3ccc8CC3x12y3E", // class name
  bases__ZN3ccc8CC3x12y3E, 2,
  &(vtc__ZN3ccc8CC3x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1657,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y3  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD3x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x12y33abcEv
  ~DD3x12y3(); // tgen
  DD3x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y33efgEv");}
void  ccc::DD3x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y33pqrEv");}
void  ccc::DD3x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y33abcEv");}
ccc::DD3x12y3 ::~DD3x12y3(){ note_dtor("_ZN3ccc8DD3x12y3E", this);} // tgen
ccc::DD3x12y3 ::DD3x12y3(){ note_ctor("_ZN3ccc8DD3x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y3E, buf);
    ::ccc::DD3x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y3E);
    dp->::ccc::DD3x12y3::~DD3x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y3E(Test__ZN3ccc8DD3x12y3E, "_ZN3ccc8DD3x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y3C1Ev();
extern void _ZN3ccc8DD3x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y3E[] = {
  NSPAIR(_ZN3ccc8DD3x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y3E[];
extern void _ZN3ccc8DD3x12y33efgEv();
extern void _ZN3ccc8DD3x12y33pqrEv();
extern void _ZN3ccc8DD3x12y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y33abcEv,_ZTv0_n12_N3ccc8DD3x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y33abcEv,_ZThn4_N3ccc8DD3x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y33abcEv,_ZTv0_n12_N3ccc8DD3x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y3E[] = {
  {&(_ZTVN3ccc8DD3x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y3E[];
static VTBL_ENTRY alt_thunk_names1658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y33abcEv,_ZTv0_n12_N3ccc8DD3x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y33abcEv,_ZThn4_N3ccc8DD3x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y3E = {  "_ZN3ccc8DD3x12y3E", // class name
  bases__ZN3ccc8DD3x12y3E, 2,
  &(vtc__ZN3ccc8DD3x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1658,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y4  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC3x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y43efgEv
  ~CC3x12y4(); // tgen
  CC3x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y4E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y43pqrEv");}
void  ccc::CC3x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y43abcEv");}
void  ccc::CC3x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y43efgEv");}
ccc::CC3x12y4 ::~CC3x12y4(){ note_dtor("_ZN3ccc8CC3x12y4E", this);} // tgen
ccc::CC3x12y4 ::CC3x12y4(){ note_ctor("_ZN3ccc8CC3x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y4E, buf);
    ::ccc::CC3x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y4E);
    dp->::ccc::CC3x12y4::~CC3x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y4E(Test__ZN3ccc8CC3x12y4E, "_ZN3ccc8CC3x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y4C1Ev();
extern void _ZN3ccc8CC3x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y4E[] = {
  NSPAIR(_ZN3ccc8CC3x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y4E[];
extern void _ZN3ccc8CC3x12y43abcEv();
extern void _ZN3ccc8CC3x12y43pqrEv();
extern void _ZN3ccc8CC3x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y43efgEv,_ZTv0_n12_N3ccc8CC3x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y43efgEv,_ZThn4_N3ccc8CC3x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y43pqrEv,_ZTv0_n16_N3ccc8CC3x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y43pqrEv,_ZThn4_N3ccc8CC3x12y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y43abcEv,_ZTv0_n20_N3ccc8CC3x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y43abcEv,_ZThn4_N3ccc8CC3x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y43efgEv,_ZTv0_n12_N3ccc8CC3x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y43pqrEv,_ZTv0_n16_N3ccc8CC3x12y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y43abcEv,_ZTv0_n20_N3ccc8CC3x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y4E[] = {
  {&(_ZTVN3ccc8CC3x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y4E[];
static VTBL_ENTRY alt_thunk_names1659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y43abcEv,_ZTv0_n20_N3ccc8CC3x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y43abcEv,_ZThn4_N3ccc8CC3x12y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y43pqrEv,_ZTv0_n16_N3ccc8CC3x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y43pqrEv,_ZThn4_N3ccc8CC3x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y43efgEv,_ZTv0_n12_N3ccc8CC3x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y43efgEv,_ZThn4_N3ccc8CC3x12y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y4E = {  "_ZN3ccc8CC3x12y4E", // class name
  bases__ZN3ccc8CC3x12y4E, 2,
  &(vtc__ZN3ccc8CC3x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1659,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y4  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD3x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x12y43efgEv
  ~DD3x12y4(); // tgen
  DD3x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y43pqrEv");}
void  ccc::DD3x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y43abcEv");}
void  ccc::DD3x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y43efgEv");}
ccc::DD3x12y4 ::~DD3x12y4(){ note_dtor("_ZN3ccc8DD3x12y4E", this);} // tgen
ccc::DD3x12y4 ::DD3x12y4(){ note_ctor("_ZN3ccc8DD3x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y4E, buf);
    ::ccc::DD3x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y4E);
    dp->::ccc::DD3x12y4::~DD3x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y4E(Test__ZN3ccc8DD3x12y4E, "_ZN3ccc8DD3x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y4C1Ev();
extern void _ZN3ccc8DD3x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y4E[] = {
  NSPAIR(_ZN3ccc8DD3x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y4E[];
extern void _ZN3ccc8DD3x12y43efgEv();
extern void _ZN3ccc8DD3x12y43pqrEv();
extern void _ZN3ccc8DD3x12y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y43abcEv,_ZTv0_n12_N3ccc8DD3x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y43abcEv,_ZThn4_N3ccc8DD3x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y43abcEv,_ZTv0_n12_N3ccc8DD3x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y4E[] = {
  {&(_ZTVN3ccc8DD3x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y4E[];
static VTBL_ENTRY alt_thunk_names1660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y43abcEv,_ZTv0_n12_N3ccc8DD3x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y43abcEv,_ZThn4_N3ccc8DD3x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y4E = {  "_ZN3ccc8DD3x12y4E", // class name
  bases__ZN3ccc8DD3x12y4E, 2,
  &(vtc__ZN3ccc8DD3x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1660,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y5  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC3x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y53abcEv
  ~CC3x12y5(); // tgen
  CC3x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y5E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y53pqrEv");}
void  ccc::CC3x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y53efgEv");}
void  ccc::CC3x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y53abcEv");}
ccc::CC3x12y5 ::~CC3x12y5(){ note_dtor("_ZN3ccc8CC3x12y5E", this);} // tgen
ccc::CC3x12y5 ::CC3x12y5(){ note_ctor("_ZN3ccc8CC3x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y5E, buf);
    ::ccc::CC3x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y5E);
    dp->::ccc::CC3x12y5::~CC3x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y5E(Test__ZN3ccc8CC3x12y5E, "_ZN3ccc8CC3x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y5C1Ev();
extern void _ZN3ccc8CC3x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y5E[] = {
  NSPAIR(_ZN3ccc8CC3x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y5E[];
extern void _ZN3ccc8CC3x12y53abcEv();
extern void _ZN3ccc8CC3x12y53pqrEv();
extern void _ZN3ccc8CC3x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y53efgEv,_ZTv0_n12_N3ccc8CC3x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y53efgEv,_ZThn4_N3ccc8CC3x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y53pqrEv,_ZTv0_n16_N3ccc8CC3x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y53pqrEv,_ZThn4_N3ccc8CC3x12y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y53abcEv,_ZTv0_n20_N3ccc8CC3x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y53abcEv,_ZThn4_N3ccc8CC3x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y53efgEv,_ZTv0_n12_N3ccc8CC3x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y53pqrEv,_ZTv0_n16_N3ccc8CC3x12y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y53abcEv,_ZTv0_n20_N3ccc8CC3x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y5E[] = {
  {&(_ZTVN3ccc8CC3x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y5E[];
static VTBL_ENTRY alt_thunk_names1661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y53abcEv,_ZTv0_n20_N3ccc8CC3x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y53abcEv,_ZThn4_N3ccc8CC3x12y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y53pqrEv,_ZTv0_n16_N3ccc8CC3x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y53pqrEv,_ZThn4_N3ccc8CC3x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y53efgEv,_ZTv0_n12_N3ccc8CC3x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y53efgEv,_ZThn4_N3ccc8CC3x12y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y5E = {  "_ZN3ccc8CC3x12y5E", // class name
  bases__ZN3ccc8CC3x12y5E, 2,
  &(vtc__ZN3ccc8CC3x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1661,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y5  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD3x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x12y53abcEv
  ~DD3x12y5(); // tgen
  DD3x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y53pqrEv");}
void  ccc::DD3x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y53efgEv");}
void  ccc::DD3x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y53abcEv");}
ccc::DD3x12y5 ::~DD3x12y5(){ note_dtor("_ZN3ccc8DD3x12y5E", this);} // tgen
ccc::DD3x12y5 ::DD3x12y5(){ note_ctor("_ZN3ccc8DD3x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y5E, buf);
    ::ccc::DD3x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y5E);
    dp->::ccc::DD3x12y5::~DD3x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y5E(Test__ZN3ccc8DD3x12y5E, "_ZN3ccc8DD3x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y5C1Ev();
extern void _ZN3ccc8DD3x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y5E[] = {
  NSPAIR(_ZN3ccc8DD3x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y5E[];
extern void _ZN3ccc8DD3x12y53efgEv();
extern void _ZN3ccc8DD3x12y53pqrEv();
extern void _ZN3ccc8DD3x12y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y53abcEv,_ZTv0_n12_N3ccc8DD3x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y53abcEv,_ZThn4_N3ccc8DD3x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y53abcEv,_ZTv0_n12_N3ccc8DD3x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y5E[] = {
  {&(_ZTVN3ccc8DD3x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y5E[];
static VTBL_ENTRY alt_thunk_names1662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y53abcEv,_ZTv0_n12_N3ccc8DD3x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y53abcEv,_ZThn4_N3ccc8DD3x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y5E = {  "_ZN3ccc8DD3x12y5E", // class name
  bases__ZN3ccc8DD3x12y5E, 2,
  &(vtc__ZN3ccc8DD3x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1662,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y6  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y63efgEv
  ~CC3x12y6(); // tgen
  CC3x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y6E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y63abcEv");}
void  ccc::CC3x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y63efgEv");}
ccc::CC3x12y6 ::~CC3x12y6(){ note_dtor("_ZN3ccc8CC3x12y6E", this);} // tgen
ccc::CC3x12y6 ::CC3x12y6(){ note_ctor("_ZN3ccc8CC3x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y6E, buf);
    ::ccc::CC3x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y6E);
    dp->::ccc::CC3x12y6::~CC3x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y6E(Test__ZN3ccc8CC3x12y6E, "_ZN3ccc8CC3x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y6C1Ev();
extern void _ZN3ccc8CC3x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y6E[] = {
  NSPAIR(_ZN3ccc8CC3x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y6E[];
extern void _ZN3ccc8CC3x12y63abcEv();
extern void _ZN3ccc8CC3x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y63efgEv,_ZTv0_n12_N3ccc8CC3x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y63efgEv,_ZThn4_N3ccc8CC3x12y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y63abcEv,_ZTv0_n20_N3ccc8CC3x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y63abcEv,_ZThn4_N3ccc8CC3x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y63efgEv,_ZTv0_n12_N3ccc8CC3x12y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y63abcEv,_ZTv0_n20_N3ccc8CC3x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y6E[] = {
  {&(_ZTVN3ccc8CC3x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y6E[];
static VTBL_ENTRY alt_thunk_names1663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y63abcEv,_ZTv0_n20_N3ccc8CC3x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y63abcEv,_ZThn4_N3ccc8CC3x12y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y63efgEv,_ZTv0_n12_N3ccc8CC3x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y63efgEv,_ZThn4_N3ccc8CC3x12y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y6E = {  "_ZN3ccc8CC3x12y6E", // class name
  bases__ZN3ccc8CC3x12y6E, 2,
  &(vtc__ZN3ccc8CC3x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1663,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y6  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD3x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x12y63efgEv
  ~DD3x12y6(); // tgen
  DD3x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y63abcEv");}
void  ccc::DD3x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y63efgEv");}
ccc::DD3x12y6 ::~DD3x12y6(){ note_dtor("_ZN3ccc8DD3x12y6E", this);} // tgen
ccc::DD3x12y6 ::DD3x12y6(){ note_ctor("_ZN3ccc8DD3x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y6E, buf);
    ::ccc::DD3x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y6E);
    dp->::ccc::DD3x12y6::~DD3x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y6E(Test__ZN3ccc8DD3x12y6E, "_ZN3ccc8DD3x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y6C1Ev();
extern void _ZN3ccc8DD3x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y6E[] = {
  NSPAIR(_ZN3ccc8DD3x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y6E[];
extern void _ZN3ccc8DD3x12y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x12y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y63abcEv,_ZTv0_n12_N3ccc8DD3x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y63abcEv,_ZThn4_N3ccc8DD3x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y63abcEv,_ZTv0_n12_N3ccc8DD3x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y6E[] = {
  {&(_ZTVN3ccc8DD3x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y6E[];
static VTBL_ENTRY alt_thunk_names1664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y63abcEv,_ZTv0_n12_N3ccc8DD3x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y63abcEv,_ZThn4_N3ccc8DD3x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y6E = {  "_ZN3ccc8DD3x12y6E", // class name
  bases__ZN3ccc8DD3x12y6E, 2,
  &(vtc__ZN3ccc8DD3x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1664,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y7  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y73pqrEv
  ~CC3x12y7(); // tgen
  CC3x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y7E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y73abcEv");}
void  ccc::CC3x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y73pqrEv");}
ccc::CC3x12y7 ::~CC3x12y7(){ note_dtor("_ZN3ccc8CC3x12y7E", this);} // tgen
ccc::CC3x12y7 ::CC3x12y7(){ note_ctor("_ZN3ccc8CC3x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y7E, buf);
    ::ccc::CC3x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y7E);
    dp->::ccc::CC3x12y7::~CC3x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y7E(Test__ZN3ccc8CC3x12y7E, "_ZN3ccc8CC3x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y7C1Ev();
extern void _ZN3ccc8CC3x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y7E[] = {
  NSPAIR(_ZN3ccc8CC3x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y7E[];
extern void _ZN3ccc8CC3x12y73abcEv();
extern void _ZN3ccc8CC3x12y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y73pqrEv,_ZTv0_n16_N3ccc8CC3x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y73pqrEv,_ZThn4_N3ccc8CC3x12y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y73abcEv,_ZTv0_n20_N3ccc8CC3x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y73abcEv,_ZThn4_N3ccc8CC3x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y73pqrEv,_ZTv0_n16_N3ccc8CC3x12y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y73abcEv,_ZTv0_n20_N3ccc8CC3x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y7E[] = {
  {&(_ZTVN3ccc8CC3x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y7E[];
static VTBL_ENTRY alt_thunk_names1665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y73abcEv,_ZTv0_n20_N3ccc8CC3x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y73abcEv,_ZThn4_N3ccc8CC3x12y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y73pqrEv,_ZTv0_n16_N3ccc8CC3x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y73pqrEv,_ZThn4_N3ccc8CC3x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y7E = {  "_ZN3ccc8CC3x12y7E", // class name
  bases__ZN3ccc8CC3x12y7E, 2,
  &(vtc__ZN3ccc8CC3x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1665,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y7  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD3x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y73pqrEv
  ~DD3x12y7(); // tgen
  DD3x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y73abcEv");}
void  ccc::DD3x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y73pqrEv");}
ccc::DD3x12y7 ::~DD3x12y7(){ note_dtor("_ZN3ccc8DD3x12y7E", this);} // tgen
ccc::DD3x12y7 ::DD3x12y7(){ note_ctor("_ZN3ccc8DD3x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y7E, buf);
    ::ccc::DD3x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y7E);
    dp->::ccc::DD3x12y7::~DD3x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y7E(Test__ZN3ccc8DD3x12y7E, "_ZN3ccc8DD3x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y7C1Ev();
extern void _ZN3ccc8DD3x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y7E[] = {
  NSPAIR(_ZN3ccc8DD3x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x12y73pqrEv();
extern void _ZN3ccc8DD3x12y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y73abcEv,_ZTv0_n12_N3ccc8DD3x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y73abcEv,_ZThn4_N3ccc8DD3x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y73abcEv,_ZTv0_n12_N3ccc8DD3x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y7E[] = {
  {&(_ZTVN3ccc8DD3x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y7E[];
static VTBL_ENTRY alt_thunk_names1666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y73abcEv,_ZTv0_n12_N3ccc8DD3x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y73abcEv,_ZThn4_N3ccc8DD3x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y7E = {  "_ZN3ccc8DD3x12y7E", // class name
  bases__ZN3ccc8DD3x12y7E, 2,
  &(vtc__ZN3ccc8DD3x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1666,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y8  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y83abcEv
  ~CC3x12y8(); // tgen
  CC3x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y8E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y83efgEv");}
void  ccc::CC3x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y83abcEv");}
ccc::CC3x12y8 ::~CC3x12y8(){ note_dtor("_ZN3ccc8CC3x12y8E", this);} // tgen
ccc::CC3x12y8 ::CC3x12y8(){ note_ctor("_ZN3ccc8CC3x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y8E, buf);
    ::ccc::CC3x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y8E);
    dp->::ccc::CC3x12y8::~CC3x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y8E(Test__ZN3ccc8CC3x12y8E, "_ZN3ccc8CC3x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y8C1Ev();
extern void _ZN3ccc8CC3x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y8E[] = {
  NSPAIR(_ZN3ccc8CC3x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y8E[];
extern void _ZN3ccc8CC3x12y83abcEv();
extern void _ZN3ccc8CC3x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y83efgEv,_ZTv0_n12_N3ccc8CC3x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y83efgEv,_ZThn4_N3ccc8CC3x12y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x12y83abcEv,_ZTv0_n20_N3ccc8CC3x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y83abcEv,_ZThn4_N3ccc8CC3x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y83efgEv,_ZTv0_n12_N3ccc8CC3x12y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x12y83abcEv,_ZTv0_n20_N3ccc8CC3x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y8E[] = {
  {&(_ZTVN3ccc8CC3x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y8E[];
static VTBL_ENTRY alt_thunk_names1667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x12y83abcEv,_ZTv0_n20_N3ccc8CC3x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y83abcEv,_ZThn4_N3ccc8CC3x12y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y83efgEv,_ZTv0_n12_N3ccc8CC3x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y83efgEv,_ZThn4_N3ccc8CC3x12y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y8E = {  "_ZN3ccc8CC3x12y8E", // class name
  bases__ZN3ccc8CC3x12y8E, 2,
  &(vtc__ZN3ccc8CC3x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1667,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y8  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD3x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x12y83abcEv
  ~DD3x12y8(); // tgen
  DD3x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y83efgEv");}
void  ccc::DD3x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x12y83abcEv");}
ccc::DD3x12y8 ::~DD3x12y8(){ note_dtor("_ZN3ccc8DD3x12y8E", this);} // tgen
ccc::DD3x12y8 ::DD3x12y8(){ note_ctor("_ZN3ccc8DD3x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y8E, buf);
    ::ccc::DD3x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y8E);
    dp->::ccc::DD3x12y8::~DD3x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y8E(Test__ZN3ccc8DD3x12y8E, "_ZN3ccc8DD3x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y8C1Ev();
extern void _ZN3ccc8DD3x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y8E[] = {
  NSPAIR(_ZN3ccc8DD3x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y8E[];
extern void _ZN3ccc8DD3x12y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x12y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x12y83abcEv,_ZTv0_n12_N3ccc8DD3x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x12y83abcEv,_ZThn4_N3ccc8DD3x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x12y83abcEv,_ZTv0_n12_N3ccc8DD3x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y8E[] = {
  {&(_ZTVN3ccc8DD3x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y8E[];
static VTBL_ENTRY alt_thunk_names1668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x12y83abcEv,_ZTv0_n12_N3ccc8DD3x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x12y83abcEv,_ZThn4_N3ccc8DD3x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x12y8E = {  "_ZN3ccc8DD3x12y8E", // class name
  bases__ZN3ccc8DD3x12y8E, 2,
  &(vtc__ZN3ccc8DD3x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1668,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y9  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y93pqrEv
  ~CC3x12y9(); // tgen
  CC3x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y9E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y93efgEv");}
void  ccc::CC3x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y93pqrEv");}
ccc::CC3x12y9 ::~CC3x12y9(){ note_dtor("_ZN3ccc8CC3x12y9E", this);} // tgen
ccc::CC3x12y9 ::CC3x12y9(){ note_ctor("_ZN3ccc8CC3x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y9E, buf);
    ::ccc::CC3x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC3x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y9E);
    dp->::ccc::CC3x12y9::~CC3x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y9E(Test__ZN3ccc8CC3x12y9E, "_ZN3ccc8CC3x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y9C1Ev();
extern void _ZN3ccc8CC3x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y9E[] = {
  NSPAIR(_ZN3ccc8CC3x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC3x12y93efgEv();
extern void _ZN3ccc8CC3x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x12y93efgEv,_ZTv0_n12_N3ccc8CC3x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y93efgEv,_ZThn4_N3ccc8CC3x12y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x12y93pqrEv,_ZTv0_n16_N3ccc8CC3x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y93pqrEv,_ZThn4_N3ccc8CC3x12y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x12y93efgEv,_ZTv0_n12_N3ccc8CC3x12y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x12y93pqrEv,_ZTv0_n16_N3ccc8CC3x12y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x12y9E[] = {
  {&(_ZTVN3ccc8CC3x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x12y9E[];
static VTBL_ENTRY alt_thunk_names1669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x12y93pqrEv,_ZTv0_n16_N3ccc8CC3x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y93pqrEv,_ZThn4_N3ccc8CC3x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x12y93efgEv,_ZTv0_n12_N3ccc8CC3x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x12y93efgEv,_ZThn4_N3ccc8CC3x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x12y9E = {  "_ZN3ccc8CC3x12y9E", // class name
  bases__ZN3ccc8CC3x12y9E, 2,
  &(vtc__ZN3ccc8CC3x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x12y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1669,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y9  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD3x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x12y93pqrEv
  ~DD3x12y9(); // tgen
  DD3x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x12y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x12y93efgEv");}
void  ccc::DD3x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x12y93pqrEv");}
ccc::DD3x12y9 ::~DD3x12y9(){ note_dtor("_ZN3ccc8DD3x12y9E", this);} // tgen
ccc::DD3x12y9 ::DD3x12y9(){ note_ctor("_ZN3ccc8DD3x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x12y9E, buf);
    ::ccc::DD3x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x12y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD3x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x12y9E);
    dp->::ccc::DD3x12y9::~DD3x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x12y9E(Test__ZN3ccc8DD3x12y9E, "_ZN3ccc8DD3x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x12y9C1Ev();
extern void _ZN3ccc8DD3x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x12y9E[] = {
  NSPAIR(_ZN3ccc8DD3x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD3x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y9E[];
extern void _ZN3ccc8DD3x12y93efgEv();
extern void _ZN3ccc8DD3x12y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x12y9E[] = {
  {&(_ZTVN3ccc8DD3x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x12y9E[];
Class_Descriptor cd__ZN3ccc8DD3x12y9E = {  "_ZN3ccc8DD3x12y9E", // class name
  bases__ZN3ccc8DD3x12y9E, 2,
  &(vtc__ZN3ccc8DD3x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x12y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y10  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x12y103abcEv
  ~CC3x12y10(); // tgen
  CC3x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y10E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y103pqrEv");}
void  ccc::CC3x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x12y103abcEv");}
ccc::CC3x12y10 ::~CC3x12y10(){ note_dtor("_ZN3ccc9CC3x12y10E", this);} // tgen
ccc::CC3x12y10 ::CC3x12y10(){ note_ctor("_ZN3ccc9CC3x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y10E, buf);
    ::ccc::CC3x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y10E);
    dp->::ccc::CC3x12y10::~CC3x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y10E(Test__ZN3ccc9CC3x12y10E, "_ZN3ccc9CC3x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y10C1Ev();
extern void _ZN3ccc9CC3x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y10E[] = {
  NSPAIR(_ZN3ccc9CC3x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y10E[];
extern void _ZN3ccc9CC3x12y103abcEv();
extern void _ZN3ccc9CC3x12y103pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x12y103pqrEv,_ZTv0_n16_N3ccc9CC3x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y103pqrEv,_ZThn4_N3ccc9CC3x12y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x12y103abcEv,_ZTv0_n20_N3ccc9CC3x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y103abcEv,_ZThn4_N3ccc9CC3x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x12y103pqrEv,_ZTv0_n16_N3ccc9CC3x12y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x12y103abcEv,_ZTv0_n20_N3ccc9CC3x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y10E[] = {
  {&(_ZTVN3ccc9CC3x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y10E[];
static VTBL_ENTRY alt_thunk_names1670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x12y103abcEv,_ZTv0_n20_N3ccc9CC3x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y103abcEv,_ZThn4_N3ccc9CC3x12y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x12y103pqrEv,_ZTv0_n16_N3ccc9CC3x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y103pqrEv,_ZThn4_N3ccc9CC3x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x12y10E = {  "_ZN3ccc9CC3x12y10E", // class name
  bases__ZN3ccc9CC3x12y10E, 2,
  &(vtc__ZN3ccc9CC3x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1670,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y10  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD3x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x12y103abcEv
  ~DD3x12y10(); // tgen
  DD3x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x12y103pqrEv");}
void  ccc::DD3x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x12y103abcEv");}
ccc::DD3x12y10 ::~DD3x12y10(){ note_dtor("_ZN3ccc9DD3x12y10E", this);} // tgen
ccc::DD3x12y10 ::DD3x12y10(){ note_ctor("_ZN3ccc9DD3x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y10E, buf);
    ::ccc::DD3x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y10E);
    dp->::ccc::DD3x12y10::~DD3x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y10E(Test__ZN3ccc9DD3x12y10E, "_ZN3ccc9DD3x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y10C1Ev();
extern void _ZN3ccc9DD3x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y10E[] = {
  NSPAIR(_ZN3ccc9DD3x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x12y103pqrEv();
extern void _ZN3ccc9DD3x12y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x12y103abcEv,_ZTv0_n12_N3ccc9DD3x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x12y103abcEv,_ZThn4_N3ccc9DD3x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x12y103abcEv,_ZTv0_n12_N3ccc9DD3x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y10E[] = {
  {&(_ZTVN3ccc9DD3x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y10E[];
static VTBL_ENTRY alt_thunk_names1671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x12y103abcEv,_ZTv0_n12_N3ccc9DD3x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x12y103abcEv,_ZThn4_N3ccc9DD3x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x12y10E = {  "_ZN3ccc9DD3x12y10E", // class name
  bases__ZN3ccc9DD3x12y10E, 2,
  &(vtc__ZN3ccc9DD3x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1671,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y11  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x12y113efgEv
  ~CC3x12y11(); // tgen
  CC3x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y11E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y113pqrEv");}
void  ccc::CC3x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x12y113efgEv");}
ccc::CC3x12y11 ::~CC3x12y11(){ note_dtor("_ZN3ccc9CC3x12y11E", this);} // tgen
ccc::CC3x12y11 ::CC3x12y11(){ note_ctor("_ZN3ccc9CC3x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y11E, buf);
    ::ccc::CC3x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y11E);
    dp->::ccc::CC3x12y11::~CC3x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y11E(Test__ZN3ccc9CC3x12y11E, "_ZN3ccc9CC3x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y11C1Ev();
extern void _ZN3ccc9CC3x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y11E[] = {
  NSPAIR(_ZN3ccc9CC3x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC3x12y113pqrEv();
extern void _ZN3ccc9CC3x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x12y113efgEv,_ZTv0_n12_N3ccc9CC3x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y113efgEv,_ZThn4_N3ccc9CC3x12y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x12y113pqrEv,_ZTv0_n16_N3ccc9CC3x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y113pqrEv,_ZThn4_N3ccc9CC3x12y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x12y113efgEv,_ZTv0_n12_N3ccc9CC3x12y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x12y113pqrEv,_ZTv0_n16_N3ccc9CC3x12y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y11E[] = {
  {&(_ZTVN3ccc9CC3x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y11E[];
static VTBL_ENTRY alt_thunk_names1672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x12y113pqrEv,_ZTv0_n16_N3ccc9CC3x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y113pqrEv,_ZThn4_N3ccc9CC3x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x12y113efgEv,_ZTv0_n12_N3ccc9CC3x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y113efgEv,_ZThn4_N3ccc9CC3x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x12y11E = {  "_ZN3ccc9CC3x12y11E", // class name
  bases__ZN3ccc9CC3x12y11E, 2,
  &(vtc__ZN3ccc9CC3x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1672,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y11  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD3x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x12y113efgEv
  ~DD3x12y11(); // tgen
  DD3x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x12y113pqrEv");}
void  ccc::DD3x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x12y113efgEv");}
ccc::DD3x12y11 ::~DD3x12y11(){ note_dtor("_ZN3ccc9DD3x12y11E", this);} // tgen
ccc::DD3x12y11 ::DD3x12y11(){ note_ctor("_ZN3ccc9DD3x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y11E, buf);
    ::ccc::DD3x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y11E);
    dp->::ccc::DD3x12y11::~DD3x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y11E(Test__ZN3ccc9DD3x12y11E, "_ZN3ccc9DD3x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y11C1Ev();
extern void _ZN3ccc9DD3x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y11E[] = {
  NSPAIR(_ZN3ccc9DD3x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y11E[];
extern void _ZN3ccc9DD3x12y113efgEv();
extern void _ZN3ccc9DD3x12y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y11E[] = {
  {&(_ZTVN3ccc9DD3x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y11E[];
Class_Descriptor cd__ZN3ccc9DD3x12y11E = {  "_ZN3ccc9DD3x12y11E", // class name
  bases__ZN3ccc9DD3x12y11E, 2,
  &(vtc__ZN3ccc9DD3x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y12  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC3x12y123abcEv
  ~CC3x12y12(); // tgen
  CC3x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x12y123abcEv");}
ccc::CC3x12y12 ::~CC3x12y12(){ note_dtor("_ZN3ccc9CC3x12y12E", this);} // tgen
ccc::CC3x12y12 ::CC3x12y12(){ note_ctor("_ZN3ccc9CC3x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y12E, buf);
    ::ccc::CC3x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y12E);
    dp->::ccc::CC3x12y12::~CC3x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y12E(Test__ZN3ccc9CC3x12y12E, "_ZN3ccc9CC3x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y12C1Ev();
extern void _ZN3ccc9CC3x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y12E[] = {
  NSPAIR(_ZN3ccc9CC3x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y12E[];
extern void _ZN3ccc9CC3x12y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x12y123abcEv,_ZTv0_n20_N3ccc9CC3x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y123abcEv,_ZThn4_N3ccc9CC3x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x12y123abcEv,_ZTv0_n20_N3ccc9CC3x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y12E[] = {
  {&(_ZTVN3ccc9CC3x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y12E[];
static VTBL_ENTRY alt_thunk_names1673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x12y123abcEv,_ZTv0_n20_N3ccc9CC3x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y123abcEv,_ZThn4_N3ccc9CC3x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x12y12E = {  "_ZN3ccc9CC3x12y12E", // class name
  bases__ZN3ccc9CC3x12y12E, 2,
  &(vtc__ZN3ccc9CC3x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1673,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y12  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD3x12y123abcEv
  ~DD3x12y12(); // tgen
  DD3x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD3x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x12y123abcEv");}
ccc::DD3x12y12 ::~DD3x12y12(){ note_dtor("_ZN3ccc9DD3x12y12E", this);} // tgen
ccc::DD3x12y12 ::DD3x12y12(){ note_ctor("_ZN3ccc9DD3x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y12E, buf);
    ::ccc::DD3x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y12E);
    dp->::ccc::DD3x12y12::~DD3x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y12E(Test__ZN3ccc9DD3x12y12E, "_ZN3ccc9DD3x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y12C1Ev();
extern void _ZN3ccc9DD3x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y12E[] = {
  NSPAIR(_ZN3ccc9DD3x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x12y123abcEv,_ZTv0_n12_N3ccc9DD3x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x12y123abcEv,_ZThn4_N3ccc9DD3x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y123abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x12y123abcEv,_ZTv0_n12_N3ccc9DD3x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y12E[] = {
  {&(_ZTVN3ccc9DD3x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y12E[];
static VTBL_ENTRY alt_thunk_names1674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x12y123abcEv,_ZTv0_n12_N3ccc9DD3x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x12y123abcEv,_ZThn4_N3ccc9DD3x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x12y12E = {  "_ZN3ccc9DD3x12y12E", // class name
  bases__ZN3ccc9DD3x12y12E, 2,
  &(vtc__ZN3ccc9DD3x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1674,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y13  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC3x12y133efgEv
  ~CC3x12y13(); // tgen
  CC3x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x12y133efgEv");}
ccc::CC3x12y13 ::~CC3x12y13(){ note_dtor("_ZN3ccc9CC3x12y13E", this);} // tgen
ccc::CC3x12y13 ::CC3x12y13(){ note_ctor("_ZN3ccc9CC3x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y13E, buf);
    ::ccc::CC3x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y13E);
    dp->::ccc::CC3x12y13::~CC3x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y13E(Test__ZN3ccc9CC3x12y13E, "_ZN3ccc9CC3x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y13C1Ev();
extern void _ZN3ccc9CC3x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y13E[] = {
  NSPAIR(_ZN3ccc9CC3x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC3x12y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x12y133efgEv,_ZTv0_n12_N3ccc9CC3x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y133efgEv,_ZThn4_N3ccc9CC3x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x12y133efgEv,_ZTv0_n12_N3ccc9CC3x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y13E[] = {
  {&(_ZTVN3ccc9CC3x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y13E[];
static VTBL_ENTRY alt_thunk_names1675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x12y133efgEv,_ZTv0_n12_N3ccc9CC3x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y133efgEv,_ZThn4_N3ccc9CC3x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x12y13E = {  "_ZN3ccc9CC3x12y13E", // class name
  bases__ZN3ccc9CC3x12y13E, 2,
  &(vtc__ZN3ccc9CC3x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1675,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y13  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD3x12y133efgEv
  ~DD3x12y13(); // tgen
  DD3x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x12y133efgEv");}
ccc::DD3x12y13 ::~DD3x12y13(){ note_dtor("_ZN3ccc9DD3x12y13E", this);} // tgen
ccc::DD3x12y13 ::DD3x12y13(){ note_ctor("_ZN3ccc9DD3x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y13E, buf);
    ::ccc::DD3x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y13E);
    dp->::ccc::DD3x12y13::~DD3x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y13E(Test__ZN3ccc9DD3x12y13E, "_ZN3ccc9DD3x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y13C1Ev();
extern void _ZN3ccc9DD3x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y13E[] = {
  NSPAIR(_ZN3ccc9DD3x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y13E[];
extern void _ZN3ccc9DD3x12y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y13E[] = {
  {&(_ZTVN3ccc9DD3x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y13E[];
Class_Descriptor cd__ZN3ccc9DD3x12y13E = {  "_ZN3ccc9DD3x12y13E", // class name
  bases__ZN3ccc9DD3x12y13E, 2,
  &(vtc__ZN3ccc9DD3x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y14  : virtual ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y143pqrEv
  ~CC3x12y14(); // tgen
  CC3x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y143pqrEv");}
ccc::CC3x12y14 ::~CC3x12y14(){ note_dtor("_ZN3ccc9CC3x12y14E", this);} // tgen
ccc::CC3x12y14 ::CC3x12y14(){ note_ctor("_ZN3ccc9CC3x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y14E, buf);
    ::ccc::CC3x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y14E);
    dp->::ccc::CC3x12y14::~CC3x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y14E(Test__ZN3ccc9CC3x12y14E, "_ZN3ccc9CC3x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y14C1Ev();
extern void _ZN3ccc9CC3x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y14E[] = {
  NSPAIR(_ZN3ccc9CC3x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC3x12y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x12y143pqrEv,_ZTv0_n16_N3ccc9CC3x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y143pqrEv,_ZThn4_N3ccc9CC3x12y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x12y143pqrEv,_ZTv0_n16_N3ccc9CC3x12y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y14E[] = {
  {&(_ZTVN3ccc9CC3x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y14E[];
static VTBL_ENTRY alt_thunk_names1676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x12y143pqrEv,_ZTv0_n16_N3ccc9CC3x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x12y143pqrEv,_ZThn4_N3ccc9CC3x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x12y14E = {  "_ZN3ccc9CC3x12y14E", // class name
  bases__ZN3ccc9CC3x12y14E, 2,
  &(vtc__ZN3ccc9CC3x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1676,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y14  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD3x12y143pqrEv
  ~DD3x12y14(); // tgen
  DD3x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x12y143pqrEv");}
ccc::DD3x12y14 ::~DD3x12y14(){ note_dtor("_ZN3ccc9DD3x12y14E", this);} // tgen
ccc::DD3x12y14 ::DD3x12y14(){ note_ctor("_ZN3ccc9DD3x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y14E, buf);
    ::ccc::DD3x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y14E);
    dp->::ccc::DD3x12y14::~DD3x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y14E(Test__ZN3ccc9DD3x12y14E, "_ZN3ccc9DD3x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y14C1Ev();
extern void _ZN3ccc9DD3x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y14E[] = {
  NSPAIR(_ZN3ccc9DD3x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x12y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y14E[] = {
  {&(_ZTVN3ccc9DD3x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y14E[];
Class_Descriptor cd__ZN3ccc9DD3x12y14E = {  "_ZN3ccc9DD3x12y14E", // class name
  bases__ZN3ccc9DD3x12y14E, 2,
  &(vtc__ZN3ccc9DD3x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y15  : virtual ::ccc::AA3 , ::ccc::BB12 {
  ~CC3x12y15(); // tgen
  CC3x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x12y15 ::~CC3x12y15(){ note_dtor("_ZN3ccc9CC3x12y15E", this);} // tgen
ccc::CC3x12y15 ::CC3x12y15(){ note_ctor("_ZN3ccc9CC3x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y15E, buf);
    ::ccc::CC3x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC3x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y15E);
    dp->::ccc::CC3x12y15::~CC3x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y15E(Test__ZN3ccc9CC3x12y15E, "_ZN3ccc9CC3x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y15C1Ev();
extern void _ZN3ccc9CC3x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y15E[] = {
  NSPAIR(_ZN3ccc9CC3x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x12y15E[] = {
  {&(_ZTVN3ccc9CC3x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x12y15E[];
Class_Descriptor cd__ZN3ccc9CC3x12y15E = {  "_ZN3ccc9CC3x12y15E", // class name
  bases__ZN3ccc9CC3x12y15E, 2,
  &(vtc__ZN3ccc9CC3x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x12y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x12y15  : virtual ::ccc::AA3 , virtual ::ccc::BB12 {
  ~DD3x12y15(); // tgen
  DD3x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD3x12y15 ::~DD3x12y15(){ note_dtor("_ZN3ccc9DD3x12y15E", this);} // tgen
ccc::DD3x12y15 ::DD3x12y15(){ note_ctor("_ZN3ccc9DD3x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x12y15E, buf);
    ::ccc::DD3x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x12y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD3x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x12y15E);
    dp->::ccc::DD3x12y15::~DD3x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x12y15E(Test__ZN3ccc9DD3x12y15E, "_ZN3ccc9DD3x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x12y15C1Ev();
extern void _ZN3ccc9DD3x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x12y15E[] = {
  NSPAIR(_ZN3ccc9DD3x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD3x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x12y15E[] = {
  {&(_ZTVN3ccc9DD3x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x12y15E[];
Class_Descriptor cd__ZN3ccc9DD3x12y15E = {  "_ZN3ccc9DD3x12y15E", // class name
  bases__ZN3ccc9DD3x12y15E, 2,
  &(vtc__ZN3ccc9DD3x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x12y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y0  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y03pqrEv
  ~CC3x13y0(); // tgen
  CC3x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y0E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y03abcEv");}
void  ccc::CC3x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y03efgEv");}
void  ccc::CC3x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y03pqrEv");}
ccc::CC3x13y0 ::~CC3x13y0(){ note_dtor("_ZN3ccc8CC3x13y0E", this);} // tgen
ccc::CC3x13y0 ::CC3x13y0(){ note_ctor("_ZN3ccc8CC3x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y0E, buf);
    ::ccc::CC3x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y0E);
    dp->::ccc::CC3x13y0::~CC3x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y0E(Test__ZN3ccc8CC3x13y0E, "_ZN3ccc8CC3x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y0C1Ev();
extern void _ZN3ccc8CC3x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y0E[] = {
  NSPAIR(_ZN3ccc8CC3x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y0E[];
extern void _ZN3ccc8CC3x13y03efgEv();
extern void _ZN3ccc8CC3x13y03abcEv();
extern void _ZN3ccc8CC3x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y03efgEv,_ZTv0_n12_N3ccc8CC3x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y03efgEv,_ZThn4_N3ccc8CC3x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y03pqrEv,_ZTv0_n16_N3ccc8CC3x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y03pqrEv,_ZThn4_N3ccc8CC3x13y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y03abcEv,_ZTv0_n20_N3ccc8CC3x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y03abcEv,_ZThn4_N3ccc8CC3x13y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y03efgEv,_ZTv0_n12_N3ccc8CC3x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y03pqrEv,_ZTv0_n16_N3ccc8CC3x13y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y03abcEv,_ZTv0_n20_N3ccc8CC3x13y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y0E[] = {
  {&(_ZTVN3ccc8CC3x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y0E[];
static VTBL_ENTRY alt_thunk_names1677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y03abcEv,_ZTv0_n20_N3ccc8CC3x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y03abcEv,_ZThn4_N3ccc8CC3x13y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y03pqrEv,_ZTv0_n16_N3ccc8CC3x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y03pqrEv,_ZThn4_N3ccc8CC3x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y03efgEv,_ZTv0_n12_N3ccc8CC3x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y03efgEv,_ZThn4_N3ccc8CC3x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y0E = {  "_ZN3ccc8CC3x13y0E", // class name
  bases__ZN3ccc8CC3x13y0E, 2,
  &(vtc__ZN3ccc8CC3x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1677,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y0  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD3x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y03pqrEv
  ~DD3x13y0(); // tgen
  DD3x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y03abcEv");}
void  ccc::DD3x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y03efgEv");}
void  ccc::DD3x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y03pqrEv");}
ccc::DD3x13y0 ::~DD3x13y0(){ note_dtor("_ZN3ccc8DD3x13y0E", this);} // tgen
ccc::DD3x13y0 ::DD3x13y0(){ note_ctor("_ZN3ccc8DD3x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y0E, buf);
    ::ccc::DD3x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y0E);
    dp->::ccc::DD3x13y0::~DD3x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y0E(Test__ZN3ccc8DD3x13y0E, "_ZN3ccc8DD3x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y0C1Ev();
extern void _ZN3ccc8DD3x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y0E[] = {
  NSPAIR(_ZN3ccc8DD3x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y0E[];
extern void _ZN3ccc8DD3x13y03efgEv();
extern void _ZN3ccc8DD3x13y03pqrEv();
extern void _ZN3ccc8DD3x13y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y03efgEv,_ZTv0_n12_N3ccc8DD3x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y03efgEv,_ZThn4_N3ccc8DD3x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y03efgEv,_ZTv0_n12_N3ccc8DD3x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y0E[] = {
  {&(_ZTVN3ccc8DD3x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y0E[];
static VTBL_ENTRY alt_thunk_names1678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y03efgEv,_ZTv0_n12_N3ccc8DD3x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y03efgEv,_ZThn4_N3ccc8DD3x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y0E = {  "_ZN3ccc8DD3x13y0E", // class name
  bases__ZN3ccc8DD3x13y0E, 2,
  &(vtc__ZN3ccc8DD3x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1678,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y1  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x13y13efgEv
  ~CC3x13y1(); // tgen
  CC3x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y1E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y13abcEv");}
void  ccc::CC3x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y13pqrEv");}
void  ccc::CC3x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y13efgEv");}
ccc::CC3x13y1 ::~CC3x13y1(){ note_dtor("_ZN3ccc8CC3x13y1E", this);} // tgen
ccc::CC3x13y1 ::CC3x13y1(){ note_ctor("_ZN3ccc8CC3x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y1E, buf);
    ::ccc::CC3x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y1E);
    dp->::ccc::CC3x13y1::~CC3x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y1E(Test__ZN3ccc8CC3x13y1E, "_ZN3ccc8CC3x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y1C1Ev();
extern void _ZN3ccc8CC3x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y1E[] = {
  NSPAIR(_ZN3ccc8CC3x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y1E[];
extern void _ZN3ccc8CC3x13y13efgEv();
extern void _ZN3ccc8CC3x13y13abcEv();
extern void _ZN3ccc8CC3x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y13efgEv,_ZTv0_n12_N3ccc8CC3x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y13efgEv,_ZThn4_N3ccc8CC3x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y13pqrEv,_ZTv0_n16_N3ccc8CC3x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y13pqrEv,_ZThn4_N3ccc8CC3x13y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y13abcEv,_ZTv0_n20_N3ccc8CC3x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y13abcEv,_ZThn4_N3ccc8CC3x13y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y13efgEv,_ZTv0_n12_N3ccc8CC3x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y13pqrEv,_ZTv0_n16_N3ccc8CC3x13y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y13abcEv,_ZTv0_n20_N3ccc8CC3x13y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y1E[] = {
  {&(_ZTVN3ccc8CC3x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y1E[];
static VTBL_ENTRY alt_thunk_names1679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y13abcEv,_ZTv0_n20_N3ccc8CC3x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y13abcEv,_ZThn4_N3ccc8CC3x13y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y13pqrEv,_ZTv0_n16_N3ccc8CC3x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y13pqrEv,_ZThn4_N3ccc8CC3x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y13efgEv,_ZTv0_n12_N3ccc8CC3x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y13efgEv,_ZThn4_N3ccc8CC3x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y1E = {  "_ZN3ccc8CC3x13y1E", // class name
  bases__ZN3ccc8CC3x13y1E, 2,
  &(vtc__ZN3ccc8CC3x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1679,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y1  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD3x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x13y13efgEv
  ~DD3x13y1(); // tgen
  DD3x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y13abcEv");}
void  ccc::DD3x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y13pqrEv");}
void  ccc::DD3x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y13efgEv");}
ccc::DD3x13y1 ::~DD3x13y1(){ note_dtor("_ZN3ccc8DD3x13y1E", this);} // tgen
ccc::DD3x13y1 ::DD3x13y1(){ note_ctor("_ZN3ccc8DD3x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y1E, buf);
    ::ccc::DD3x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y1E);
    dp->::ccc::DD3x13y1::~DD3x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y1E(Test__ZN3ccc8DD3x13y1E, "_ZN3ccc8DD3x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y1C1Ev();
extern void _ZN3ccc8DD3x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y1E[] = {
  NSPAIR(_ZN3ccc8DD3x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y1E[];
extern void _ZN3ccc8DD3x13y13efgEv();
extern void _ZN3ccc8DD3x13y13pqrEv();
extern void _ZN3ccc8DD3x13y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y13efgEv,_ZTv0_n12_N3ccc8DD3x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y13efgEv,_ZThn4_N3ccc8DD3x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y13efgEv,_ZTv0_n12_N3ccc8DD3x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y1E[] = {
  {&(_ZTVN3ccc8DD3x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y1E[];
static VTBL_ENTRY alt_thunk_names1680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y13efgEv,_ZTv0_n12_N3ccc8DD3x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y13efgEv,_ZThn4_N3ccc8DD3x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y1E = {  "_ZN3ccc8DD3x13y1E", // class name
  bases__ZN3ccc8DD3x13y1E, 2,
  &(vtc__ZN3ccc8DD3x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1680,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y2  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y23pqrEv
  ~CC3x13y2(); // tgen
  CC3x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y2E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y23efgEv");}
void  ccc::CC3x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y23abcEv");}
void  ccc::CC3x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y23pqrEv");}
ccc::CC3x13y2 ::~CC3x13y2(){ note_dtor("_ZN3ccc8CC3x13y2E", this);} // tgen
ccc::CC3x13y2 ::CC3x13y2(){ note_ctor("_ZN3ccc8CC3x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y2E, buf);
    ::ccc::CC3x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y2E);
    dp->::ccc::CC3x13y2::~CC3x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y2E(Test__ZN3ccc8CC3x13y2E, "_ZN3ccc8CC3x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y2C1Ev();
extern void _ZN3ccc8CC3x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y2E[] = {
  NSPAIR(_ZN3ccc8CC3x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y2E[];
extern void _ZN3ccc8CC3x13y23efgEv();
extern void _ZN3ccc8CC3x13y23abcEv();
extern void _ZN3ccc8CC3x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y23efgEv,_ZTv0_n12_N3ccc8CC3x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y23efgEv,_ZThn4_N3ccc8CC3x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y23pqrEv,_ZTv0_n16_N3ccc8CC3x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y23pqrEv,_ZThn4_N3ccc8CC3x13y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y23abcEv,_ZTv0_n20_N3ccc8CC3x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y23abcEv,_ZThn4_N3ccc8CC3x13y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y23efgEv,_ZTv0_n12_N3ccc8CC3x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y23pqrEv,_ZTv0_n16_N3ccc8CC3x13y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y23abcEv,_ZTv0_n20_N3ccc8CC3x13y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y2E[] = {
  {&(_ZTVN3ccc8CC3x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y2E[];
static VTBL_ENTRY alt_thunk_names1681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y23abcEv,_ZTv0_n20_N3ccc8CC3x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y23abcEv,_ZThn4_N3ccc8CC3x13y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y23pqrEv,_ZTv0_n16_N3ccc8CC3x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y23pqrEv,_ZThn4_N3ccc8CC3x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y23efgEv,_ZTv0_n12_N3ccc8CC3x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y23efgEv,_ZThn4_N3ccc8CC3x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y2E = {  "_ZN3ccc8CC3x13y2E", // class name
  bases__ZN3ccc8CC3x13y2E, 2,
  &(vtc__ZN3ccc8CC3x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1681,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y2  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD3x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y23pqrEv
  ~DD3x13y2(); // tgen
  DD3x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y23efgEv");}
void  ccc::DD3x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y23abcEv");}
void  ccc::DD3x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y23pqrEv");}
ccc::DD3x13y2 ::~DD3x13y2(){ note_dtor("_ZN3ccc8DD3x13y2E", this);} // tgen
ccc::DD3x13y2 ::DD3x13y2(){ note_ctor("_ZN3ccc8DD3x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y2E, buf);
    ::ccc::DD3x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y2E);
    dp->::ccc::DD3x13y2::~DD3x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y2E(Test__ZN3ccc8DD3x13y2E, "_ZN3ccc8DD3x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y2C1Ev();
extern void _ZN3ccc8DD3x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y2E[] = {
  NSPAIR(_ZN3ccc8DD3x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y2E[];
extern void _ZN3ccc8DD3x13y23efgEv();
extern void _ZN3ccc8DD3x13y23pqrEv();
extern void _ZN3ccc8DD3x13y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y23efgEv,_ZTv0_n12_N3ccc8DD3x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y23efgEv,_ZThn4_N3ccc8DD3x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y23efgEv,_ZTv0_n12_N3ccc8DD3x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y2E[] = {
  {&(_ZTVN3ccc8DD3x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y2E[];
static VTBL_ENTRY alt_thunk_names1682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y23efgEv,_ZTv0_n12_N3ccc8DD3x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y23efgEv,_ZThn4_N3ccc8DD3x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y2E = {  "_ZN3ccc8DD3x13y2E", // class name
  bases__ZN3ccc8DD3x13y2E, 2,
  &(vtc__ZN3ccc8DD3x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1682,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y3  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x13y33abcEv
  ~CC3x13y3(); // tgen
  CC3x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y3E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y33efgEv");}
void  ccc::CC3x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y33pqrEv");}
void  ccc::CC3x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y33abcEv");}
ccc::CC3x13y3 ::~CC3x13y3(){ note_dtor("_ZN3ccc8CC3x13y3E", this);} // tgen
ccc::CC3x13y3 ::CC3x13y3(){ note_ctor("_ZN3ccc8CC3x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y3E, buf);
    ::ccc::CC3x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y3E);
    dp->::ccc::CC3x13y3::~CC3x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y3E(Test__ZN3ccc8CC3x13y3E, "_ZN3ccc8CC3x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y3C1Ev();
extern void _ZN3ccc8CC3x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y3E[] = {
  NSPAIR(_ZN3ccc8CC3x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y3E[];
extern void _ZN3ccc8CC3x13y33efgEv();
extern void _ZN3ccc8CC3x13y33pqrEv();
extern void _ZN3ccc8CC3x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y33efgEv,_ZTv0_n12_N3ccc8CC3x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y33efgEv,_ZThn4_N3ccc8CC3x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y33pqrEv,_ZTv0_n16_N3ccc8CC3x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y33pqrEv,_ZThn4_N3ccc8CC3x13y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y33abcEv,_ZTv0_n20_N3ccc8CC3x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y33abcEv,_ZThn4_N3ccc8CC3x13y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y33efgEv,_ZTv0_n12_N3ccc8CC3x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y33pqrEv,_ZTv0_n16_N3ccc8CC3x13y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y33abcEv,_ZTv0_n20_N3ccc8CC3x13y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y3E[] = {
  {&(_ZTVN3ccc8CC3x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y3E[];
static VTBL_ENTRY alt_thunk_names1683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y33abcEv,_ZTv0_n20_N3ccc8CC3x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y33abcEv,_ZThn4_N3ccc8CC3x13y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y33pqrEv,_ZTv0_n16_N3ccc8CC3x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y33pqrEv,_ZThn4_N3ccc8CC3x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y33efgEv,_ZTv0_n12_N3ccc8CC3x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y33efgEv,_ZThn4_N3ccc8CC3x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y3E = {  "_ZN3ccc8CC3x13y3E", // class name
  bases__ZN3ccc8CC3x13y3E, 2,
  &(vtc__ZN3ccc8CC3x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1683,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y3  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD3x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x13y33abcEv
  ~DD3x13y3(); // tgen
  DD3x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y33efgEv");}
void  ccc::DD3x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y33pqrEv");}
void  ccc::DD3x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y33abcEv");}
ccc::DD3x13y3 ::~DD3x13y3(){ note_dtor("_ZN3ccc8DD3x13y3E", this);} // tgen
ccc::DD3x13y3 ::DD3x13y3(){ note_ctor("_ZN3ccc8DD3x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y3E, buf);
    ::ccc::DD3x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y3E);
    dp->::ccc::DD3x13y3::~DD3x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y3E(Test__ZN3ccc8DD3x13y3E, "_ZN3ccc8DD3x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y3C1Ev();
extern void _ZN3ccc8DD3x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y3E[] = {
  NSPAIR(_ZN3ccc8DD3x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y3E[];
extern void _ZN3ccc8DD3x13y33efgEv();
extern void _ZN3ccc8DD3x13y33pqrEv();
extern void _ZN3ccc8DD3x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y33efgEv,_ZTv0_n12_N3ccc8DD3x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y33efgEv,_ZThn4_N3ccc8DD3x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y33efgEv,_ZTv0_n12_N3ccc8DD3x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y3E[] = {
  {&(_ZTVN3ccc8DD3x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y3E[];
static VTBL_ENTRY alt_thunk_names1684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y33efgEv,_ZTv0_n12_N3ccc8DD3x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y33efgEv,_ZThn4_N3ccc8DD3x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y3E = {  "_ZN3ccc8DD3x13y3E", // class name
  bases__ZN3ccc8DD3x13y3E, 2,
  &(vtc__ZN3ccc8DD3x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1684,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y4  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC3x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y43efgEv
  ~CC3x13y4(); // tgen
  CC3x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y4E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y43pqrEv");}
void  ccc::CC3x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y43abcEv");}
void  ccc::CC3x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y43efgEv");}
ccc::CC3x13y4 ::~CC3x13y4(){ note_dtor("_ZN3ccc8CC3x13y4E", this);} // tgen
ccc::CC3x13y4 ::CC3x13y4(){ note_ctor("_ZN3ccc8CC3x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y4E, buf);
    ::ccc::CC3x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y4E);
    dp->::ccc::CC3x13y4::~CC3x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y4E(Test__ZN3ccc8CC3x13y4E, "_ZN3ccc8CC3x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y4C1Ev();
extern void _ZN3ccc8CC3x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y4E[] = {
  NSPAIR(_ZN3ccc8CC3x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y4E[];
extern void _ZN3ccc8CC3x13y43efgEv();
extern void _ZN3ccc8CC3x13y43pqrEv();
extern void _ZN3ccc8CC3x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y43efgEv,_ZTv0_n12_N3ccc8CC3x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y43efgEv,_ZThn4_N3ccc8CC3x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y43pqrEv,_ZTv0_n16_N3ccc8CC3x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y43pqrEv,_ZThn4_N3ccc8CC3x13y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y43abcEv,_ZTv0_n20_N3ccc8CC3x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y43abcEv,_ZThn4_N3ccc8CC3x13y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y43efgEv,_ZTv0_n12_N3ccc8CC3x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y43pqrEv,_ZTv0_n16_N3ccc8CC3x13y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y43abcEv,_ZTv0_n20_N3ccc8CC3x13y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y4E[] = {
  {&(_ZTVN3ccc8CC3x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y4E[];
static VTBL_ENTRY alt_thunk_names1685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y43abcEv,_ZTv0_n20_N3ccc8CC3x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y43abcEv,_ZThn4_N3ccc8CC3x13y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y43pqrEv,_ZTv0_n16_N3ccc8CC3x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y43pqrEv,_ZThn4_N3ccc8CC3x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y43efgEv,_ZTv0_n12_N3ccc8CC3x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y43efgEv,_ZThn4_N3ccc8CC3x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y4E = {  "_ZN3ccc8CC3x13y4E", // class name
  bases__ZN3ccc8CC3x13y4E, 2,
  &(vtc__ZN3ccc8CC3x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1685,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y4  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD3x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x13y43efgEv
  ~DD3x13y4(); // tgen
  DD3x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y43pqrEv");}
void  ccc::DD3x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y43abcEv");}
void  ccc::DD3x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y43efgEv");}
ccc::DD3x13y4 ::~DD3x13y4(){ note_dtor("_ZN3ccc8DD3x13y4E", this);} // tgen
ccc::DD3x13y4 ::DD3x13y4(){ note_ctor("_ZN3ccc8DD3x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y4E, buf);
    ::ccc::DD3x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y4E);
    dp->::ccc::DD3x13y4::~DD3x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y4E(Test__ZN3ccc8DD3x13y4E, "_ZN3ccc8DD3x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y4C1Ev();
extern void _ZN3ccc8DD3x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y4E[] = {
  NSPAIR(_ZN3ccc8DD3x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y4E[];
extern void _ZN3ccc8DD3x13y43efgEv();
extern void _ZN3ccc8DD3x13y43pqrEv();
extern void _ZN3ccc8DD3x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y43efgEv,_ZTv0_n12_N3ccc8DD3x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y43efgEv,_ZThn4_N3ccc8DD3x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y43efgEv,_ZTv0_n12_N3ccc8DD3x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y4E[] = {
  {&(_ZTVN3ccc8DD3x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y4E[];
static VTBL_ENTRY alt_thunk_names1686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y43efgEv,_ZTv0_n12_N3ccc8DD3x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y43efgEv,_ZThn4_N3ccc8DD3x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y4E = {  "_ZN3ccc8DD3x13y4E", // class name
  bases__ZN3ccc8DD3x13y4E, 2,
  &(vtc__ZN3ccc8DD3x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1686,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y5  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC3x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y53abcEv
  ~CC3x13y5(); // tgen
  CC3x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y5E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y53pqrEv");}
void  ccc::CC3x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y53efgEv");}
void  ccc::CC3x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y53abcEv");}
ccc::CC3x13y5 ::~CC3x13y5(){ note_dtor("_ZN3ccc8CC3x13y5E", this);} // tgen
ccc::CC3x13y5 ::CC3x13y5(){ note_ctor("_ZN3ccc8CC3x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y5E, buf);
    ::ccc::CC3x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y5E);
    dp->::ccc::CC3x13y5::~CC3x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y5E(Test__ZN3ccc8CC3x13y5E, "_ZN3ccc8CC3x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y5C1Ev();
extern void _ZN3ccc8CC3x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y5E[] = {
  NSPAIR(_ZN3ccc8CC3x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y5E[];
extern void _ZN3ccc8CC3x13y53efgEv();
extern void _ZN3ccc8CC3x13y53pqrEv();
extern void _ZN3ccc8CC3x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y53efgEv,_ZTv0_n12_N3ccc8CC3x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y53efgEv,_ZThn4_N3ccc8CC3x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y53pqrEv,_ZTv0_n16_N3ccc8CC3x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y53pqrEv,_ZThn4_N3ccc8CC3x13y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y53abcEv,_ZTv0_n20_N3ccc8CC3x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y53abcEv,_ZThn4_N3ccc8CC3x13y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y53efgEv,_ZTv0_n12_N3ccc8CC3x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y53pqrEv,_ZTv0_n16_N3ccc8CC3x13y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y53abcEv,_ZTv0_n20_N3ccc8CC3x13y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y5E[] = {
  {&(_ZTVN3ccc8CC3x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y5E[];
static VTBL_ENTRY alt_thunk_names1687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y53abcEv,_ZTv0_n20_N3ccc8CC3x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y53abcEv,_ZThn4_N3ccc8CC3x13y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y53pqrEv,_ZTv0_n16_N3ccc8CC3x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y53pqrEv,_ZThn4_N3ccc8CC3x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y53efgEv,_ZTv0_n12_N3ccc8CC3x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y53efgEv,_ZThn4_N3ccc8CC3x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y5E = {  "_ZN3ccc8CC3x13y5E", // class name
  bases__ZN3ccc8CC3x13y5E, 2,
  &(vtc__ZN3ccc8CC3x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1687,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y5  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD3x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x13y53abcEv
  ~DD3x13y5(); // tgen
  DD3x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y53pqrEv");}
void  ccc::DD3x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y53efgEv");}
void  ccc::DD3x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y53abcEv");}
ccc::DD3x13y5 ::~DD3x13y5(){ note_dtor("_ZN3ccc8DD3x13y5E", this);} // tgen
ccc::DD3x13y5 ::DD3x13y5(){ note_ctor("_ZN3ccc8DD3x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y5E, buf);
    ::ccc::DD3x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y5E);
    dp->::ccc::DD3x13y5::~DD3x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y5E(Test__ZN3ccc8DD3x13y5E, "_ZN3ccc8DD3x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y5C1Ev();
extern void _ZN3ccc8DD3x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y5E[] = {
  NSPAIR(_ZN3ccc8DD3x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y5E[];
extern void _ZN3ccc8DD3x13y53efgEv();
extern void _ZN3ccc8DD3x13y53pqrEv();
extern void _ZN3ccc8DD3x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y53efgEv,_ZTv0_n12_N3ccc8DD3x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y53efgEv,_ZThn4_N3ccc8DD3x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y53efgEv,_ZTv0_n12_N3ccc8DD3x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y5E[] = {
  {&(_ZTVN3ccc8DD3x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y5E[];
static VTBL_ENTRY alt_thunk_names1688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y53efgEv,_ZTv0_n12_N3ccc8DD3x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y53efgEv,_ZThn4_N3ccc8DD3x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y5E = {  "_ZN3ccc8DD3x13y5E", // class name
  bases__ZN3ccc8DD3x13y5E, 2,
  &(vtc__ZN3ccc8DD3x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1688,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y6  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y63efgEv
  ~CC3x13y6(); // tgen
  CC3x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y6E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y63abcEv");}
void  ccc::CC3x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y63efgEv");}
ccc::CC3x13y6 ::~CC3x13y6(){ note_dtor("_ZN3ccc8CC3x13y6E", this);} // tgen
ccc::CC3x13y6 ::CC3x13y6(){ note_ctor("_ZN3ccc8CC3x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y6E, buf);
    ::ccc::CC3x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y6E);
    dp->::ccc::CC3x13y6::~CC3x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y6E(Test__ZN3ccc8CC3x13y6E, "_ZN3ccc8CC3x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y6C1Ev();
extern void _ZN3ccc8CC3x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y6E[] = {
  NSPAIR(_ZN3ccc8CC3x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y6E[];
extern void _ZN3ccc8CC3x13y63efgEv();
extern void _ZN3ccc8CC3x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y63efgEv,_ZTv0_n12_N3ccc8CC3x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y63efgEv,_ZThn4_N3ccc8CC3x13y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y63abcEv,_ZTv0_n20_N3ccc8CC3x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y63abcEv,_ZThn4_N3ccc8CC3x13y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y63efgEv,_ZTv0_n12_N3ccc8CC3x13y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y63abcEv,_ZTv0_n20_N3ccc8CC3x13y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y6E[] = {
  {&(_ZTVN3ccc8CC3x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y6E[];
static VTBL_ENTRY alt_thunk_names1689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y63abcEv,_ZTv0_n20_N3ccc8CC3x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y63abcEv,_ZThn4_N3ccc8CC3x13y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y63efgEv,_ZTv0_n12_N3ccc8CC3x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y63efgEv,_ZThn4_N3ccc8CC3x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y6E = {  "_ZN3ccc8CC3x13y6E", // class name
  bases__ZN3ccc8CC3x13y6E, 2,
  &(vtc__ZN3ccc8CC3x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1689,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y6  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD3x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x13y63efgEv
  ~DD3x13y6(); // tgen
  DD3x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y63abcEv");}
void  ccc::DD3x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y63efgEv");}
ccc::DD3x13y6 ::~DD3x13y6(){ note_dtor("_ZN3ccc8DD3x13y6E", this);} // tgen
ccc::DD3x13y6 ::DD3x13y6(){ note_ctor("_ZN3ccc8DD3x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y6E, buf);
    ::ccc::DD3x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y6E);
    dp->::ccc::DD3x13y6::~DD3x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y6E(Test__ZN3ccc8DD3x13y6E, "_ZN3ccc8DD3x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y6C1Ev();
extern void _ZN3ccc8DD3x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y6E[] = {
  NSPAIR(_ZN3ccc8DD3x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y6E[];
extern void _ZN3ccc8DD3x13y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y63efgEv,_ZTv0_n12_N3ccc8DD3x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y63efgEv,_ZThn4_N3ccc8DD3x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y63efgEv,_ZTv0_n12_N3ccc8DD3x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y6E[] = {
  {&(_ZTVN3ccc8DD3x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y6E[];
static VTBL_ENTRY alt_thunk_names1690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y63efgEv,_ZTv0_n12_N3ccc8DD3x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y63efgEv,_ZThn4_N3ccc8DD3x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y6E = {  "_ZN3ccc8DD3x13y6E", // class name
  bases__ZN3ccc8DD3x13y6E, 2,
  &(vtc__ZN3ccc8DD3x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1690,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y7  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y73pqrEv
  ~CC3x13y7(); // tgen
  CC3x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y7E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y73abcEv");}
void  ccc::CC3x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y73pqrEv");}
ccc::CC3x13y7 ::~CC3x13y7(){ note_dtor("_ZN3ccc8CC3x13y7E", this);} // tgen
ccc::CC3x13y7 ::CC3x13y7(){ note_ctor("_ZN3ccc8CC3x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y7E, buf);
    ::ccc::CC3x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y7E);
    dp->::ccc::CC3x13y7::~CC3x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y7E(Test__ZN3ccc8CC3x13y7E, "_ZN3ccc8CC3x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y7C1Ev();
extern void _ZN3ccc8CC3x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y7E[] = {
  NSPAIR(_ZN3ccc8CC3x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC3x13y73abcEv();
extern void _ZN3ccc8CC3x13y73pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y73pqrEv,_ZTv0_n16_N3ccc8CC3x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y73pqrEv,_ZThn4_N3ccc8CC3x13y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y73abcEv,_ZTv0_n20_N3ccc8CC3x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y73abcEv,_ZThn4_N3ccc8CC3x13y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y73pqrEv,_ZTv0_n16_N3ccc8CC3x13y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y73abcEv,_ZTv0_n20_N3ccc8CC3x13y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y7E[] = {
  {&(_ZTVN3ccc8CC3x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y7E[];
static VTBL_ENTRY alt_thunk_names1691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y73abcEv,_ZTv0_n20_N3ccc8CC3x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y73abcEv,_ZThn4_N3ccc8CC3x13y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y73pqrEv,_ZTv0_n16_N3ccc8CC3x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y73pqrEv,_ZThn4_N3ccc8CC3x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y7E = {  "_ZN3ccc8CC3x13y7E", // class name
  bases__ZN3ccc8CC3x13y7E, 2,
  &(vtc__ZN3ccc8CC3x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1691,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y7  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD3x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y73pqrEv
  ~DD3x13y7(); // tgen
  DD3x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y73abcEv");}
void  ccc::DD3x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y73pqrEv");}
ccc::DD3x13y7 ::~DD3x13y7(){ note_dtor("_ZN3ccc8DD3x13y7E", this);} // tgen
ccc::DD3x13y7 ::DD3x13y7(){ note_ctor("_ZN3ccc8DD3x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y7E, buf);
    ::ccc::DD3x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y7E);
    dp->::ccc::DD3x13y7::~DD3x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y7E(Test__ZN3ccc8DD3x13y7E, "_ZN3ccc8DD3x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y7C1Ev();
extern void _ZN3ccc8DD3x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y7E[] = {
  NSPAIR(_ZN3ccc8DD3x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x13y73pqrEv();
extern void _ZN3ccc8DD3x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y73abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y7E[] = {
  {&(_ZTVN3ccc8DD3x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y7E[];
Class_Descriptor cd__ZN3ccc8DD3x13y7E = {  "_ZN3ccc8DD3x13y7E", // class name
  bases__ZN3ccc8DD3x13y7E, 2,
  &(vtc__ZN3ccc8DD3x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y8  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y83abcEv
  ~CC3x13y8(); // tgen
  CC3x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y8E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y83efgEv");}
void  ccc::CC3x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y83abcEv");}
ccc::CC3x13y8 ::~CC3x13y8(){ note_dtor("_ZN3ccc8CC3x13y8E", this);} // tgen
ccc::CC3x13y8 ::CC3x13y8(){ note_ctor("_ZN3ccc8CC3x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y8E, buf);
    ::ccc::CC3x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y8E);
    dp->::ccc::CC3x13y8::~CC3x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y8E(Test__ZN3ccc8CC3x13y8E, "_ZN3ccc8CC3x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y8C1Ev();
extern void _ZN3ccc8CC3x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y8E[] = {
  NSPAIR(_ZN3ccc8CC3x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y8E[];
extern void _ZN3ccc8CC3x13y83efgEv();
extern void _ZN3ccc8CC3x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y83efgEv,_ZTv0_n12_N3ccc8CC3x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y83efgEv,_ZThn4_N3ccc8CC3x13y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x13y83abcEv,_ZTv0_n20_N3ccc8CC3x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y83abcEv,_ZThn4_N3ccc8CC3x13y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y83efgEv,_ZTv0_n12_N3ccc8CC3x13y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x13y83abcEv,_ZTv0_n20_N3ccc8CC3x13y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y8E[] = {
  {&(_ZTVN3ccc8CC3x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y8E[];
static VTBL_ENTRY alt_thunk_names1692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x13y83abcEv,_ZTv0_n20_N3ccc8CC3x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y83abcEv,_ZThn4_N3ccc8CC3x13y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y83efgEv,_ZTv0_n12_N3ccc8CC3x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y83efgEv,_ZThn4_N3ccc8CC3x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y8E = {  "_ZN3ccc8CC3x13y8E", // class name
  bases__ZN3ccc8CC3x13y8E, 2,
  &(vtc__ZN3ccc8CC3x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1692,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y8  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD3x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x13y83abcEv
  ~DD3x13y8(); // tgen
  DD3x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y83efgEv");}
void  ccc::DD3x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x13y83abcEv");}
ccc::DD3x13y8 ::~DD3x13y8(){ note_dtor("_ZN3ccc8DD3x13y8E", this);} // tgen
ccc::DD3x13y8 ::DD3x13y8(){ note_ctor("_ZN3ccc8DD3x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y8E, buf);
    ::ccc::DD3x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y8E);
    dp->::ccc::DD3x13y8::~DD3x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y8E(Test__ZN3ccc8DD3x13y8E, "_ZN3ccc8DD3x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y8C1Ev();
extern void _ZN3ccc8DD3x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y8E[] = {
  NSPAIR(_ZN3ccc8DD3x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y8E[];
extern void _ZN3ccc8DD3x13y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y83efgEv,_ZTv0_n12_N3ccc8DD3x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y83efgEv,_ZThn4_N3ccc8DD3x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y83efgEv,_ZTv0_n12_N3ccc8DD3x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y8E[] = {
  {&(_ZTVN3ccc8DD3x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y8E[];
static VTBL_ENTRY alt_thunk_names1693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y83efgEv,_ZTv0_n12_N3ccc8DD3x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y83efgEv,_ZThn4_N3ccc8DD3x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y8E = {  "_ZN3ccc8DD3x13y8E", // class name
  bases__ZN3ccc8DD3x13y8E, 2,
  &(vtc__ZN3ccc8DD3x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1693,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y9  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y93pqrEv
  ~CC3x13y9(); // tgen
  CC3x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y9E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y93efgEv");}
void  ccc::CC3x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y93pqrEv");}
ccc::CC3x13y9 ::~CC3x13y9(){ note_dtor("_ZN3ccc8CC3x13y9E", this);} // tgen
ccc::CC3x13y9 ::CC3x13y9(){ note_ctor("_ZN3ccc8CC3x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y9E, buf);
    ::ccc::CC3x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC3x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y9E);
    dp->::ccc::CC3x13y9::~CC3x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y9E(Test__ZN3ccc8CC3x13y9E, "_ZN3ccc8CC3x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y9C1Ev();
extern void _ZN3ccc8CC3x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y9E[] = {
  NSPAIR(_ZN3ccc8CC3x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y9E[];
extern void _ZN3ccc8CC3x13y93efgEv();
extern void _ZN3ccc8CC3x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x13y93efgEv,_ZTv0_n12_N3ccc8CC3x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y93efgEv,_ZThn4_N3ccc8CC3x13y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x13y93pqrEv,_ZTv0_n16_N3ccc8CC3x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y93pqrEv,_ZThn4_N3ccc8CC3x13y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x13y93efgEv,_ZTv0_n12_N3ccc8CC3x13y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x13y93pqrEv,_ZTv0_n16_N3ccc8CC3x13y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x13y9E[] = {
  {&(_ZTVN3ccc8CC3x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x13y9E[];
static VTBL_ENTRY alt_thunk_names1694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x13y93pqrEv,_ZTv0_n16_N3ccc8CC3x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y93pqrEv,_ZThn4_N3ccc8CC3x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x13y93efgEv,_ZTv0_n12_N3ccc8CC3x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x13y93efgEv,_ZThn4_N3ccc8CC3x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x13y9E = {  "_ZN3ccc8CC3x13y9E", // class name
  bases__ZN3ccc8CC3x13y9E, 2,
  &(vtc__ZN3ccc8CC3x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x13y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1694,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y9  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD3x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x13y93pqrEv
  ~DD3x13y9(); // tgen
  DD3x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x13y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x13y93efgEv");}
void  ccc::DD3x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x13y93pqrEv");}
ccc::DD3x13y9 ::~DD3x13y9(){ note_dtor("_ZN3ccc8DD3x13y9E", this);} // tgen
ccc::DD3x13y9 ::DD3x13y9(){ note_ctor("_ZN3ccc8DD3x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x13y9E, buf);
    ::ccc::DD3x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x13y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD3x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x13y9E);
    dp->::ccc::DD3x13y9::~DD3x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x13y9E(Test__ZN3ccc8DD3x13y9E, "_ZN3ccc8DD3x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x13y9C1Ev();
extern void _ZN3ccc8DD3x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x13y9E[] = {
  NSPAIR(_ZN3ccc8DD3x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD3x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y9E[];
extern void _ZN3ccc8DD3x13y93efgEv();
extern void _ZN3ccc8DD3x13y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x13y93efgEv,_ZTv0_n12_N3ccc8DD3x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x13y93efgEv,_ZThn4_N3ccc8DD3x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x13y93efgEv,_ZTv0_n12_N3ccc8DD3x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x13y9E[] = {
  {&(_ZTVN3ccc8DD3x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x13y9E[];
static VTBL_ENTRY alt_thunk_names1695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x13y93efgEv,_ZTv0_n12_N3ccc8DD3x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x13y93efgEv,_ZThn4_N3ccc8DD3x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x13y9E = {  "_ZN3ccc8DD3x13y9E", // class name
  bases__ZN3ccc8DD3x13y9E, 2,
  &(vtc__ZN3ccc8DD3x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x13y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1695,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y10  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x13y103abcEv
  ~CC3x13y10(); // tgen
  CC3x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y10E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y103pqrEv");}
void  ccc::CC3x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x13y103abcEv");}
ccc::CC3x13y10 ::~CC3x13y10(){ note_dtor("_ZN3ccc9CC3x13y10E", this);} // tgen
ccc::CC3x13y10 ::CC3x13y10(){ note_ctor("_ZN3ccc9CC3x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y10E, buf);
    ::ccc::CC3x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y10E);
    dp->::ccc::CC3x13y10::~CC3x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y10E(Test__ZN3ccc9CC3x13y10E, "_ZN3ccc9CC3x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y10C1Ev();
extern void _ZN3ccc9CC3x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y10E[] = {
  NSPAIR(_ZN3ccc9CC3x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC3x13y103pqrEv();
extern void _ZN3ccc9CC3x13y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x13y103pqrEv,_ZTv0_n16_N3ccc9CC3x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y103pqrEv,_ZThn4_N3ccc9CC3x13y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x13y103abcEv,_ZTv0_n20_N3ccc9CC3x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y103abcEv,_ZThn4_N3ccc9CC3x13y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x13y103pqrEv,_ZTv0_n16_N3ccc9CC3x13y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x13y103abcEv,_ZTv0_n20_N3ccc9CC3x13y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y10E[] = {
  {&(_ZTVN3ccc9CC3x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC3x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y10E[];
static VTBL_ENTRY alt_thunk_names1696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x13y103abcEv,_ZTv0_n20_N3ccc9CC3x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y103abcEv,_ZThn4_N3ccc9CC3x13y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x13y103pqrEv,_ZTv0_n16_N3ccc9CC3x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y103pqrEv,_ZThn4_N3ccc9CC3x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x13y10E = {  "_ZN3ccc9CC3x13y10E", // class name
  bases__ZN3ccc9CC3x13y10E, 2,
  &(vtc__ZN3ccc9CC3x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1696,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y10  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD3x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x13y103abcEv
  ~DD3x13y10(); // tgen
  DD3x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x13y103pqrEv");}
void  ccc::DD3x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x13y103abcEv");}
ccc::DD3x13y10 ::~DD3x13y10(){ note_dtor("_ZN3ccc9DD3x13y10E", this);} // tgen
ccc::DD3x13y10 ::DD3x13y10(){ note_ctor("_ZN3ccc9DD3x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y10E, buf);
    ::ccc::DD3x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y10E);
    dp->::ccc::DD3x13y10::~DD3x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y10E(Test__ZN3ccc9DD3x13y10E, "_ZN3ccc9DD3x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y10C1Ev();
extern void _ZN3ccc9DD3x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y10E[] = {
  NSPAIR(_ZN3ccc9DD3x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x13y103pqrEv();
extern void _ZN3ccc9DD3x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y10E[] = {
  {&(_ZTVN3ccc9DD3x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y10E[];
Class_Descriptor cd__ZN3ccc9DD3x13y10E = {  "_ZN3ccc9DD3x13y10E", // class name
  bases__ZN3ccc9DD3x13y10E, 2,
  &(vtc__ZN3ccc9DD3x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y11  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x13y113efgEv
  ~CC3x13y11(); // tgen
  CC3x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y11E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y113pqrEv");}
void  ccc::CC3x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x13y113efgEv");}
ccc::CC3x13y11 ::~CC3x13y11(){ note_dtor("_ZN3ccc9CC3x13y11E", this);} // tgen
ccc::CC3x13y11 ::CC3x13y11(){ note_ctor("_ZN3ccc9CC3x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y11E, buf);
    ::ccc::CC3x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y11E);
    dp->::ccc::CC3x13y11::~CC3x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y11E(Test__ZN3ccc9CC3x13y11E, "_ZN3ccc9CC3x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y11C1Ev();
extern void _ZN3ccc9CC3x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y11E[] = {
  NSPAIR(_ZN3ccc9CC3x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y11E[];
extern void _ZN3ccc9CC3x13y113efgEv();
extern void _ZN3ccc9CC3x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x13y113efgEv,_ZTv0_n12_N3ccc9CC3x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y113efgEv,_ZThn4_N3ccc9CC3x13y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x13y113pqrEv,_ZTv0_n16_N3ccc9CC3x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y113pqrEv,_ZThn4_N3ccc9CC3x13y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x13y113efgEv,_ZTv0_n12_N3ccc9CC3x13y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x13y113pqrEv,_ZTv0_n16_N3ccc9CC3x13y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y11E[] = {
  {&(_ZTVN3ccc9CC3x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y11E[];
static VTBL_ENTRY alt_thunk_names1697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x13y113pqrEv,_ZTv0_n16_N3ccc9CC3x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y113pqrEv,_ZThn4_N3ccc9CC3x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x13y113efgEv,_ZTv0_n12_N3ccc9CC3x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y113efgEv,_ZThn4_N3ccc9CC3x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x13y11E = {  "_ZN3ccc9CC3x13y11E", // class name
  bases__ZN3ccc9CC3x13y11E, 2,
  &(vtc__ZN3ccc9CC3x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1697,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y11  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD3x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x13y113efgEv
  ~DD3x13y11(); // tgen
  DD3x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x13y113pqrEv");}
void  ccc::DD3x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x13y113efgEv");}
ccc::DD3x13y11 ::~DD3x13y11(){ note_dtor("_ZN3ccc9DD3x13y11E", this);} // tgen
ccc::DD3x13y11 ::DD3x13y11(){ note_ctor("_ZN3ccc9DD3x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y11E, buf);
    ::ccc::DD3x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y11E);
    dp->::ccc::DD3x13y11::~DD3x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y11E(Test__ZN3ccc9DD3x13y11E, "_ZN3ccc9DD3x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y11C1Ev();
extern void _ZN3ccc9DD3x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y11E[] = {
  NSPAIR(_ZN3ccc9DD3x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y11E[];
extern void _ZN3ccc9DD3x13y113efgEv();
extern void _ZN3ccc9DD3x13y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x13y113efgEv,_ZTv0_n12_N3ccc9DD3x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x13y113efgEv,_ZThn4_N3ccc9DD3x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x13y113efgEv,_ZTv0_n12_N3ccc9DD3x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y11E[] = {
  {&(_ZTVN3ccc9DD3x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y11E[];
static VTBL_ENTRY alt_thunk_names1698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x13y113efgEv,_ZTv0_n12_N3ccc9DD3x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x13y113efgEv,_ZThn4_N3ccc9DD3x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x13y11E = {  "_ZN3ccc9DD3x13y11E", // class name
  bases__ZN3ccc9DD3x13y11E, 2,
  &(vtc__ZN3ccc9DD3x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1698,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y12  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC3x13y123abcEv
  ~CC3x13y12(); // tgen
  CC3x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x13y123abcEv");}
ccc::CC3x13y12 ::~CC3x13y12(){ note_dtor("_ZN3ccc9CC3x13y12E", this);} // tgen
ccc::CC3x13y12 ::CC3x13y12(){ note_ctor("_ZN3ccc9CC3x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y12E, buf);
    ::ccc::CC3x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y12E);
    dp->::ccc::CC3x13y12::~CC3x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y12E(Test__ZN3ccc9CC3x13y12E, "_ZN3ccc9CC3x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y12C1Ev();
extern void _ZN3ccc9CC3x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y12E[] = {
  NSPAIR(_ZN3ccc9CC3x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC3x13y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x13y123abcEv,_ZTv0_n20_N3ccc9CC3x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y123abcEv,_ZThn4_N3ccc9CC3x13y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x13y123abcEv,_ZTv0_n20_N3ccc9CC3x13y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y12E[] = {
  {&(_ZTVN3ccc9CC3x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y12E[];
static VTBL_ENTRY alt_thunk_names1699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x13y123abcEv,_ZTv0_n20_N3ccc9CC3x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y123abcEv,_ZThn4_N3ccc9CC3x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x13y12E = {  "_ZN3ccc9CC3x13y12E", // class name
  bases__ZN3ccc9CC3x13y12E, 2,
  &(vtc__ZN3ccc9CC3x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1699,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y12  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD3x13y123abcEv
  ~DD3x13y12(); // tgen
  DD3x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x13y123abcEv");}
ccc::DD3x13y12 ::~DD3x13y12(){ note_dtor("_ZN3ccc9DD3x13y12E", this);} // tgen
ccc::DD3x13y12 ::DD3x13y12(){ note_ctor("_ZN3ccc9DD3x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y12E, buf);
    ::ccc::DD3x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y12E);
    dp->::ccc::DD3x13y12::~DD3x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y12E(Test__ZN3ccc9DD3x13y12E, "_ZN3ccc9DD3x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y12C1Ev();
extern void _ZN3ccc9DD3x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y12E[] = {
  NSPAIR(_ZN3ccc9DD3x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y12E[] = {
  {&(_ZTVN3ccc9DD3x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y12E[];
Class_Descriptor cd__ZN3ccc9DD3x13y12E = {  "_ZN3ccc9DD3x13y12E", // class name
  bases__ZN3ccc9DD3x13y12E, 2,
  &(vtc__ZN3ccc9DD3x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y13  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC3x13y133efgEv
  ~CC3x13y13(); // tgen
  CC3x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y13E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x13y133efgEv");}
ccc::CC3x13y13 ::~CC3x13y13(){ note_dtor("_ZN3ccc9CC3x13y13E", this);} // tgen
ccc::CC3x13y13 ::CC3x13y13(){ note_ctor("_ZN3ccc9CC3x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y13E, buf);
    ::ccc::CC3x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y13E);
    dp->::ccc::CC3x13y13::~CC3x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y13E(Test__ZN3ccc9CC3x13y13E, "_ZN3ccc9CC3x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y13C1Ev();
extern void _ZN3ccc9CC3x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y13E[] = {
  NSPAIR(_ZN3ccc9CC3x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y13E[];
extern void _ZN3ccc9CC3x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x13y133efgEv,_ZTv0_n12_N3ccc9CC3x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y133efgEv,_ZThn4_N3ccc9CC3x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x13y133efgEv,_ZTv0_n12_N3ccc9CC3x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y13E[] = {
  {&(_ZTVN3ccc9CC3x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y13E[];
static VTBL_ENTRY alt_thunk_names1700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x13y133efgEv,_ZTv0_n12_N3ccc9CC3x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y133efgEv,_ZThn4_N3ccc9CC3x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x13y13E = {  "_ZN3ccc9CC3x13y13E", // class name
  bases__ZN3ccc9CC3x13y13E, 2,
  &(vtc__ZN3ccc9CC3x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1700,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y13  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD3x13y133efgEv
  ~DD3x13y13(); // tgen
  DD3x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD3x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x13y133efgEv");}
ccc::DD3x13y13 ::~DD3x13y13(){ note_dtor("_ZN3ccc9DD3x13y13E", this);} // tgen
ccc::DD3x13y13 ::DD3x13y13(){ note_ctor("_ZN3ccc9DD3x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y13E, buf);
    ::ccc::DD3x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y13E);
    dp->::ccc::DD3x13y13::~DD3x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y13E(Test__ZN3ccc9DD3x13y13E, "_ZN3ccc9DD3x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y13C1Ev();
extern void _ZN3ccc9DD3x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y13E[] = {
  NSPAIR(_ZN3ccc9DD3x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y13E[];
extern void _ZN3ccc9DD3x13y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x13y133efgEv,_ZTv0_n12_N3ccc9DD3x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x13y133efgEv,_ZThn4_N3ccc9DD3x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x13y133efgEv,_ZTv0_n12_N3ccc9DD3x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y13E[] = {
  {&(_ZTVN3ccc9DD3x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y13E[];
static VTBL_ENTRY alt_thunk_names1701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x13y133efgEv,_ZTv0_n12_N3ccc9DD3x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x13y133efgEv,_ZThn4_N3ccc9DD3x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x13y13E = {  "_ZN3ccc9DD3x13y13E", // class name
  bases__ZN3ccc9DD3x13y13E, 2,
  &(vtc__ZN3ccc9DD3x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1701,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y14  : virtual ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y143pqrEv
  ~CC3x13y14(); // tgen
  CC3x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y14E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y143pqrEv");}
ccc::CC3x13y14 ::~CC3x13y14(){ note_dtor("_ZN3ccc9CC3x13y14E", this);} // tgen
ccc::CC3x13y14 ::CC3x13y14(){ note_ctor("_ZN3ccc9CC3x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y14E, buf);
    ::ccc::CC3x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y14E);
    dp->::ccc::CC3x13y14::~CC3x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y14E(Test__ZN3ccc9CC3x13y14E, "_ZN3ccc9CC3x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y14C1Ev();
extern void _ZN3ccc9CC3x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y14E[] = {
  NSPAIR(_ZN3ccc9CC3x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC3x13y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x13y143pqrEv,_ZTv0_n16_N3ccc9CC3x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y143pqrEv,_ZThn4_N3ccc9CC3x13y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x13y143pqrEv,_ZTv0_n16_N3ccc9CC3x13y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y14E[] = {
  {&(_ZTVN3ccc9CC3x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y14E[];
static VTBL_ENTRY alt_thunk_names1702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x13y143pqrEv,_ZTv0_n16_N3ccc9CC3x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x13y143pqrEv,_ZThn4_N3ccc9CC3x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x13y14E = {  "_ZN3ccc9CC3x13y14E", // class name
  bases__ZN3ccc9CC3x13y14E, 2,
  &(vtc__ZN3ccc9CC3x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1702,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y14  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD3x13y143pqrEv
  ~DD3x13y14(); // tgen
  DD3x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x13y143pqrEv");}
ccc::DD3x13y14 ::~DD3x13y14(){ note_dtor("_ZN3ccc9DD3x13y14E", this);} // tgen
ccc::DD3x13y14 ::DD3x13y14(){ note_ctor("_ZN3ccc9DD3x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y14E, buf);
    ::ccc::DD3x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y14E);
    dp->::ccc::DD3x13y14::~DD3x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y14E(Test__ZN3ccc9DD3x13y14E, "_ZN3ccc9DD3x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y14C1Ev();
extern void _ZN3ccc9DD3x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y14E[] = {
  NSPAIR(_ZN3ccc9DD3x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x13y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y14E[] = {
  {&(_ZTVN3ccc9DD3x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y14E[];
Class_Descriptor cd__ZN3ccc9DD3x13y14E = {  "_ZN3ccc9DD3x13y14E", // class name
  bases__ZN3ccc9DD3x13y14E, 2,
  &(vtc__ZN3ccc9DD3x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y15  : virtual ::ccc::AA3 , ::ccc::BB13 {
  ~CC3x13y15(); // tgen
  CC3x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x13y15 ::~CC3x13y15(){ note_dtor("_ZN3ccc9CC3x13y15E", this);} // tgen
ccc::CC3x13y15 ::CC3x13y15(){ note_ctor("_ZN3ccc9CC3x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y15E, buf);
    ::ccc::CC3x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC3x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y15E);
    dp->::ccc::CC3x13y15::~CC3x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y15E(Test__ZN3ccc9CC3x13y15E, "_ZN3ccc9CC3x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y15C1Ev();
extern void _ZN3ccc9CC3x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y15E[] = {
  NSPAIR(_ZN3ccc9CC3x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x13y15E[] = {
  {&(_ZTVN3ccc9CC3x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x13y15E[];
Class_Descriptor cd__ZN3ccc9CC3x13y15E = {  "_ZN3ccc9CC3x13y15E", // class name
  bases__ZN3ccc9CC3x13y15E, 2,
  &(vtc__ZN3ccc9CC3x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x13y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x13y15  : virtual ::ccc::AA3 , virtual ::ccc::BB13 {
  ~DD3x13y15(); // tgen
  DD3x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD3x13y15 ::~DD3x13y15(){ note_dtor("_ZN3ccc9DD3x13y15E", this);} // tgen
ccc::DD3x13y15 ::DD3x13y15(){ note_ctor("_ZN3ccc9DD3x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x13y15E, buf);
    ::ccc::DD3x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x13y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD3x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x13y15E);
    dp->::ccc::DD3x13y15::~DD3x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x13y15E(Test__ZN3ccc9DD3x13y15E, "_ZN3ccc9DD3x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x13y15C1Ev();
extern void _ZN3ccc9DD3x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x13y15E[] = {
  NSPAIR(_ZN3ccc9DD3x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD3x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x13y15E[] = {
  {&(_ZTVN3ccc9DD3x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x13y15E[];
Class_Descriptor cd__ZN3ccc9DD3x13y15E = {  "_ZN3ccc9DD3x13y15E", // class name
  bases__ZN3ccc9DD3x13y15E, 2,
  &(vtc__ZN3ccc9DD3x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x13y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y0  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y03pqrEv
  ~CC3x14y0(); // tgen
  CC3x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y0E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y03abcEv");}
void  ccc::CC3x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y03efgEv");}
void  ccc::CC3x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y03pqrEv");}
ccc::CC3x14y0 ::~CC3x14y0(){ note_dtor("_ZN3ccc8CC3x14y0E", this);} // tgen
ccc::CC3x14y0 ::CC3x14y0(){ note_ctor("_ZN3ccc8CC3x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y0E, buf);
    ::ccc::CC3x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y0E);
    dp->::ccc::CC3x14y0::~CC3x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y0E(Test__ZN3ccc8CC3x14y0E, "_ZN3ccc8CC3x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y0C1Ev();
extern void _ZN3ccc8CC3x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y0E[] = {
  NSPAIR(_ZN3ccc8CC3x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y0E[];
extern void _ZN3ccc8CC3x14y03pqrEv();
extern void _ZN3ccc8CC3x14y03abcEv();
extern void _ZN3ccc8CC3x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y03efgEv,_ZTv0_n12_N3ccc8CC3x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y03efgEv,_ZThn4_N3ccc8CC3x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y03pqrEv,_ZTv0_n16_N3ccc8CC3x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y03pqrEv,_ZThn4_N3ccc8CC3x14y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y03abcEv,_ZTv0_n20_N3ccc8CC3x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y03abcEv,_ZThn4_N3ccc8CC3x14y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y03efgEv,_ZTv0_n12_N3ccc8CC3x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y03pqrEv,_ZTv0_n16_N3ccc8CC3x14y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y03abcEv,_ZTv0_n20_N3ccc8CC3x14y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y0E[] = {
  {&(_ZTVN3ccc8CC3x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y0E[];
static VTBL_ENTRY alt_thunk_names1703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y03abcEv,_ZTv0_n20_N3ccc8CC3x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y03abcEv,_ZThn4_N3ccc8CC3x14y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y03pqrEv,_ZTv0_n16_N3ccc8CC3x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y03pqrEv,_ZThn4_N3ccc8CC3x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y03efgEv,_ZTv0_n12_N3ccc8CC3x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y03efgEv,_ZThn4_N3ccc8CC3x14y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y0E = {  "_ZN3ccc8CC3x14y0E", // class name
  bases__ZN3ccc8CC3x14y0E, 2,
  &(vtc__ZN3ccc8CC3x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1703,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y0  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD3x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y03pqrEv
  ~DD3x14y0(); // tgen
  DD3x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y0E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y03abcEv");}
void  ccc::DD3x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y03efgEv");}
void  ccc::DD3x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y03pqrEv");}
ccc::DD3x14y0 ::~DD3x14y0(){ note_dtor("_ZN3ccc8DD3x14y0E", this);} // tgen
ccc::DD3x14y0 ::DD3x14y0(){ note_ctor("_ZN3ccc8DD3x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y0E, buf);
    ::ccc::DD3x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y0E);
    dp->::ccc::DD3x14y0::~DD3x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y0E(Test__ZN3ccc8DD3x14y0E, "_ZN3ccc8DD3x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y0C1Ev();
extern void _ZN3ccc8DD3x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y0E[] = {
  NSPAIR(_ZN3ccc8DD3x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y0E[];
extern void _ZN3ccc8DD3x14y03efgEv();
extern void _ZN3ccc8DD3x14y03pqrEv();
extern void _ZN3ccc8DD3x14y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y03pqrEv,_ZTv0_n12_N3ccc8DD3x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y03pqrEv,_ZThn4_N3ccc8DD3x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y03pqrEv,_ZTv0_n12_N3ccc8DD3x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y0E[] = {
  {&(_ZTVN3ccc8DD3x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y0E[];
static VTBL_ENTRY alt_thunk_names1704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y03pqrEv,_ZTv0_n12_N3ccc8DD3x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y03pqrEv,_ZThn4_N3ccc8DD3x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y0E = {  "_ZN3ccc8DD3x14y0E", // class name
  bases__ZN3ccc8DD3x14y0E, 2,
  &(vtc__ZN3ccc8DD3x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1704,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y1  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x14y13efgEv
  ~CC3x14y1(); // tgen
  CC3x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y1E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y13abcEv");}
void  ccc::CC3x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y13pqrEv");}
void  ccc::CC3x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y13efgEv");}
ccc::CC3x14y1 ::~CC3x14y1(){ note_dtor("_ZN3ccc8CC3x14y1E", this);} // tgen
ccc::CC3x14y1 ::CC3x14y1(){ note_ctor("_ZN3ccc8CC3x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y1E, buf);
    ::ccc::CC3x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y1E);
    dp->::ccc::CC3x14y1::~CC3x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y1E(Test__ZN3ccc8CC3x14y1E, "_ZN3ccc8CC3x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y1C1Ev();
extern void _ZN3ccc8CC3x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y1E[] = {
  NSPAIR(_ZN3ccc8CC3x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y1E[];
extern void _ZN3ccc8CC3x14y13pqrEv();
extern void _ZN3ccc8CC3x14y13abcEv();
extern void _ZN3ccc8CC3x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y13efgEv,_ZTv0_n12_N3ccc8CC3x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y13efgEv,_ZThn4_N3ccc8CC3x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y13pqrEv,_ZTv0_n16_N3ccc8CC3x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y13pqrEv,_ZThn4_N3ccc8CC3x14y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y13abcEv,_ZTv0_n20_N3ccc8CC3x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y13abcEv,_ZThn4_N3ccc8CC3x14y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y13efgEv,_ZTv0_n12_N3ccc8CC3x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y13pqrEv,_ZTv0_n16_N3ccc8CC3x14y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y13abcEv,_ZTv0_n20_N3ccc8CC3x14y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y1E[] = {
  {&(_ZTVN3ccc8CC3x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y1E[];
static VTBL_ENTRY alt_thunk_names1705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y13abcEv,_ZTv0_n20_N3ccc8CC3x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y13abcEv,_ZThn4_N3ccc8CC3x14y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y13pqrEv,_ZTv0_n16_N3ccc8CC3x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y13pqrEv,_ZThn4_N3ccc8CC3x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y13efgEv,_ZTv0_n12_N3ccc8CC3x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y13efgEv,_ZThn4_N3ccc8CC3x14y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y1E = {  "_ZN3ccc8CC3x14y1E", // class name
  bases__ZN3ccc8CC3x14y1E, 2,
  &(vtc__ZN3ccc8CC3x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1705,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y1  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD3x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x14y13efgEv
  ~DD3x14y1(); // tgen
  DD3x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y1E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y13abcEv");}
void  ccc::DD3x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y13pqrEv");}
void  ccc::DD3x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y13efgEv");}
ccc::DD3x14y1 ::~DD3x14y1(){ note_dtor("_ZN3ccc8DD3x14y1E", this);} // tgen
ccc::DD3x14y1 ::DD3x14y1(){ note_ctor("_ZN3ccc8DD3x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y1E, buf);
    ::ccc::DD3x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y1E);
    dp->::ccc::DD3x14y1::~DD3x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y1E(Test__ZN3ccc8DD3x14y1E, "_ZN3ccc8DD3x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y1C1Ev();
extern void _ZN3ccc8DD3x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y1E[] = {
  NSPAIR(_ZN3ccc8DD3x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y1E[];
extern void _ZN3ccc8DD3x14y13efgEv();
extern void _ZN3ccc8DD3x14y13pqrEv();
extern void _ZN3ccc8DD3x14y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y13pqrEv,_ZTv0_n12_N3ccc8DD3x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y13pqrEv,_ZThn4_N3ccc8DD3x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y13pqrEv,_ZTv0_n12_N3ccc8DD3x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y1E[] = {
  {&(_ZTVN3ccc8DD3x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y1E[];
static VTBL_ENTRY alt_thunk_names1706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y13pqrEv,_ZTv0_n12_N3ccc8DD3x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y13pqrEv,_ZThn4_N3ccc8DD3x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y1E = {  "_ZN3ccc8DD3x14y1E", // class name
  bases__ZN3ccc8DD3x14y1E, 2,
  &(vtc__ZN3ccc8DD3x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1706,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y2  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y23pqrEv
  ~CC3x14y2(); // tgen
  CC3x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y2E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y23efgEv");}
void  ccc::CC3x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y23abcEv");}
void  ccc::CC3x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y23pqrEv");}
ccc::CC3x14y2 ::~CC3x14y2(){ note_dtor("_ZN3ccc8CC3x14y2E", this);} // tgen
ccc::CC3x14y2 ::CC3x14y2(){ note_ctor("_ZN3ccc8CC3x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y2E, buf);
    ::ccc::CC3x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y2E);
    dp->::ccc::CC3x14y2::~CC3x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y2E(Test__ZN3ccc8CC3x14y2E, "_ZN3ccc8CC3x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y2C1Ev();
extern void _ZN3ccc8CC3x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y2E[] = {
  NSPAIR(_ZN3ccc8CC3x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y2E[];
extern void _ZN3ccc8CC3x14y23pqrEv();
extern void _ZN3ccc8CC3x14y23efgEv();
extern void _ZN3ccc8CC3x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y23efgEv,_ZTv0_n12_N3ccc8CC3x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y23efgEv,_ZThn4_N3ccc8CC3x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y23pqrEv,_ZTv0_n16_N3ccc8CC3x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y23pqrEv,_ZThn4_N3ccc8CC3x14y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y23abcEv,_ZTv0_n20_N3ccc8CC3x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y23abcEv,_ZThn4_N3ccc8CC3x14y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y23efgEv,_ZTv0_n12_N3ccc8CC3x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y23pqrEv,_ZTv0_n16_N3ccc8CC3x14y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y23abcEv,_ZTv0_n20_N3ccc8CC3x14y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y2E[] = {
  {&(_ZTVN3ccc8CC3x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y2E[];
static VTBL_ENTRY alt_thunk_names1707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y23abcEv,_ZTv0_n20_N3ccc8CC3x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y23abcEv,_ZThn4_N3ccc8CC3x14y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y23pqrEv,_ZTv0_n16_N3ccc8CC3x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y23pqrEv,_ZThn4_N3ccc8CC3x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y23efgEv,_ZTv0_n12_N3ccc8CC3x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y23efgEv,_ZThn4_N3ccc8CC3x14y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y2E = {  "_ZN3ccc8CC3x14y2E", // class name
  bases__ZN3ccc8CC3x14y2E, 2,
  &(vtc__ZN3ccc8CC3x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1707,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y2  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD3x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y23pqrEv
  ~DD3x14y2(); // tgen
  DD3x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y2E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y23efgEv");}
void  ccc::DD3x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y23abcEv");}
void  ccc::DD3x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y23pqrEv");}
ccc::DD3x14y2 ::~DD3x14y2(){ note_dtor("_ZN3ccc8DD3x14y2E", this);} // tgen
ccc::DD3x14y2 ::DD3x14y2(){ note_ctor("_ZN3ccc8DD3x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y2E, buf);
    ::ccc::DD3x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y2E);
    dp->::ccc::DD3x14y2::~DD3x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y2E(Test__ZN3ccc8DD3x14y2E, "_ZN3ccc8DD3x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y2C1Ev();
extern void _ZN3ccc8DD3x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y2E[] = {
  NSPAIR(_ZN3ccc8DD3x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y2E[];
extern void _ZN3ccc8DD3x14y23efgEv();
extern void _ZN3ccc8DD3x14y23pqrEv();
extern void _ZN3ccc8DD3x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y23pqrEv,_ZTv0_n12_N3ccc8DD3x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y23pqrEv,_ZThn4_N3ccc8DD3x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y23pqrEv,_ZTv0_n12_N3ccc8DD3x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y2E[] = {
  {&(_ZTVN3ccc8DD3x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y2E[];
static VTBL_ENTRY alt_thunk_names1708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y23pqrEv,_ZTv0_n12_N3ccc8DD3x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y23pqrEv,_ZThn4_N3ccc8DD3x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y2E = {  "_ZN3ccc8DD3x14y2E", // class name
  bases__ZN3ccc8DD3x14y2E, 2,
  &(vtc__ZN3ccc8DD3x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1708,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y3  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x14y33abcEv
  ~CC3x14y3(); // tgen
  CC3x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y3E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y33efgEv");}
void  ccc::CC3x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y33pqrEv");}
void  ccc::CC3x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y33abcEv");}
ccc::CC3x14y3 ::~CC3x14y3(){ note_dtor("_ZN3ccc8CC3x14y3E", this);} // tgen
ccc::CC3x14y3 ::CC3x14y3(){ note_ctor("_ZN3ccc8CC3x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y3E, buf);
    ::ccc::CC3x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y3E);
    dp->::ccc::CC3x14y3::~CC3x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y3E(Test__ZN3ccc8CC3x14y3E, "_ZN3ccc8CC3x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y3C1Ev();
extern void _ZN3ccc8CC3x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y3E[] = {
  NSPAIR(_ZN3ccc8CC3x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y3E[];
extern void _ZN3ccc8CC3x14y33pqrEv();
extern void _ZN3ccc8CC3x14y33efgEv();
extern void _ZN3ccc8CC3x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y33efgEv,_ZTv0_n12_N3ccc8CC3x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y33efgEv,_ZThn4_N3ccc8CC3x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y33pqrEv,_ZTv0_n16_N3ccc8CC3x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y33pqrEv,_ZThn4_N3ccc8CC3x14y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y33abcEv,_ZTv0_n20_N3ccc8CC3x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y33abcEv,_ZThn4_N3ccc8CC3x14y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y33efgEv,_ZTv0_n12_N3ccc8CC3x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y33pqrEv,_ZTv0_n16_N3ccc8CC3x14y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y33abcEv,_ZTv0_n20_N3ccc8CC3x14y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y3E[] = {
  {&(_ZTVN3ccc8CC3x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y3E[];
static VTBL_ENTRY alt_thunk_names1709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y33abcEv,_ZTv0_n20_N3ccc8CC3x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y33abcEv,_ZThn4_N3ccc8CC3x14y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y33pqrEv,_ZTv0_n16_N3ccc8CC3x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y33pqrEv,_ZThn4_N3ccc8CC3x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y33efgEv,_ZTv0_n12_N3ccc8CC3x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y33efgEv,_ZThn4_N3ccc8CC3x14y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y3E = {  "_ZN3ccc8CC3x14y3E", // class name
  bases__ZN3ccc8CC3x14y3E, 2,
  &(vtc__ZN3ccc8CC3x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1709,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y3  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD3x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x14y33abcEv
  ~DD3x14y3(); // tgen
  DD3x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y3E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y33efgEv");}
void  ccc::DD3x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y33pqrEv");}
void  ccc::DD3x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y33abcEv");}
ccc::DD3x14y3 ::~DD3x14y3(){ note_dtor("_ZN3ccc8DD3x14y3E", this);} // tgen
ccc::DD3x14y3 ::DD3x14y3(){ note_ctor("_ZN3ccc8DD3x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y3E, buf);
    ::ccc::DD3x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y3E);
    dp->::ccc::DD3x14y3::~DD3x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y3E(Test__ZN3ccc8DD3x14y3E, "_ZN3ccc8DD3x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y3C1Ev();
extern void _ZN3ccc8DD3x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y3E[] = {
  NSPAIR(_ZN3ccc8DD3x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y3E[];
extern void _ZN3ccc8DD3x14y33efgEv();
extern void _ZN3ccc8DD3x14y33pqrEv();
extern void _ZN3ccc8DD3x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y33pqrEv,_ZTv0_n12_N3ccc8DD3x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y33pqrEv,_ZThn4_N3ccc8DD3x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y33pqrEv,_ZTv0_n12_N3ccc8DD3x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y3E[] = {
  {&(_ZTVN3ccc8DD3x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y3E[];
static VTBL_ENTRY alt_thunk_names1710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y33pqrEv,_ZTv0_n12_N3ccc8DD3x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y33pqrEv,_ZThn4_N3ccc8DD3x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y3E = {  "_ZN3ccc8DD3x14y3E", // class name
  bases__ZN3ccc8DD3x14y3E, 2,
  &(vtc__ZN3ccc8DD3x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1710,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y4  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC3x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y43efgEv
  ~CC3x14y4(); // tgen
  CC3x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y4E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y43pqrEv");}
void  ccc::CC3x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y43abcEv");}
void  ccc::CC3x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y43efgEv");}
ccc::CC3x14y4 ::~CC3x14y4(){ note_dtor("_ZN3ccc8CC3x14y4E", this);} // tgen
ccc::CC3x14y4 ::CC3x14y4(){ note_ctor("_ZN3ccc8CC3x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y4E, buf);
    ::ccc::CC3x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y4E);
    dp->::ccc::CC3x14y4::~CC3x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y4E(Test__ZN3ccc8CC3x14y4E, "_ZN3ccc8CC3x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y4C1Ev();
extern void _ZN3ccc8CC3x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y4E[] = {
  NSPAIR(_ZN3ccc8CC3x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y4E[];
extern void _ZN3ccc8CC3x14y43pqrEv();
extern void _ZN3ccc8CC3x14y43abcEv();
extern void _ZN3ccc8CC3x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y43efgEv,_ZTv0_n12_N3ccc8CC3x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y43efgEv,_ZThn4_N3ccc8CC3x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y43pqrEv,_ZTv0_n16_N3ccc8CC3x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y43pqrEv,_ZThn4_N3ccc8CC3x14y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y43abcEv,_ZTv0_n20_N3ccc8CC3x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y43abcEv,_ZThn4_N3ccc8CC3x14y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y43efgEv,_ZTv0_n12_N3ccc8CC3x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y43pqrEv,_ZTv0_n16_N3ccc8CC3x14y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y43abcEv,_ZTv0_n20_N3ccc8CC3x14y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y4E[] = {
  {&(_ZTVN3ccc8CC3x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y4E[];
static VTBL_ENTRY alt_thunk_names1711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y43abcEv,_ZTv0_n20_N3ccc8CC3x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y43abcEv,_ZThn4_N3ccc8CC3x14y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y43pqrEv,_ZTv0_n16_N3ccc8CC3x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y43pqrEv,_ZThn4_N3ccc8CC3x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y43efgEv,_ZTv0_n12_N3ccc8CC3x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y43efgEv,_ZThn4_N3ccc8CC3x14y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y4E = {  "_ZN3ccc8CC3x14y4E", // class name
  bases__ZN3ccc8CC3x14y4E, 2,
  &(vtc__ZN3ccc8CC3x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1711,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y4  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD3x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x14y43efgEv
  ~DD3x14y4(); // tgen
  DD3x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y4E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y43pqrEv");}
void  ccc::DD3x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y43abcEv");}
void  ccc::DD3x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y43efgEv");}
ccc::DD3x14y4 ::~DD3x14y4(){ note_dtor("_ZN3ccc8DD3x14y4E", this);} // tgen
ccc::DD3x14y4 ::DD3x14y4(){ note_ctor("_ZN3ccc8DD3x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y4E, buf);
    ::ccc::DD3x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y4E);
    dp->::ccc::DD3x14y4::~DD3x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y4E(Test__ZN3ccc8DD3x14y4E, "_ZN3ccc8DD3x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y4C1Ev();
extern void _ZN3ccc8DD3x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y4E[] = {
  NSPAIR(_ZN3ccc8DD3x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y4E[];
extern void _ZN3ccc8DD3x14y43efgEv();
extern void _ZN3ccc8DD3x14y43pqrEv();
extern void _ZN3ccc8DD3x14y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y43pqrEv,_ZTv0_n12_N3ccc8DD3x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y43pqrEv,_ZThn4_N3ccc8DD3x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y43pqrEv,_ZTv0_n12_N3ccc8DD3x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y4E[] = {
  {&(_ZTVN3ccc8DD3x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y4E[];
static VTBL_ENTRY alt_thunk_names1712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y43pqrEv,_ZTv0_n12_N3ccc8DD3x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y43pqrEv,_ZThn4_N3ccc8DD3x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y4E = {  "_ZN3ccc8DD3x14y4E", // class name
  bases__ZN3ccc8DD3x14y4E, 2,
  &(vtc__ZN3ccc8DD3x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1712,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y5  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC3x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y53abcEv
  ~CC3x14y5(); // tgen
  CC3x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y5E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y53pqrEv");}
void  ccc::CC3x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y53efgEv");}
void  ccc::CC3x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y53abcEv");}
ccc::CC3x14y5 ::~CC3x14y5(){ note_dtor("_ZN3ccc8CC3x14y5E", this);} // tgen
ccc::CC3x14y5 ::CC3x14y5(){ note_ctor("_ZN3ccc8CC3x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y5E, buf);
    ::ccc::CC3x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y5E);
    dp->::ccc::CC3x14y5::~CC3x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y5E(Test__ZN3ccc8CC3x14y5E, "_ZN3ccc8CC3x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y5C1Ev();
extern void _ZN3ccc8CC3x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y5E[] = {
  NSPAIR(_ZN3ccc8CC3x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y5E[];
extern void _ZN3ccc8CC3x14y53pqrEv();
extern void _ZN3ccc8CC3x14y53efgEv();
extern void _ZN3ccc8CC3x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y53efgEv,_ZTv0_n12_N3ccc8CC3x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y53efgEv,_ZThn4_N3ccc8CC3x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y53pqrEv,_ZTv0_n16_N3ccc8CC3x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y53pqrEv,_ZThn4_N3ccc8CC3x14y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y53abcEv,_ZTv0_n20_N3ccc8CC3x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y53abcEv,_ZThn4_N3ccc8CC3x14y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y53efgEv,_ZTv0_n12_N3ccc8CC3x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y53pqrEv,_ZTv0_n16_N3ccc8CC3x14y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y53abcEv,_ZTv0_n20_N3ccc8CC3x14y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y5E[] = {
  {&(_ZTVN3ccc8CC3x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y5E[];
static VTBL_ENTRY alt_thunk_names1713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y53abcEv,_ZTv0_n20_N3ccc8CC3x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y53abcEv,_ZThn4_N3ccc8CC3x14y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y53pqrEv,_ZTv0_n16_N3ccc8CC3x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y53pqrEv,_ZThn4_N3ccc8CC3x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y53efgEv,_ZTv0_n12_N3ccc8CC3x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y53efgEv,_ZThn4_N3ccc8CC3x14y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y5E = {  "_ZN3ccc8CC3x14y5E", // class name
  bases__ZN3ccc8CC3x14y5E, 2,
  &(vtc__ZN3ccc8CC3x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1713,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y5  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD3x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x14y53abcEv
  ~DD3x14y5(); // tgen
  DD3x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y5E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y53pqrEv");}
void  ccc::DD3x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y53efgEv");}
void  ccc::DD3x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y53abcEv");}
ccc::DD3x14y5 ::~DD3x14y5(){ note_dtor("_ZN3ccc8DD3x14y5E", this);} // tgen
ccc::DD3x14y5 ::DD3x14y5(){ note_ctor("_ZN3ccc8DD3x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y5E, buf);
    ::ccc::DD3x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y5E);
    dp->::ccc::DD3x14y5::~DD3x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y5E(Test__ZN3ccc8DD3x14y5E, "_ZN3ccc8DD3x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y5C1Ev();
extern void _ZN3ccc8DD3x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y5E[] = {
  NSPAIR(_ZN3ccc8DD3x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y5E[];
extern void _ZN3ccc8DD3x14y53efgEv();
extern void _ZN3ccc8DD3x14y53pqrEv();
extern void _ZN3ccc8DD3x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y53pqrEv,_ZTv0_n12_N3ccc8DD3x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y53pqrEv,_ZThn4_N3ccc8DD3x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y53pqrEv,_ZTv0_n12_N3ccc8DD3x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y5E[] = {
  {&(_ZTVN3ccc8DD3x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y5E[];
static VTBL_ENTRY alt_thunk_names1714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y53pqrEv,_ZTv0_n12_N3ccc8DD3x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y53pqrEv,_ZThn4_N3ccc8DD3x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y5E = {  "_ZN3ccc8DD3x14y5E", // class name
  bases__ZN3ccc8DD3x14y5E, 2,
  &(vtc__ZN3ccc8DD3x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1714,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y6  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y63efgEv
  ~CC3x14y6(); // tgen
  CC3x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y6E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y63abcEv");}
void  ccc::CC3x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y63efgEv");}
ccc::CC3x14y6 ::~CC3x14y6(){ note_dtor("_ZN3ccc8CC3x14y6E", this);} // tgen
ccc::CC3x14y6 ::CC3x14y6(){ note_ctor("_ZN3ccc8CC3x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y6E, buf);
    ::ccc::CC3x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y6E);
    dp->::ccc::CC3x14y6::~CC3x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y6E(Test__ZN3ccc8CC3x14y6E, "_ZN3ccc8CC3x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y6C1Ev();
extern void _ZN3ccc8CC3x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y6E[] = {
  NSPAIR(_ZN3ccc8CC3x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC3x14y63abcEv();
extern void _ZN3ccc8CC3x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y63efgEv,_ZTv0_n12_N3ccc8CC3x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y63efgEv,_ZThn4_N3ccc8CC3x14y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y63abcEv,_ZTv0_n20_N3ccc8CC3x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y63abcEv,_ZThn4_N3ccc8CC3x14y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y63efgEv,_ZTv0_n12_N3ccc8CC3x14y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y63abcEv,_ZTv0_n20_N3ccc8CC3x14y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y6E[] = {
  {&(_ZTVN3ccc8CC3x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y6E[];
static VTBL_ENTRY alt_thunk_names1715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y63abcEv,_ZTv0_n20_N3ccc8CC3x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y63abcEv,_ZThn4_N3ccc8CC3x14y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y63efgEv,_ZTv0_n12_N3ccc8CC3x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y63efgEv,_ZThn4_N3ccc8CC3x14y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y6E = {  "_ZN3ccc8CC3x14y6E", // class name
  bases__ZN3ccc8CC3x14y6E, 2,
  &(vtc__ZN3ccc8CC3x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1715,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y6  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD3x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x14y63efgEv
  ~DD3x14y6(); // tgen
  DD3x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y6E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y63abcEv");}
void  ccc::DD3x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y63efgEv");}
ccc::DD3x14y6 ::~DD3x14y6(){ note_dtor("_ZN3ccc8DD3x14y6E", this);} // tgen
ccc::DD3x14y6 ::DD3x14y6(){ note_ctor("_ZN3ccc8DD3x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y6E, buf);
    ::ccc::DD3x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y6E);
    dp->::ccc::DD3x14y6::~DD3x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y6E(Test__ZN3ccc8DD3x14y6E, "_ZN3ccc8DD3x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y6C1Ev();
extern void _ZN3ccc8DD3x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y6E[] = {
  NSPAIR(_ZN3ccc8DD3x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y6E[];
extern void _ZN3ccc8DD3x14y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y63abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y6E[] = {
  {&(_ZTVN3ccc8DD3x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y6E[];
Class_Descriptor cd__ZN3ccc8DD3x14y6E = {  "_ZN3ccc8DD3x14y6E", // class name
  bases__ZN3ccc8DD3x14y6E, 2,
  &(vtc__ZN3ccc8DD3x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y7  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y73pqrEv
  ~CC3x14y7(); // tgen
  CC3x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y7E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y73abcEv");}
void  ccc::CC3x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y73pqrEv");}
ccc::CC3x14y7 ::~CC3x14y7(){ note_dtor("_ZN3ccc8CC3x14y7E", this);} // tgen
ccc::CC3x14y7 ::CC3x14y7(){ note_ctor("_ZN3ccc8CC3x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y7E, buf);
    ::ccc::CC3x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y7E);
    dp->::ccc::CC3x14y7::~CC3x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y7E(Test__ZN3ccc8CC3x14y7E, "_ZN3ccc8CC3x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y7C1Ev();
extern void _ZN3ccc8CC3x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y7E[] = {
  NSPAIR(_ZN3ccc8CC3x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y7E[];
extern void _ZN3ccc8CC3x14y73pqrEv();
extern void _ZN3ccc8CC3x14y73abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y73pqrEv,_ZTv0_n16_N3ccc8CC3x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y73pqrEv,_ZThn4_N3ccc8CC3x14y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y73abcEv,_ZTv0_n20_N3ccc8CC3x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y73abcEv,_ZThn4_N3ccc8CC3x14y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y73pqrEv,_ZTv0_n16_N3ccc8CC3x14y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y73abcEv,_ZTv0_n20_N3ccc8CC3x14y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y7E[] = {
  {&(_ZTVN3ccc8CC3x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y7E[];
static VTBL_ENTRY alt_thunk_names1716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y73abcEv,_ZTv0_n20_N3ccc8CC3x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y73abcEv,_ZThn4_N3ccc8CC3x14y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y73pqrEv,_ZTv0_n16_N3ccc8CC3x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y73pqrEv,_ZThn4_N3ccc8CC3x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y7E = {  "_ZN3ccc8CC3x14y7E", // class name
  bases__ZN3ccc8CC3x14y7E, 2,
  &(vtc__ZN3ccc8CC3x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1716,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y7  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD3x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y73pqrEv
  ~DD3x14y7(); // tgen
  DD3x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y7E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y73abcEv");}
void  ccc::DD3x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y73pqrEv");}
ccc::DD3x14y7 ::~DD3x14y7(){ note_dtor("_ZN3ccc8DD3x14y7E", this);} // tgen
ccc::DD3x14y7 ::DD3x14y7(){ note_ctor("_ZN3ccc8DD3x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y7E, buf);
    ::ccc::DD3x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y7E);
    dp->::ccc::DD3x14y7::~DD3x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y7E(Test__ZN3ccc8DD3x14y7E, "_ZN3ccc8DD3x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y7C1Ev();
extern void _ZN3ccc8DD3x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y7E[] = {
  NSPAIR(_ZN3ccc8DD3x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x14y73pqrEv();
extern void _ZN3ccc8DD3x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y73pqrEv,_ZTv0_n12_N3ccc8DD3x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y73pqrEv,_ZThn4_N3ccc8DD3x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y73pqrEv,_ZTv0_n12_N3ccc8DD3x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y7E[] = {
  {&(_ZTVN3ccc8DD3x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y7E[];
static VTBL_ENTRY alt_thunk_names1717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y73pqrEv,_ZTv0_n12_N3ccc8DD3x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y73pqrEv,_ZThn4_N3ccc8DD3x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y7E = {  "_ZN3ccc8DD3x14y7E", // class name
  bases__ZN3ccc8DD3x14y7E, 2,
  &(vtc__ZN3ccc8DD3x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1717,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y8  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y83abcEv
  ~CC3x14y8(); // tgen
  CC3x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y8E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y83efgEv");}
void  ccc::CC3x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y83abcEv");}
ccc::CC3x14y8 ::~CC3x14y8(){ note_dtor("_ZN3ccc8CC3x14y8E", this);} // tgen
ccc::CC3x14y8 ::CC3x14y8(){ note_ctor("_ZN3ccc8CC3x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y8E, buf);
    ::ccc::CC3x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y8E);
    dp->::ccc::CC3x14y8::~CC3x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y8E(Test__ZN3ccc8CC3x14y8E, "_ZN3ccc8CC3x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y8C1Ev();
extern void _ZN3ccc8CC3x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y8E[] = {
  NSPAIR(_ZN3ccc8CC3x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC3x14y83efgEv();
extern void _ZN3ccc8CC3x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y83efgEv,_ZTv0_n12_N3ccc8CC3x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y83efgEv,_ZThn4_N3ccc8CC3x14y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC3x14y83abcEv,_ZTv0_n20_N3ccc8CC3x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y83abcEv,_ZThn4_N3ccc8CC3x14y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y83efgEv,_ZTv0_n12_N3ccc8CC3x14y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC3x14y83abcEv,_ZTv0_n20_N3ccc8CC3x14y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y8E[] = {
  {&(_ZTVN3ccc8CC3x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC3x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y8E[];
static VTBL_ENTRY alt_thunk_names1718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC3x14y83abcEv,_ZTv0_n20_N3ccc8CC3x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y83abcEv,_ZThn4_N3ccc8CC3x14y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y83efgEv,_ZTv0_n12_N3ccc8CC3x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y83efgEv,_ZThn4_N3ccc8CC3x14y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y8E = {  "_ZN3ccc8CC3x14y8E", // class name
  bases__ZN3ccc8CC3x14y8E, 2,
  &(vtc__ZN3ccc8CC3x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1718,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y8  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD3x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x14y83abcEv
  ~DD3x14y8(); // tgen
  DD3x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y8E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y83efgEv");}
void  ccc::DD3x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x14y83abcEv");}
ccc::DD3x14y8 ::~DD3x14y8(){ note_dtor("_ZN3ccc8DD3x14y8E", this);} // tgen
ccc::DD3x14y8 ::DD3x14y8(){ note_ctor("_ZN3ccc8DD3x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y8E, buf);
    ::ccc::DD3x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y8E);
    dp->::ccc::DD3x14y8::~DD3x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y8E(Test__ZN3ccc8DD3x14y8E, "_ZN3ccc8DD3x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y8C1Ev();
extern void _ZN3ccc8DD3x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y8E[] = {
  NSPAIR(_ZN3ccc8DD3x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y8E[];
extern void _ZN3ccc8DD3x14y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y8E[] = {
  {&(_ZTVN3ccc8DD3x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y8E[];
Class_Descriptor cd__ZN3ccc8DD3x14y8E = {  "_ZN3ccc8DD3x14y8E", // class name
  bases__ZN3ccc8DD3x14y8E, 2,
  &(vtc__ZN3ccc8DD3x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y9  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y93pqrEv
  ~CC3x14y9(); // tgen
  CC3x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y9E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y93efgEv");}
void  ccc::CC3x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y93pqrEv");}
ccc::CC3x14y9 ::~CC3x14y9(){ note_dtor("_ZN3ccc8CC3x14y9E", this);} // tgen
ccc::CC3x14y9 ::CC3x14y9(){ note_ctor("_ZN3ccc8CC3x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y9E, buf);
    ::ccc::CC3x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc8CC3x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC3x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y9E);
    dp->::ccc::CC3x14y9::~CC3x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y9E(Test__ZN3ccc8CC3x14y9E, "_ZN3ccc8CC3x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y9C1Ev();
extern void _ZN3ccc8CC3x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y9E[] = {
  NSPAIR(_ZN3ccc8CC3x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y9E[];
extern void _ZN3ccc8CC3x14y93pqrEv();
extern void _ZN3ccc8CC3x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC3x14y93efgEv,_ZTv0_n12_N3ccc8CC3x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y93efgEv,_ZThn4_N3ccc8CC3x14y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC3x14y93pqrEv,_ZTv0_n16_N3ccc8CC3x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y93pqrEv,_ZThn4_N3ccc8CC3x14y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC3x14y93efgEv,_ZTv0_n12_N3ccc8CC3x14y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC3x14y93pqrEv,_ZTv0_n16_N3ccc8CC3x14y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x14y9E[] = {
  {&(_ZTVN3ccc8CC3x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC3x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x14y9E[];
static VTBL_ENTRY alt_thunk_names1719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC3x14y93pqrEv,_ZTv0_n16_N3ccc8CC3x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y93pqrEv,_ZThn4_N3ccc8CC3x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC3x14y93efgEv,_ZTv0_n12_N3ccc8CC3x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC3x14y93efgEv,_ZThn4_N3ccc8CC3x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC3x14y9E = {  "_ZN3ccc8CC3x14y9E", // class name
  bases__ZN3ccc8CC3x14y9E, 2,
  &(vtc__ZN3ccc8CC3x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x14y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1719,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y9  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD3x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x14y93pqrEv
  ~DD3x14y9(); // tgen
  DD3x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x14y9E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x14y93efgEv");}
void  ccc::DD3x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x14y93pqrEv");}
ccc::DD3x14y9 ::~DD3x14y9(){ note_dtor("_ZN3ccc8DD3x14y9E", this);} // tgen
ccc::DD3x14y9 ::DD3x14y9(){ note_ctor("_ZN3ccc8DD3x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD3x14y9E, buf);
    ::ccc::DD3x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD3x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x14y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD3x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x14y9E);
    dp->::ccc::DD3x14y9::~DD3x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x14y9E(Test__ZN3ccc8DD3x14y9E, "_ZN3ccc8DD3x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD3x14y9C1Ev();
extern void _ZN3ccc8DD3x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x14y9E[] = {
  NSPAIR(_ZN3ccc8DD3x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD3x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y9E[];
extern void _ZN3ccc8DD3x14y93efgEv();
extern void _ZN3ccc8DD3x14y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD3x14y93pqrEv,_ZTv0_n12_N3ccc8DD3x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD3x14y93pqrEv,_ZThn4_N3ccc8DD3x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD3x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD3x14y93pqrEv,_ZTv0_n12_N3ccc8DD3x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x14y9E[] = {
  {&(_ZTVN3ccc8DD3x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD3x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x14y9E[];
static VTBL_ENTRY alt_thunk_names1720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD3x14y93pqrEv,_ZTv0_n12_N3ccc8DD3x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD3x14y93pqrEv,_ZThn4_N3ccc8DD3x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD3x14y9E = {  "_ZN3ccc8DD3x14y9E", // class name
  bases__ZN3ccc8DD3x14y9E, 2,
  &(vtc__ZN3ccc8DD3x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD3x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x14y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1720,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y10  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x14y103abcEv
  ~CC3x14y10(); // tgen
  CC3x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y10E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y103pqrEv");}
void  ccc::CC3x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x14y103abcEv");}
ccc::CC3x14y10 ::~CC3x14y10(){ note_dtor("_ZN3ccc9CC3x14y10E", this);} // tgen
ccc::CC3x14y10 ::CC3x14y10(){ note_ctor("_ZN3ccc9CC3x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y10E, buf);
    ::ccc::CC3x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y10E);
    dp->::ccc::CC3x14y10::~CC3x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y10E(Test__ZN3ccc9CC3x14y10E, "_ZN3ccc9CC3x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y10C1Ev();
extern void _ZN3ccc9CC3x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y10E[] = {
  NSPAIR(_ZN3ccc9CC3x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y10E[];
extern void _ZN3ccc9CC3x14y103pqrEv();
extern void _ZN3ccc9CC3x14y103abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x14y103pqrEv,_ZTv0_n16_N3ccc9CC3x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y103pqrEv,_ZThn4_N3ccc9CC3x14y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x14y103abcEv,_ZTv0_n20_N3ccc9CC3x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y103abcEv,_ZThn4_N3ccc9CC3x14y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x14y103pqrEv,_ZTv0_n16_N3ccc9CC3x14y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x14y103abcEv,_ZTv0_n20_N3ccc9CC3x14y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y10E[] = {
  {&(_ZTVN3ccc9CC3x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y10E[];
static VTBL_ENTRY alt_thunk_names1721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x14y103abcEv,_ZTv0_n20_N3ccc9CC3x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y103abcEv,_ZThn4_N3ccc9CC3x14y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x14y103pqrEv,_ZTv0_n16_N3ccc9CC3x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y103pqrEv,_ZThn4_N3ccc9CC3x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x14y10E = {  "_ZN3ccc9CC3x14y10E", // class name
  bases__ZN3ccc9CC3x14y10E, 2,
  &(vtc__ZN3ccc9CC3x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1721,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y10  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD3x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x14y103abcEv
  ~DD3x14y10(); // tgen
  DD3x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y10E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x14y103pqrEv");}
void  ccc::DD3x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x14y103abcEv");}
ccc::DD3x14y10 ::~DD3x14y10(){ note_dtor("_ZN3ccc9DD3x14y10E", this);} // tgen
ccc::DD3x14y10 ::DD3x14y10(){ note_ctor("_ZN3ccc9DD3x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y10E, buf);
    ::ccc::DD3x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y10E);
    dp->::ccc::DD3x14y10::~DD3x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y10E(Test__ZN3ccc9DD3x14y10E, "_ZN3ccc9DD3x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y10C1Ev();
extern void _ZN3ccc9DD3x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y10E[] = {
  NSPAIR(_ZN3ccc9DD3x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x14y103pqrEv();
extern void _ZN3ccc9DD3x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x14y103pqrEv,_ZTv0_n12_N3ccc9DD3x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x14y103pqrEv,_ZThn4_N3ccc9DD3x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x14y103pqrEv,_ZTv0_n12_N3ccc9DD3x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y10E[] = {
  {&(_ZTVN3ccc9DD3x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y10E[];
static VTBL_ENTRY alt_thunk_names1722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x14y103pqrEv,_ZTv0_n12_N3ccc9DD3x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x14y103pqrEv,_ZThn4_N3ccc9DD3x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x14y10E = {  "_ZN3ccc9DD3x14y10E", // class name
  bases__ZN3ccc9DD3x14y10E, 2,
  &(vtc__ZN3ccc9DD3x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1722,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y11  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x14y113efgEv
  ~CC3x14y11(); // tgen
  CC3x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y11E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y113pqrEv");}
void  ccc::CC3x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x14y113efgEv");}
ccc::CC3x14y11 ::~CC3x14y11(){ note_dtor("_ZN3ccc9CC3x14y11E", this);} // tgen
ccc::CC3x14y11 ::CC3x14y11(){ note_ctor("_ZN3ccc9CC3x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y11E, buf);
    ::ccc::CC3x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y11E);
    dp->::ccc::CC3x14y11::~CC3x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y11E(Test__ZN3ccc9CC3x14y11E, "_ZN3ccc9CC3x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y11C1Ev();
extern void _ZN3ccc9CC3x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y11E[] = {
  NSPAIR(_ZN3ccc9CC3x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y11E[];
extern void _ZN3ccc9CC3x14y113pqrEv();
extern void _ZN3ccc9CC3x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x14y113efgEv,_ZTv0_n12_N3ccc9CC3x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y113efgEv,_ZThn4_N3ccc9CC3x14y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x14y113pqrEv,_ZTv0_n16_N3ccc9CC3x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y113pqrEv,_ZThn4_N3ccc9CC3x14y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x14y113efgEv,_ZTv0_n12_N3ccc9CC3x14y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x14y113pqrEv,_ZTv0_n16_N3ccc9CC3x14y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y11E[] = {
  {&(_ZTVN3ccc9CC3x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y11E[];
static VTBL_ENTRY alt_thunk_names1723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x14y113pqrEv,_ZTv0_n16_N3ccc9CC3x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y113pqrEv,_ZThn4_N3ccc9CC3x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x14y113efgEv,_ZTv0_n12_N3ccc9CC3x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y113efgEv,_ZThn4_N3ccc9CC3x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x14y11E = {  "_ZN3ccc9CC3x14y11E", // class name
  bases__ZN3ccc9CC3x14y11E, 2,
  &(vtc__ZN3ccc9CC3x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1723,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y11  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD3x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x14y113efgEv
  ~DD3x14y11(); // tgen
  DD3x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y11E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD3x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x14y113pqrEv");}
void  ccc::DD3x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x14y113efgEv");}
ccc::DD3x14y11 ::~DD3x14y11(){ note_dtor("_ZN3ccc9DD3x14y11E", this);} // tgen
ccc::DD3x14y11 ::DD3x14y11(){ note_ctor("_ZN3ccc9DD3x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y11E, buf);
    ::ccc::DD3x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y11E);
    dp->::ccc::DD3x14y11::~DD3x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y11E(Test__ZN3ccc9DD3x14y11E, "_ZN3ccc9DD3x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y11C1Ev();
extern void _ZN3ccc9DD3x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y11E[] = {
  NSPAIR(_ZN3ccc9DD3x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y11E[];
extern void _ZN3ccc9DD3x14y113efgEv();
extern void _ZN3ccc9DD3x14y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x14y113pqrEv,_ZTv0_n12_N3ccc9DD3x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x14y113pqrEv,_ZThn4_N3ccc9DD3x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x14y113pqrEv,_ZTv0_n12_N3ccc9DD3x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y11E[] = {
  {&(_ZTVN3ccc9DD3x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y11E[];
static VTBL_ENTRY alt_thunk_names1724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x14y113pqrEv,_ZTv0_n12_N3ccc9DD3x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x14y113pqrEv,_ZThn4_N3ccc9DD3x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x14y11E = {  "_ZN3ccc9DD3x14y11E", // class name
  bases__ZN3ccc9DD3x14y11E, 2,
  &(vtc__ZN3ccc9DD3x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1724,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y12  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC3x14y123abcEv
  ~CC3x14y12(); // tgen
  CC3x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x14y123abcEv");}
ccc::CC3x14y12 ::~CC3x14y12(){ note_dtor("_ZN3ccc9CC3x14y12E", this);} // tgen
ccc::CC3x14y12 ::CC3x14y12(){ note_ctor("_ZN3ccc9CC3x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y12E, buf);
    ::ccc::CC3x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y12E);
    dp->::ccc::CC3x14y12::~CC3x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y12E(Test__ZN3ccc9CC3x14y12E, "_ZN3ccc9CC3x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y12C1Ev();
extern void _ZN3ccc9CC3x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y12E[] = {
  NSPAIR(_ZN3ccc9CC3x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC3x14y123abcEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC3x14y123abcEv,_ZTv0_n20_N3ccc9CC3x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y123abcEv,_ZThn4_N3ccc9CC3x14y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC3x14y123abcEv,_ZTv0_n20_N3ccc9CC3x14y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y12E[] = {
  {&(_ZTVN3ccc9CC3x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y12E[];
static VTBL_ENTRY alt_thunk_names1725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC3x14y123abcEv,_ZTv0_n20_N3ccc9CC3x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y123abcEv,_ZThn4_N3ccc9CC3x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x14y12E = {  "_ZN3ccc9CC3x14y12E", // class name
  bases__ZN3ccc9CC3x14y12E, 2,
  &(vtc__ZN3ccc9CC3x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1725,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y12  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD3x14y123abcEv
  ~DD3x14y12(); // tgen
  DD3x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x14y123abcEv");}
ccc::DD3x14y12 ::~DD3x14y12(){ note_dtor("_ZN3ccc9DD3x14y12E", this);} // tgen
ccc::DD3x14y12 ::DD3x14y12(){ note_ctor("_ZN3ccc9DD3x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y12E, buf);
    ::ccc::DD3x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y12E);
    dp->::ccc::DD3x14y12::~DD3x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y12E(Test__ZN3ccc9DD3x14y12E, "_ZN3ccc9DD3x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y12C1Ev();
extern void _ZN3ccc9DD3x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y12E[] = {
  NSPAIR(_ZN3ccc9DD3x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y12E[] = {
  {&(_ZTVN3ccc9DD3x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y12E[];
Class_Descriptor cd__ZN3ccc9DD3x14y12E = {  "_ZN3ccc9DD3x14y12E", // class name
  bases__ZN3ccc9DD3x14y12E, 2,
  &(vtc__ZN3ccc9DD3x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y13  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC3x14y133efgEv
  ~CC3x14y13(); // tgen
  CC3x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y13E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x14y133efgEv");}
ccc::CC3x14y13 ::~CC3x14y13(){ note_dtor("_ZN3ccc9CC3x14y13E", this);} // tgen
ccc::CC3x14y13 ::CC3x14y13(){ note_ctor("_ZN3ccc9CC3x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y13E, buf);
    ::ccc::CC3x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y13E);
    dp->::ccc::CC3x14y13::~CC3x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y13E(Test__ZN3ccc9CC3x14y13E, "_ZN3ccc9CC3x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y13C1Ev();
extern void _ZN3ccc9CC3x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y13E[] = {
  NSPAIR(_ZN3ccc9CC3x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC3x14y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC3x14y133efgEv,_ZTv0_n12_N3ccc9CC3x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y133efgEv,_ZThn4_N3ccc9CC3x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC3x14y133efgEv,_ZTv0_n12_N3ccc9CC3x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y13E[] = {
  {&(_ZTVN3ccc9CC3x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC3x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y13E[];
static VTBL_ENTRY alt_thunk_names1726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC3x14y133efgEv,_ZTv0_n12_N3ccc9CC3x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y133efgEv,_ZThn4_N3ccc9CC3x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x14y13E = {  "_ZN3ccc9CC3x14y13E", // class name
  bases__ZN3ccc9CC3x14y13E, 2,
  &(vtc__ZN3ccc9CC3x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1726,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y13  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD3x14y133efgEv
  ~DD3x14y13(); // tgen
  DD3x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y13E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD3x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x14y133efgEv");}
ccc::DD3x14y13 ::~DD3x14y13(){ note_dtor("_ZN3ccc9DD3x14y13E", this);} // tgen
ccc::DD3x14y13 ::DD3x14y13(){ note_ctor("_ZN3ccc9DD3x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y13E, buf);
    ::ccc::DD3x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y13E);
    dp->::ccc::DD3x14y13::~DD3x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y13E(Test__ZN3ccc9DD3x14y13E, "_ZN3ccc9DD3x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y13C1Ev();
extern void _ZN3ccc9DD3x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y13E[] = {
  NSPAIR(_ZN3ccc9DD3x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y13E[];
extern void _ZN3ccc9DD3x14y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y13E[] = {
  {&(_ZTVN3ccc9DD3x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y13E[];
Class_Descriptor cd__ZN3ccc9DD3x14y13E = {  "_ZN3ccc9DD3x14y13E", // class name
  bases__ZN3ccc9DD3x14y13E, 2,
  &(vtc__ZN3ccc9DD3x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y14  : virtual ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y143pqrEv
  ~CC3x14y14(); // tgen
  CC3x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y14E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y143pqrEv");}
ccc::CC3x14y14 ::~CC3x14y14(){ note_dtor("_ZN3ccc9CC3x14y14E", this);} // tgen
ccc::CC3x14y14 ::CC3x14y14(){ note_ctor("_ZN3ccc9CC3x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y14E, buf);
    ::ccc::CC3x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y14E);
    dp->::ccc::CC3x14y14::~CC3x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y14E(Test__ZN3ccc9CC3x14y14E, "_ZN3ccc9CC3x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y14C1Ev();
extern void _ZN3ccc9CC3x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y14E[] = {
  NSPAIR(_ZN3ccc9CC3x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y14E[];
extern void _ZN3ccc9CC3x14y143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC3x14y143pqrEv,_ZTv0_n16_N3ccc9CC3x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y143pqrEv,_ZThn4_N3ccc9CC3x14y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC3x14y143pqrEv,_ZTv0_n16_N3ccc9CC3x14y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y14E[] = {
  {&(_ZTVN3ccc9CC3x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y14E[];
static VTBL_ENTRY alt_thunk_names1727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC3x14y143pqrEv,_ZTv0_n16_N3ccc9CC3x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC3x14y143pqrEv,_ZThn4_N3ccc9CC3x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC3x14y14E = {  "_ZN3ccc9CC3x14y14E", // class name
  bases__ZN3ccc9CC3x14y14E, 2,
  &(vtc__ZN3ccc9CC3x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1727,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y14  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD3x14y143pqrEv
  ~DD3x14y14(); // tgen
  DD3x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y14E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD3x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x14y143pqrEv");}
ccc::DD3x14y14 ::~DD3x14y14(){ note_dtor("_ZN3ccc9DD3x14y14E", this);} // tgen
ccc::DD3x14y14 ::DD3x14y14(){ note_ctor("_ZN3ccc9DD3x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y14E, buf);
    ::ccc::DD3x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y14E);
    dp->::ccc::DD3x14y14::~DD3x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y14E(Test__ZN3ccc9DD3x14y14E, "_ZN3ccc9DD3x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y14C1Ev();
extern void _ZN3ccc9DD3x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y14E[] = {
  NSPAIR(_ZN3ccc9DD3x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x14y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD3x14y143pqrEv,_ZTv0_n12_N3ccc9DD3x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD3x14y143pqrEv,_ZThn4_N3ccc9DD3x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD3x14y143pqrEv,_ZTv0_n12_N3ccc9DD3x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y14E[] = {
  {&(_ZTVN3ccc9DD3x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y14E[];
static VTBL_ENTRY alt_thunk_names1728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD3x14y143pqrEv,_ZTv0_n12_N3ccc9DD3x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD3x14y143pqrEv,_ZThn4_N3ccc9DD3x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD3x14y14E = {  "_ZN3ccc9DD3x14y14E", // class name
  bases__ZN3ccc9DD3x14y14E, 2,
  &(vtc__ZN3ccc9DD3x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1728,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y15  : virtual ::ccc::AA3 , ::ccc::BB14 {
  ~CC3x14y15(); // tgen
  CC3x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x14y15 ::~CC3x14y15(){ note_dtor("_ZN3ccc9CC3x14y15E", this);} // tgen
ccc::CC3x14y15 ::CC3x14y15(){ note_ctor("_ZN3ccc9CC3x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y15E, buf);
    ::ccc::CC3x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), ABISELECT(8,4), "_ZN3ccc9CC3x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC3x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y15E);
    dp->::ccc::CC3x14y15::~CC3x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y15E(Test__ZN3ccc9CC3x14y15E, "_ZN3ccc9CC3x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y15C1Ev();
extern void _ZN3ccc9CC3x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y15E[] = {
  NSPAIR(_ZN3ccc9CC3x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x14y15E[] = {
  {&(_ZTVN3ccc9CC3x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC3x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x14y15E[];
Class_Descriptor cd__ZN3ccc9CC3x14y15E = {  "_ZN3ccc9CC3x14y15E", // class name
  bases__ZN3ccc9CC3x14y15E, 2,
  &(vtc__ZN3ccc9CC3x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x14y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD3x14y15  : virtual ::ccc::AA3 , virtual ::ccc::BB14 {
  ~DD3x14y15(); // tgen
  DD3x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD3x14y15 ::~DD3x14y15(){ note_dtor("_ZN3ccc9DD3x14y15E", this);} // tgen
ccc::DD3x14y15 ::DD3x14y15(){ note_ctor("_ZN3ccc9DD3x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD3x14y15E, buf);
    ::ccc::DD3x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD3x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x14y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD3x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x14y15E);
    dp->::ccc::DD3x14y15::~DD3x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x14y15E(Test__ZN3ccc9DD3x14y15E, "_ZN3ccc9DD3x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD3x14y15C1Ev();
extern void _ZN3ccc9DD3x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x14y15E[] = {
  NSPAIR(_ZN3ccc9DD3x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD3x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x14y15E[] = {
  {&(_ZTVN3ccc9DD3x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD3x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x14y15E[];
Class_Descriptor cd__ZN3ccc9DD3x14y15E = {  "_ZN3ccc9DD3x14y15E", // class name
  bases__ZN3ccc9DD3x14y15E, 2,
  &(vtc__ZN3ccc9DD3x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD3x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x14y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y0  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y03pqrEv
  ~CC3x15y0(); // tgen
  CC3x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y0E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y03abcEv");}
void  ccc::CC3x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y03efgEv");}
void  ccc::CC3x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y03pqrEv");}
ccc::CC3x15y0 ::~CC3x15y0(){ note_dtor("_ZN3ccc8CC3x15y0E", this);} // tgen
ccc::CC3x15y0 ::CC3x15y0(){ note_ctor("_ZN3ccc8CC3x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y0E, buf);
    ::ccc::CC3x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y0E);
    dp->::ccc::CC3x15y0::~CC3x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y0E(Test__ZN3ccc8CC3x15y0E, "_ZN3ccc8CC3x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y0C1Ev();
extern void _ZN3ccc8CC3x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y0E[] = {
  NSPAIR(_ZN3ccc8CC3x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y0E[];
extern void _ZN3ccc8CC3x15y03efgEv();
extern void _ZN3ccc8CC3x15y03pqrEv();
extern void _ZN3ccc8CC3x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y0E[] = {
  {&(_ZTVN3ccc8CC3x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y0E[];
Class_Descriptor cd__ZN3ccc8CC3x15y0E = {  "_ZN3ccc8CC3x15y0E", // class name
  bases__ZN3ccc8CC3x15y0E, 2,
  &(vtc__ZN3ccc8CC3x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y0E),2, //virtual 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  DD3x15y0  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD3x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD3x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y03pqrEv
  ~DD3x15y0(); // tgen
  DD3x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y0E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y03abcEv");}
void  ccc::DD3x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y03efgEv");}
void  ccc::DD3x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y03pqrEv");}
ccc::DD3x15y0 ::~DD3x15y0(){ note_dtor("_ZN3ccc8DD3x15y0E", this);} // tgen
ccc::DD3x15y0 ::DD3x15y0(){ note_ctor("_ZN3ccc8DD3x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y0E, buf);
    ::ccc::DD3x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y0E);
    dp->::ccc::DD3x15y0::~DD3x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y0E(Test__ZN3ccc8DD3x15y0E, "_ZN3ccc8DD3x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y0C1Ev();
extern void _ZN3ccc8DD3x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y0E[] = {
  NSPAIR(_ZN3ccc8DD3x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y0E[];
extern void _ZN3ccc8DD3x15y03efgEv();
extern void _ZN3ccc8DD3x15y03pqrEv();
extern void _ZN3ccc8DD3x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y0E[] = {
  {&(_ZTVN3ccc8DD3x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y0E[];
Class_Descriptor cd__ZN3ccc8DD3x15y0E = {  "_ZN3ccc8DD3x15y0E", // class name
  bases__ZN3ccc8DD3x15y0E, 2,
  &(vtc__ZN3ccc8DD3x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y0E),2, //virtual 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  CC3x15y1  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x15y13efgEv
  ~CC3x15y1(); // tgen
  CC3x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y1E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y13abcEv");}
void  ccc::CC3x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y13pqrEv");}
void  ccc::CC3x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y13efgEv");}
ccc::CC3x15y1 ::~CC3x15y1(){ note_dtor("_ZN3ccc8CC3x15y1E", this);} // tgen
ccc::CC3x15y1 ::CC3x15y1(){ note_ctor("_ZN3ccc8CC3x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y1E, buf);
    ::ccc::CC3x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y1E);
    dp->::ccc::CC3x15y1::~CC3x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y1E(Test__ZN3ccc8CC3x15y1E, "_ZN3ccc8CC3x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y1C1Ev();
extern void _ZN3ccc8CC3x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y1E[] = {
  NSPAIR(_ZN3ccc8CC3x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y1E[];
extern void _ZN3ccc8CC3x15y13efgEv();
extern void _ZN3ccc8CC3x15y13pqrEv();
extern void _ZN3ccc8CC3x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y1E[] = {
  {&(_ZTVN3ccc8CC3x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y1E[];
Class_Descriptor cd__ZN3ccc8CC3x15y1E = {  "_ZN3ccc8CC3x15y1E", // class name
  bases__ZN3ccc8CC3x15y1E, 2,
  &(vtc__ZN3ccc8CC3x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y1E),2, //virtual 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  DD3x15y1  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD3x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x15y13efgEv
  ~DD3x15y1(); // tgen
  DD3x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y1E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y13abcEv");}
void  ccc::DD3x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y13pqrEv");}
void  ccc::DD3x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y13efgEv");}
ccc::DD3x15y1 ::~DD3x15y1(){ note_dtor("_ZN3ccc8DD3x15y1E", this);} // tgen
ccc::DD3x15y1 ::DD3x15y1(){ note_ctor("_ZN3ccc8DD3x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y1E, buf);
    ::ccc::DD3x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y1E);
    dp->::ccc::DD3x15y1::~DD3x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y1E(Test__ZN3ccc8DD3x15y1E, "_ZN3ccc8DD3x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y1C1Ev();
extern void _ZN3ccc8DD3x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y1E[] = {
  NSPAIR(_ZN3ccc8DD3x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y1E[];
extern void _ZN3ccc8DD3x15y13efgEv();
extern void _ZN3ccc8DD3x15y13pqrEv();
extern void _ZN3ccc8DD3x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y1E[] = {
  {&(_ZTVN3ccc8DD3x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y1E[];
Class_Descriptor cd__ZN3ccc8DD3x15y1E = {  "_ZN3ccc8DD3x15y1E", // class name
  bases__ZN3ccc8DD3x15y1E, 2,
  &(vtc__ZN3ccc8DD3x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y1E),2, //virtual 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  CC3x15y2  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y23pqrEv
  ~CC3x15y2(); // tgen
  CC3x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y2E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y23efgEv");}
void  ccc::CC3x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y23abcEv");}
void  ccc::CC3x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y23pqrEv");}
ccc::CC3x15y2 ::~CC3x15y2(){ note_dtor("_ZN3ccc8CC3x15y2E", this);} // tgen
ccc::CC3x15y2 ::CC3x15y2(){ note_ctor("_ZN3ccc8CC3x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y2E, buf);
    ::ccc::CC3x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y2E);
    dp->::ccc::CC3x15y2::~CC3x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y2E(Test__ZN3ccc8CC3x15y2E, "_ZN3ccc8CC3x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y2C1Ev();
extern void _ZN3ccc8CC3x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y2E[] = {
  NSPAIR(_ZN3ccc8CC3x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y2E[];
extern void _ZN3ccc8CC3x15y23efgEv();
extern void _ZN3ccc8CC3x15y23pqrEv();
extern void _ZN3ccc8CC3x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y2E[] = {
  {&(_ZTVN3ccc8CC3x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y2E[];
Class_Descriptor cd__ZN3ccc8CC3x15y2E = {  "_ZN3ccc8CC3x15y2E", // class name
  bases__ZN3ccc8CC3x15y2E, 2,
  &(vtc__ZN3ccc8CC3x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y2E),2, //virtual 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  DD3x15y2  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD3x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD3x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y23pqrEv
  ~DD3x15y2(); // tgen
  DD3x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y2E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y23efgEv");}
void  ccc::DD3x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y23abcEv");}
void  ccc::DD3x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y23pqrEv");}
ccc::DD3x15y2 ::~DD3x15y2(){ note_dtor("_ZN3ccc8DD3x15y2E", this);} // tgen
ccc::DD3x15y2 ::DD3x15y2(){ note_ctor("_ZN3ccc8DD3x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y2E, buf);
    ::ccc::DD3x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y2E);
    dp->::ccc::DD3x15y2::~DD3x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y2E(Test__ZN3ccc8DD3x15y2E, "_ZN3ccc8DD3x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y2C1Ev();
extern void _ZN3ccc8DD3x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y2E[] = {
  NSPAIR(_ZN3ccc8DD3x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y2E[];
extern void _ZN3ccc8DD3x15y23efgEv();
extern void _ZN3ccc8DD3x15y23pqrEv();
extern void _ZN3ccc8DD3x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y2E[] = {
  {&(_ZTVN3ccc8DD3x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y2E[];
Class_Descriptor cd__ZN3ccc8DD3x15y2E = {  "_ZN3ccc8DD3x15y2E", // class name
  bases__ZN3ccc8DD3x15y2E, 2,
  &(vtc__ZN3ccc8DD3x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y2E),2, //virtual 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  CC3x15y3  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x15y33abcEv
  ~CC3x15y3(); // tgen
  CC3x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y3E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y33efgEv");}
void  ccc::CC3x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y33pqrEv");}
void  ccc::CC3x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y33abcEv");}
ccc::CC3x15y3 ::~CC3x15y3(){ note_dtor("_ZN3ccc8CC3x15y3E", this);} // tgen
ccc::CC3x15y3 ::CC3x15y3(){ note_ctor("_ZN3ccc8CC3x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y3E, buf);
    ::ccc::CC3x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y3E);
    dp->::ccc::CC3x15y3::~CC3x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y3E(Test__ZN3ccc8CC3x15y3E, "_ZN3ccc8CC3x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y3C1Ev();
extern void _ZN3ccc8CC3x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y3E[] = {
  NSPAIR(_ZN3ccc8CC3x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y3E[];
extern void _ZN3ccc8CC3x15y33efgEv();
extern void _ZN3ccc8CC3x15y33pqrEv();
extern void _ZN3ccc8CC3x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y3E[] = {
  {&(_ZTVN3ccc8CC3x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y3E[];
Class_Descriptor cd__ZN3ccc8CC3x15y3E = {  "_ZN3ccc8CC3x15y3E", // class name
  bases__ZN3ccc8CC3x15y3E, 2,
  &(vtc__ZN3ccc8CC3x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y3E),2, //virtual 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  DD3x15y3  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD3x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x15y33abcEv
  ~DD3x15y3(); // tgen
  DD3x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y3E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y33efgEv");}
void  ccc::DD3x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y33pqrEv");}
void  ccc::DD3x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y33abcEv");}
ccc::DD3x15y3 ::~DD3x15y3(){ note_dtor("_ZN3ccc8DD3x15y3E", this);} // tgen
ccc::DD3x15y3 ::DD3x15y3(){ note_ctor("_ZN3ccc8DD3x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y3E, buf);
    ::ccc::DD3x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y3E);
    dp->::ccc::DD3x15y3::~DD3x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y3E(Test__ZN3ccc8DD3x15y3E, "_ZN3ccc8DD3x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y3C1Ev();
extern void _ZN3ccc8DD3x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y3E[] = {
  NSPAIR(_ZN3ccc8DD3x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y3E[];
extern void _ZN3ccc8DD3x15y33efgEv();
extern void _ZN3ccc8DD3x15y33pqrEv();
extern void _ZN3ccc8DD3x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y3E[] = {
  {&(_ZTVN3ccc8DD3x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y3E[];
Class_Descriptor cd__ZN3ccc8DD3x15y3E = {  "_ZN3ccc8DD3x15y3E", // class name
  bases__ZN3ccc8DD3x15y3E, 2,
  &(vtc__ZN3ccc8DD3x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y3E),2, //virtual 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  CC3x15y4  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC3x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y43efgEv
  ~CC3x15y4(); // tgen
  CC3x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y4E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y43pqrEv");}
void  ccc::CC3x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y43abcEv");}
void  ccc::CC3x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y43efgEv");}
ccc::CC3x15y4 ::~CC3x15y4(){ note_dtor("_ZN3ccc8CC3x15y4E", this);} // tgen
ccc::CC3x15y4 ::CC3x15y4(){ note_ctor("_ZN3ccc8CC3x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y4E, buf);
    ::ccc::CC3x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y4E);
    dp->::ccc::CC3x15y4::~CC3x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y4E(Test__ZN3ccc8CC3x15y4E, "_ZN3ccc8CC3x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y4C1Ev();
extern void _ZN3ccc8CC3x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y4E[] = {
  NSPAIR(_ZN3ccc8CC3x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y4E[];
extern void _ZN3ccc8CC3x15y43efgEv();
extern void _ZN3ccc8CC3x15y43pqrEv();
extern void _ZN3ccc8CC3x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y4E[] = {
  {&(_ZTVN3ccc8CC3x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y4E[];
Class_Descriptor cd__ZN3ccc8CC3x15y4E = {  "_ZN3ccc8CC3x15y4E", // class name
  bases__ZN3ccc8CC3x15y4E, 2,
  &(vtc__ZN3ccc8CC3x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y4E),2, //virtual 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  DD3x15y4  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD3x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD3x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD3x15y43efgEv
  ~DD3x15y4(); // tgen
  DD3x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y4E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y43pqrEv");}
void  ccc::DD3x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y43abcEv");}
void  ccc::DD3x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y43efgEv");}
ccc::DD3x15y4 ::~DD3x15y4(){ note_dtor("_ZN3ccc8DD3x15y4E", this);} // tgen
ccc::DD3x15y4 ::DD3x15y4(){ note_ctor("_ZN3ccc8DD3x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y4E, buf);
    ::ccc::DD3x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y4E);
    dp->::ccc::DD3x15y4::~DD3x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y4E(Test__ZN3ccc8DD3x15y4E, "_ZN3ccc8DD3x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y4C1Ev();
extern void _ZN3ccc8DD3x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y4E[] = {
  NSPAIR(_ZN3ccc8DD3x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y4E[];
extern void _ZN3ccc8DD3x15y43efgEv();
extern void _ZN3ccc8DD3x15y43pqrEv();
extern void _ZN3ccc8DD3x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y4E[] = {
  {&(_ZTVN3ccc8DD3x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y4E[];
Class_Descriptor cd__ZN3ccc8DD3x15y4E = {  "_ZN3ccc8DD3x15y4E", // class name
  bases__ZN3ccc8DD3x15y4E, 2,
  &(vtc__ZN3ccc8DD3x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y4E),2, //virtual 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  CC3x15y5  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC3x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y53abcEv
  ~CC3x15y5(); // tgen
  CC3x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y5E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y53pqrEv");}
void  ccc::CC3x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y53efgEv");}
void  ccc::CC3x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y53abcEv");}
ccc::CC3x15y5 ::~CC3x15y5(){ note_dtor("_ZN3ccc8CC3x15y5E", this);} // tgen
ccc::CC3x15y5 ::CC3x15y5(){ note_ctor("_ZN3ccc8CC3x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y5E, buf);
    ::ccc::CC3x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y5E);
    dp->::ccc::CC3x15y5::~CC3x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y5E(Test__ZN3ccc8CC3x15y5E, "_ZN3ccc8CC3x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y5C1Ev();
extern void _ZN3ccc8CC3x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y5E[] = {
  NSPAIR(_ZN3ccc8CC3x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y5E[];
extern void _ZN3ccc8CC3x15y53efgEv();
extern void _ZN3ccc8CC3x15y53pqrEv();
extern void _ZN3ccc8CC3x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y5E[] = {
  {&(_ZTVN3ccc8CC3x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y5E[];
Class_Descriptor cd__ZN3ccc8CC3x15y5E = {  "_ZN3ccc8CC3x15y5E", // class name
  bases__ZN3ccc8CC3x15y5E, 2,
  &(vtc__ZN3ccc8CC3x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y5E),2, //virtual 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  DD3x15y5  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD3x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD3x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD3x15y53abcEv
  ~DD3x15y5(); // tgen
  DD3x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y5E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD3x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y53pqrEv");}
void  ccc::DD3x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y53efgEv");}
void  ccc::DD3x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y53abcEv");}
ccc::DD3x15y5 ::~DD3x15y5(){ note_dtor("_ZN3ccc8DD3x15y5E", this);} // tgen
ccc::DD3x15y5 ::DD3x15y5(){ note_ctor("_ZN3ccc8DD3x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y5E, buf);
    ::ccc::DD3x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y5E);
    dp->::ccc::DD3x15y5::~DD3x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y5E(Test__ZN3ccc8DD3x15y5E, "_ZN3ccc8DD3x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y5C1Ev();
extern void _ZN3ccc8DD3x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y5E[] = {
  NSPAIR(_ZN3ccc8DD3x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y5E[];
extern void _ZN3ccc8DD3x15y53efgEv();
extern void _ZN3ccc8DD3x15y53pqrEv();
extern void _ZN3ccc8DD3x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y5E[] = {
  {&(_ZTVN3ccc8DD3x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y5E[];
Class_Descriptor cd__ZN3ccc8DD3x15y5E = {  "_ZN3ccc8DD3x15y5E", // class name
  bases__ZN3ccc8DD3x15y5E, 2,
  &(vtc__ZN3ccc8DD3x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y5E),2, //virtual 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  CC3x15y6  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y63efgEv
  ~CC3x15y6(); // tgen
  CC3x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y6E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y63abcEv");}
void  ccc::CC3x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y63efgEv");}
ccc::CC3x15y6 ::~CC3x15y6(){ note_dtor("_ZN3ccc8CC3x15y6E", this);} // tgen
ccc::CC3x15y6 ::CC3x15y6(){ note_ctor("_ZN3ccc8CC3x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y6E, buf);
    ::ccc::CC3x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y6E);
    dp->::ccc::CC3x15y6::~CC3x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y6E(Test__ZN3ccc8CC3x15y6E, "_ZN3ccc8CC3x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y6C1Ev();
extern void _ZN3ccc8CC3x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y6E[] = {
  NSPAIR(_ZN3ccc8CC3x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y6E[];
extern void _ZN3ccc8CC3x15y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y6E[] = {
  {&(_ZTVN3ccc8CC3x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y6E[];
Class_Descriptor cd__ZN3ccc8CC3x15y6E = {  "_ZN3ccc8CC3x15y6E", // class name
  bases__ZN3ccc8CC3x15y6E, 2,
  &(vtc__ZN3ccc8CC3x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y6E),2, //virtual 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  DD3x15y6  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD3x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD3x15y63efgEv
  ~DD3x15y6(); // tgen
  DD3x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y6E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y63abcEv");}
void  ccc::DD3x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y63efgEv");}
ccc::DD3x15y6 ::~DD3x15y6(){ note_dtor("_ZN3ccc8DD3x15y6E", this);} // tgen
ccc::DD3x15y6 ::DD3x15y6(){ note_ctor("_ZN3ccc8DD3x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y6E, buf);
    ::ccc::DD3x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y6E);
    dp->::ccc::DD3x15y6::~DD3x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y6E(Test__ZN3ccc8DD3x15y6E, "_ZN3ccc8DD3x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y6C1Ev();
extern void _ZN3ccc8DD3x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y6E[] = {
  NSPAIR(_ZN3ccc8DD3x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y6E[];
extern void _ZN3ccc8DD3x15y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y6E[] = {
  {&(_ZTVN3ccc8DD3x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y6E[];
Class_Descriptor cd__ZN3ccc8DD3x15y6E = {  "_ZN3ccc8DD3x15y6E", // class name
  bases__ZN3ccc8DD3x15y6E, 2,
  &(vtc__ZN3ccc8DD3x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y6E),2, //virtual 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  CC3x15y7  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y73pqrEv
  ~CC3x15y7(); // tgen
  CC3x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y7E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y73abcEv");}
void  ccc::CC3x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y73pqrEv");}
ccc::CC3x15y7 ::~CC3x15y7(){ note_dtor("_ZN3ccc8CC3x15y7E", this);} // tgen
ccc::CC3x15y7 ::CC3x15y7(){ note_ctor("_ZN3ccc8CC3x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y7E, buf);
    ::ccc::CC3x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y7E);
    dp->::ccc::CC3x15y7::~CC3x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y7E(Test__ZN3ccc8CC3x15y7E, "_ZN3ccc8CC3x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y7C1Ev();
extern void _ZN3ccc8CC3x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y7E[] = {
  NSPAIR(_ZN3ccc8CC3x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x15y73pqrEv();
extern void _ZN3ccc8CC3x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y7E[] = {
  {&(_ZTVN3ccc8CC3x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y7E[];
Class_Descriptor cd__ZN3ccc8CC3x15y7E = {  "_ZN3ccc8CC3x15y7E", // class name
  bases__ZN3ccc8CC3x15y7E, 2,
  &(vtc__ZN3ccc8CC3x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y7E),2, //virtual 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  DD3x15y7  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD3x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y73pqrEv
  ~DD3x15y7(); // tgen
  DD3x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y7E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y73abcEv");}
void  ccc::DD3x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y73pqrEv");}
ccc::DD3x15y7 ::~DD3x15y7(){ note_dtor("_ZN3ccc8DD3x15y7E", this);} // tgen
ccc::DD3x15y7 ::DD3x15y7(){ note_ctor("_ZN3ccc8DD3x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y7E, buf);
    ::ccc::DD3x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y7E);
    dp->::ccc::DD3x15y7::~DD3x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y7E(Test__ZN3ccc8DD3x15y7E, "_ZN3ccc8DD3x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y7C1Ev();
extern void _ZN3ccc8DD3x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y7E[] = {
  NSPAIR(_ZN3ccc8DD3x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8DD3x15y73pqrEv();
extern void _ZN3ccc8DD3x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y7E[] = {
  {&(_ZTVN3ccc8DD3x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y7E[];
Class_Descriptor cd__ZN3ccc8DD3x15y7E = {  "_ZN3ccc8DD3x15y7E", // class name
  bases__ZN3ccc8DD3x15y7E, 2,
  &(vtc__ZN3ccc8DD3x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y7E),2, //virtual 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  CC3x15y8  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y83abcEv
  ~CC3x15y8(); // tgen
  CC3x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y8E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y83efgEv");}
void  ccc::CC3x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y83abcEv");}
ccc::CC3x15y8 ::~CC3x15y8(){ note_dtor("_ZN3ccc8CC3x15y8E", this);} // tgen
ccc::CC3x15y8 ::CC3x15y8(){ note_ctor("_ZN3ccc8CC3x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y8E, buf);
    ::ccc::CC3x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y8E);
    dp->::ccc::CC3x15y8::~CC3x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y8E(Test__ZN3ccc8CC3x15y8E, "_ZN3ccc8CC3x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y8C1Ev();
extern void _ZN3ccc8CC3x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y8E[] = {
  NSPAIR(_ZN3ccc8CC3x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y8E[];
extern void _ZN3ccc8CC3x15y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y8E[] = {
  {&(_ZTVN3ccc8CC3x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y8E[];
Class_Descriptor cd__ZN3ccc8CC3x15y8E = {  "_ZN3ccc8CC3x15y8E", // class name
  bases__ZN3ccc8CC3x15y8E, 2,
  &(vtc__ZN3ccc8CC3x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y8E),2, //virtual 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  DD3x15y8  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD3x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD3x15y83abcEv
  ~DD3x15y8(); // tgen
  DD3x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y8E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y83efgEv");}
void  ccc::DD3x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD3x15y83abcEv");}
ccc::DD3x15y8 ::~DD3x15y8(){ note_dtor("_ZN3ccc8DD3x15y8E", this);} // tgen
ccc::DD3x15y8 ::DD3x15y8(){ note_ctor("_ZN3ccc8DD3x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y8E, buf);
    ::ccc::DD3x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y8E);
    dp->::ccc::DD3x15y8::~DD3x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y8E(Test__ZN3ccc8DD3x15y8E, "_ZN3ccc8DD3x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y8C1Ev();
extern void _ZN3ccc8DD3x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y8E[] = {
  NSPAIR(_ZN3ccc8DD3x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y8E[];
extern void _ZN3ccc8DD3x15y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8DD3x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y8E[] = {
  {&(_ZTVN3ccc8DD3x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y8E[];
Class_Descriptor cd__ZN3ccc8DD3x15y8E = {  "_ZN3ccc8DD3x15y8E", // class name
  bases__ZN3ccc8DD3x15y8E, 2,
  &(vtc__ZN3ccc8DD3x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y8E),2, //virtual 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  CC3x15y9  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y93pqrEv
  ~CC3x15y9(); // tgen
  CC3x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y9E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y93efgEv");}
void  ccc::CC3x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y93pqrEv");}
ccc::CC3x15y9 ::~CC3x15y9(){ note_dtor("_ZN3ccc8CC3x15y9E", this);} // tgen
ccc::CC3x15y9 ::CC3x15y9(){ note_ctor("_ZN3ccc8CC3x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y9E, buf);
    ::ccc::CC3x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y9E);
    dp->::ccc::CC3x15y9::~CC3x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y9E(Test__ZN3ccc8CC3x15y9E, "_ZN3ccc8CC3x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y9C1Ev();
extern void _ZN3ccc8CC3x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y9E[] = {
  NSPAIR(_ZN3ccc8CC3x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y9E[];
extern void _ZN3ccc8CC3x15y93efgEv();
extern void _ZN3ccc8CC3x15y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC3x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC3x15y9E[] = {
  {&(_ZTVN3ccc8CC3x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC3x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC3x15y9E[];
Class_Descriptor cd__ZN3ccc8CC3x15y9E = {  "_ZN3ccc8CC3x15y9E", // class name
  bases__ZN3ccc8CC3x15y9E, 2,
  &(vtc__ZN3ccc8CC3x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC3x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC3x15y9E),2, //virtual 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  DD3x15y9  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD3x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD3x15y93pqrEv
  ~DD3x15y9(); // tgen
  DD3x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD3x15y9E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD3x15y93efgEv");}
void  ccc::DD3x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD3x15y93pqrEv");}
ccc::DD3x15y9 ::~DD3x15y9(){ note_dtor("_ZN3ccc8DD3x15y9E", this);} // tgen
ccc::DD3x15y9 ::DD3x15y9(){ note_ctor("_ZN3ccc8DD3x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD3x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD3x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD3x15y9E, buf);
    ::ccc::DD3x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD3x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD3x15y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8DD3x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD3x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD3x15y9E);
    dp->::ccc::DD3x15y9::~DD3x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD3x15y9E(Test__ZN3ccc8DD3x15y9E, "_ZN3ccc8DD3x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD3x15y9C1Ev();
extern void _ZN3ccc8DD3x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD3x15y9E[] = {
  NSPAIR(_ZN3ccc8DD3x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD3x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD3x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y9E[];
extern void _ZN3ccc8DD3x15y93efgEv();
extern void _ZN3ccc8DD3x15y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD3x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD3x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD3x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD3x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD3x15y9E[] = {
  {&(_ZTVN3ccc8DD3x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD3x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD3x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD3x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD3x15y9E[];
Class_Descriptor cd__ZN3ccc8DD3x15y9E = {  "_ZN3ccc8DD3x15y9E", // class name
  bases__ZN3ccc8DD3x15y9E, 2,
  &(vtc__ZN3ccc8DD3x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD3x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD3x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD3x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD3x15y9E),2, //virtual 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  CC3x15y10  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x15y103abcEv
  ~CC3x15y10(); // tgen
  CC3x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y10E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y103pqrEv");}
void  ccc::CC3x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x15y103abcEv");}
ccc::CC3x15y10 ::~CC3x15y10(){ note_dtor("_ZN3ccc9CC3x15y10E", this);} // tgen
ccc::CC3x15y10 ::CC3x15y10(){ note_ctor("_ZN3ccc9CC3x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y10E, buf);
    ::ccc::CC3x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y10E);
    dp->::ccc::CC3x15y10::~CC3x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y10E(Test__ZN3ccc9CC3x15y10E, "_ZN3ccc9CC3x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y10C1Ev();
extern void _ZN3ccc9CC3x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y10E[] = {
  NSPAIR(_ZN3ccc9CC3x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x15y103pqrEv();
extern void _ZN3ccc9CC3x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y10E[] = {
  {&(_ZTVN3ccc9CC3x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y10E[];
Class_Descriptor cd__ZN3ccc9CC3x15y10E = {  "_ZN3ccc9CC3x15y10E", // class name
  bases__ZN3ccc9CC3x15y10E, 2,
  &(vtc__ZN3ccc9CC3x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y10E),2, //virtual 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  DD3x15y10  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD3x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD3x15y103abcEv
  ~DD3x15y10(); // tgen
  DD3x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y10E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x15y103pqrEv");}
void  ccc::DD3x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x15y103abcEv");}
ccc::DD3x15y10 ::~DD3x15y10(){ note_dtor("_ZN3ccc9DD3x15y10E", this);} // tgen
ccc::DD3x15y10 ::DD3x15y10(){ note_ctor("_ZN3ccc9DD3x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y10E, buf);
    ::ccc::DD3x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y10E);
    dp->::ccc::DD3x15y10::~DD3x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y10E(Test__ZN3ccc9DD3x15y10E, "_ZN3ccc9DD3x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y10C1Ev();
extern void _ZN3ccc9DD3x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y10E[] = {
  NSPAIR(_ZN3ccc9DD3x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x15y103pqrEv();
extern void _ZN3ccc9DD3x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y10E[] = {
  {&(_ZTVN3ccc9DD3x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y10E[];
Class_Descriptor cd__ZN3ccc9DD3x15y10E = {  "_ZN3ccc9DD3x15y10E", // class name
  bases__ZN3ccc9DD3x15y10E, 2,
  &(vtc__ZN3ccc9DD3x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y10E),2, //virtual 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  CC3x15y11  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x15y113efgEv
  ~CC3x15y11(); // tgen
  CC3x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y11E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y113pqrEv");}
void  ccc::CC3x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x15y113efgEv");}
ccc::CC3x15y11 ::~CC3x15y11(){ note_dtor("_ZN3ccc9CC3x15y11E", this);} // tgen
ccc::CC3x15y11 ::CC3x15y11(){ note_ctor("_ZN3ccc9CC3x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y11E, buf);
    ::ccc::CC3x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y11E);
    dp->::ccc::CC3x15y11::~CC3x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y11E(Test__ZN3ccc9CC3x15y11E, "_ZN3ccc9CC3x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y11C1Ev();
extern void _ZN3ccc9CC3x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y11E[] = {
  NSPAIR(_ZN3ccc9CC3x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y11E[];
extern void _ZN3ccc9CC3x15y113efgEv();
extern void _ZN3ccc9CC3x15y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y11E[] = {
  {&(_ZTVN3ccc9CC3x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y11E[];
Class_Descriptor cd__ZN3ccc9CC3x15y11E = {  "_ZN3ccc9CC3x15y11E", // class name
  bases__ZN3ccc9CC3x15y11E, 2,
  &(vtc__ZN3ccc9CC3x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y11E),2, //virtual 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  DD3x15y11  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD3x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD3x15y113efgEv
  ~DD3x15y11(); // tgen
  DD3x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y11E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD3x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x15y113pqrEv");}
void  ccc::DD3x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x15y113efgEv");}
ccc::DD3x15y11 ::~DD3x15y11(){ note_dtor("_ZN3ccc9DD3x15y11E", this);} // tgen
ccc::DD3x15y11 ::DD3x15y11(){ note_ctor("_ZN3ccc9DD3x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y11E, buf);
    ::ccc::DD3x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y11E);
    dp->::ccc::DD3x15y11::~DD3x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y11E(Test__ZN3ccc9DD3x15y11E, "_ZN3ccc9DD3x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y11C1Ev();
extern void _ZN3ccc9DD3x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y11E[] = {
  NSPAIR(_ZN3ccc9DD3x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y11E[];
extern void _ZN3ccc9DD3x15y113efgEv();
extern void _ZN3ccc9DD3x15y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y11E[] = {
  {&(_ZTVN3ccc9DD3x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y11E[];
Class_Descriptor cd__ZN3ccc9DD3x15y11E = {  "_ZN3ccc9DD3x15y11E", // class name
  bases__ZN3ccc9DD3x15y11E, 2,
  &(vtc__ZN3ccc9DD3x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y11E),2, //virtual 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  CC3x15y12  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC3x15y123abcEv
  ~CC3x15y12(); // tgen
  CC3x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y12E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x15y123abcEv");}
ccc::CC3x15y12 ::~CC3x15y12(){ note_dtor("_ZN3ccc9CC3x15y12E", this);} // tgen
ccc::CC3x15y12 ::CC3x15y12(){ note_ctor("_ZN3ccc9CC3x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y12E, buf);
    ::ccc::CC3x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y12E);
    dp->::ccc::CC3x15y12::~CC3x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y12E(Test__ZN3ccc9CC3x15y12E, "_ZN3ccc9CC3x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y12C1Ev();
extern void _ZN3ccc9CC3x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y12E[] = {
  NSPAIR(_ZN3ccc9CC3x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y12E[] = {
  {&(_ZTVN3ccc9CC3x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y12E[];
Class_Descriptor cd__ZN3ccc9CC3x15y12E = {  "_ZN3ccc9CC3x15y12E", // class name
  bases__ZN3ccc9CC3x15y12E, 2,
  &(vtc__ZN3ccc9CC3x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y12E),2, //virtual 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  DD3x15y12  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD3x15y123abcEv
  ~DD3x15y12(); // tgen
  DD3x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y12E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD3x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD3x15y123abcEv");}
ccc::DD3x15y12 ::~DD3x15y12(){ note_dtor("_ZN3ccc9DD3x15y12E", this);} // tgen
ccc::DD3x15y12 ::DD3x15y12(){ note_ctor("_ZN3ccc9DD3x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y12E, buf);
    ::ccc::DD3x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y12E);
    dp->::ccc::DD3x15y12::~DD3x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y12E(Test__ZN3ccc9DD3x15y12E, "_ZN3ccc9DD3x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y12C1Ev();
extern void _ZN3ccc9DD3x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y12E[] = {
  NSPAIR(_ZN3ccc9DD3x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9DD3x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y12E[] = {
  {&(_ZTVN3ccc9DD3x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y12E[];
Class_Descriptor cd__ZN3ccc9DD3x15y12E = {  "_ZN3ccc9DD3x15y12E", // class name
  bases__ZN3ccc9DD3x15y12E, 2,
  &(vtc__ZN3ccc9DD3x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y12E),2, //virtual 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  CC3x15y13  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC3x15y133efgEv
  ~CC3x15y13(); // tgen
  CC3x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y13E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x15y133efgEv");}
ccc::CC3x15y13 ::~CC3x15y13(){ note_dtor("_ZN3ccc9CC3x15y13E", this);} // tgen
ccc::CC3x15y13 ::CC3x15y13(){ note_ctor("_ZN3ccc9CC3x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y13E, buf);
    ::ccc::CC3x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y13E);
    dp->::ccc::CC3x15y13::~CC3x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y13E(Test__ZN3ccc9CC3x15y13E, "_ZN3ccc9CC3x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y13C1Ev();
extern void _ZN3ccc9CC3x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y13E[] = {
  NSPAIR(_ZN3ccc9CC3x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y13E[];
extern void _ZN3ccc9CC3x15y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y13E[] = {
  {&(_ZTVN3ccc9CC3x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y13E[];
Class_Descriptor cd__ZN3ccc9CC3x15y13E = {  "_ZN3ccc9CC3x15y13E", // class name
  bases__ZN3ccc9CC3x15y13E, 2,
  &(vtc__ZN3ccc9CC3x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y13E),2, //virtual 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  DD3x15y13  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD3x15y133efgEv
  ~DD3x15y13(); // tgen
  DD3x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y13E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD3x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD3x15y133efgEv");}
ccc::DD3x15y13 ::~DD3x15y13(){ note_dtor("_ZN3ccc9DD3x15y13E", this);} // tgen
ccc::DD3x15y13 ::DD3x15y13(){ note_ctor("_ZN3ccc9DD3x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y13E, buf);
    ::ccc::DD3x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y13E);
    dp->::ccc::DD3x15y13::~DD3x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y13E(Test__ZN3ccc9DD3x15y13E, "_ZN3ccc9DD3x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y13C1Ev();
extern void _ZN3ccc9DD3x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y13E[] = {
  NSPAIR(_ZN3ccc9DD3x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y13E[];
extern void _ZN3ccc9DD3x15y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y13E[] = {
  {&(_ZTVN3ccc9DD3x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y13E[];
Class_Descriptor cd__ZN3ccc9DD3x15y13E = {  "_ZN3ccc9DD3x15y13E", // class name
  bases__ZN3ccc9DD3x15y13E, 2,
  &(vtc__ZN3ccc9DD3x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y13E),2, //virtual 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  CC3x15y14  : virtual ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y143pqrEv
  ~CC3x15y14(); // tgen
  CC3x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y14E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y143pqrEv");}
ccc::CC3x15y14 ::~CC3x15y14(){ note_dtor("_ZN3ccc9CC3x15y14E", this);} // tgen
ccc::CC3x15y14 ::CC3x15y14(){ note_ctor("_ZN3ccc9CC3x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y14E, buf);
    ::ccc::CC3x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y14E);
    dp->::ccc::CC3x15y14::~CC3x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y14E(Test__ZN3ccc9CC3x15y14E, "_ZN3ccc9CC3x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y14C1Ev();
extern void _ZN3ccc9CC3x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y14E[] = {
  NSPAIR(_ZN3ccc9CC3x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x15y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y14E[] = {
  {&(_ZTVN3ccc9CC3x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y14E[];
Class_Descriptor cd__ZN3ccc9CC3x15y14E = {  "_ZN3ccc9CC3x15y14E", // class name
  bases__ZN3ccc9CC3x15y14E, 2,
  &(vtc__ZN3ccc9CC3x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y14E),2, //virtual 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  DD3x15y14  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD3x15y143pqrEv
  ~DD3x15y14(); // tgen
  DD3x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y14E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD3x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD3x15y143pqrEv");}
ccc::DD3x15y14 ::~DD3x15y14(){ note_dtor("_ZN3ccc9DD3x15y14E", this);} // tgen
ccc::DD3x15y14 ::DD3x15y14(){ note_ctor("_ZN3ccc9DD3x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y14E, buf);
    ::ccc::DD3x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y14E);
    dp->::ccc::DD3x15y14::~DD3x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y14E(Test__ZN3ccc9DD3x15y14E, "_ZN3ccc9DD3x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y14C1Ev();
extern void _ZN3ccc9DD3x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y14E[] = {
  NSPAIR(_ZN3ccc9DD3x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9DD3x15y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD3x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y14E[] = {
  {&(_ZTVN3ccc9DD3x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y14E[];
Class_Descriptor cd__ZN3ccc9DD3x15y14E = {  "_ZN3ccc9DD3x15y14E", // class name
  bases__ZN3ccc9DD3x15y14E, 2,
  &(vtc__ZN3ccc9DD3x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y14E),2, //virtual 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  CC3x15y15  : virtual ::ccc::AA3 , ::ccc::BB15 {
  ~CC3x15y15(); // tgen
  CC3x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC3x15y15 ::~CC3x15y15(){ note_dtor("_ZN3ccc9CC3x15y15E", this);} // tgen
ccc::CC3x15y15 ::CC3x15y15(){ note_ctor("_ZN3ccc9CC3x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y15E, buf);
    ::ccc::CC3x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y15E);
    dp->::ccc::CC3x15y15::~CC3x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y15E(Test__ZN3ccc9CC3x15y15E, "_ZN3ccc9CC3x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y15C1Ev();
extern void _ZN3ccc9CC3x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y15E[] = {
  NSPAIR(_ZN3ccc9CC3x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC3x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC3x15y15E[] = {
  {&(_ZTVN3ccc9CC3x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC3x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC3x15y15E[];
Class_Descriptor cd__ZN3ccc9CC3x15y15E = {  "_ZN3ccc9CC3x15y15E", // class name
  bases__ZN3ccc9CC3x15y15E, 2,
  &(vtc__ZN3ccc9CC3x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC3x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC3x15y15E),2, //virtual 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  DD3x15y15  : virtual ::ccc::AA3 , virtual ::ccc::BB15 {
  ~DD3x15y15(); // tgen
  DD3x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD3x15y15E) C1{ VBC2{ v1 v2 v3} VBC3{}}
}
namespace ccc { 
ccc::DD3x15y15 ::~DD3x15y15(){ note_dtor("_ZN3ccc9DD3x15y15E", this);} // tgen
ccc::DD3x15y15 ::DD3x15y15(){ note_ctor("_ZN3ccc9DD3x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD3x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD3x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD3x15y15E, buf);
    ::ccc::DD3x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD3x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD3x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD3x15y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9DD3x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD3x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD3x15y15E);
    dp->::ccc::DD3x15y15::~DD3x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD3x15y15E(Test__ZN3ccc9DD3x15y15E, "_ZN3ccc9DD3x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD3x15y15C1Ev();
extern void _ZN3ccc9DD3x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD3x15y15E[] = {
  NSPAIR(_ZN3ccc9DD3x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD3x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD3x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD3x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD3x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD3x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD3x15y15E[] = {
  {&(_ZTVN3ccc9DD3x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD3x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD3x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD3x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD3x15y15E[];
Class_Descriptor cd__ZN3ccc9DD3x15y15E = {  "_ZN3ccc9DD3x15y15E", // class name
  bases__ZN3ccc9DD3x15y15E, 2,
  &(vtc__ZN3ccc9DD3x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD3x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD3x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD3x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD3x15y15E),2, //virtual 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  CC4x0y0  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y03pqrEv
  ~CC4x0y0(); // tgen
  CC4x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y0E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y03abcEv");}
void  ccc::CC4x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y03efgEv");}
void  ccc::CC4x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y03pqrEv");}
ccc::CC4x0y0 ::~CC4x0y0(){ note_dtor("_ZN3ccc7CC4x0y0E", this);} // tgen
ccc::CC4x0y0 ::CC4x0y0(){ note_ctor("_ZN3ccc7CC4x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y0E, buf);
    ::ccc::CC4x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y0E);
    dp->::ccc::CC4x0y0::~CC4x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y0E(Test__ZN3ccc7CC4x0y0E, "_ZN3ccc7CC4x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y0C1Ev();
extern void _ZN3ccc7CC4x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y0E[] = {
  NSPAIR(_ZN3ccc7CC4x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y0E[];
extern void _ZN3ccc7CC4x0y03abcEv();
extern void _ZN3ccc7CC4x0y03efgEv();
extern void _ZN3ccc7CC4x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y03pqrEv,_ZTv0_n12_N3ccc7CC4x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03pqrEv,_ZThn4_N3ccc7CC4x0y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y03abcEv,_ZTv0_n16_N3ccc7CC4x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03abcEv,_ZThn4_N3ccc7CC4x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y03efgEv,_ZTv0_n20_N3ccc7CC4x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03efgEv,_ZThn4_N3ccc7CC4x0y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y03pqrEv,_ZTv0_n12_N3ccc7CC4x0y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y03abcEv,_ZTv0_n16_N3ccc7CC4x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y03efgEv,_ZTv0_n20_N3ccc7CC4x0y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y0E[] = {
  {&(_ZTVN3ccc7CC4x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y0E[];
static VTBL_ENTRY alt_thunk_names1729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y03efgEv,_ZTv0_n20_N3ccc7CC4x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y03efgEv,_ZThn4_N3ccc7CC4x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y03abcEv,_ZTv0_n16_N3ccc7CC4x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y03abcEv,_ZThn4_N3ccc7CC4x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y03pqrEv,_ZTv0_n12_N3ccc7CC4x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y03pqrEv,_ZThn4_N3ccc7CC4x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y0E = {  "_ZN3ccc7CC4x0y0E", // class name
  bases__ZN3ccc7CC4x0y0E, 2,
  &(vtc__ZN3ccc7CC4x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1729,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y0  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD4x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y03pqrEv
  ~DD4x0y0(); // tgen
  DD4x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y03abcEv");}
void  ccc::DD4x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y03efgEv");}
void  ccc::DD4x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y03pqrEv");}
ccc::DD4x0y0 ::~DD4x0y0(){ note_dtor("_ZN3ccc7DD4x0y0E", this);} // tgen
ccc::DD4x0y0 ::DD4x0y0(){ note_ctor("_ZN3ccc7DD4x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y0E, buf);
    ::ccc::DD4x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y0E);
    dp->::ccc::DD4x0y0::~DD4x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y0E(Test__ZN3ccc7DD4x0y0E, "_ZN3ccc7DD4x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y0C1Ev();
extern void _ZN3ccc7DD4x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y0E[] = {
  NSPAIR(_ZN3ccc7DD4x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y0E[];
extern void _ZN3ccc7DD4x0y03pqrEv();
extern void _ZN3ccc7DD4x0y03abcEv();
extern void _ZN3ccc7DD4x0y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y03abcEv,_ZTv0_n12_N3ccc7DD4x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y03abcEv,_ZThn4_N3ccc7DD4x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y03efgEv,_ZTv0_n16_N3ccc7DD4x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y03efgEv,_ZThn4_N3ccc7DD4x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y03pqrEv,_ZTv0_n20_N3ccc7DD4x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y03pqrEv,_ZThn4_N3ccc7DD4x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y03abcEv,_ZTv0_n12_N3ccc7DD4x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y03efgEv,_ZTv0_n16_N3ccc7DD4x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y03pqrEv,_ZTv0_n20_N3ccc7DD4x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y0E[] = {
  {&(_ZTVN3ccc7DD4x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y0E[];
static VTBL_ENTRY alt_thunk_names1730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y03pqrEv,_ZTv0_n20_N3ccc7DD4x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y03pqrEv,_ZThn4_N3ccc7DD4x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y03efgEv,_ZTv0_n16_N3ccc7DD4x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y03efgEv,_ZThn4_N3ccc7DD4x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y03abcEv,_ZTv0_n12_N3ccc7DD4x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y03abcEv,_ZThn4_N3ccc7DD4x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y0E = {  "_ZN3ccc7DD4x0y0E", // class name
  bases__ZN3ccc7DD4x0y0E, 2,
  &(vtc__ZN3ccc7DD4x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1730,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y1  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x0y13efgEv
  ~CC4x0y1(); // tgen
  CC4x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y1E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y13abcEv");}
void  ccc::CC4x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y13pqrEv");}
void  ccc::CC4x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y13efgEv");}
ccc::CC4x0y1 ::~CC4x0y1(){ note_dtor("_ZN3ccc7CC4x0y1E", this);} // tgen
ccc::CC4x0y1 ::CC4x0y1(){ note_ctor("_ZN3ccc7CC4x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y1E, buf);
    ::ccc::CC4x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y1E);
    dp->::ccc::CC4x0y1::~CC4x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y1E(Test__ZN3ccc7CC4x0y1E, "_ZN3ccc7CC4x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y1C1Ev();
extern void _ZN3ccc7CC4x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y1E[] = {
  NSPAIR(_ZN3ccc7CC4x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y1E[];
extern void _ZN3ccc7CC4x0y13abcEv();
extern void _ZN3ccc7CC4x0y13efgEv();
extern void _ZN3ccc7CC4x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y13pqrEv,_ZTv0_n12_N3ccc7CC4x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13pqrEv,_ZThn4_N3ccc7CC4x0y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y13abcEv,_ZTv0_n16_N3ccc7CC4x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13abcEv,_ZThn4_N3ccc7CC4x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y13efgEv,_ZTv0_n20_N3ccc7CC4x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13efgEv,_ZThn4_N3ccc7CC4x0y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y13pqrEv,_ZTv0_n12_N3ccc7CC4x0y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y13abcEv,_ZTv0_n16_N3ccc7CC4x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y13efgEv,_ZTv0_n20_N3ccc7CC4x0y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y1E[] = {
  {&(_ZTVN3ccc7CC4x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y1E[];
static VTBL_ENTRY alt_thunk_names1731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y13efgEv,_ZTv0_n20_N3ccc7CC4x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y13efgEv,_ZThn4_N3ccc7CC4x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y13abcEv,_ZTv0_n16_N3ccc7CC4x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y13abcEv,_ZThn4_N3ccc7CC4x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y13pqrEv,_ZTv0_n12_N3ccc7CC4x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y13pqrEv,_ZThn4_N3ccc7CC4x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y1E = {  "_ZN3ccc7CC4x0y1E", // class name
  bases__ZN3ccc7CC4x0y1E, 2,
  &(vtc__ZN3ccc7CC4x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1731,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y1  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD4x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x0y13efgEv
  ~DD4x0y1(); // tgen
  DD4x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y13abcEv");}
void  ccc::DD4x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y13pqrEv");}
void  ccc::DD4x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y13efgEv");}
ccc::DD4x0y1 ::~DD4x0y1(){ note_dtor("_ZN3ccc7DD4x0y1E", this);} // tgen
ccc::DD4x0y1 ::DD4x0y1(){ note_ctor("_ZN3ccc7DD4x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y1E, buf);
    ::ccc::DD4x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y1E);
    dp->::ccc::DD4x0y1::~DD4x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y1E(Test__ZN3ccc7DD4x0y1E, "_ZN3ccc7DD4x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y1C1Ev();
extern void _ZN3ccc7DD4x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y1E[] = {
  NSPAIR(_ZN3ccc7DD4x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y1E[];
extern void _ZN3ccc7DD4x0y13pqrEv();
extern void _ZN3ccc7DD4x0y13abcEv();
extern void _ZN3ccc7DD4x0y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y13abcEv,_ZTv0_n12_N3ccc7DD4x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y13abcEv,_ZThn4_N3ccc7DD4x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y13efgEv,_ZTv0_n16_N3ccc7DD4x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y13efgEv,_ZThn4_N3ccc7DD4x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y13pqrEv,_ZTv0_n20_N3ccc7DD4x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y13pqrEv,_ZThn4_N3ccc7DD4x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y13abcEv,_ZTv0_n12_N3ccc7DD4x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y13efgEv,_ZTv0_n16_N3ccc7DD4x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y13pqrEv,_ZTv0_n20_N3ccc7DD4x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y1E[] = {
  {&(_ZTVN3ccc7DD4x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y1E[];
static VTBL_ENTRY alt_thunk_names1732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y13pqrEv,_ZTv0_n20_N3ccc7DD4x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y13pqrEv,_ZThn4_N3ccc7DD4x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y13efgEv,_ZTv0_n16_N3ccc7DD4x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y13efgEv,_ZThn4_N3ccc7DD4x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y13abcEv,_ZTv0_n12_N3ccc7DD4x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y13abcEv,_ZThn4_N3ccc7DD4x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y1E = {  "_ZN3ccc7DD4x0y1E", // class name
  bases__ZN3ccc7DD4x0y1E, 2,
  &(vtc__ZN3ccc7DD4x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1732,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y2  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y23pqrEv
  ~CC4x0y2(); // tgen
  CC4x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y2E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y23efgEv");}
void  ccc::CC4x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y23abcEv");}
void  ccc::CC4x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y23pqrEv");}
ccc::CC4x0y2 ::~CC4x0y2(){ note_dtor("_ZN3ccc7CC4x0y2E", this);} // tgen
ccc::CC4x0y2 ::CC4x0y2(){ note_ctor("_ZN3ccc7CC4x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y2E, buf);
    ::ccc::CC4x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y2E);
    dp->::ccc::CC4x0y2::~CC4x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y2E(Test__ZN3ccc7CC4x0y2E, "_ZN3ccc7CC4x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y2C1Ev();
extern void _ZN3ccc7CC4x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y2E[] = {
  NSPAIR(_ZN3ccc7CC4x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y2E[];
extern void _ZN3ccc7CC4x0y23abcEv();
extern void _ZN3ccc7CC4x0y23efgEv();
extern void _ZN3ccc7CC4x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y23pqrEv,_ZTv0_n12_N3ccc7CC4x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23pqrEv,_ZThn4_N3ccc7CC4x0y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y23abcEv,_ZTv0_n16_N3ccc7CC4x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23abcEv,_ZThn4_N3ccc7CC4x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y23efgEv,_ZTv0_n20_N3ccc7CC4x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23efgEv,_ZThn4_N3ccc7CC4x0y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y23pqrEv,_ZTv0_n12_N3ccc7CC4x0y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y23abcEv,_ZTv0_n16_N3ccc7CC4x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y23efgEv,_ZTv0_n20_N3ccc7CC4x0y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y2E[] = {
  {&(_ZTVN3ccc7CC4x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y2E[];
static VTBL_ENTRY alt_thunk_names1733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y23efgEv,_ZTv0_n20_N3ccc7CC4x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y23efgEv,_ZThn4_N3ccc7CC4x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y23abcEv,_ZTv0_n16_N3ccc7CC4x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y23abcEv,_ZThn4_N3ccc7CC4x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y23pqrEv,_ZTv0_n12_N3ccc7CC4x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y23pqrEv,_ZThn4_N3ccc7CC4x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y2E = {  "_ZN3ccc7CC4x0y2E", // class name
  bases__ZN3ccc7CC4x0y2E, 2,
  &(vtc__ZN3ccc7CC4x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1733,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y2  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD4x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y23pqrEv
  ~DD4x0y2(); // tgen
  DD4x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y23efgEv");}
void  ccc::DD4x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y23abcEv");}
void  ccc::DD4x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y23pqrEv");}
ccc::DD4x0y2 ::~DD4x0y2(){ note_dtor("_ZN3ccc7DD4x0y2E", this);} // tgen
ccc::DD4x0y2 ::DD4x0y2(){ note_ctor("_ZN3ccc7DD4x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y2E, buf);
    ::ccc::DD4x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y2E);
    dp->::ccc::DD4x0y2::~DD4x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y2E(Test__ZN3ccc7DD4x0y2E, "_ZN3ccc7DD4x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y2C1Ev();
extern void _ZN3ccc7DD4x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y2E[] = {
  NSPAIR(_ZN3ccc7DD4x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y2E[];
extern void _ZN3ccc7DD4x0y23pqrEv();
extern void _ZN3ccc7DD4x0y23abcEv();
extern void _ZN3ccc7DD4x0y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y23abcEv,_ZTv0_n12_N3ccc7DD4x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y23abcEv,_ZThn4_N3ccc7DD4x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y23efgEv,_ZTv0_n16_N3ccc7DD4x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y23efgEv,_ZThn4_N3ccc7DD4x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y23pqrEv,_ZTv0_n20_N3ccc7DD4x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y23pqrEv,_ZThn4_N3ccc7DD4x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y23abcEv,_ZTv0_n12_N3ccc7DD4x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y23efgEv,_ZTv0_n16_N3ccc7DD4x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y23pqrEv,_ZTv0_n20_N3ccc7DD4x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y2E[] = {
  {&(_ZTVN3ccc7DD4x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y2E[];
static VTBL_ENTRY alt_thunk_names1734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y23pqrEv,_ZTv0_n20_N3ccc7DD4x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y23pqrEv,_ZThn4_N3ccc7DD4x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y23efgEv,_ZTv0_n16_N3ccc7DD4x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y23efgEv,_ZThn4_N3ccc7DD4x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y23abcEv,_ZTv0_n12_N3ccc7DD4x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y23abcEv,_ZThn4_N3ccc7DD4x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y2E = {  "_ZN3ccc7DD4x0y2E", // class name
  bases__ZN3ccc7DD4x0y2E, 2,
  &(vtc__ZN3ccc7DD4x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1734,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y3  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x0y33abcEv
  ~CC4x0y3(); // tgen
  CC4x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y3E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y33efgEv");}
void  ccc::CC4x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y33pqrEv");}
void  ccc::CC4x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y33abcEv");}
ccc::CC4x0y3 ::~CC4x0y3(){ note_dtor("_ZN3ccc7CC4x0y3E", this);} // tgen
ccc::CC4x0y3 ::CC4x0y3(){ note_ctor("_ZN3ccc7CC4x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y3E, buf);
    ::ccc::CC4x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y3E);
    dp->::ccc::CC4x0y3::~CC4x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y3E(Test__ZN3ccc7CC4x0y3E, "_ZN3ccc7CC4x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y3C1Ev();
extern void _ZN3ccc7CC4x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y3E[] = {
  NSPAIR(_ZN3ccc7CC4x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y3E[];
extern void _ZN3ccc7CC4x0y33abcEv();
extern void _ZN3ccc7CC4x0y33efgEv();
extern void _ZN3ccc7CC4x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y33pqrEv,_ZTv0_n12_N3ccc7CC4x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33pqrEv,_ZThn4_N3ccc7CC4x0y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y33abcEv,_ZTv0_n16_N3ccc7CC4x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33abcEv,_ZThn4_N3ccc7CC4x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y33efgEv,_ZTv0_n20_N3ccc7CC4x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33efgEv,_ZThn4_N3ccc7CC4x0y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y33pqrEv,_ZTv0_n12_N3ccc7CC4x0y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y33abcEv,_ZTv0_n16_N3ccc7CC4x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y33efgEv,_ZTv0_n20_N3ccc7CC4x0y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y3E[] = {
  {&(_ZTVN3ccc7CC4x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y3E[];
static VTBL_ENTRY alt_thunk_names1735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y33efgEv,_ZTv0_n20_N3ccc7CC4x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y33efgEv,_ZThn4_N3ccc7CC4x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y33abcEv,_ZTv0_n16_N3ccc7CC4x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y33abcEv,_ZThn4_N3ccc7CC4x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y33pqrEv,_ZTv0_n12_N3ccc7CC4x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y33pqrEv,_ZThn4_N3ccc7CC4x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y3E = {  "_ZN3ccc7CC4x0y3E", // class name
  bases__ZN3ccc7CC4x0y3E, 2,
  &(vtc__ZN3ccc7CC4x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1735,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y3  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD4x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x0y33abcEv
  ~DD4x0y3(); // tgen
  DD4x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y33efgEv");}
void  ccc::DD4x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y33pqrEv");}
void  ccc::DD4x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y33abcEv");}
ccc::DD4x0y3 ::~DD4x0y3(){ note_dtor("_ZN3ccc7DD4x0y3E", this);} // tgen
ccc::DD4x0y3 ::DD4x0y3(){ note_ctor("_ZN3ccc7DD4x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y3E, buf);
    ::ccc::DD4x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y3E);
    dp->::ccc::DD4x0y3::~DD4x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y3E(Test__ZN3ccc7DD4x0y3E, "_ZN3ccc7DD4x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y3C1Ev();
extern void _ZN3ccc7DD4x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y3E[] = {
  NSPAIR(_ZN3ccc7DD4x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y3E[];
extern void _ZN3ccc7DD4x0y33pqrEv();
extern void _ZN3ccc7DD4x0y33abcEv();
extern void _ZN3ccc7DD4x0y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y33abcEv,_ZTv0_n12_N3ccc7DD4x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y33abcEv,_ZThn4_N3ccc7DD4x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y33efgEv,_ZTv0_n16_N3ccc7DD4x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y33efgEv,_ZThn4_N3ccc7DD4x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y33pqrEv,_ZTv0_n20_N3ccc7DD4x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y33pqrEv,_ZThn4_N3ccc7DD4x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y33abcEv,_ZTv0_n12_N3ccc7DD4x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y33efgEv,_ZTv0_n16_N3ccc7DD4x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y33pqrEv,_ZTv0_n20_N3ccc7DD4x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y3E[] = {
  {&(_ZTVN3ccc7DD4x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y3E[];
static VTBL_ENTRY alt_thunk_names1736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y33pqrEv,_ZTv0_n20_N3ccc7DD4x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y33pqrEv,_ZThn4_N3ccc7DD4x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y33efgEv,_ZTv0_n16_N3ccc7DD4x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y33efgEv,_ZThn4_N3ccc7DD4x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y33abcEv,_ZTv0_n12_N3ccc7DD4x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y33abcEv,_ZThn4_N3ccc7DD4x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y3E = {  "_ZN3ccc7DD4x0y3E", // class name
  bases__ZN3ccc7DD4x0y3E, 2,
  &(vtc__ZN3ccc7DD4x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1736,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y4  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC4x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y43efgEv
  ~CC4x0y4(); // tgen
  CC4x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y4E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y43pqrEv");}
void  ccc::CC4x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y43abcEv");}
void  ccc::CC4x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y43efgEv");}
ccc::CC4x0y4 ::~CC4x0y4(){ note_dtor("_ZN3ccc7CC4x0y4E", this);} // tgen
ccc::CC4x0y4 ::CC4x0y4(){ note_ctor("_ZN3ccc7CC4x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y4E, buf);
    ::ccc::CC4x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y4E);
    dp->::ccc::CC4x0y4::~CC4x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y4E(Test__ZN3ccc7CC4x0y4E, "_ZN3ccc7CC4x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y4C1Ev();
extern void _ZN3ccc7CC4x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y4E[] = {
  NSPAIR(_ZN3ccc7CC4x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y4E[];
extern void _ZN3ccc7CC4x0y43abcEv();
extern void _ZN3ccc7CC4x0y43efgEv();
extern void _ZN3ccc7CC4x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y43pqrEv,_ZTv0_n12_N3ccc7CC4x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43pqrEv,_ZThn4_N3ccc7CC4x0y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y43abcEv,_ZTv0_n16_N3ccc7CC4x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43abcEv,_ZThn4_N3ccc7CC4x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y43efgEv,_ZTv0_n20_N3ccc7CC4x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43efgEv,_ZThn4_N3ccc7CC4x0y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y43pqrEv,_ZTv0_n12_N3ccc7CC4x0y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y43abcEv,_ZTv0_n16_N3ccc7CC4x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y43efgEv,_ZTv0_n20_N3ccc7CC4x0y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y4E[] = {
  {&(_ZTVN3ccc7CC4x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y4E[];
static VTBL_ENTRY alt_thunk_names1737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y43efgEv,_ZTv0_n20_N3ccc7CC4x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y43efgEv,_ZThn4_N3ccc7CC4x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y43abcEv,_ZTv0_n16_N3ccc7CC4x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y43abcEv,_ZThn4_N3ccc7CC4x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y43pqrEv,_ZTv0_n12_N3ccc7CC4x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y43pqrEv,_ZThn4_N3ccc7CC4x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y4E = {  "_ZN3ccc7CC4x0y4E", // class name
  bases__ZN3ccc7CC4x0y4E, 2,
  &(vtc__ZN3ccc7CC4x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1737,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y4  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD4x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x0y43efgEv
  ~DD4x0y4(); // tgen
  DD4x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y43pqrEv");}
void  ccc::DD4x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y43abcEv");}
void  ccc::DD4x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y43efgEv");}
ccc::DD4x0y4 ::~DD4x0y4(){ note_dtor("_ZN3ccc7DD4x0y4E", this);} // tgen
ccc::DD4x0y4 ::DD4x0y4(){ note_ctor("_ZN3ccc7DD4x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y4E, buf);
    ::ccc::DD4x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y4E);
    dp->::ccc::DD4x0y4::~DD4x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y4E(Test__ZN3ccc7DD4x0y4E, "_ZN3ccc7DD4x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y4C1Ev();
extern void _ZN3ccc7DD4x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y4E[] = {
  NSPAIR(_ZN3ccc7DD4x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y4E[];
extern void _ZN3ccc7DD4x0y43pqrEv();
extern void _ZN3ccc7DD4x0y43abcEv();
extern void _ZN3ccc7DD4x0y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y43abcEv,_ZTv0_n12_N3ccc7DD4x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y43abcEv,_ZThn4_N3ccc7DD4x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y43efgEv,_ZTv0_n16_N3ccc7DD4x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y43efgEv,_ZThn4_N3ccc7DD4x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y43pqrEv,_ZTv0_n20_N3ccc7DD4x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y43pqrEv,_ZThn4_N3ccc7DD4x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y43abcEv,_ZTv0_n12_N3ccc7DD4x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y43efgEv,_ZTv0_n16_N3ccc7DD4x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y43pqrEv,_ZTv0_n20_N3ccc7DD4x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y4E[] = {
  {&(_ZTVN3ccc7DD4x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y4E[];
static VTBL_ENTRY alt_thunk_names1738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y43pqrEv,_ZTv0_n20_N3ccc7DD4x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y43pqrEv,_ZThn4_N3ccc7DD4x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y43efgEv,_ZTv0_n16_N3ccc7DD4x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y43efgEv,_ZThn4_N3ccc7DD4x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y43abcEv,_ZTv0_n12_N3ccc7DD4x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y43abcEv,_ZThn4_N3ccc7DD4x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y4E = {  "_ZN3ccc7DD4x0y4E", // class name
  bases__ZN3ccc7DD4x0y4E, 2,
  &(vtc__ZN3ccc7DD4x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1738,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y5  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC4x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y53abcEv
  ~CC4x0y5(); // tgen
  CC4x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y5E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y53pqrEv");}
void  ccc::CC4x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y53efgEv");}
void  ccc::CC4x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y53abcEv");}
ccc::CC4x0y5 ::~CC4x0y5(){ note_dtor("_ZN3ccc7CC4x0y5E", this);} // tgen
ccc::CC4x0y5 ::CC4x0y5(){ note_ctor("_ZN3ccc7CC4x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y5E, buf);
    ::ccc::CC4x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y5E);
    dp->::ccc::CC4x0y5::~CC4x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y5E(Test__ZN3ccc7CC4x0y5E, "_ZN3ccc7CC4x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y5C1Ev();
extern void _ZN3ccc7CC4x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y5E[] = {
  NSPAIR(_ZN3ccc7CC4x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y5E[];
extern void _ZN3ccc7CC4x0y53abcEv();
extern void _ZN3ccc7CC4x0y53efgEv();
extern void _ZN3ccc7CC4x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y53pqrEv,_ZTv0_n12_N3ccc7CC4x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53pqrEv,_ZThn4_N3ccc7CC4x0y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y53abcEv,_ZTv0_n16_N3ccc7CC4x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53abcEv,_ZThn4_N3ccc7CC4x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y53efgEv,_ZTv0_n20_N3ccc7CC4x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53efgEv,_ZThn4_N3ccc7CC4x0y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y53pqrEv,_ZTv0_n12_N3ccc7CC4x0y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y53abcEv,_ZTv0_n16_N3ccc7CC4x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y53efgEv,_ZTv0_n20_N3ccc7CC4x0y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y5E[] = {
  {&(_ZTVN3ccc7CC4x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y5E[];
static VTBL_ENTRY alt_thunk_names1739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y53efgEv,_ZTv0_n20_N3ccc7CC4x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y53efgEv,_ZThn4_N3ccc7CC4x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y53abcEv,_ZTv0_n16_N3ccc7CC4x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y53abcEv,_ZThn4_N3ccc7CC4x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y53pqrEv,_ZTv0_n12_N3ccc7CC4x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y53pqrEv,_ZThn4_N3ccc7CC4x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y5E = {  "_ZN3ccc7CC4x0y5E", // class name
  bases__ZN3ccc7CC4x0y5E, 2,
  &(vtc__ZN3ccc7CC4x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1739,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y5  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD4x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x0y53abcEv
  ~DD4x0y5(); // tgen
  DD4x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y53pqrEv");}
void  ccc::DD4x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y53efgEv");}
void  ccc::DD4x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y53abcEv");}
ccc::DD4x0y5 ::~DD4x0y5(){ note_dtor("_ZN3ccc7DD4x0y5E", this);} // tgen
ccc::DD4x0y5 ::DD4x0y5(){ note_ctor("_ZN3ccc7DD4x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y5E, buf);
    ::ccc::DD4x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y5E);
    dp->::ccc::DD4x0y5::~DD4x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y5E(Test__ZN3ccc7DD4x0y5E, "_ZN3ccc7DD4x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y5C1Ev();
extern void _ZN3ccc7DD4x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y5E[] = {
  NSPAIR(_ZN3ccc7DD4x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y5E[];
extern void _ZN3ccc7DD4x0y53pqrEv();
extern void _ZN3ccc7DD4x0y53abcEv();
extern void _ZN3ccc7DD4x0y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y53abcEv,_ZTv0_n12_N3ccc7DD4x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y53abcEv,_ZThn4_N3ccc7DD4x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y53efgEv,_ZTv0_n16_N3ccc7DD4x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y53efgEv,_ZThn4_N3ccc7DD4x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y53pqrEv,_ZTv0_n20_N3ccc7DD4x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y53pqrEv,_ZThn4_N3ccc7DD4x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y53abcEv,_ZTv0_n12_N3ccc7DD4x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y53efgEv,_ZTv0_n16_N3ccc7DD4x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y53pqrEv,_ZTv0_n20_N3ccc7DD4x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y5E[] = {
  {&(_ZTVN3ccc7DD4x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y5E[];
static VTBL_ENTRY alt_thunk_names1740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y53pqrEv,_ZTv0_n20_N3ccc7DD4x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y53pqrEv,_ZThn4_N3ccc7DD4x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y53efgEv,_ZTv0_n16_N3ccc7DD4x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y53efgEv,_ZThn4_N3ccc7DD4x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y53abcEv,_ZTv0_n12_N3ccc7DD4x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y53abcEv,_ZThn4_N3ccc7DD4x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y5E = {  "_ZN3ccc7DD4x0y5E", // class name
  bases__ZN3ccc7DD4x0y5E, 2,
  &(vtc__ZN3ccc7DD4x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1740,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y6  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y63efgEv
  ~CC4x0y6(); // tgen
  CC4x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y6E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y63abcEv");}
void  ccc::CC4x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y63efgEv");}
ccc::CC4x0y6 ::~CC4x0y6(){ note_dtor("_ZN3ccc7CC4x0y6E", this);} // tgen
ccc::CC4x0y6 ::CC4x0y6(){ note_ctor("_ZN3ccc7CC4x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y6E, buf);
    ::ccc::CC4x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y6E);
    dp->::ccc::CC4x0y6::~CC4x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y6E(Test__ZN3ccc7CC4x0y6E, "_ZN3ccc7CC4x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y6C1Ev();
extern void _ZN3ccc7CC4x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y6E[] = {
  NSPAIR(_ZN3ccc7CC4x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y6E[];
extern void _ZN3ccc7CC4x0y63abcEv();
extern void _ZN3ccc7CC4x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y63abcEv,_ZTv0_n16_N3ccc7CC4x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y63abcEv,_ZThn4_N3ccc7CC4x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y63efgEv,_ZTv0_n20_N3ccc7CC4x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y63efgEv,_ZThn4_N3ccc7CC4x0y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y63abcEv,_ZTv0_n16_N3ccc7CC4x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y63efgEv,_ZTv0_n20_N3ccc7CC4x0y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y6E[] = {
  {&(_ZTVN3ccc7CC4x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y6E[];
static VTBL_ENTRY alt_thunk_names1741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y63efgEv,_ZTv0_n20_N3ccc7CC4x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y63efgEv,_ZThn4_N3ccc7CC4x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y63abcEv,_ZTv0_n16_N3ccc7CC4x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y63abcEv,_ZThn4_N3ccc7CC4x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y6E = {  "_ZN3ccc7CC4x0y6E", // class name
  bases__ZN3ccc7CC4x0y6E, 2,
  &(vtc__ZN3ccc7CC4x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1741,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y6  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD4x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x0y63efgEv
  ~DD4x0y6(); // tgen
  DD4x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y63abcEv");}
void  ccc::DD4x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y63efgEv");}
ccc::DD4x0y6 ::~DD4x0y6(){ note_dtor("_ZN3ccc7DD4x0y6E", this);} // tgen
ccc::DD4x0y6 ::DD4x0y6(){ note_ctor("_ZN3ccc7DD4x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y6E, buf);
    ::ccc::DD4x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y6E);
    dp->::ccc::DD4x0y6::~DD4x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y6E(Test__ZN3ccc7DD4x0y6E, "_ZN3ccc7DD4x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y6C1Ev();
extern void _ZN3ccc7DD4x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y6E[] = {
  NSPAIR(_ZN3ccc7DD4x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x0y63abcEv();
extern void _ZN3ccc7DD4x0y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y63abcEv,_ZTv0_n12_N3ccc7DD4x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y63abcEv,_ZThn4_N3ccc7DD4x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y63efgEv,_ZTv0_n16_N3ccc7DD4x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y63efgEv,_ZThn4_N3ccc7DD4x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y63abcEv,_ZTv0_n12_N3ccc7DD4x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y63efgEv,_ZTv0_n16_N3ccc7DD4x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y6E[] = {
  {&(_ZTVN3ccc7DD4x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y6E[];
static VTBL_ENTRY alt_thunk_names1742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y63efgEv,_ZTv0_n16_N3ccc7DD4x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y63efgEv,_ZThn4_N3ccc7DD4x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y63abcEv,_ZTv0_n12_N3ccc7DD4x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y63abcEv,_ZThn4_N3ccc7DD4x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y6E = {  "_ZN3ccc7DD4x0y6E", // class name
  bases__ZN3ccc7DD4x0y6E, 2,
  &(vtc__ZN3ccc7DD4x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1742,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y7  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y73pqrEv
  ~CC4x0y7(); // tgen
  CC4x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y7E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y73abcEv");}
void  ccc::CC4x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y73pqrEv");}
ccc::CC4x0y7 ::~CC4x0y7(){ note_dtor("_ZN3ccc7CC4x0y7E", this);} // tgen
ccc::CC4x0y7 ::CC4x0y7(){ note_ctor("_ZN3ccc7CC4x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y7E, buf);
    ::ccc::CC4x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y7E);
    dp->::ccc::CC4x0y7::~CC4x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y7E(Test__ZN3ccc7CC4x0y7E, "_ZN3ccc7CC4x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y7C1Ev();
extern void _ZN3ccc7CC4x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y7E[] = {
  NSPAIR(_ZN3ccc7CC4x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y7E[];
extern void _ZN3ccc7CC4x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC4x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y73pqrEv,_ZTv0_n12_N3ccc7CC4x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y73pqrEv,_ZThn4_N3ccc7CC4x0y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y73abcEv,_ZTv0_n16_N3ccc7CC4x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y73abcEv,_ZThn4_N3ccc7CC4x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y73pqrEv,_ZTv0_n12_N3ccc7CC4x0y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y73abcEv,_ZTv0_n16_N3ccc7CC4x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y7E[] = {
  {&(_ZTVN3ccc7CC4x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y7E[];
static VTBL_ENTRY alt_thunk_names1743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y73abcEv,_ZTv0_n16_N3ccc7CC4x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y73abcEv,_ZThn4_N3ccc7CC4x0y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y73pqrEv,_ZTv0_n12_N3ccc7CC4x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y73pqrEv,_ZThn4_N3ccc7CC4x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y7E = {  "_ZN3ccc7CC4x0y7E", // class name
  bases__ZN3ccc7CC4x0y7E, 2,
  &(vtc__ZN3ccc7CC4x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1743,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y7  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD4x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y73pqrEv
  ~DD4x0y7(); // tgen
  DD4x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y73abcEv");}
void  ccc::DD4x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y73pqrEv");}
ccc::DD4x0y7 ::~DD4x0y7(){ note_dtor("_ZN3ccc7DD4x0y7E", this);} // tgen
ccc::DD4x0y7 ::DD4x0y7(){ note_ctor("_ZN3ccc7DD4x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y7E, buf);
    ::ccc::DD4x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y7E);
    dp->::ccc::DD4x0y7::~DD4x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y7E(Test__ZN3ccc7DD4x0y7E, "_ZN3ccc7DD4x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y7C1Ev();
extern void _ZN3ccc7DD4x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y7E[] = {
  NSPAIR(_ZN3ccc7DD4x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y7E[];
extern void _ZN3ccc7DD4x0y73pqrEv();
extern void _ZN3ccc7DD4x0y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y73abcEv,_ZTv0_n12_N3ccc7DD4x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y73abcEv,_ZThn4_N3ccc7DD4x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y73pqrEv,_ZTv0_n20_N3ccc7DD4x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y73pqrEv,_ZThn4_N3ccc7DD4x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y73abcEv,_ZTv0_n12_N3ccc7DD4x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y73pqrEv,_ZTv0_n20_N3ccc7DD4x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y7E[] = {
  {&(_ZTVN3ccc7DD4x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y7E[];
static VTBL_ENTRY alt_thunk_names1744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y73pqrEv,_ZTv0_n20_N3ccc7DD4x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y73pqrEv,_ZThn4_N3ccc7DD4x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y73abcEv,_ZTv0_n12_N3ccc7DD4x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y73abcEv,_ZThn4_N3ccc7DD4x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y7E = {  "_ZN3ccc7DD4x0y7E", // class name
  bases__ZN3ccc7DD4x0y7E, 2,
  &(vtc__ZN3ccc7DD4x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1744,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y8  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y83abcEv
  ~CC4x0y8(); // tgen
  CC4x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y8E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y83efgEv");}
void  ccc::CC4x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y83abcEv");}
ccc::CC4x0y8 ::~CC4x0y8(){ note_dtor("_ZN3ccc7CC4x0y8E", this);} // tgen
ccc::CC4x0y8 ::CC4x0y8(){ note_ctor("_ZN3ccc7CC4x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y8E, buf);
    ::ccc::CC4x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y8E);
    dp->::ccc::CC4x0y8::~CC4x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y8E(Test__ZN3ccc7CC4x0y8E, "_ZN3ccc7CC4x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y8C1Ev();
extern void _ZN3ccc7CC4x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y8E[] = {
  NSPAIR(_ZN3ccc7CC4x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y8E[];
extern void _ZN3ccc7CC4x0y83abcEv();
extern void _ZN3ccc7CC4x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x0y83abcEv,_ZTv0_n16_N3ccc7CC4x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y83abcEv,_ZThn4_N3ccc7CC4x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y83efgEv,_ZTv0_n20_N3ccc7CC4x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y83efgEv,_ZThn4_N3ccc7CC4x0y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x0y83abcEv,_ZTv0_n16_N3ccc7CC4x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y83efgEv,_ZTv0_n20_N3ccc7CC4x0y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y8E[] = {
  {&(_ZTVN3ccc7CC4x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y8E[];
static VTBL_ENTRY alt_thunk_names1745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y83efgEv,_ZTv0_n20_N3ccc7CC4x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y83efgEv,_ZThn4_N3ccc7CC4x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x0y83abcEv,_ZTv0_n16_N3ccc7CC4x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y83abcEv,_ZThn4_N3ccc7CC4x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y8E = {  "_ZN3ccc7CC4x0y8E", // class name
  bases__ZN3ccc7CC4x0y8E, 2,
  &(vtc__ZN3ccc7CC4x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1745,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y8  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD4x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x0y83abcEv
  ~DD4x0y8(); // tgen
  DD4x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y83efgEv");}
void  ccc::DD4x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x0y83abcEv");}
ccc::DD4x0y8 ::~DD4x0y8(){ note_dtor("_ZN3ccc7DD4x0y8E", this);} // tgen
ccc::DD4x0y8 ::DD4x0y8(){ note_ctor("_ZN3ccc7DD4x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y8E, buf);
    ::ccc::DD4x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y8E);
    dp->::ccc::DD4x0y8::~DD4x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y8E(Test__ZN3ccc7DD4x0y8E, "_ZN3ccc7DD4x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y8C1Ev();
extern void _ZN3ccc7DD4x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y8E[] = {
  NSPAIR(_ZN3ccc7DD4x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x0y83abcEv();
extern void _ZN3ccc7DD4x0y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x0y83abcEv,_ZTv0_n12_N3ccc7DD4x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y83abcEv,_ZThn4_N3ccc7DD4x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y83efgEv,_ZTv0_n16_N3ccc7DD4x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y83efgEv,_ZThn4_N3ccc7DD4x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x0y83abcEv,_ZTv0_n12_N3ccc7DD4x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y83efgEv,_ZTv0_n16_N3ccc7DD4x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y8E[] = {
  {&(_ZTVN3ccc7DD4x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y8E[];
static VTBL_ENTRY alt_thunk_names1746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y83efgEv,_ZTv0_n16_N3ccc7DD4x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y83efgEv,_ZThn4_N3ccc7DD4x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x0y83abcEv,_ZTv0_n12_N3ccc7DD4x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y83abcEv,_ZThn4_N3ccc7DD4x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y8E = {  "_ZN3ccc7DD4x0y8E", // class name
  bases__ZN3ccc7DD4x0y8E, 2,
  &(vtc__ZN3ccc7DD4x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1746,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y9  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y93pqrEv
  ~CC4x0y9(); // tgen
  CC4x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y9E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y93efgEv");}
void  ccc::CC4x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y93pqrEv");}
ccc::CC4x0y9 ::~CC4x0y9(){ note_dtor("_ZN3ccc7CC4x0y9E", this);} // tgen
ccc::CC4x0y9 ::CC4x0y9(){ note_ctor("_ZN3ccc7CC4x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y9E, buf);
    ::ccc::CC4x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC4x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y9E);
    dp->::ccc::CC4x0y9::~CC4x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y9E(Test__ZN3ccc7CC4x0y9E, "_ZN3ccc7CC4x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y9C1Ev();
extern void _ZN3ccc7CC4x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y9E[] = {
  NSPAIR(_ZN3ccc7CC4x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC4x0y93efgEv();
extern void _ZN3ccc7CC4x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x0y93pqrEv,_ZTv0_n12_N3ccc7CC4x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y93pqrEv,_ZThn4_N3ccc7CC4x0y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x0y93efgEv,_ZTv0_n20_N3ccc7CC4x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y93efgEv,_ZThn4_N3ccc7CC4x0y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x0y93pqrEv,_ZTv0_n12_N3ccc7CC4x0y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x0y93efgEv,_ZTv0_n20_N3ccc7CC4x0y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x0y9E[] = {
  {&(_ZTVN3ccc7CC4x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x0y9E[];
static VTBL_ENTRY alt_thunk_names1747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x0y93efgEv,_ZTv0_n20_N3ccc7CC4x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y93efgEv,_ZThn4_N3ccc7CC4x0y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x0y93pqrEv,_ZTv0_n12_N3ccc7CC4x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x0y93pqrEv,_ZThn4_N3ccc7CC4x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x0y9E = {  "_ZN3ccc7CC4x0y9E", // class name
  bases__ZN3ccc7CC4x0y9E, 2,
  &(vtc__ZN3ccc7CC4x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x0y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1747,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y9  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD4x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x0y93pqrEv
  ~DD4x0y9(); // tgen
  DD4x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x0y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x0y93efgEv");}
void  ccc::DD4x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x0y93pqrEv");}
ccc::DD4x0y9 ::~DD4x0y9(){ note_dtor("_ZN3ccc7DD4x0y9E", this);} // tgen
ccc::DD4x0y9 ::DD4x0y9(){ note_ctor("_ZN3ccc7DD4x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x0y9E, buf);
    ::ccc::DD4x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x0y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD4x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x0y9E);
    dp->::ccc::DD4x0y9::~DD4x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x0y9E(Test__ZN3ccc7DD4x0y9E, "_ZN3ccc7DD4x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x0y9C1Ev();
extern void _ZN3ccc7DD4x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x0y9E[] = {
  NSPAIR(_ZN3ccc7DD4x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD4x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y9E[];
extern void _ZN3ccc7DD4x0y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x0y93efgEv,_ZTv0_n16_N3ccc7DD4x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y93efgEv,_ZThn4_N3ccc7DD4x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x0y93pqrEv,_ZTv0_n20_N3ccc7DD4x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x0y93pqrEv,_ZThn4_N3ccc7DD4x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x0y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x0y93efgEv,_ZTv0_n16_N3ccc7DD4x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x0y93pqrEv,_ZTv0_n20_N3ccc7DD4x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x0y9E[] = {
  {&(_ZTVN3ccc7DD4x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x0y9E[];
static VTBL_ENTRY alt_thunk_names1748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x0y93pqrEv,_ZTv0_n20_N3ccc7DD4x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y93pqrEv,_ZThn4_N3ccc7DD4x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x0y93efgEv,_ZTv0_n16_N3ccc7DD4x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x0y93efgEv,_ZThn4_N3ccc7DD4x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x0y9E = {  "_ZN3ccc7DD4x0y9E", // class name
  bases__ZN3ccc7DD4x0y9E, 2,
  &(vtc__ZN3ccc7DD4x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x0y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1748,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y10  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x0y103abcEv
  ~CC4x0y10(); // tgen
  CC4x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y10E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y103pqrEv");}
void  ccc::CC4x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x0y103abcEv");}
ccc::CC4x0y10 ::~CC4x0y10(){ note_dtor("_ZN3ccc8CC4x0y10E", this);} // tgen
ccc::CC4x0y10 ::CC4x0y10(){ note_ctor("_ZN3ccc8CC4x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y10E, buf);
    ::ccc::CC4x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y10E);
    dp->::ccc::CC4x0y10::~CC4x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y10E(Test__ZN3ccc8CC4x0y10E, "_ZN3ccc8CC4x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y10C1Ev();
extern void _ZN3ccc8CC4x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y10E[] = {
  NSPAIR(_ZN3ccc8CC4x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y10E[];
extern void _ZN3ccc8CC4x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC4x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x0y103pqrEv,_ZTv0_n12_N3ccc8CC4x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y103pqrEv,_ZThn4_N3ccc8CC4x0y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x0y103abcEv,_ZTv0_n16_N3ccc8CC4x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y103abcEv,_ZThn4_N3ccc8CC4x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x0y103pqrEv,_ZTv0_n12_N3ccc8CC4x0y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x0y103abcEv,_ZTv0_n16_N3ccc8CC4x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y10E[] = {
  {&(_ZTVN3ccc8CC4x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y10E[];
static VTBL_ENTRY alt_thunk_names1749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x0y103abcEv,_ZTv0_n16_N3ccc8CC4x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y103abcEv,_ZThn4_N3ccc8CC4x0y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x0y103pqrEv,_ZTv0_n12_N3ccc8CC4x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y103pqrEv,_ZThn4_N3ccc8CC4x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x0y10E = {  "_ZN3ccc8CC4x0y10E", // class name
  bases__ZN3ccc8CC4x0y10E, 2,
  &(vtc__ZN3ccc8CC4x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1749,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y10  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD4x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x0y103abcEv
  ~DD4x0y10(); // tgen
  DD4x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x0y103pqrEv");}
void  ccc::DD4x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x0y103abcEv");}
ccc::DD4x0y10 ::~DD4x0y10(){ note_dtor("_ZN3ccc8DD4x0y10E", this);} // tgen
ccc::DD4x0y10 ::DD4x0y10(){ note_ctor("_ZN3ccc8DD4x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y10E, buf);
    ::ccc::DD4x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y10E);
    dp->::ccc::DD4x0y10::~DD4x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y10E(Test__ZN3ccc8DD4x0y10E, "_ZN3ccc8DD4x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y10C1Ev();
extern void _ZN3ccc8DD4x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y10E[] = {
  NSPAIR(_ZN3ccc8DD4x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y10E[];
extern void _ZN3ccc8DD4x0y103pqrEv();
extern void _ZN3ccc8DD4x0y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x0y103abcEv,_ZTv0_n12_N3ccc8DD4x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y103abcEv,_ZThn4_N3ccc8DD4x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x0y103pqrEv,_ZTv0_n20_N3ccc8DD4x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y103pqrEv,_ZThn4_N3ccc8DD4x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x0y103abcEv,_ZTv0_n12_N3ccc8DD4x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x0y103pqrEv,_ZTv0_n20_N3ccc8DD4x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y10E[] = {
  {&(_ZTVN3ccc8DD4x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y10E[];
static VTBL_ENTRY alt_thunk_names1750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x0y103pqrEv,_ZTv0_n20_N3ccc8DD4x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y103pqrEv,_ZThn4_N3ccc8DD4x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x0y103abcEv,_ZTv0_n12_N3ccc8DD4x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y103abcEv,_ZThn4_N3ccc8DD4x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x0y10E = {  "_ZN3ccc8DD4x0y10E", // class name
  bases__ZN3ccc8DD4x0y10E, 2,
  &(vtc__ZN3ccc8DD4x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1750,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y11  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x0y113efgEv
  ~CC4x0y11(); // tgen
  CC4x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y11E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y113pqrEv");}
void  ccc::CC4x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x0y113efgEv");}
ccc::CC4x0y11 ::~CC4x0y11(){ note_dtor("_ZN3ccc8CC4x0y11E", this);} // tgen
ccc::CC4x0y11 ::CC4x0y11(){ note_ctor("_ZN3ccc8CC4x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y11E, buf);
    ::ccc::CC4x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y11E);
    dp->::ccc::CC4x0y11::~CC4x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y11E(Test__ZN3ccc8CC4x0y11E, "_ZN3ccc8CC4x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y11C1Ev();
extern void _ZN3ccc8CC4x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y11E[] = {
  NSPAIR(_ZN3ccc8CC4x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC4x0y113efgEv();
extern void _ZN3ccc8CC4x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x0y113pqrEv,_ZTv0_n12_N3ccc8CC4x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y113pqrEv,_ZThn4_N3ccc8CC4x0y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x0y113efgEv,_ZTv0_n20_N3ccc8CC4x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y113efgEv,_ZThn4_N3ccc8CC4x0y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x0y113pqrEv,_ZTv0_n12_N3ccc8CC4x0y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x0y113efgEv,_ZTv0_n20_N3ccc8CC4x0y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y11E[] = {
  {&(_ZTVN3ccc8CC4x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y11E[];
static VTBL_ENTRY alt_thunk_names1751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x0y113efgEv,_ZTv0_n20_N3ccc8CC4x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y113efgEv,_ZThn4_N3ccc8CC4x0y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x0y113pqrEv,_ZTv0_n12_N3ccc8CC4x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y113pqrEv,_ZThn4_N3ccc8CC4x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x0y11E = {  "_ZN3ccc8CC4x0y11E", // class name
  bases__ZN3ccc8CC4x0y11E, 2,
  &(vtc__ZN3ccc8CC4x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1751,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y11  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD4x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x0y113efgEv
  ~DD4x0y11(); // tgen
  DD4x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x0y113pqrEv");}
void  ccc::DD4x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x0y113efgEv");}
ccc::DD4x0y11 ::~DD4x0y11(){ note_dtor("_ZN3ccc8DD4x0y11E", this);} // tgen
ccc::DD4x0y11 ::DD4x0y11(){ note_ctor("_ZN3ccc8DD4x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y11E, buf);
    ::ccc::DD4x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y11E);
    dp->::ccc::DD4x0y11::~DD4x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y11E(Test__ZN3ccc8DD4x0y11E, "_ZN3ccc8DD4x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y11C1Ev();
extern void _ZN3ccc8DD4x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y11E[] = {
  NSPAIR(_ZN3ccc8DD4x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y11E[];
extern void _ZN3ccc8DD4x0y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x0y113efgEv,_ZTv0_n16_N3ccc8DD4x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y113efgEv,_ZThn4_N3ccc8DD4x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x0y113pqrEv,_ZTv0_n20_N3ccc8DD4x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y113pqrEv,_ZThn4_N3ccc8DD4x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x0y113efgEv,_ZTv0_n16_N3ccc8DD4x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x0y113pqrEv,_ZTv0_n20_N3ccc8DD4x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y11E[] = {
  {&(_ZTVN3ccc8DD4x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y11E[];
static VTBL_ENTRY alt_thunk_names1752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x0y113pqrEv,_ZTv0_n20_N3ccc8DD4x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y113pqrEv,_ZThn4_N3ccc8DD4x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x0y113efgEv,_ZTv0_n16_N3ccc8DD4x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y113efgEv,_ZThn4_N3ccc8DD4x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x0y11E = {  "_ZN3ccc8DD4x0y11E", // class name
  bases__ZN3ccc8DD4x0y11E, 2,
  &(vtc__ZN3ccc8DD4x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1752,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y12  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC4x0y123abcEv
  ~CC4x0y12(); // tgen
  CC4x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x0y123abcEv");}
ccc::CC4x0y12 ::~CC4x0y12(){ note_dtor("_ZN3ccc8CC4x0y12E", this);} // tgen
ccc::CC4x0y12 ::CC4x0y12(){ note_ctor("_ZN3ccc8CC4x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y12E, buf);
    ::ccc::CC4x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y12E);
    dp->::ccc::CC4x0y12::~CC4x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y12E(Test__ZN3ccc8CC4x0y12E, "_ZN3ccc8CC4x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y12C1Ev();
extern void _ZN3ccc8CC4x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y12E[] = {
  NSPAIR(_ZN3ccc8CC4x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y12E[];
extern void _ZN3ccc8CC4x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x0y123abcEv,_ZTv0_n16_N3ccc8CC4x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y123abcEv,_ZThn4_N3ccc8CC4x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x0y123abcEv,_ZTv0_n16_N3ccc8CC4x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y12E[] = {
  {&(_ZTVN3ccc8CC4x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y12E[];
static VTBL_ENTRY alt_thunk_names1753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x0y123abcEv,_ZTv0_n16_N3ccc8CC4x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y123abcEv,_ZThn4_N3ccc8CC4x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x0y12E = {  "_ZN3ccc8CC4x0y12E", // class name
  bases__ZN3ccc8CC4x0y12E, 2,
  &(vtc__ZN3ccc8CC4x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1753,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y12  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD4x0y123abcEv
  ~DD4x0y12(); // tgen
  DD4x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x0y123abcEv");}
ccc::DD4x0y12 ::~DD4x0y12(){ note_dtor("_ZN3ccc8DD4x0y12E", this);} // tgen
ccc::DD4x0y12 ::DD4x0y12(){ note_ctor("_ZN3ccc8DD4x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y12E, buf);
    ::ccc::DD4x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y12E);
    dp->::ccc::DD4x0y12::~DD4x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y12E(Test__ZN3ccc8DD4x0y12E, "_ZN3ccc8DD4x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y12C1Ev();
extern void _ZN3ccc8DD4x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y12E[] = {
  NSPAIR(_ZN3ccc8DD4x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x0y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x0y123abcEv,_ZTv0_n12_N3ccc8DD4x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y123abcEv,_ZThn4_N3ccc8DD4x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x0y123abcEv,_ZTv0_n12_N3ccc8DD4x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y12E[] = {
  {&(_ZTVN3ccc8DD4x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y12E[];
static VTBL_ENTRY alt_thunk_names1754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x0y123abcEv,_ZTv0_n12_N3ccc8DD4x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y123abcEv,_ZThn4_N3ccc8DD4x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x0y12E = {  "_ZN3ccc8DD4x0y12E", // class name
  bases__ZN3ccc8DD4x0y12E, 2,
  &(vtc__ZN3ccc8DD4x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1754,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y13  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC4x0y133efgEv
  ~CC4x0y13(); // tgen
  CC4x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x0y133efgEv");}
ccc::CC4x0y13 ::~CC4x0y13(){ note_dtor("_ZN3ccc8CC4x0y13E", this);} // tgen
ccc::CC4x0y13 ::CC4x0y13(){ note_ctor("_ZN3ccc8CC4x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y13E, buf);
    ::ccc::CC4x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y13E);
    dp->::ccc::CC4x0y13::~CC4x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y13E(Test__ZN3ccc8CC4x0y13E, "_ZN3ccc8CC4x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y13C1Ev();
extern void _ZN3ccc8CC4x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y13E[] = {
  NSPAIR(_ZN3ccc8CC4x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC4x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x0y133efgEv,_ZTv0_n20_N3ccc8CC4x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y133efgEv,_ZThn4_N3ccc8CC4x0y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x0y133efgEv,_ZTv0_n20_N3ccc8CC4x0y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y13E[] = {
  {&(_ZTVN3ccc8CC4x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y13E[];
static VTBL_ENTRY alt_thunk_names1755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x0y133efgEv,_ZTv0_n20_N3ccc8CC4x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y133efgEv,_ZThn4_N3ccc8CC4x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x0y13E = {  "_ZN3ccc8CC4x0y13E", // class name
  bases__ZN3ccc8CC4x0y13E, 2,
  &(vtc__ZN3ccc8CC4x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1755,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y13  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD4x0y133efgEv
  ~DD4x0y13(); // tgen
  DD4x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x0y133efgEv");}
ccc::DD4x0y13 ::~DD4x0y13(){ note_dtor("_ZN3ccc8DD4x0y13E", this);} // tgen
ccc::DD4x0y13 ::DD4x0y13(){ note_ctor("_ZN3ccc8DD4x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y13E, buf);
    ::ccc::DD4x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y13E);
    dp->::ccc::DD4x0y13::~DD4x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y13E(Test__ZN3ccc8DD4x0y13E, "_ZN3ccc8DD4x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y13C1Ev();
extern void _ZN3ccc8DD4x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y13E[] = {
  NSPAIR(_ZN3ccc8DD4x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x0y133efgEv,_ZTv0_n16_N3ccc8DD4x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y133efgEv,_ZThn4_N3ccc8DD4x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x0y133efgEv,_ZTv0_n16_N3ccc8DD4x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y13E[] = {
  {&(_ZTVN3ccc8DD4x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y13E[];
static VTBL_ENTRY alt_thunk_names1756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x0y133efgEv,_ZTv0_n16_N3ccc8DD4x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y133efgEv,_ZThn4_N3ccc8DD4x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x0y13E = {  "_ZN3ccc8DD4x0y13E", // class name
  bases__ZN3ccc8DD4x0y13E, 2,
  &(vtc__ZN3ccc8DD4x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1756,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y14  : virtual ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y143pqrEv
  ~CC4x0y14(); // tgen
  CC4x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y143pqrEv");}
ccc::CC4x0y14 ::~CC4x0y14(){ note_dtor("_ZN3ccc8CC4x0y14E", this);} // tgen
ccc::CC4x0y14 ::CC4x0y14(){ note_ctor("_ZN3ccc8CC4x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y14E, buf);
    ::ccc::CC4x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y14E);
    dp->::ccc::CC4x0y14::~CC4x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y14E(Test__ZN3ccc8CC4x0y14E, "_ZN3ccc8CC4x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y14C1Ev();
extern void _ZN3ccc8CC4x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y14E[] = {
  NSPAIR(_ZN3ccc8CC4x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC4x0y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x0y143pqrEv,_ZTv0_n12_N3ccc8CC4x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y143pqrEv,_ZThn4_N3ccc8CC4x0y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x0y143pqrEv,_ZTv0_n12_N3ccc8CC4x0y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y14E[] = {
  {&(_ZTVN3ccc8CC4x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y14E[];
static VTBL_ENTRY alt_thunk_names1757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x0y143pqrEv,_ZTv0_n12_N3ccc8CC4x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x0y143pqrEv,_ZThn4_N3ccc8CC4x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x0y14E = {  "_ZN3ccc8CC4x0y14E", // class name
  bases__ZN3ccc8CC4x0y14E, 2,
  &(vtc__ZN3ccc8CC4x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1757,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y14  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD4x0y143pqrEv
  ~DD4x0y14(); // tgen
  DD4x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x0y143pqrEv");}
ccc::DD4x0y14 ::~DD4x0y14(){ note_dtor("_ZN3ccc8DD4x0y14E", this);} // tgen
ccc::DD4x0y14 ::DD4x0y14(){ note_ctor("_ZN3ccc8DD4x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y14E, buf);
    ::ccc::DD4x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y14E);
    dp->::ccc::DD4x0y14::~DD4x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y14E(Test__ZN3ccc8DD4x0y14E, "_ZN3ccc8DD4x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y14C1Ev();
extern void _ZN3ccc8DD4x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y14E[] = {
  NSPAIR(_ZN3ccc8DD4x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y14E[];
extern void _ZN3ccc8DD4x0y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x0y143pqrEv,_ZTv0_n20_N3ccc8DD4x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x0y143pqrEv,_ZThn4_N3ccc8DD4x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x0y143pqrEv,_ZTv0_n20_N3ccc8DD4x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y14E[] = {
  {&(_ZTVN3ccc8DD4x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y14E[];
static VTBL_ENTRY alt_thunk_names1758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x0y143pqrEv,_ZTv0_n20_N3ccc8DD4x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x0y143pqrEv,_ZThn4_N3ccc8DD4x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x0y14E = {  "_ZN3ccc8DD4x0y14E", // class name
  bases__ZN3ccc8DD4x0y14E, 2,
  &(vtc__ZN3ccc8DD4x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1758,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y15  : virtual ::ccc::AA4 , ::ccc::BB0 {
  ~CC4x0y15(); // tgen
  CC4x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x0y15 ::~CC4x0y15(){ note_dtor("_ZN3ccc8CC4x0y15E", this);} // tgen
ccc::CC4x0y15 ::CC4x0y15(){ note_ctor("_ZN3ccc8CC4x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y15E, buf);
    ::ccc::CC4x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC4x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y15E);
    dp->::ccc::CC4x0y15::~CC4x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y15E(Test__ZN3ccc8CC4x0y15E, "_ZN3ccc8CC4x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y15C1Ev();
extern void _ZN3ccc8CC4x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y15E[] = {
  NSPAIR(_ZN3ccc8CC4x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x0y15E[] = {
  {&(_ZTVN3ccc8CC4x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x0y15E[];
Class_Descriptor cd__ZN3ccc8CC4x0y15E = {  "_ZN3ccc8CC4x0y15E", // class name
  bases__ZN3ccc8CC4x0y15E, 2,
  &(vtc__ZN3ccc8CC4x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x0y15  : virtual ::ccc::AA4 , virtual ::ccc::BB0 {
  ~DD4x0y15(); // tgen
  DD4x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x0y15 ::~DD4x0y15(){ note_dtor("_ZN3ccc8DD4x0y15E", this);} // tgen
ccc::DD4x0y15 ::DD4x0y15(){ note_ctor("_ZN3ccc8DD4x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x0y15E, buf);
    ::ccc::DD4x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x0y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD4x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x0y15E);
    dp->::ccc::DD4x0y15::~DD4x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x0y15E(Test__ZN3ccc8DD4x0y15E, "_ZN3ccc8DD4x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x0y15C1Ev();
extern void _ZN3ccc8DD4x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x0y15E[] = {
  NSPAIR(_ZN3ccc8DD4x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD4x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x0y15E[] = {
  {&(_ZTVN3ccc8DD4x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x0y15E[];
Class_Descriptor cd__ZN3ccc8DD4x0y15E = {  "_ZN3ccc8DD4x0y15E", // class name
  bases__ZN3ccc8DD4x0y15E, 2,
  &(vtc__ZN3ccc8DD4x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y0  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y03pqrEv
  ~CC4x1y0(); // tgen
  CC4x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y0E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y03abcEv");}
void  ccc::CC4x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y03efgEv");}
void  ccc::CC4x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y03pqrEv");}
ccc::CC4x1y0 ::~CC4x1y0(){ note_dtor("_ZN3ccc7CC4x1y0E", this);} // tgen
ccc::CC4x1y0 ::CC4x1y0(){ note_ctor("_ZN3ccc7CC4x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y0E, buf);
    ::ccc::CC4x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y0E);
    dp->::ccc::CC4x1y0::~CC4x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y0E(Test__ZN3ccc7CC4x1y0E, "_ZN3ccc7CC4x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y0C1Ev();
extern void _ZN3ccc7CC4x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y0E[] = {
  NSPAIR(_ZN3ccc7CC4x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y0E[];
extern void _ZN3ccc7CC4x1y03abcEv();
extern void _ZN3ccc7CC4x1y03pqrEv();
extern void _ZN3ccc7CC4x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y03pqrEv,_ZTv0_n12_N3ccc7CC4x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03pqrEv,_ZThn4_N3ccc7CC4x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y03abcEv,_ZTv0_n16_N3ccc7CC4x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03abcEv,_ZThn4_N3ccc7CC4x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y03efgEv,_ZTv0_n20_N3ccc7CC4x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03efgEv,_ZThn4_N3ccc7CC4x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y03pqrEv,_ZTv0_n12_N3ccc7CC4x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y03abcEv,_ZTv0_n16_N3ccc7CC4x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y03efgEv,_ZTv0_n20_N3ccc7CC4x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y0E[] = {
  {&(_ZTVN3ccc7CC4x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y0E[];
static VTBL_ENTRY alt_thunk_names1759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y03efgEv,_ZTv0_n20_N3ccc7CC4x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y03efgEv,_ZThn4_N3ccc7CC4x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y03abcEv,_ZTv0_n16_N3ccc7CC4x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y03abcEv,_ZThn4_N3ccc7CC4x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y03pqrEv,_ZTv0_n12_N3ccc7CC4x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y03pqrEv,_ZThn4_N3ccc7CC4x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y0E = {  "_ZN3ccc7CC4x1y0E", // class name
  bases__ZN3ccc7CC4x1y0E, 2,
  &(vtc__ZN3ccc7CC4x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1759,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y0  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD4x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y03pqrEv
  ~DD4x1y0(); // tgen
  DD4x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y03abcEv");}
void  ccc::DD4x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y03efgEv");}
void  ccc::DD4x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y03pqrEv");}
ccc::DD4x1y0 ::~DD4x1y0(){ note_dtor("_ZN3ccc7DD4x1y0E", this);} // tgen
ccc::DD4x1y0 ::DD4x1y0(){ note_ctor("_ZN3ccc7DD4x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y0E, buf);
    ::ccc::DD4x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y0E);
    dp->::ccc::DD4x1y0::~DD4x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y0E(Test__ZN3ccc7DD4x1y0E, "_ZN3ccc7DD4x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y0C1Ev();
extern void _ZN3ccc7DD4x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y0E[] = {
  NSPAIR(_ZN3ccc7DD4x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y0E[];
extern void _ZN3ccc7DD4x1y03pqrEv();
extern void _ZN3ccc7DD4x1y03abcEv();
extern void _ZN3ccc7DD4x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y03abcEv,_ZTv0_n12_N3ccc7DD4x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y03abcEv,_ZThn4_N3ccc7DD4x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y03pqrEv,_ZTv0_n16_N3ccc7DD4x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y03pqrEv,_ZThn4_N3ccc7DD4x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y03efgEv,_ZTv0_n20_N3ccc7DD4x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y03efgEv,_ZThn4_N3ccc7DD4x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y03abcEv,_ZTv0_n12_N3ccc7DD4x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y03pqrEv,_ZTv0_n16_N3ccc7DD4x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y03efgEv,_ZTv0_n20_N3ccc7DD4x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y0E[] = {
  {&(_ZTVN3ccc7DD4x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y0E[];
static VTBL_ENTRY alt_thunk_names1760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y03efgEv,_ZTv0_n20_N3ccc7DD4x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y03efgEv,_ZThn4_N3ccc7DD4x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y03pqrEv,_ZTv0_n16_N3ccc7DD4x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y03pqrEv,_ZThn4_N3ccc7DD4x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y03abcEv,_ZTv0_n12_N3ccc7DD4x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y03abcEv,_ZThn4_N3ccc7DD4x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y0E = {  "_ZN3ccc7DD4x1y0E", // class name
  bases__ZN3ccc7DD4x1y0E, 2,
  &(vtc__ZN3ccc7DD4x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1760,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y1  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x1y13efgEv
  ~CC4x1y1(); // tgen
  CC4x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y1E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y13abcEv");}
void  ccc::CC4x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y13pqrEv");}
void  ccc::CC4x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y13efgEv");}
ccc::CC4x1y1 ::~CC4x1y1(){ note_dtor("_ZN3ccc7CC4x1y1E", this);} // tgen
ccc::CC4x1y1 ::CC4x1y1(){ note_ctor("_ZN3ccc7CC4x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y1E, buf);
    ::ccc::CC4x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y1E);
    dp->::ccc::CC4x1y1::~CC4x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y1E(Test__ZN3ccc7CC4x1y1E, "_ZN3ccc7CC4x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y1C1Ev();
extern void _ZN3ccc7CC4x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y1E[] = {
  NSPAIR(_ZN3ccc7CC4x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y1E[];
extern void _ZN3ccc7CC4x1y13abcEv();
extern void _ZN3ccc7CC4x1y13pqrEv();
extern void _ZN3ccc7CC4x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y13pqrEv,_ZTv0_n12_N3ccc7CC4x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13pqrEv,_ZThn4_N3ccc7CC4x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y13abcEv,_ZTv0_n16_N3ccc7CC4x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13abcEv,_ZThn4_N3ccc7CC4x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y13efgEv,_ZTv0_n20_N3ccc7CC4x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13efgEv,_ZThn4_N3ccc7CC4x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y13pqrEv,_ZTv0_n12_N3ccc7CC4x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y13abcEv,_ZTv0_n16_N3ccc7CC4x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y13efgEv,_ZTv0_n20_N3ccc7CC4x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y1E[] = {
  {&(_ZTVN3ccc7CC4x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y1E[];
static VTBL_ENTRY alt_thunk_names1761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y13efgEv,_ZTv0_n20_N3ccc7CC4x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y13efgEv,_ZThn4_N3ccc7CC4x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y13abcEv,_ZTv0_n16_N3ccc7CC4x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y13abcEv,_ZThn4_N3ccc7CC4x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y13pqrEv,_ZTv0_n12_N3ccc7CC4x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y13pqrEv,_ZThn4_N3ccc7CC4x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y1E = {  "_ZN3ccc7CC4x1y1E", // class name
  bases__ZN3ccc7CC4x1y1E, 2,
  &(vtc__ZN3ccc7CC4x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1761,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y1  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD4x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x1y13efgEv
  ~DD4x1y1(); // tgen
  DD4x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y13abcEv");}
void  ccc::DD4x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y13pqrEv");}
void  ccc::DD4x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y13efgEv");}
ccc::DD4x1y1 ::~DD4x1y1(){ note_dtor("_ZN3ccc7DD4x1y1E", this);} // tgen
ccc::DD4x1y1 ::DD4x1y1(){ note_ctor("_ZN3ccc7DD4x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y1E, buf);
    ::ccc::DD4x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y1E);
    dp->::ccc::DD4x1y1::~DD4x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y1E(Test__ZN3ccc7DD4x1y1E, "_ZN3ccc7DD4x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y1C1Ev();
extern void _ZN3ccc7DD4x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y1E[] = {
  NSPAIR(_ZN3ccc7DD4x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y1E[];
extern void _ZN3ccc7DD4x1y13pqrEv();
extern void _ZN3ccc7DD4x1y13abcEv();
extern void _ZN3ccc7DD4x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y13abcEv,_ZTv0_n12_N3ccc7DD4x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y13abcEv,_ZThn4_N3ccc7DD4x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y13pqrEv,_ZTv0_n16_N3ccc7DD4x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y13pqrEv,_ZThn4_N3ccc7DD4x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y13efgEv,_ZTv0_n20_N3ccc7DD4x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y13efgEv,_ZThn4_N3ccc7DD4x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y13abcEv,_ZTv0_n12_N3ccc7DD4x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y13pqrEv,_ZTv0_n16_N3ccc7DD4x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y13efgEv,_ZTv0_n20_N3ccc7DD4x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y1E[] = {
  {&(_ZTVN3ccc7DD4x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y1E[];
static VTBL_ENTRY alt_thunk_names1762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y13efgEv,_ZTv0_n20_N3ccc7DD4x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y13efgEv,_ZThn4_N3ccc7DD4x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y13pqrEv,_ZTv0_n16_N3ccc7DD4x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y13pqrEv,_ZThn4_N3ccc7DD4x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y13abcEv,_ZTv0_n12_N3ccc7DD4x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y13abcEv,_ZThn4_N3ccc7DD4x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y1E = {  "_ZN3ccc7DD4x1y1E", // class name
  bases__ZN3ccc7DD4x1y1E, 2,
  &(vtc__ZN3ccc7DD4x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1762,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y2  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y23pqrEv
  ~CC4x1y2(); // tgen
  CC4x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y2E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y23efgEv");}
void  ccc::CC4x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y23abcEv");}
void  ccc::CC4x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y23pqrEv");}
ccc::CC4x1y2 ::~CC4x1y2(){ note_dtor("_ZN3ccc7CC4x1y2E", this);} // tgen
ccc::CC4x1y2 ::CC4x1y2(){ note_ctor("_ZN3ccc7CC4x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y2E, buf);
    ::ccc::CC4x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y2E);
    dp->::ccc::CC4x1y2::~CC4x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y2E(Test__ZN3ccc7CC4x1y2E, "_ZN3ccc7CC4x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y2C1Ev();
extern void _ZN3ccc7CC4x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y2E[] = {
  NSPAIR(_ZN3ccc7CC4x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y2E[];
extern void _ZN3ccc7CC4x1y23abcEv();
extern void _ZN3ccc7CC4x1y23pqrEv();
extern void _ZN3ccc7CC4x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y23pqrEv,_ZTv0_n12_N3ccc7CC4x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23pqrEv,_ZThn4_N3ccc7CC4x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y23abcEv,_ZTv0_n16_N3ccc7CC4x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23abcEv,_ZThn4_N3ccc7CC4x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y23efgEv,_ZTv0_n20_N3ccc7CC4x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23efgEv,_ZThn4_N3ccc7CC4x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y23pqrEv,_ZTv0_n12_N3ccc7CC4x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y23abcEv,_ZTv0_n16_N3ccc7CC4x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y23efgEv,_ZTv0_n20_N3ccc7CC4x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y2E[] = {
  {&(_ZTVN3ccc7CC4x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y2E[];
static VTBL_ENTRY alt_thunk_names1763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y23efgEv,_ZTv0_n20_N3ccc7CC4x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y23efgEv,_ZThn4_N3ccc7CC4x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y23abcEv,_ZTv0_n16_N3ccc7CC4x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y23abcEv,_ZThn4_N3ccc7CC4x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y23pqrEv,_ZTv0_n12_N3ccc7CC4x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y23pqrEv,_ZThn4_N3ccc7CC4x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y2E = {  "_ZN3ccc7CC4x1y2E", // class name
  bases__ZN3ccc7CC4x1y2E, 2,
  &(vtc__ZN3ccc7CC4x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1763,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y2  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD4x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y23pqrEv
  ~DD4x1y2(); // tgen
  DD4x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y23efgEv");}
void  ccc::DD4x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y23abcEv");}
void  ccc::DD4x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y23pqrEv");}
ccc::DD4x1y2 ::~DD4x1y2(){ note_dtor("_ZN3ccc7DD4x1y2E", this);} // tgen
ccc::DD4x1y2 ::DD4x1y2(){ note_ctor("_ZN3ccc7DD4x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y2E, buf);
    ::ccc::DD4x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y2E);
    dp->::ccc::DD4x1y2::~DD4x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y2E(Test__ZN3ccc7DD4x1y2E, "_ZN3ccc7DD4x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y2C1Ev();
extern void _ZN3ccc7DD4x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y2E[] = {
  NSPAIR(_ZN3ccc7DD4x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y2E[];
extern void _ZN3ccc7DD4x1y23pqrEv();
extern void _ZN3ccc7DD4x1y23abcEv();
extern void _ZN3ccc7DD4x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y23abcEv,_ZTv0_n12_N3ccc7DD4x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y23abcEv,_ZThn4_N3ccc7DD4x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y23pqrEv,_ZTv0_n16_N3ccc7DD4x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y23pqrEv,_ZThn4_N3ccc7DD4x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y23efgEv,_ZTv0_n20_N3ccc7DD4x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y23efgEv,_ZThn4_N3ccc7DD4x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y23abcEv,_ZTv0_n12_N3ccc7DD4x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y23pqrEv,_ZTv0_n16_N3ccc7DD4x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y23efgEv,_ZTv0_n20_N3ccc7DD4x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y2E[] = {
  {&(_ZTVN3ccc7DD4x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y2E[];
static VTBL_ENTRY alt_thunk_names1764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y23efgEv,_ZTv0_n20_N3ccc7DD4x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y23efgEv,_ZThn4_N3ccc7DD4x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y23pqrEv,_ZTv0_n16_N3ccc7DD4x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y23pqrEv,_ZThn4_N3ccc7DD4x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y23abcEv,_ZTv0_n12_N3ccc7DD4x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y23abcEv,_ZThn4_N3ccc7DD4x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y2E = {  "_ZN3ccc7DD4x1y2E", // class name
  bases__ZN3ccc7DD4x1y2E, 2,
  &(vtc__ZN3ccc7DD4x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1764,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y3  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x1y33abcEv
  ~CC4x1y3(); // tgen
  CC4x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y3E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y33efgEv");}
void  ccc::CC4x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y33pqrEv");}
void  ccc::CC4x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y33abcEv");}
ccc::CC4x1y3 ::~CC4x1y3(){ note_dtor("_ZN3ccc7CC4x1y3E", this);} // tgen
ccc::CC4x1y3 ::CC4x1y3(){ note_ctor("_ZN3ccc7CC4x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y3E, buf);
    ::ccc::CC4x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y3E);
    dp->::ccc::CC4x1y3::~CC4x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y3E(Test__ZN3ccc7CC4x1y3E, "_ZN3ccc7CC4x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y3C1Ev();
extern void _ZN3ccc7CC4x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y3E[] = {
  NSPAIR(_ZN3ccc7CC4x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y3E[];
extern void _ZN3ccc7CC4x1y33abcEv();
extern void _ZN3ccc7CC4x1y33pqrEv();
extern void _ZN3ccc7CC4x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y33pqrEv,_ZTv0_n12_N3ccc7CC4x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33pqrEv,_ZThn4_N3ccc7CC4x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y33abcEv,_ZTv0_n16_N3ccc7CC4x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33abcEv,_ZThn4_N3ccc7CC4x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y33efgEv,_ZTv0_n20_N3ccc7CC4x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33efgEv,_ZThn4_N3ccc7CC4x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y33pqrEv,_ZTv0_n12_N3ccc7CC4x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y33abcEv,_ZTv0_n16_N3ccc7CC4x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y33efgEv,_ZTv0_n20_N3ccc7CC4x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y3E[] = {
  {&(_ZTVN3ccc7CC4x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y3E[];
static VTBL_ENTRY alt_thunk_names1765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y33efgEv,_ZTv0_n20_N3ccc7CC4x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y33efgEv,_ZThn4_N3ccc7CC4x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y33abcEv,_ZTv0_n16_N3ccc7CC4x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y33abcEv,_ZThn4_N3ccc7CC4x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y33pqrEv,_ZTv0_n12_N3ccc7CC4x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y33pqrEv,_ZThn4_N3ccc7CC4x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y3E = {  "_ZN3ccc7CC4x1y3E", // class name
  bases__ZN3ccc7CC4x1y3E, 2,
  &(vtc__ZN3ccc7CC4x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1765,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y3  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD4x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x1y33abcEv
  ~DD4x1y3(); // tgen
  DD4x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y33efgEv");}
void  ccc::DD4x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y33pqrEv");}
void  ccc::DD4x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y33abcEv");}
ccc::DD4x1y3 ::~DD4x1y3(){ note_dtor("_ZN3ccc7DD4x1y3E", this);} // tgen
ccc::DD4x1y3 ::DD4x1y3(){ note_ctor("_ZN3ccc7DD4x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y3E, buf);
    ::ccc::DD4x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y3E);
    dp->::ccc::DD4x1y3::~DD4x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y3E(Test__ZN3ccc7DD4x1y3E, "_ZN3ccc7DD4x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y3C1Ev();
extern void _ZN3ccc7DD4x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y3E[] = {
  NSPAIR(_ZN3ccc7DD4x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y3E[];
extern void _ZN3ccc7DD4x1y33pqrEv();
extern void _ZN3ccc7DD4x1y33abcEv();
extern void _ZN3ccc7DD4x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y33abcEv,_ZTv0_n12_N3ccc7DD4x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y33abcEv,_ZThn4_N3ccc7DD4x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y33pqrEv,_ZTv0_n16_N3ccc7DD4x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y33pqrEv,_ZThn4_N3ccc7DD4x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y33efgEv,_ZTv0_n20_N3ccc7DD4x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y33efgEv,_ZThn4_N3ccc7DD4x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y33abcEv,_ZTv0_n12_N3ccc7DD4x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y33pqrEv,_ZTv0_n16_N3ccc7DD4x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y33efgEv,_ZTv0_n20_N3ccc7DD4x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y3E[] = {
  {&(_ZTVN3ccc7DD4x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y3E[];
static VTBL_ENTRY alt_thunk_names1766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y33efgEv,_ZTv0_n20_N3ccc7DD4x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y33efgEv,_ZThn4_N3ccc7DD4x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y33pqrEv,_ZTv0_n16_N3ccc7DD4x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y33pqrEv,_ZThn4_N3ccc7DD4x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y33abcEv,_ZTv0_n12_N3ccc7DD4x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y33abcEv,_ZThn4_N3ccc7DD4x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y3E = {  "_ZN3ccc7DD4x1y3E", // class name
  bases__ZN3ccc7DD4x1y3E, 2,
  &(vtc__ZN3ccc7DD4x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1766,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y4  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC4x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y43efgEv
  ~CC4x1y4(); // tgen
  CC4x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y4E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y43pqrEv");}
void  ccc::CC4x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y43abcEv");}
void  ccc::CC4x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y43efgEv");}
ccc::CC4x1y4 ::~CC4x1y4(){ note_dtor("_ZN3ccc7CC4x1y4E", this);} // tgen
ccc::CC4x1y4 ::CC4x1y4(){ note_ctor("_ZN3ccc7CC4x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y4E, buf);
    ::ccc::CC4x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y4E);
    dp->::ccc::CC4x1y4::~CC4x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y4E(Test__ZN3ccc7CC4x1y4E, "_ZN3ccc7CC4x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y4C1Ev();
extern void _ZN3ccc7CC4x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y4E[] = {
  NSPAIR(_ZN3ccc7CC4x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y4E[];
extern void _ZN3ccc7CC4x1y43abcEv();
extern void _ZN3ccc7CC4x1y43pqrEv();
extern void _ZN3ccc7CC4x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y43pqrEv,_ZTv0_n12_N3ccc7CC4x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43pqrEv,_ZThn4_N3ccc7CC4x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y43abcEv,_ZTv0_n16_N3ccc7CC4x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43abcEv,_ZThn4_N3ccc7CC4x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y43efgEv,_ZTv0_n20_N3ccc7CC4x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43efgEv,_ZThn4_N3ccc7CC4x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y43pqrEv,_ZTv0_n12_N3ccc7CC4x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y43abcEv,_ZTv0_n16_N3ccc7CC4x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y43efgEv,_ZTv0_n20_N3ccc7CC4x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y4E[] = {
  {&(_ZTVN3ccc7CC4x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y4E[];
static VTBL_ENTRY alt_thunk_names1767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y43efgEv,_ZTv0_n20_N3ccc7CC4x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y43efgEv,_ZThn4_N3ccc7CC4x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y43abcEv,_ZTv0_n16_N3ccc7CC4x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y43abcEv,_ZThn4_N3ccc7CC4x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y43pqrEv,_ZTv0_n12_N3ccc7CC4x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y43pqrEv,_ZThn4_N3ccc7CC4x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y4E = {  "_ZN3ccc7CC4x1y4E", // class name
  bases__ZN3ccc7CC4x1y4E, 2,
  &(vtc__ZN3ccc7CC4x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1767,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y4  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD4x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x1y43efgEv
  ~DD4x1y4(); // tgen
  DD4x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y43pqrEv");}
void  ccc::DD4x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y43abcEv");}
void  ccc::DD4x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y43efgEv");}
ccc::DD4x1y4 ::~DD4x1y4(){ note_dtor("_ZN3ccc7DD4x1y4E", this);} // tgen
ccc::DD4x1y4 ::DD4x1y4(){ note_ctor("_ZN3ccc7DD4x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y4E, buf);
    ::ccc::DD4x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y4E);
    dp->::ccc::DD4x1y4::~DD4x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y4E(Test__ZN3ccc7DD4x1y4E, "_ZN3ccc7DD4x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y4C1Ev();
extern void _ZN3ccc7DD4x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y4E[] = {
  NSPAIR(_ZN3ccc7DD4x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y4E[];
extern void _ZN3ccc7DD4x1y43pqrEv();
extern void _ZN3ccc7DD4x1y43abcEv();
extern void _ZN3ccc7DD4x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y43abcEv,_ZTv0_n12_N3ccc7DD4x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y43abcEv,_ZThn4_N3ccc7DD4x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y43pqrEv,_ZTv0_n16_N3ccc7DD4x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y43pqrEv,_ZThn4_N3ccc7DD4x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y43efgEv,_ZTv0_n20_N3ccc7DD4x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y43efgEv,_ZThn4_N3ccc7DD4x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y43abcEv,_ZTv0_n12_N3ccc7DD4x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y43pqrEv,_ZTv0_n16_N3ccc7DD4x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y43efgEv,_ZTv0_n20_N3ccc7DD4x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y4E[] = {
  {&(_ZTVN3ccc7DD4x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y4E[];
static VTBL_ENTRY alt_thunk_names1768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y43efgEv,_ZTv0_n20_N3ccc7DD4x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y43efgEv,_ZThn4_N3ccc7DD4x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y43pqrEv,_ZTv0_n16_N3ccc7DD4x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y43pqrEv,_ZThn4_N3ccc7DD4x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y43abcEv,_ZTv0_n12_N3ccc7DD4x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y43abcEv,_ZThn4_N3ccc7DD4x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y4E = {  "_ZN3ccc7DD4x1y4E", // class name
  bases__ZN3ccc7DD4x1y4E, 2,
  &(vtc__ZN3ccc7DD4x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1768,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y5  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC4x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y53abcEv
  ~CC4x1y5(); // tgen
  CC4x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y5E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y53pqrEv");}
void  ccc::CC4x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y53efgEv");}
void  ccc::CC4x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y53abcEv");}
ccc::CC4x1y5 ::~CC4x1y5(){ note_dtor("_ZN3ccc7CC4x1y5E", this);} // tgen
ccc::CC4x1y5 ::CC4x1y5(){ note_ctor("_ZN3ccc7CC4x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y5E, buf);
    ::ccc::CC4x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y5E);
    dp->::ccc::CC4x1y5::~CC4x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y5E(Test__ZN3ccc7CC4x1y5E, "_ZN3ccc7CC4x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y5C1Ev();
extern void _ZN3ccc7CC4x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y5E[] = {
  NSPAIR(_ZN3ccc7CC4x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y5E[];
extern void _ZN3ccc7CC4x1y53abcEv();
extern void _ZN3ccc7CC4x1y53pqrEv();
extern void _ZN3ccc7CC4x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y53pqrEv,_ZTv0_n12_N3ccc7CC4x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53pqrEv,_ZThn4_N3ccc7CC4x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y53abcEv,_ZTv0_n16_N3ccc7CC4x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53abcEv,_ZThn4_N3ccc7CC4x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y53efgEv,_ZTv0_n20_N3ccc7CC4x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53efgEv,_ZThn4_N3ccc7CC4x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y53pqrEv,_ZTv0_n12_N3ccc7CC4x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y53abcEv,_ZTv0_n16_N3ccc7CC4x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y53efgEv,_ZTv0_n20_N3ccc7CC4x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y5E[] = {
  {&(_ZTVN3ccc7CC4x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y5E[];
static VTBL_ENTRY alt_thunk_names1769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y53efgEv,_ZTv0_n20_N3ccc7CC4x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y53efgEv,_ZThn4_N3ccc7CC4x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y53abcEv,_ZTv0_n16_N3ccc7CC4x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y53abcEv,_ZThn4_N3ccc7CC4x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y53pqrEv,_ZTv0_n12_N3ccc7CC4x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y53pqrEv,_ZThn4_N3ccc7CC4x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y5E = {  "_ZN3ccc7CC4x1y5E", // class name
  bases__ZN3ccc7CC4x1y5E, 2,
  &(vtc__ZN3ccc7CC4x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1769,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y5  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD4x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x1y53abcEv
  ~DD4x1y5(); // tgen
  DD4x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y53pqrEv");}
void  ccc::DD4x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y53efgEv");}
void  ccc::DD4x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y53abcEv");}
ccc::DD4x1y5 ::~DD4x1y5(){ note_dtor("_ZN3ccc7DD4x1y5E", this);} // tgen
ccc::DD4x1y5 ::DD4x1y5(){ note_ctor("_ZN3ccc7DD4x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y5E, buf);
    ::ccc::DD4x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y5E);
    dp->::ccc::DD4x1y5::~DD4x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y5E(Test__ZN3ccc7DD4x1y5E, "_ZN3ccc7DD4x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y5C1Ev();
extern void _ZN3ccc7DD4x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y5E[] = {
  NSPAIR(_ZN3ccc7DD4x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y5E[];
extern void _ZN3ccc7DD4x1y53pqrEv();
extern void _ZN3ccc7DD4x1y53abcEv();
extern void _ZN3ccc7DD4x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y53abcEv,_ZTv0_n12_N3ccc7DD4x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y53abcEv,_ZThn4_N3ccc7DD4x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y53pqrEv,_ZTv0_n16_N3ccc7DD4x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y53pqrEv,_ZThn4_N3ccc7DD4x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y53efgEv,_ZTv0_n20_N3ccc7DD4x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y53efgEv,_ZThn4_N3ccc7DD4x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y53abcEv,_ZTv0_n12_N3ccc7DD4x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y53pqrEv,_ZTv0_n16_N3ccc7DD4x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y53efgEv,_ZTv0_n20_N3ccc7DD4x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y5E[] = {
  {&(_ZTVN3ccc7DD4x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y5E[];
static VTBL_ENTRY alt_thunk_names1770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y53efgEv,_ZTv0_n20_N3ccc7DD4x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y53efgEv,_ZThn4_N3ccc7DD4x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y53pqrEv,_ZTv0_n16_N3ccc7DD4x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y53pqrEv,_ZThn4_N3ccc7DD4x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y53abcEv,_ZTv0_n12_N3ccc7DD4x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y53abcEv,_ZThn4_N3ccc7DD4x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y5E = {  "_ZN3ccc7DD4x1y5E", // class name
  bases__ZN3ccc7DD4x1y5E, 2,
  &(vtc__ZN3ccc7DD4x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1770,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y6  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y63efgEv
  ~CC4x1y6(); // tgen
  CC4x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y6E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y63abcEv");}
void  ccc::CC4x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y63efgEv");}
ccc::CC4x1y6 ::~CC4x1y6(){ note_dtor("_ZN3ccc7CC4x1y6E", this);} // tgen
ccc::CC4x1y6 ::CC4x1y6(){ note_ctor("_ZN3ccc7CC4x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y6E, buf);
    ::ccc::CC4x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y6E);
    dp->::ccc::CC4x1y6::~CC4x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y6E(Test__ZN3ccc7CC4x1y6E, "_ZN3ccc7CC4x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y6C1Ev();
extern void _ZN3ccc7CC4x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y6E[] = {
  NSPAIR(_ZN3ccc7CC4x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y6E[];
extern void _ZN3ccc7CC4x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC4x1y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y63abcEv,_ZTv0_n16_N3ccc7CC4x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y63abcEv,_ZThn4_N3ccc7CC4x1y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y63efgEv,_ZTv0_n20_N3ccc7CC4x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y63efgEv,_ZThn4_N3ccc7CC4x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y63abcEv,_ZTv0_n16_N3ccc7CC4x1y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y63efgEv,_ZTv0_n20_N3ccc7CC4x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y6E[] = {
  {&(_ZTVN3ccc7CC4x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y6E[];
static VTBL_ENTRY alt_thunk_names1771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y63efgEv,_ZTv0_n20_N3ccc7CC4x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y63efgEv,_ZThn4_N3ccc7CC4x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y63abcEv,_ZTv0_n16_N3ccc7CC4x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y63abcEv,_ZThn4_N3ccc7CC4x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y6E = {  "_ZN3ccc7CC4x1y6E", // class name
  bases__ZN3ccc7CC4x1y6E, 2,
  &(vtc__ZN3ccc7CC4x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1771,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y6  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD4x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x1y63efgEv
  ~DD4x1y6(); // tgen
  DD4x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y63abcEv");}
void  ccc::DD4x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y63efgEv");}
ccc::DD4x1y6 ::~DD4x1y6(){ note_dtor("_ZN3ccc7DD4x1y6E", this);} // tgen
ccc::DD4x1y6 ::DD4x1y6(){ note_ctor("_ZN3ccc7DD4x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y6E, buf);
    ::ccc::DD4x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y6E);
    dp->::ccc::DD4x1y6::~DD4x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y6E(Test__ZN3ccc7DD4x1y6E, "_ZN3ccc7DD4x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y6C1Ev();
extern void _ZN3ccc7DD4x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y6E[] = {
  NSPAIR(_ZN3ccc7DD4x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x1y63abcEv();
extern void _ZN3ccc7DD4x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y63abcEv,_ZTv0_n12_N3ccc7DD4x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y63abcEv,_ZThn4_N3ccc7DD4x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y63efgEv,_ZTv0_n20_N3ccc7DD4x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y63efgEv,_ZThn4_N3ccc7DD4x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y63abcEv,_ZTv0_n12_N3ccc7DD4x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y63efgEv,_ZTv0_n20_N3ccc7DD4x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y6E[] = {
  {&(_ZTVN3ccc7DD4x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y6E[];
static VTBL_ENTRY alt_thunk_names1772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y63efgEv,_ZTv0_n20_N3ccc7DD4x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y63efgEv,_ZThn4_N3ccc7DD4x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y63abcEv,_ZTv0_n12_N3ccc7DD4x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y63abcEv,_ZThn4_N3ccc7DD4x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y6E = {  "_ZN3ccc7DD4x1y6E", // class name
  bases__ZN3ccc7DD4x1y6E, 2,
  &(vtc__ZN3ccc7DD4x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1772,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y7  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y73pqrEv
  ~CC4x1y7(); // tgen
  CC4x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y7E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y73abcEv");}
void  ccc::CC4x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y73pqrEv");}
ccc::CC4x1y7 ::~CC4x1y7(){ note_dtor("_ZN3ccc7CC4x1y7E", this);} // tgen
ccc::CC4x1y7 ::CC4x1y7(){ note_ctor("_ZN3ccc7CC4x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y7E, buf);
    ::ccc::CC4x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y7E);
    dp->::ccc::CC4x1y7::~CC4x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y7E(Test__ZN3ccc7CC4x1y7E, "_ZN3ccc7CC4x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y7C1Ev();
extern void _ZN3ccc7CC4x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y7E[] = {
  NSPAIR(_ZN3ccc7CC4x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y7E[];
extern void _ZN3ccc7CC4x1y73abcEv();
extern void _ZN3ccc7CC4x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y73pqrEv,_ZTv0_n12_N3ccc7CC4x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y73pqrEv,_ZThn4_N3ccc7CC4x1y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y73abcEv,_ZTv0_n16_N3ccc7CC4x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y73abcEv,_ZThn4_N3ccc7CC4x1y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y73pqrEv,_ZTv0_n12_N3ccc7CC4x1y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y73abcEv,_ZTv0_n16_N3ccc7CC4x1y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y7E[] = {
  {&(_ZTVN3ccc7CC4x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y7E[];
static VTBL_ENTRY alt_thunk_names1773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y73abcEv,_ZTv0_n16_N3ccc7CC4x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y73abcEv,_ZThn4_N3ccc7CC4x1y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y73pqrEv,_ZTv0_n12_N3ccc7CC4x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y73pqrEv,_ZThn4_N3ccc7CC4x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y7E = {  "_ZN3ccc7CC4x1y7E", // class name
  bases__ZN3ccc7CC4x1y7E, 2,
  &(vtc__ZN3ccc7CC4x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1773,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y7  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD4x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y73pqrEv
  ~DD4x1y7(); // tgen
  DD4x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y73abcEv");}
void  ccc::DD4x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y73pqrEv");}
ccc::DD4x1y7 ::~DD4x1y7(){ note_dtor("_ZN3ccc7DD4x1y7E", this);} // tgen
ccc::DD4x1y7 ::DD4x1y7(){ note_ctor("_ZN3ccc7DD4x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y7E, buf);
    ::ccc::DD4x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y7E);
    dp->::ccc::DD4x1y7::~DD4x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y7E(Test__ZN3ccc7DD4x1y7E, "_ZN3ccc7DD4x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y7C1Ev();
extern void _ZN3ccc7DD4x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y7E[] = {
  NSPAIR(_ZN3ccc7DD4x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y7E[];
extern void _ZN3ccc7DD4x1y73pqrEv();
extern void _ZN3ccc7DD4x1y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y73abcEv,_ZTv0_n12_N3ccc7DD4x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y73abcEv,_ZThn4_N3ccc7DD4x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y73pqrEv,_ZTv0_n16_N3ccc7DD4x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y73pqrEv,_ZThn4_N3ccc7DD4x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y73abcEv,_ZTv0_n12_N3ccc7DD4x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y73pqrEv,_ZTv0_n16_N3ccc7DD4x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y7E[] = {
  {&(_ZTVN3ccc7DD4x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y7E[];
static VTBL_ENTRY alt_thunk_names1774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y73pqrEv,_ZTv0_n16_N3ccc7DD4x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y73pqrEv,_ZThn4_N3ccc7DD4x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y73abcEv,_ZTv0_n12_N3ccc7DD4x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y73abcEv,_ZThn4_N3ccc7DD4x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y7E = {  "_ZN3ccc7DD4x1y7E", // class name
  bases__ZN3ccc7DD4x1y7E, 2,
  &(vtc__ZN3ccc7DD4x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1774,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y8  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y83abcEv
  ~CC4x1y8(); // tgen
  CC4x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y8E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y83efgEv");}
void  ccc::CC4x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y83abcEv");}
ccc::CC4x1y8 ::~CC4x1y8(){ note_dtor("_ZN3ccc7CC4x1y8E", this);} // tgen
ccc::CC4x1y8 ::CC4x1y8(){ note_ctor("_ZN3ccc7CC4x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y8E, buf);
    ::ccc::CC4x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y8E);
    dp->::ccc::CC4x1y8::~CC4x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y8E(Test__ZN3ccc7CC4x1y8E, "_ZN3ccc7CC4x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y8C1Ev();
extern void _ZN3ccc7CC4x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y8E[] = {
  NSPAIR(_ZN3ccc7CC4x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y8E[];
extern void _ZN3ccc7CC4x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC4x1y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x1y83abcEv,_ZTv0_n16_N3ccc7CC4x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y83abcEv,_ZThn4_N3ccc7CC4x1y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y83efgEv,_ZTv0_n20_N3ccc7CC4x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y83efgEv,_ZThn4_N3ccc7CC4x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x1y83abcEv,_ZTv0_n16_N3ccc7CC4x1y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y83efgEv,_ZTv0_n20_N3ccc7CC4x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y8E[] = {
  {&(_ZTVN3ccc7CC4x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y8E[];
static VTBL_ENTRY alt_thunk_names1775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y83efgEv,_ZTv0_n20_N3ccc7CC4x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y83efgEv,_ZThn4_N3ccc7CC4x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x1y83abcEv,_ZTv0_n16_N3ccc7CC4x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y83abcEv,_ZThn4_N3ccc7CC4x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y8E = {  "_ZN3ccc7CC4x1y8E", // class name
  bases__ZN3ccc7CC4x1y8E, 2,
  &(vtc__ZN3ccc7CC4x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1775,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y8  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD4x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x1y83abcEv
  ~DD4x1y8(); // tgen
  DD4x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y83efgEv");}
void  ccc::DD4x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x1y83abcEv");}
ccc::DD4x1y8 ::~DD4x1y8(){ note_dtor("_ZN3ccc7DD4x1y8E", this);} // tgen
ccc::DD4x1y8 ::DD4x1y8(){ note_ctor("_ZN3ccc7DD4x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y8E, buf);
    ::ccc::DD4x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y8E);
    dp->::ccc::DD4x1y8::~DD4x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y8E(Test__ZN3ccc7DD4x1y8E, "_ZN3ccc7DD4x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y8C1Ev();
extern void _ZN3ccc7DD4x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y8E[] = {
  NSPAIR(_ZN3ccc7DD4x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x1y83abcEv();
extern void _ZN3ccc7DD4x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x1y83abcEv,_ZTv0_n12_N3ccc7DD4x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y83abcEv,_ZThn4_N3ccc7DD4x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y83efgEv,_ZTv0_n20_N3ccc7DD4x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y83efgEv,_ZThn4_N3ccc7DD4x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x1y83abcEv,_ZTv0_n12_N3ccc7DD4x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y83efgEv,_ZTv0_n20_N3ccc7DD4x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y8E[] = {
  {&(_ZTVN3ccc7DD4x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y8E[];
static VTBL_ENTRY alt_thunk_names1776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y83efgEv,_ZTv0_n20_N3ccc7DD4x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y83efgEv,_ZThn4_N3ccc7DD4x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x1y83abcEv,_ZTv0_n12_N3ccc7DD4x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y83abcEv,_ZThn4_N3ccc7DD4x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y8E = {  "_ZN3ccc7DD4x1y8E", // class name
  bases__ZN3ccc7DD4x1y8E, 2,
  &(vtc__ZN3ccc7DD4x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1776,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y9  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y93pqrEv
  ~CC4x1y9(); // tgen
  CC4x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y9E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y93efgEv");}
void  ccc::CC4x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y93pqrEv");}
ccc::CC4x1y9 ::~CC4x1y9(){ note_dtor("_ZN3ccc7CC4x1y9E", this);} // tgen
ccc::CC4x1y9 ::CC4x1y9(){ note_ctor("_ZN3ccc7CC4x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y9E, buf);
    ::ccc::CC4x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC4x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y9E);
    dp->::ccc::CC4x1y9::~CC4x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y9E(Test__ZN3ccc7CC4x1y9E, "_ZN3ccc7CC4x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y9C1Ev();
extern void _ZN3ccc7CC4x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y9E[] = {
  NSPAIR(_ZN3ccc7CC4x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC4x1y93pqrEv();
extern void _ZN3ccc7CC4x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x1y93pqrEv,_ZTv0_n12_N3ccc7CC4x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y93pqrEv,_ZThn4_N3ccc7CC4x1y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x1y93efgEv,_ZTv0_n20_N3ccc7CC4x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y93efgEv,_ZThn4_N3ccc7CC4x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x1y93pqrEv,_ZTv0_n12_N3ccc7CC4x1y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x1y93efgEv,_ZTv0_n20_N3ccc7CC4x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x1y9E[] = {
  {&(_ZTVN3ccc7CC4x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x1y9E[];
static VTBL_ENTRY alt_thunk_names1777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x1y93efgEv,_ZTv0_n20_N3ccc7CC4x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y93efgEv,_ZThn4_N3ccc7CC4x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x1y93pqrEv,_ZTv0_n12_N3ccc7CC4x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x1y93pqrEv,_ZThn4_N3ccc7CC4x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x1y9E = {  "_ZN3ccc7CC4x1y9E", // class name
  bases__ZN3ccc7CC4x1y9E, 2,
  &(vtc__ZN3ccc7CC4x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x1y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1777,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y9  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD4x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x1y93pqrEv
  ~DD4x1y9(); // tgen
  DD4x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x1y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x1y93efgEv");}
void  ccc::DD4x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x1y93pqrEv");}
ccc::DD4x1y9 ::~DD4x1y9(){ note_dtor("_ZN3ccc7DD4x1y9E", this);} // tgen
ccc::DD4x1y9 ::DD4x1y9(){ note_ctor("_ZN3ccc7DD4x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x1y9E, buf);
    ::ccc::DD4x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x1y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD4x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x1y9E);
    dp->::ccc::DD4x1y9::~DD4x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x1y9E(Test__ZN3ccc7DD4x1y9E, "_ZN3ccc7DD4x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x1y9C1Ev();
extern void _ZN3ccc7DD4x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x1y9E[] = {
  NSPAIR(_ZN3ccc7DD4x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD4x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y9E[];
extern void _ZN3ccc7DD4x1y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x1y93pqrEv,_ZTv0_n16_N3ccc7DD4x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y93pqrEv,_ZThn4_N3ccc7DD4x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x1y93efgEv,_ZTv0_n20_N3ccc7DD4x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x1y93efgEv,_ZThn4_N3ccc7DD4x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x1y93pqrEv,_ZTv0_n16_N3ccc7DD4x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x1y93efgEv,_ZTv0_n20_N3ccc7DD4x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x1y9E[] = {
  {&(_ZTVN3ccc7DD4x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x1y9E[];
static VTBL_ENTRY alt_thunk_names1778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x1y93efgEv,_ZTv0_n20_N3ccc7DD4x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y93efgEv,_ZThn4_N3ccc7DD4x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x1y93pqrEv,_ZTv0_n16_N3ccc7DD4x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x1y93pqrEv,_ZThn4_N3ccc7DD4x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x1y9E = {  "_ZN3ccc7DD4x1y9E", // class name
  bases__ZN3ccc7DD4x1y9E, 2,
  &(vtc__ZN3ccc7DD4x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x1y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1778,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y10  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x1y103abcEv
  ~CC4x1y10(); // tgen
  CC4x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y10E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y103pqrEv");}
void  ccc::CC4x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x1y103abcEv");}
ccc::CC4x1y10 ::~CC4x1y10(){ note_dtor("_ZN3ccc8CC4x1y10E", this);} // tgen
ccc::CC4x1y10 ::CC4x1y10(){ note_ctor("_ZN3ccc8CC4x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y10E, buf);
    ::ccc::CC4x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y10E);
    dp->::ccc::CC4x1y10::~CC4x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y10E(Test__ZN3ccc8CC4x1y10E, "_ZN3ccc8CC4x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y10C1Ev();
extern void _ZN3ccc8CC4x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y10E[] = {
  NSPAIR(_ZN3ccc8CC4x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y10E[];
extern void _ZN3ccc8CC4x1y103abcEv();
extern void _ZN3ccc8CC4x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x1y103pqrEv,_ZTv0_n12_N3ccc8CC4x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y103pqrEv,_ZThn4_N3ccc8CC4x1y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x1y103abcEv,_ZTv0_n16_N3ccc8CC4x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y103abcEv,_ZThn4_N3ccc8CC4x1y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x1y103pqrEv,_ZTv0_n12_N3ccc8CC4x1y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x1y103abcEv,_ZTv0_n16_N3ccc8CC4x1y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y10E[] = {
  {&(_ZTVN3ccc8CC4x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y10E[];
static VTBL_ENTRY alt_thunk_names1779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x1y103abcEv,_ZTv0_n16_N3ccc8CC4x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y103abcEv,_ZThn4_N3ccc8CC4x1y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x1y103pqrEv,_ZTv0_n12_N3ccc8CC4x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y103pqrEv,_ZThn4_N3ccc8CC4x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x1y10E = {  "_ZN3ccc8CC4x1y10E", // class name
  bases__ZN3ccc8CC4x1y10E, 2,
  &(vtc__ZN3ccc8CC4x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1779,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y10  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD4x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x1y103abcEv
  ~DD4x1y10(); // tgen
  DD4x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x1y103pqrEv");}
void  ccc::DD4x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x1y103abcEv");}
ccc::DD4x1y10 ::~DD4x1y10(){ note_dtor("_ZN3ccc8DD4x1y10E", this);} // tgen
ccc::DD4x1y10 ::DD4x1y10(){ note_ctor("_ZN3ccc8DD4x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y10E, buf);
    ::ccc::DD4x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y10E);
    dp->::ccc::DD4x1y10::~DD4x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y10E(Test__ZN3ccc8DD4x1y10E, "_ZN3ccc8DD4x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y10C1Ev();
extern void _ZN3ccc8DD4x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y10E[] = {
  NSPAIR(_ZN3ccc8DD4x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y10E[];
extern void _ZN3ccc8DD4x1y103pqrEv();
extern void _ZN3ccc8DD4x1y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x1y103abcEv,_ZTv0_n12_N3ccc8DD4x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y103abcEv,_ZThn4_N3ccc8DD4x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x1y103pqrEv,_ZTv0_n16_N3ccc8DD4x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y103pqrEv,_ZThn4_N3ccc8DD4x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x1y103abcEv,_ZTv0_n12_N3ccc8DD4x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x1y103pqrEv,_ZTv0_n16_N3ccc8DD4x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y10E[] = {
  {&(_ZTVN3ccc8DD4x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y10E[];
static VTBL_ENTRY alt_thunk_names1780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x1y103pqrEv,_ZTv0_n16_N3ccc8DD4x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y103pqrEv,_ZThn4_N3ccc8DD4x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x1y103abcEv,_ZTv0_n12_N3ccc8DD4x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y103abcEv,_ZThn4_N3ccc8DD4x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x1y10E = {  "_ZN3ccc8DD4x1y10E", // class name
  bases__ZN3ccc8DD4x1y10E, 2,
  &(vtc__ZN3ccc8DD4x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1780,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y11  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x1y113efgEv
  ~CC4x1y11(); // tgen
  CC4x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y11E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y113pqrEv");}
void  ccc::CC4x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x1y113efgEv");}
ccc::CC4x1y11 ::~CC4x1y11(){ note_dtor("_ZN3ccc8CC4x1y11E", this);} // tgen
ccc::CC4x1y11 ::CC4x1y11(){ note_ctor("_ZN3ccc8CC4x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y11E, buf);
    ::ccc::CC4x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y11E);
    dp->::ccc::CC4x1y11::~CC4x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y11E(Test__ZN3ccc8CC4x1y11E, "_ZN3ccc8CC4x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y11C1Ev();
extern void _ZN3ccc8CC4x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y11E[] = {
  NSPAIR(_ZN3ccc8CC4x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC4x1y113pqrEv();
extern void _ZN3ccc8CC4x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x1y113pqrEv,_ZTv0_n12_N3ccc8CC4x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y113pqrEv,_ZThn4_N3ccc8CC4x1y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x1y113efgEv,_ZTv0_n20_N3ccc8CC4x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y113efgEv,_ZThn4_N3ccc8CC4x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x1y113pqrEv,_ZTv0_n12_N3ccc8CC4x1y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x1y113efgEv,_ZTv0_n20_N3ccc8CC4x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y11E[] = {
  {&(_ZTVN3ccc8CC4x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y11E[];
static VTBL_ENTRY alt_thunk_names1781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x1y113efgEv,_ZTv0_n20_N3ccc8CC4x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y113efgEv,_ZThn4_N3ccc8CC4x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x1y113pqrEv,_ZTv0_n12_N3ccc8CC4x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y113pqrEv,_ZThn4_N3ccc8CC4x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x1y11E = {  "_ZN3ccc8CC4x1y11E", // class name
  bases__ZN3ccc8CC4x1y11E, 2,
  &(vtc__ZN3ccc8CC4x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1781,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y11  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD4x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x1y113efgEv
  ~DD4x1y11(); // tgen
  DD4x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x1y113pqrEv");}
void  ccc::DD4x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x1y113efgEv");}
ccc::DD4x1y11 ::~DD4x1y11(){ note_dtor("_ZN3ccc8DD4x1y11E", this);} // tgen
ccc::DD4x1y11 ::DD4x1y11(){ note_ctor("_ZN3ccc8DD4x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y11E, buf);
    ::ccc::DD4x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y11E);
    dp->::ccc::DD4x1y11::~DD4x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y11E(Test__ZN3ccc8DD4x1y11E, "_ZN3ccc8DD4x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y11C1Ev();
extern void _ZN3ccc8DD4x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y11E[] = {
  NSPAIR(_ZN3ccc8DD4x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y11E[];
extern void _ZN3ccc8DD4x1y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x1y113pqrEv,_ZTv0_n16_N3ccc8DD4x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y113pqrEv,_ZThn4_N3ccc8DD4x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x1y113efgEv,_ZTv0_n20_N3ccc8DD4x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y113efgEv,_ZThn4_N3ccc8DD4x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x1y113pqrEv,_ZTv0_n16_N3ccc8DD4x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x1y113efgEv,_ZTv0_n20_N3ccc8DD4x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y11E[] = {
  {&(_ZTVN3ccc8DD4x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y11E[];
static VTBL_ENTRY alt_thunk_names1782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x1y113efgEv,_ZTv0_n20_N3ccc8DD4x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y113efgEv,_ZThn4_N3ccc8DD4x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x1y113pqrEv,_ZTv0_n16_N3ccc8DD4x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y113pqrEv,_ZThn4_N3ccc8DD4x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x1y11E = {  "_ZN3ccc8DD4x1y11E", // class name
  bases__ZN3ccc8DD4x1y11E, 2,
  &(vtc__ZN3ccc8DD4x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1782,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y12  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC4x1y123abcEv
  ~CC4x1y12(); // tgen
  CC4x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x1y123abcEv");}
ccc::CC4x1y12 ::~CC4x1y12(){ note_dtor("_ZN3ccc8CC4x1y12E", this);} // tgen
ccc::CC4x1y12 ::CC4x1y12(){ note_ctor("_ZN3ccc8CC4x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y12E, buf);
    ::ccc::CC4x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y12E);
    dp->::ccc::CC4x1y12::~CC4x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y12E(Test__ZN3ccc8CC4x1y12E, "_ZN3ccc8CC4x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y12C1Ev();
extern void _ZN3ccc8CC4x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y12E[] = {
  NSPAIR(_ZN3ccc8CC4x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y12E[];
extern void _ZN3ccc8CC4x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x1y123abcEv,_ZTv0_n16_N3ccc8CC4x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y123abcEv,_ZThn4_N3ccc8CC4x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x1y123abcEv,_ZTv0_n16_N3ccc8CC4x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y12E[] = {
  {&(_ZTVN3ccc8CC4x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y12E[];
static VTBL_ENTRY alt_thunk_names1783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x1y123abcEv,_ZTv0_n16_N3ccc8CC4x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y123abcEv,_ZThn4_N3ccc8CC4x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x1y12E = {  "_ZN3ccc8CC4x1y12E", // class name
  bases__ZN3ccc8CC4x1y12E, 2,
  &(vtc__ZN3ccc8CC4x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1783,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y12  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD4x1y123abcEv
  ~DD4x1y12(); // tgen
  DD4x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x1y123abcEv");}
ccc::DD4x1y12 ::~DD4x1y12(){ note_dtor("_ZN3ccc8DD4x1y12E", this);} // tgen
ccc::DD4x1y12 ::DD4x1y12(){ note_ctor("_ZN3ccc8DD4x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y12E, buf);
    ::ccc::DD4x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y12E);
    dp->::ccc::DD4x1y12::~DD4x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y12E(Test__ZN3ccc8DD4x1y12E, "_ZN3ccc8DD4x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y12C1Ev();
extern void _ZN3ccc8DD4x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y12E[] = {
  NSPAIR(_ZN3ccc8DD4x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x1y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x1y123abcEv,_ZTv0_n12_N3ccc8DD4x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y123abcEv,_ZThn4_N3ccc8DD4x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x1y123abcEv,_ZTv0_n12_N3ccc8DD4x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y12E[] = {
  {&(_ZTVN3ccc8DD4x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y12E[];
static VTBL_ENTRY alt_thunk_names1784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x1y123abcEv,_ZTv0_n12_N3ccc8DD4x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y123abcEv,_ZThn4_N3ccc8DD4x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x1y12E = {  "_ZN3ccc8DD4x1y12E", // class name
  bases__ZN3ccc8DD4x1y12E, 2,
  &(vtc__ZN3ccc8DD4x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1784,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y13  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC4x1y133efgEv
  ~CC4x1y13(); // tgen
  CC4x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x1y133efgEv");}
ccc::CC4x1y13 ::~CC4x1y13(){ note_dtor("_ZN3ccc8CC4x1y13E", this);} // tgen
ccc::CC4x1y13 ::CC4x1y13(){ note_ctor("_ZN3ccc8CC4x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y13E, buf);
    ::ccc::CC4x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y13E);
    dp->::ccc::CC4x1y13::~CC4x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y13E(Test__ZN3ccc8CC4x1y13E, "_ZN3ccc8CC4x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y13C1Ev();
extern void _ZN3ccc8CC4x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y13E[] = {
  NSPAIR(_ZN3ccc8CC4x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC4x1y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x1y133efgEv,_ZTv0_n20_N3ccc8CC4x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y133efgEv,_ZThn4_N3ccc8CC4x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x1y133efgEv,_ZTv0_n20_N3ccc8CC4x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y13E[] = {
  {&(_ZTVN3ccc8CC4x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y13E[];
static VTBL_ENTRY alt_thunk_names1785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x1y133efgEv,_ZTv0_n20_N3ccc8CC4x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y133efgEv,_ZThn4_N3ccc8CC4x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x1y13E = {  "_ZN3ccc8CC4x1y13E", // class name
  bases__ZN3ccc8CC4x1y13E, 2,
  &(vtc__ZN3ccc8CC4x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1785,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y13  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD4x1y133efgEv
  ~DD4x1y13(); // tgen
  DD4x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x1y133efgEv");}
ccc::DD4x1y13 ::~DD4x1y13(){ note_dtor("_ZN3ccc8DD4x1y13E", this);} // tgen
ccc::DD4x1y13 ::DD4x1y13(){ note_ctor("_ZN3ccc8DD4x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y13E, buf);
    ::ccc::DD4x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y13E);
    dp->::ccc::DD4x1y13::~DD4x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y13E(Test__ZN3ccc8DD4x1y13E, "_ZN3ccc8DD4x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y13C1Ev();
extern void _ZN3ccc8DD4x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y13E[] = {
  NSPAIR(_ZN3ccc8DD4x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x1y133efgEv,_ZTv0_n20_N3ccc8DD4x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y133efgEv,_ZThn4_N3ccc8DD4x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x1y133efgEv,_ZTv0_n20_N3ccc8DD4x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y13E[] = {
  {&(_ZTVN3ccc8DD4x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y13E[];
static VTBL_ENTRY alt_thunk_names1786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x1y133efgEv,_ZTv0_n20_N3ccc8DD4x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y133efgEv,_ZThn4_N3ccc8DD4x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x1y13E = {  "_ZN3ccc8DD4x1y13E", // class name
  bases__ZN3ccc8DD4x1y13E, 2,
  &(vtc__ZN3ccc8DD4x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1786,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y14  : virtual ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y143pqrEv
  ~CC4x1y14(); // tgen
  CC4x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y143pqrEv");}
ccc::CC4x1y14 ::~CC4x1y14(){ note_dtor("_ZN3ccc8CC4x1y14E", this);} // tgen
ccc::CC4x1y14 ::CC4x1y14(){ note_ctor("_ZN3ccc8CC4x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y14E, buf);
    ::ccc::CC4x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y14E);
    dp->::ccc::CC4x1y14::~CC4x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y14E(Test__ZN3ccc8CC4x1y14E, "_ZN3ccc8CC4x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y14C1Ev();
extern void _ZN3ccc8CC4x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y14E[] = {
  NSPAIR(_ZN3ccc8CC4x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC4x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x1y143pqrEv,_ZTv0_n12_N3ccc8CC4x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y143pqrEv,_ZThn4_N3ccc8CC4x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x1y143pqrEv,_ZTv0_n12_N3ccc8CC4x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y14E[] = {
  {&(_ZTVN3ccc8CC4x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y14E[];
static VTBL_ENTRY alt_thunk_names1787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x1y143pqrEv,_ZTv0_n12_N3ccc8CC4x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x1y143pqrEv,_ZThn4_N3ccc8CC4x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x1y14E = {  "_ZN3ccc8CC4x1y14E", // class name
  bases__ZN3ccc8CC4x1y14E, 2,
  &(vtc__ZN3ccc8CC4x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1787,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y14  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD4x1y143pqrEv
  ~DD4x1y14(); // tgen
  DD4x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x1y143pqrEv");}
ccc::DD4x1y14 ::~DD4x1y14(){ note_dtor("_ZN3ccc8DD4x1y14E", this);} // tgen
ccc::DD4x1y14 ::DD4x1y14(){ note_ctor("_ZN3ccc8DD4x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y14E, buf);
    ::ccc::DD4x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y14E);
    dp->::ccc::DD4x1y14::~DD4x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y14E(Test__ZN3ccc8DD4x1y14E, "_ZN3ccc8DD4x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y14C1Ev();
extern void _ZN3ccc8DD4x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y14E[] = {
  NSPAIR(_ZN3ccc8DD4x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y14E[];
extern void _ZN3ccc8DD4x1y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x1y143pqrEv,_ZTv0_n16_N3ccc8DD4x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x1y143pqrEv,_ZThn4_N3ccc8DD4x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x1y143pqrEv,_ZTv0_n16_N3ccc8DD4x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y14E[] = {
  {&(_ZTVN3ccc8DD4x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y14E[];
static VTBL_ENTRY alt_thunk_names1788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x1y143pqrEv,_ZTv0_n16_N3ccc8DD4x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x1y143pqrEv,_ZThn4_N3ccc8DD4x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x1y14E = {  "_ZN3ccc8DD4x1y14E", // class name
  bases__ZN3ccc8DD4x1y14E, 2,
  &(vtc__ZN3ccc8DD4x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1788,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y15  : virtual ::ccc::AA4 , ::ccc::BB1 {
  ~CC4x1y15(); // tgen
  CC4x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x1y15 ::~CC4x1y15(){ note_dtor("_ZN3ccc8CC4x1y15E", this);} // tgen
ccc::CC4x1y15 ::CC4x1y15(){ note_ctor("_ZN3ccc8CC4x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y15E, buf);
    ::ccc::CC4x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC4x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y15E);
    dp->::ccc::CC4x1y15::~CC4x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y15E(Test__ZN3ccc8CC4x1y15E, "_ZN3ccc8CC4x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y15C1Ev();
extern void _ZN3ccc8CC4x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y15E[] = {
  NSPAIR(_ZN3ccc8CC4x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x1y15E[] = {
  {&(_ZTVN3ccc8CC4x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x1y15E[];
Class_Descriptor cd__ZN3ccc8CC4x1y15E = {  "_ZN3ccc8CC4x1y15E", // class name
  bases__ZN3ccc8CC4x1y15E, 2,
  &(vtc__ZN3ccc8CC4x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x1y15  : virtual ::ccc::AA4 , virtual ::ccc::BB1 {
  ~DD4x1y15(); // tgen
  DD4x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x1y15 ::~DD4x1y15(){ note_dtor("_ZN3ccc8DD4x1y15E", this);} // tgen
ccc::DD4x1y15 ::DD4x1y15(){ note_ctor("_ZN3ccc8DD4x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x1y15E, buf);
    ::ccc::DD4x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x1y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD4x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x1y15E);
    dp->::ccc::DD4x1y15::~DD4x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x1y15E(Test__ZN3ccc8DD4x1y15E, "_ZN3ccc8DD4x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x1y15C1Ev();
extern void _ZN3ccc8DD4x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x1y15E[] = {
  NSPAIR(_ZN3ccc8DD4x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD4x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x1y15E[] = {
  {&(_ZTVN3ccc8DD4x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x1y15E[];
Class_Descriptor cd__ZN3ccc8DD4x1y15E = {  "_ZN3ccc8DD4x1y15E", // class name
  bases__ZN3ccc8DD4x1y15E, 2,
  &(vtc__ZN3ccc8DD4x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y0  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y03pqrEv
  ~CC4x2y0(); // tgen
  CC4x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y0E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y03abcEv");}
void  ccc::CC4x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y03efgEv");}
void  ccc::CC4x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y03pqrEv");}
ccc::CC4x2y0 ::~CC4x2y0(){ note_dtor("_ZN3ccc7CC4x2y0E", this);} // tgen
ccc::CC4x2y0 ::CC4x2y0(){ note_ctor("_ZN3ccc7CC4x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y0E, buf);
    ::ccc::CC4x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y0E);
    dp->::ccc::CC4x2y0::~CC4x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y0E(Test__ZN3ccc7CC4x2y0E, "_ZN3ccc7CC4x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y0C1Ev();
extern void _ZN3ccc7CC4x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y0E[] = {
  NSPAIR(_ZN3ccc7CC4x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y0E[];
extern void _ZN3ccc7CC4x2y03efgEv();
extern void _ZN3ccc7CC4x2y03abcEv();
extern void _ZN3ccc7CC4x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y03pqrEv,_ZTv0_n12_N3ccc7CC4x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03pqrEv,_ZThn4_N3ccc7CC4x2y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y03abcEv,_ZTv0_n16_N3ccc7CC4x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03abcEv,_ZThn4_N3ccc7CC4x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y03efgEv,_ZTv0_n20_N3ccc7CC4x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03efgEv,_ZThn4_N3ccc7CC4x2y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y03pqrEv,_ZTv0_n12_N3ccc7CC4x2y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y03abcEv,_ZTv0_n16_N3ccc7CC4x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y03efgEv,_ZTv0_n20_N3ccc7CC4x2y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y0E[] = {
  {&(_ZTVN3ccc7CC4x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y0E[];
static VTBL_ENTRY alt_thunk_names1789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y03efgEv,_ZTv0_n20_N3ccc7CC4x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y03efgEv,_ZThn4_N3ccc7CC4x2y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y03abcEv,_ZTv0_n16_N3ccc7CC4x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y03abcEv,_ZThn4_N3ccc7CC4x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y03pqrEv,_ZTv0_n12_N3ccc7CC4x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y03pqrEv,_ZThn4_N3ccc7CC4x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y0E = {  "_ZN3ccc7CC4x2y0E", // class name
  bases__ZN3ccc7CC4x2y0E, 2,
  &(vtc__ZN3ccc7CC4x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1789,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y0  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD4x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y03pqrEv
  ~DD4x2y0(); // tgen
  DD4x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y03abcEv");}
void  ccc::DD4x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y03efgEv");}
void  ccc::DD4x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y03pqrEv");}
ccc::DD4x2y0 ::~DD4x2y0(){ note_dtor("_ZN3ccc7DD4x2y0E", this);} // tgen
ccc::DD4x2y0 ::DD4x2y0(){ note_ctor("_ZN3ccc7DD4x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y0E, buf);
    ::ccc::DD4x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y0E);
    dp->::ccc::DD4x2y0::~DD4x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y0E(Test__ZN3ccc7DD4x2y0E, "_ZN3ccc7DD4x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y0C1Ev();
extern void _ZN3ccc7DD4x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y0E[] = {
  NSPAIR(_ZN3ccc7DD4x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y0E[];
extern void _ZN3ccc7DD4x2y03pqrEv();
extern void _ZN3ccc7DD4x2y03abcEv();
extern void _ZN3ccc7DD4x2y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y03efgEv,_ZTv0_n12_N3ccc7DD4x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y03efgEv,_ZThn4_N3ccc7DD4x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y03abcEv,_ZTv0_n16_N3ccc7DD4x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y03abcEv,_ZThn4_N3ccc7DD4x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y03pqrEv,_ZTv0_n20_N3ccc7DD4x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y03pqrEv,_ZThn4_N3ccc7DD4x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y03efgEv,_ZTv0_n12_N3ccc7DD4x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y03abcEv,_ZTv0_n16_N3ccc7DD4x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y03pqrEv,_ZTv0_n20_N3ccc7DD4x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y0E[] = {
  {&(_ZTVN3ccc7DD4x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y0E[];
static VTBL_ENTRY alt_thunk_names1790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y03pqrEv,_ZTv0_n20_N3ccc7DD4x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y03pqrEv,_ZThn4_N3ccc7DD4x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y03abcEv,_ZTv0_n16_N3ccc7DD4x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y03abcEv,_ZThn4_N3ccc7DD4x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y03efgEv,_ZTv0_n12_N3ccc7DD4x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y03efgEv,_ZThn4_N3ccc7DD4x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y0E = {  "_ZN3ccc7DD4x2y0E", // class name
  bases__ZN3ccc7DD4x2y0E, 2,
  &(vtc__ZN3ccc7DD4x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1790,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y1  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x2y13efgEv
  ~CC4x2y1(); // tgen
  CC4x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y1E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y13abcEv");}
void  ccc::CC4x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y13pqrEv");}
void  ccc::CC4x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y13efgEv");}
ccc::CC4x2y1 ::~CC4x2y1(){ note_dtor("_ZN3ccc7CC4x2y1E", this);} // tgen
ccc::CC4x2y1 ::CC4x2y1(){ note_ctor("_ZN3ccc7CC4x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y1E, buf);
    ::ccc::CC4x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y1E);
    dp->::ccc::CC4x2y1::~CC4x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y1E(Test__ZN3ccc7CC4x2y1E, "_ZN3ccc7CC4x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y1C1Ev();
extern void _ZN3ccc7CC4x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y1E[] = {
  NSPAIR(_ZN3ccc7CC4x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y1E[];
extern void _ZN3ccc7CC4x2y13efgEv();
extern void _ZN3ccc7CC4x2y13abcEv();
extern void _ZN3ccc7CC4x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y13pqrEv,_ZTv0_n12_N3ccc7CC4x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13pqrEv,_ZThn4_N3ccc7CC4x2y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y13abcEv,_ZTv0_n16_N3ccc7CC4x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13abcEv,_ZThn4_N3ccc7CC4x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y13efgEv,_ZTv0_n20_N3ccc7CC4x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13efgEv,_ZThn4_N3ccc7CC4x2y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y13pqrEv,_ZTv0_n12_N3ccc7CC4x2y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y13abcEv,_ZTv0_n16_N3ccc7CC4x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y13efgEv,_ZTv0_n20_N3ccc7CC4x2y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y1E[] = {
  {&(_ZTVN3ccc7CC4x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y1E[];
static VTBL_ENTRY alt_thunk_names1791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y13efgEv,_ZTv0_n20_N3ccc7CC4x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y13efgEv,_ZThn4_N3ccc7CC4x2y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y13abcEv,_ZTv0_n16_N3ccc7CC4x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y13abcEv,_ZThn4_N3ccc7CC4x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y13pqrEv,_ZTv0_n12_N3ccc7CC4x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y13pqrEv,_ZThn4_N3ccc7CC4x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y1E = {  "_ZN3ccc7CC4x2y1E", // class name
  bases__ZN3ccc7CC4x2y1E, 2,
  &(vtc__ZN3ccc7CC4x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1791,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y1  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD4x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x2y13efgEv
  ~DD4x2y1(); // tgen
  DD4x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y13abcEv");}
void  ccc::DD4x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y13pqrEv");}
void  ccc::DD4x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y13efgEv");}
ccc::DD4x2y1 ::~DD4x2y1(){ note_dtor("_ZN3ccc7DD4x2y1E", this);} // tgen
ccc::DD4x2y1 ::DD4x2y1(){ note_ctor("_ZN3ccc7DD4x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y1E, buf);
    ::ccc::DD4x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y1E);
    dp->::ccc::DD4x2y1::~DD4x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y1E(Test__ZN3ccc7DD4x2y1E, "_ZN3ccc7DD4x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y1C1Ev();
extern void _ZN3ccc7DD4x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y1E[] = {
  NSPAIR(_ZN3ccc7DD4x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y1E[];
extern void _ZN3ccc7DD4x2y13pqrEv();
extern void _ZN3ccc7DD4x2y13abcEv();
extern void _ZN3ccc7DD4x2y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y13efgEv,_ZTv0_n12_N3ccc7DD4x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y13efgEv,_ZThn4_N3ccc7DD4x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y13abcEv,_ZTv0_n16_N3ccc7DD4x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y13abcEv,_ZThn4_N3ccc7DD4x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y13pqrEv,_ZTv0_n20_N3ccc7DD4x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y13pqrEv,_ZThn4_N3ccc7DD4x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y13efgEv,_ZTv0_n12_N3ccc7DD4x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y13abcEv,_ZTv0_n16_N3ccc7DD4x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y13pqrEv,_ZTv0_n20_N3ccc7DD4x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y1E[] = {
  {&(_ZTVN3ccc7DD4x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y1E[];
static VTBL_ENTRY alt_thunk_names1792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y13pqrEv,_ZTv0_n20_N3ccc7DD4x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y13pqrEv,_ZThn4_N3ccc7DD4x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y13abcEv,_ZTv0_n16_N3ccc7DD4x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y13abcEv,_ZThn4_N3ccc7DD4x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y13efgEv,_ZTv0_n12_N3ccc7DD4x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y13efgEv,_ZThn4_N3ccc7DD4x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y1E = {  "_ZN3ccc7DD4x2y1E", // class name
  bases__ZN3ccc7DD4x2y1E, 2,
  &(vtc__ZN3ccc7DD4x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1792,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y2  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y23pqrEv
  ~CC4x2y2(); // tgen
  CC4x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y2E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y23efgEv");}
void  ccc::CC4x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y23abcEv");}
void  ccc::CC4x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y23pqrEv");}
ccc::CC4x2y2 ::~CC4x2y2(){ note_dtor("_ZN3ccc7CC4x2y2E", this);} // tgen
ccc::CC4x2y2 ::CC4x2y2(){ note_ctor("_ZN3ccc7CC4x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y2E, buf);
    ::ccc::CC4x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y2E);
    dp->::ccc::CC4x2y2::~CC4x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y2E(Test__ZN3ccc7CC4x2y2E, "_ZN3ccc7CC4x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y2C1Ev();
extern void _ZN3ccc7CC4x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y2E[] = {
  NSPAIR(_ZN3ccc7CC4x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y2E[];
extern void _ZN3ccc7CC4x2y23efgEv();
extern void _ZN3ccc7CC4x2y23abcEv();
extern void _ZN3ccc7CC4x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y23pqrEv,_ZTv0_n12_N3ccc7CC4x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23pqrEv,_ZThn4_N3ccc7CC4x2y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y23abcEv,_ZTv0_n16_N3ccc7CC4x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23abcEv,_ZThn4_N3ccc7CC4x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y23efgEv,_ZTv0_n20_N3ccc7CC4x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23efgEv,_ZThn4_N3ccc7CC4x2y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y23pqrEv,_ZTv0_n12_N3ccc7CC4x2y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y23abcEv,_ZTv0_n16_N3ccc7CC4x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y23efgEv,_ZTv0_n20_N3ccc7CC4x2y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y2E[] = {
  {&(_ZTVN3ccc7CC4x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y2E[];
static VTBL_ENTRY alt_thunk_names1793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y23efgEv,_ZTv0_n20_N3ccc7CC4x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y23efgEv,_ZThn4_N3ccc7CC4x2y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y23abcEv,_ZTv0_n16_N3ccc7CC4x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y23abcEv,_ZThn4_N3ccc7CC4x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y23pqrEv,_ZTv0_n12_N3ccc7CC4x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y23pqrEv,_ZThn4_N3ccc7CC4x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y2E = {  "_ZN3ccc7CC4x2y2E", // class name
  bases__ZN3ccc7CC4x2y2E, 2,
  &(vtc__ZN3ccc7CC4x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1793,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y2  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD4x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y23pqrEv
  ~DD4x2y2(); // tgen
  DD4x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y23efgEv");}
void  ccc::DD4x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y23abcEv");}
void  ccc::DD4x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y23pqrEv");}
ccc::DD4x2y2 ::~DD4x2y2(){ note_dtor("_ZN3ccc7DD4x2y2E", this);} // tgen
ccc::DD4x2y2 ::DD4x2y2(){ note_ctor("_ZN3ccc7DD4x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y2E, buf);
    ::ccc::DD4x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y2E);
    dp->::ccc::DD4x2y2::~DD4x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y2E(Test__ZN3ccc7DD4x2y2E, "_ZN3ccc7DD4x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y2C1Ev();
extern void _ZN3ccc7DD4x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y2E[] = {
  NSPAIR(_ZN3ccc7DD4x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y2E[];
extern void _ZN3ccc7DD4x2y23pqrEv();
extern void _ZN3ccc7DD4x2y23abcEv();
extern void _ZN3ccc7DD4x2y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y23efgEv,_ZTv0_n12_N3ccc7DD4x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y23efgEv,_ZThn4_N3ccc7DD4x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y23abcEv,_ZTv0_n16_N3ccc7DD4x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y23abcEv,_ZThn4_N3ccc7DD4x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y23pqrEv,_ZTv0_n20_N3ccc7DD4x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y23pqrEv,_ZThn4_N3ccc7DD4x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y23efgEv,_ZTv0_n12_N3ccc7DD4x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y23abcEv,_ZTv0_n16_N3ccc7DD4x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y23pqrEv,_ZTv0_n20_N3ccc7DD4x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y2E[] = {
  {&(_ZTVN3ccc7DD4x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y2E[];
static VTBL_ENTRY alt_thunk_names1794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y23pqrEv,_ZTv0_n20_N3ccc7DD4x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y23pqrEv,_ZThn4_N3ccc7DD4x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y23abcEv,_ZTv0_n16_N3ccc7DD4x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y23abcEv,_ZThn4_N3ccc7DD4x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y23efgEv,_ZTv0_n12_N3ccc7DD4x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y23efgEv,_ZThn4_N3ccc7DD4x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y2E = {  "_ZN3ccc7DD4x2y2E", // class name
  bases__ZN3ccc7DD4x2y2E, 2,
  &(vtc__ZN3ccc7DD4x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1794,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y3  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x2y33abcEv
  ~CC4x2y3(); // tgen
  CC4x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y3E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y33efgEv");}
void  ccc::CC4x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y33pqrEv");}
void  ccc::CC4x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y33abcEv");}
ccc::CC4x2y3 ::~CC4x2y3(){ note_dtor("_ZN3ccc7CC4x2y3E", this);} // tgen
ccc::CC4x2y3 ::CC4x2y3(){ note_ctor("_ZN3ccc7CC4x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y3E, buf);
    ::ccc::CC4x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y3E);
    dp->::ccc::CC4x2y3::~CC4x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y3E(Test__ZN3ccc7CC4x2y3E, "_ZN3ccc7CC4x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y3C1Ev();
extern void _ZN3ccc7CC4x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y3E[] = {
  NSPAIR(_ZN3ccc7CC4x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y3E[];
extern void _ZN3ccc7CC4x2y33efgEv();
extern void _ZN3ccc7CC4x2y33abcEv();
extern void _ZN3ccc7CC4x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y33pqrEv,_ZTv0_n12_N3ccc7CC4x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33pqrEv,_ZThn4_N3ccc7CC4x2y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y33abcEv,_ZTv0_n16_N3ccc7CC4x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33abcEv,_ZThn4_N3ccc7CC4x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y33efgEv,_ZTv0_n20_N3ccc7CC4x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33efgEv,_ZThn4_N3ccc7CC4x2y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y33pqrEv,_ZTv0_n12_N3ccc7CC4x2y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y33abcEv,_ZTv0_n16_N3ccc7CC4x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y33efgEv,_ZTv0_n20_N3ccc7CC4x2y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y3E[] = {
  {&(_ZTVN3ccc7CC4x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y3E[];
static VTBL_ENTRY alt_thunk_names1795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y33efgEv,_ZTv0_n20_N3ccc7CC4x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y33efgEv,_ZThn4_N3ccc7CC4x2y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y33abcEv,_ZTv0_n16_N3ccc7CC4x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y33abcEv,_ZThn4_N3ccc7CC4x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y33pqrEv,_ZTv0_n12_N3ccc7CC4x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y33pqrEv,_ZThn4_N3ccc7CC4x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y3E = {  "_ZN3ccc7CC4x2y3E", // class name
  bases__ZN3ccc7CC4x2y3E, 2,
  &(vtc__ZN3ccc7CC4x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1795,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y3  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD4x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x2y33abcEv
  ~DD4x2y3(); // tgen
  DD4x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y33efgEv");}
void  ccc::DD4x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y33pqrEv");}
void  ccc::DD4x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y33abcEv");}
ccc::DD4x2y3 ::~DD4x2y3(){ note_dtor("_ZN3ccc7DD4x2y3E", this);} // tgen
ccc::DD4x2y3 ::DD4x2y3(){ note_ctor("_ZN3ccc7DD4x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y3E, buf);
    ::ccc::DD4x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y3E);
    dp->::ccc::DD4x2y3::~DD4x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y3E(Test__ZN3ccc7DD4x2y3E, "_ZN3ccc7DD4x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y3C1Ev();
extern void _ZN3ccc7DD4x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y3E[] = {
  NSPAIR(_ZN3ccc7DD4x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y3E[];
extern void _ZN3ccc7DD4x2y33pqrEv();
extern void _ZN3ccc7DD4x2y33abcEv();
extern void _ZN3ccc7DD4x2y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y33efgEv,_ZTv0_n12_N3ccc7DD4x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y33efgEv,_ZThn4_N3ccc7DD4x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y33abcEv,_ZTv0_n16_N3ccc7DD4x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y33abcEv,_ZThn4_N3ccc7DD4x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y33pqrEv,_ZTv0_n20_N3ccc7DD4x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y33pqrEv,_ZThn4_N3ccc7DD4x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y33efgEv,_ZTv0_n12_N3ccc7DD4x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y33abcEv,_ZTv0_n16_N3ccc7DD4x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y33pqrEv,_ZTv0_n20_N3ccc7DD4x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y3E[] = {
  {&(_ZTVN3ccc7DD4x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y3E[];
static VTBL_ENTRY alt_thunk_names1796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y33pqrEv,_ZTv0_n20_N3ccc7DD4x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y33pqrEv,_ZThn4_N3ccc7DD4x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y33abcEv,_ZTv0_n16_N3ccc7DD4x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y33abcEv,_ZThn4_N3ccc7DD4x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y33efgEv,_ZTv0_n12_N3ccc7DD4x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y33efgEv,_ZThn4_N3ccc7DD4x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y3E = {  "_ZN3ccc7DD4x2y3E", // class name
  bases__ZN3ccc7DD4x2y3E, 2,
  &(vtc__ZN3ccc7DD4x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1796,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y4  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC4x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y43efgEv
  ~CC4x2y4(); // tgen
  CC4x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y4E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y43pqrEv");}
void  ccc::CC4x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y43abcEv");}
void  ccc::CC4x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y43efgEv");}
ccc::CC4x2y4 ::~CC4x2y4(){ note_dtor("_ZN3ccc7CC4x2y4E", this);} // tgen
ccc::CC4x2y4 ::CC4x2y4(){ note_ctor("_ZN3ccc7CC4x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y4E, buf);
    ::ccc::CC4x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y4E);
    dp->::ccc::CC4x2y4::~CC4x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y4E(Test__ZN3ccc7CC4x2y4E, "_ZN3ccc7CC4x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y4C1Ev();
extern void _ZN3ccc7CC4x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y4E[] = {
  NSPAIR(_ZN3ccc7CC4x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y4E[];
extern void _ZN3ccc7CC4x2y43efgEv();
extern void _ZN3ccc7CC4x2y43abcEv();
extern void _ZN3ccc7CC4x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y43pqrEv,_ZTv0_n12_N3ccc7CC4x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43pqrEv,_ZThn4_N3ccc7CC4x2y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y43abcEv,_ZTv0_n16_N3ccc7CC4x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43abcEv,_ZThn4_N3ccc7CC4x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y43efgEv,_ZTv0_n20_N3ccc7CC4x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43efgEv,_ZThn4_N3ccc7CC4x2y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y43pqrEv,_ZTv0_n12_N3ccc7CC4x2y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y43abcEv,_ZTv0_n16_N3ccc7CC4x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y43efgEv,_ZTv0_n20_N3ccc7CC4x2y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y4E[] = {
  {&(_ZTVN3ccc7CC4x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y4E[];
static VTBL_ENTRY alt_thunk_names1797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y43efgEv,_ZTv0_n20_N3ccc7CC4x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y43efgEv,_ZThn4_N3ccc7CC4x2y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y43abcEv,_ZTv0_n16_N3ccc7CC4x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y43abcEv,_ZThn4_N3ccc7CC4x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y43pqrEv,_ZTv0_n12_N3ccc7CC4x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y43pqrEv,_ZThn4_N3ccc7CC4x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y4E = {  "_ZN3ccc7CC4x2y4E", // class name
  bases__ZN3ccc7CC4x2y4E, 2,
  &(vtc__ZN3ccc7CC4x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1797,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y4  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD4x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x2y43efgEv
  ~DD4x2y4(); // tgen
  DD4x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y43pqrEv");}
void  ccc::DD4x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y43abcEv");}
void  ccc::DD4x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y43efgEv");}
ccc::DD4x2y4 ::~DD4x2y4(){ note_dtor("_ZN3ccc7DD4x2y4E", this);} // tgen
ccc::DD4x2y4 ::DD4x2y4(){ note_ctor("_ZN3ccc7DD4x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y4E, buf);
    ::ccc::DD4x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y4E);
    dp->::ccc::DD4x2y4::~DD4x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y4E(Test__ZN3ccc7DD4x2y4E, "_ZN3ccc7DD4x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y4C1Ev();
extern void _ZN3ccc7DD4x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y4E[] = {
  NSPAIR(_ZN3ccc7DD4x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y4E[];
extern void _ZN3ccc7DD4x2y43pqrEv();
extern void _ZN3ccc7DD4x2y43abcEv();
extern void _ZN3ccc7DD4x2y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y43efgEv,_ZTv0_n12_N3ccc7DD4x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y43efgEv,_ZThn4_N3ccc7DD4x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y43abcEv,_ZTv0_n16_N3ccc7DD4x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y43abcEv,_ZThn4_N3ccc7DD4x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y43pqrEv,_ZTv0_n20_N3ccc7DD4x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y43pqrEv,_ZThn4_N3ccc7DD4x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y43efgEv,_ZTv0_n12_N3ccc7DD4x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y43abcEv,_ZTv0_n16_N3ccc7DD4x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y43pqrEv,_ZTv0_n20_N3ccc7DD4x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y4E[] = {
  {&(_ZTVN3ccc7DD4x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y4E[];
static VTBL_ENTRY alt_thunk_names1798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y43pqrEv,_ZTv0_n20_N3ccc7DD4x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y43pqrEv,_ZThn4_N3ccc7DD4x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y43abcEv,_ZTv0_n16_N3ccc7DD4x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y43abcEv,_ZThn4_N3ccc7DD4x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y43efgEv,_ZTv0_n12_N3ccc7DD4x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y43efgEv,_ZThn4_N3ccc7DD4x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y4E = {  "_ZN3ccc7DD4x2y4E", // class name
  bases__ZN3ccc7DD4x2y4E, 2,
  &(vtc__ZN3ccc7DD4x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1798,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y5  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC4x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y53abcEv
  ~CC4x2y5(); // tgen
  CC4x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y5E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y53pqrEv");}
void  ccc::CC4x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y53efgEv");}
void  ccc::CC4x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y53abcEv");}
ccc::CC4x2y5 ::~CC4x2y5(){ note_dtor("_ZN3ccc7CC4x2y5E", this);} // tgen
ccc::CC4x2y5 ::CC4x2y5(){ note_ctor("_ZN3ccc7CC4x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y5E, buf);
    ::ccc::CC4x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y5E);
    dp->::ccc::CC4x2y5::~CC4x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y5E(Test__ZN3ccc7CC4x2y5E, "_ZN3ccc7CC4x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y5C1Ev();
extern void _ZN3ccc7CC4x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y5E[] = {
  NSPAIR(_ZN3ccc7CC4x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y5E[];
extern void _ZN3ccc7CC4x2y53efgEv();
extern void _ZN3ccc7CC4x2y53abcEv();
extern void _ZN3ccc7CC4x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y53pqrEv,_ZTv0_n12_N3ccc7CC4x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53pqrEv,_ZThn4_N3ccc7CC4x2y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y53abcEv,_ZTv0_n16_N3ccc7CC4x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53abcEv,_ZThn4_N3ccc7CC4x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y53efgEv,_ZTv0_n20_N3ccc7CC4x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53efgEv,_ZThn4_N3ccc7CC4x2y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y53pqrEv,_ZTv0_n12_N3ccc7CC4x2y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y53abcEv,_ZTv0_n16_N3ccc7CC4x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y53efgEv,_ZTv0_n20_N3ccc7CC4x2y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y5E[] = {
  {&(_ZTVN3ccc7CC4x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y5E[];
static VTBL_ENTRY alt_thunk_names1799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y53efgEv,_ZTv0_n20_N3ccc7CC4x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y53efgEv,_ZThn4_N3ccc7CC4x2y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y53abcEv,_ZTv0_n16_N3ccc7CC4x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y53abcEv,_ZThn4_N3ccc7CC4x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y53pqrEv,_ZTv0_n12_N3ccc7CC4x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y53pqrEv,_ZThn4_N3ccc7CC4x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y5E = {  "_ZN3ccc7CC4x2y5E", // class name
  bases__ZN3ccc7CC4x2y5E, 2,
  &(vtc__ZN3ccc7CC4x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1799,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y5  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD4x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x2y53abcEv
  ~DD4x2y5(); // tgen
  DD4x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y53pqrEv");}
void  ccc::DD4x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y53efgEv");}
void  ccc::DD4x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y53abcEv");}
ccc::DD4x2y5 ::~DD4x2y5(){ note_dtor("_ZN3ccc7DD4x2y5E", this);} // tgen
ccc::DD4x2y5 ::DD4x2y5(){ note_ctor("_ZN3ccc7DD4x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y5E, buf);
    ::ccc::DD4x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y5E);
    dp->::ccc::DD4x2y5::~DD4x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y5E(Test__ZN3ccc7DD4x2y5E, "_ZN3ccc7DD4x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y5C1Ev();
extern void _ZN3ccc7DD4x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y5E[] = {
  NSPAIR(_ZN3ccc7DD4x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y5E[];
extern void _ZN3ccc7DD4x2y53pqrEv();
extern void _ZN3ccc7DD4x2y53abcEv();
extern void _ZN3ccc7DD4x2y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y53efgEv,_ZTv0_n12_N3ccc7DD4x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y53efgEv,_ZThn4_N3ccc7DD4x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y53abcEv,_ZTv0_n16_N3ccc7DD4x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y53abcEv,_ZThn4_N3ccc7DD4x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y53pqrEv,_ZTv0_n20_N3ccc7DD4x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y53pqrEv,_ZThn4_N3ccc7DD4x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y53efgEv,_ZTv0_n12_N3ccc7DD4x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y53abcEv,_ZTv0_n16_N3ccc7DD4x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y53pqrEv,_ZTv0_n20_N3ccc7DD4x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y5E[] = {
  {&(_ZTVN3ccc7DD4x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y5E[];
static VTBL_ENTRY alt_thunk_names1800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y53pqrEv,_ZTv0_n20_N3ccc7DD4x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y53pqrEv,_ZThn4_N3ccc7DD4x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y53abcEv,_ZTv0_n16_N3ccc7DD4x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y53abcEv,_ZThn4_N3ccc7DD4x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y53efgEv,_ZTv0_n12_N3ccc7DD4x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y53efgEv,_ZThn4_N3ccc7DD4x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y5E = {  "_ZN3ccc7DD4x2y5E", // class name
  bases__ZN3ccc7DD4x2y5E, 2,
  &(vtc__ZN3ccc7DD4x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1800,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y6  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y63efgEv
  ~CC4x2y6(); // tgen
  CC4x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y6E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y63abcEv");}
void  ccc::CC4x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y63efgEv");}
ccc::CC4x2y6 ::~CC4x2y6(){ note_dtor("_ZN3ccc7CC4x2y6E", this);} // tgen
ccc::CC4x2y6 ::CC4x2y6(){ note_ctor("_ZN3ccc7CC4x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y6E, buf);
    ::ccc::CC4x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y6E);
    dp->::ccc::CC4x2y6::~CC4x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y6E(Test__ZN3ccc7CC4x2y6E, "_ZN3ccc7CC4x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y6C1Ev();
extern void _ZN3ccc7CC4x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y6E[] = {
  NSPAIR(_ZN3ccc7CC4x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y6E[];
extern void _ZN3ccc7CC4x2y63efgEv();
extern void _ZN3ccc7CC4x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y63abcEv,_ZTv0_n16_N3ccc7CC4x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y63abcEv,_ZThn4_N3ccc7CC4x2y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y63efgEv,_ZTv0_n20_N3ccc7CC4x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y63efgEv,_ZThn4_N3ccc7CC4x2y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y63abcEv,_ZTv0_n16_N3ccc7CC4x2y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y63efgEv,_ZTv0_n20_N3ccc7CC4x2y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y6E[] = {
  {&(_ZTVN3ccc7CC4x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y6E[];
static VTBL_ENTRY alt_thunk_names1801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y63efgEv,_ZTv0_n20_N3ccc7CC4x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y63efgEv,_ZThn4_N3ccc7CC4x2y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y63abcEv,_ZTv0_n16_N3ccc7CC4x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y63abcEv,_ZThn4_N3ccc7CC4x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y6E = {  "_ZN3ccc7CC4x2y6E", // class name
  bases__ZN3ccc7CC4x2y6E, 2,
  &(vtc__ZN3ccc7CC4x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1801,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y6  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD4x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x2y63efgEv
  ~DD4x2y6(); // tgen
  DD4x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y63abcEv");}
void  ccc::DD4x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y63efgEv");}
ccc::DD4x2y6 ::~DD4x2y6(){ note_dtor("_ZN3ccc7DD4x2y6E", this);} // tgen
ccc::DD4x2y6 ::DD4x2y6(){ note_ctor("_ZN3ccc7DD4x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y6E, buf);
    ::ccc::DD4x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y6E);
    dp->::ccc::DD4x2y6::~DD4x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y6E(Test__ZN3ccc7DD4x2y6E, "_ZN3ccc7DD4x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y6C1Ev();
extern void _ZN3ccc7DD4x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y6E[] = {
  NSPAIR(_ZN3ccc7DD4x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x2y63abcEv();
extern void _ZN3ccc7DD4x2y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y63efgEv,_ZTv0_n12_N3ccc7DD4x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y63efgEv,_ZThn4_N3ccc7DD4x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y63abcEv,_ZTv0_n16_N3ccc7DD4x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y63abcEv,_ZThn4_N3ccc7DD4x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y63efgEv,_ZTv0_n12_N3ccc7DD4x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y63abcEv,_ZTv0_n16_N3ccc7DD4x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y6E[] = {
  {&(_ZTVN3ccc7DD4x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y6E[];
static VTBL_ENTRY alt_thunk_names1802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y63abcEv,_ZTv0_n16_N3ccc7DD4x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y63abcEv,_ZThn4_N3ccc7DD4x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y63efgEv,_ZTv0_n12_N3ccc7DD4x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y63efgEv,_ZThn4_N3ccc7DD4x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y6E = {  "_ZN3ccc7DD4x2y6E", // class name
  bases__ZN3ccc7DD4x2y6E, 2,
  &(vtc__ZN3ccc7DD4x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1802,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y7  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y73pqrEv
  ~CC4x2y7(); // tgen
  CC4x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y7E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y73abcEv");}
void  ccc::CC4x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y73pqrEv");}
ccc::CC4x2y7 ::~CC4x2y7(){ note_dtor("_ZN3ccc7CC4x2y7E", this);} // tgen
ccc::CC4x2y7 ::CC4x2y7(){ note_ctor("_ZN3ccc7CC4x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y7E, buf);
    ::ccc::CC4x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y7E);
    dp->::ccc::CC4x2y7::~CC4x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y7E(Test__ZN3ccc7CC4x2y7E, "_ZN3ccc7CC4x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y7C1Ev();
extern void _ZN3ccc7CC4x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y7E[] = {
  NSPAIR(_ZN3ccc7CC4x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC4x2y73abcEv();
extern void _ZN3ccc7CC4x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y73pqrEv,_ZTv0_n12_N3ccc7CC4x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y73pqrEv,_ZThn4_N3ccc7CC4x2y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y73abcEv,_ZTv0_n16_N3ccc7CC4x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y73abcEv,_ZThn4_N3ccc7CC4x2y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y73pqrEv,_ZTv0_n12_N3ccc7CC4x2y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y73abcEv,_ZTv0_n16_N3ccc7CC4x2y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y7E[] = {
  {&(_ZTVN3ccc7CC4x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y7E[];
static VTBL_ENTRY alt_thunk_names1803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y73abcEv,_ZTv0_n16_N3ccc7CC4x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y73abcEv,_ZThn4_N3ccc7CC4x2y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y73pqrEv,_ZTv0_n12_N3ccc7CC4x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y73pqrEv,_ZThn4_N3ccc7CC4x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y7E = {  "_ZN3ccc7CC4x2y7E", // class name
  bases__ZN3ccc7CC4x2y7E, 2,
  &(vtc__ZN3ccc7CC4x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1803,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y7  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD4x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y73pqrEv
  ~DD4x2y7(); // tgen
  DD4x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y73abcEv");}
void  ccc::DD4x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y73pqrEv");}
ccc::DD4x2y7 ::~DD4x2y7(){ note_dtor("_ZN3ccc7DD4x2y7E", this);} // tgen
ccc::DD4x2y7 ::DD4x2y7(){ note_ctor("_ZN3ccc7DD4x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y7E, buf);
    ::ccc::DD4x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y7E);
    dp->::ccc::DD4x2y7::~DD4x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y7E(Test__ZN3ccc7DD4x2y7E, "_ZN3ccc7DD4x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y7C1Ev();
extern void _ZN3ccc7DD4x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y7E[] = {
  NSPAIR(_ZN3ccc7DD4x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y7E[];
extern void _ZN3ccc7DD4x2y73pqrEv();
extern void _ZN3ccc7DD4x2y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y73abcEv,_ZTv0_n16_N3ccc7DD4x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y73abcEv,_ZThn4_N3ccc7DD4x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y73pqrEv,_ZTv0_n20_N3ccc7DD4x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y73pqrEv,_ZThn4_N3ccc7DD4x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y73abcEv,_ZTv0_n16_N3ccc7DD4x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y73pqrEv,_ZTv0_n20_N3ccc7DD4x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y7E[] = {
  {&(_ZTVN3ccc7DD4x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y7E[];
static VTBL_ENTRY alt_thunk_names1804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y73pqrEv,_ZTv0_n20_N3ccc7DD4x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y73pqrEv,_ZThn4_N3ccc7DD4x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y73abcEv,_ZTv0_n16_N3ccc7DD4x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y73abcEv,_ZThn4_N3ccc7DD4x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y7E = {  "_ZN3ccc7DD4x2y7E", // class name
  bases__ZN3ccc7DD4x2y7E, 2,
  &(vtc__ZN3ccc7DD4x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1804,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y8  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y83abcEv
  ~CC4x2y8(); // tgen
  CC4x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y8E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y83efgEv");}
void  ccc::CC4x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y83abcEv");}
ccc::CC4x2y8 ::~CC4x2y8(){ note_dtor("_ZN3ccc7CC4x2y8E", this);} // tgen
ccc::CC4x2y8 ::CC4x2y8(){ note_ctor("_ZN3ccc7CC4x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y8E, buf);
    ::ccc::CC4x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y8E);
    dp->::ccc::CC4x2y8::~CC4x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y8E(Test__ZN3ccc7CC4x2y8E, "_ZN3ccc7CC4x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y8C1Ev();
extern void _ZN3ccc7CC4x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y8E[] = {
  NSPAIR(_ZN3ccc7CC4x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y8E[];
extern void _ZN3ccc7CC4x2y83efgEv();
extern void _ZN3ccc7CC4x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x2y83abcEv,_ZTv0_n16_N3ccc7CC4x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y83abcEv,_ZThn4_N3ccc7CC4x2y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y83efgEv,_ZTv0_n20_N3ccc7CC4x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y83efgEv,_ZThn4_N3ccc7CC4x2y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x2y83abcEv,_ZTv0_n16_N3ccc7CC4x2y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y83efgEv,_ZTv0_n20_N3ccc7CC4x2y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y8E[] = {
  {&(_ZTVN3ccc7CC4x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y8E[];
static VTBL_ENTRY alt_thunk_names1805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y83efgEv,_ZTv0_n20_N3ccc7CC4x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y83efgEv,_ZThn4_N3ccc7CC4x2y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x2y83abcEv,_ZTv0_n16_N3ccc7CC4x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y83abcEv,_ZThn4_N3ccc7CC4x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y8E = {  "_ZN3ccc7CC4x2y8E", // class name
  bases__ZN3ccc7CC4x2y8E, 2,
  &(vtc__ZN3ccc7CC4x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1805,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y8  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD4x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x2y83abcEv
  ~DD4x2y8(); // tgen
  DD4x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y83efgEv");}
void  ccc::DD4x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x2y83abcEv");}
ccc::DD4x2y8 ::~DD4x2y8(){ note_dtor("_ZN3ccc7DD4x2y8E", this);} // tgen
ccc::DD4x2y8 ::DD4x2y8(){ note_ctor("_ZN3ccc7DD4x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y8E, buf);
    ::ccc::DD4x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y8E);
    dp->::ccc::DD4x2y8::~DD4x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y8E(Test__ZN3ccc7DD4x2y8E, "_ZN3ccc7DD4x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y8C1Ev();
extern void _ZN3ccc7DD4x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y8E[] = {
  NSPAIR(_ZN3ccc7DD4x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x2y83abcEv();
extern void _ZN3ccc7DD4x2y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y83efgEv,_ZTv0_n12_N3ccc7DD4x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y83efgEv,_ZThn4_N3ccc7DD4x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x2y83abcEv,_ZTv0_n16_N3ccc7DD4x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y83abcEv,_ZThn4_N3ccc7DD4x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y83efgEv,_ZTv0_n12_N3ccc7DD4x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x2y83abcEv,_ZTv0_n16_N3ccc7DD4x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y8E[] = {
  {&(_ZTVN3ccc7DD4x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y8E[];
static VTBL_ENTRY alt_thunk_names1806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x2y83abcEv,_ZTv0_n16_N3ccc7DD4x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y83abcEv,_ZThn4_N3ccc7DD4x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y83efgEv,_ZTv0_n12_N3ccc7DD4x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y83efgEv,_ZThn4_N3ccc7DD4x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y8E = {  "_ZN3ccc7DD4x2y8E", // class name
  bases__ZN3ccc7DD4x2y8E, 2,
  &(vtc__ZN3ccc7DD4x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1806,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y9  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y93pqrEv
  ~CC4x2y9(); // tgen
  CC4x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y9E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y93efgEv");}
void  ccc::CC4x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y93pqrEv");}
ccc::CC4x2y9 ::~CC4x2y9(){ note_dtor("_ZN3ccc7CC4x2y9E", this);} // tgen
ccc::CC4x2y9 ::CC4x2y9(){ note_ctor("_ZN3ccc7CC4x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y9E, buf);
    ::ccc::CC4x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC4x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y9E);
    dp->::ccc::CC4x2y9::~CC4x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y9E(Test__ZN3ccc7CC4x2y9E, "_ZN3ccc7CC4x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y9C1Ev();
extern void _ZN3ccc7CC4x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y9E[] = {
  NSPAIR(_ZN3ccc7CC4x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y9E[];
extern void _ZN3ccc7CC4x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC4x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x2y93pqrEv,_ZTv0_n12_N3ccc7CC4x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y93pqrEv,_ZThn4_N3ccc7CC4x2y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x2y93efgEv,_ZTv0_n20_N3ccc7CC4x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y93efgEv,_ZThn4_N3ccc7CC4x2y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x2y93pqrEv,_ZTv0_n12_N3ccc7CC4x2y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x2y93efgEv,_ZTv0_n20_N3ccc7CC4x2y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x2y9E[] = {
  {&(_ZTVN3ccc7CC4x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x2y9E[];
static VTBL_ENTRY alt_thunk_names1807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x2y93efgEv,_ZTv0_n20_N3ccc7CC4x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y93efgEv,_ZThn4_N3ccc7CC4x2y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x2y93pqrEv,_ZTv0_n12_N3ccc7CC4x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x2y93pqrEv,_ZThn4_N3ccc7CC4x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x2y9E = {  "_ZN3ccc7CC4x2y9E", // class name
  bases__ZN3ccc7CC4x2y9E, 2,
  &(vtc__ZN3ccc7CC4x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x2y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1807,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y9  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD4x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x2y93pqrEv
  ~DD4x2y9(); // tgen
  DD4x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x2y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x2y93efgEv");}
void  ccc::DD4x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x2y93pqrEv");}
ccc::DD4x2y9 ::~DD4x2y9(){ note_dtor("_ZN3ccc7DD4x2y9E", this);} // tgen
ccc::DD4x2y9 ::DD4x2y9(){ note_ctor("_ZN3ccc7DD4x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x2y9E, buf);
    ::ccc::DD4x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x2y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD4x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x2y9E);
    dp->::ccc::DD4x2y9::~DD4x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x2y9E(Test__ZN3ccc7DD4x2y9E, "_ZN3ccc7DD4x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x2y9C1Ev();
extern void _ZN3ccc7DD4x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x2y9E[] = {
  NSPAIR(_ZN3ccc7DD4x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD4x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y9E[];
extern void _ZN3ccc7DD4x2y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x2y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x2y93efgEv,_ZTv0_n12_N3ccc7DD4x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y93efgEv,_ZThn4_N3ccc7DD4x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x2y93pqrEv,_ZTv0_n20_N3ccc7DD4x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x2y93pqrEv,_ZThn4_N3ccc7DD4x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x2y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x2y93efgEv,_ZTv0_n12_N3ccc7DD4x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x2y93pqrEv,_ZTv0_n20_N3ccc7DD4x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x2y9E[] = {
  {&(_ZTVN3ccc7DD4x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x2y9E[];
static VTBL_ENTRY alt_thunk_names1808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x2y93pqrEv,_ZTv0_n20_N3ccc7DD4x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y93pqrEv,_ZThn4_N3ccc7DD4x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x2y93efgEv,_ZTv0_n12_N3ccc7DD4x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x2y93efgEv,_ZThn4_N3ccc7DD4x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x2y9E = {  "_ZN3ccc7DD4x2y9E", // class name
  bases__ZN3ccc7DD4x2y9E, 2,
  &(vtc__ZN3ccc7DD4x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x2y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1808,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y10  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x2y103abcEv
  ~CC4x2y10(); // tgen
  CC4x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y10E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y103pqrEv");}
void  ccc::CC4x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x2y103abcEv");}
ccc::CC4x2y10 ::~CC4x2y10(){ note_dtor("_ZN3ccc8CC4x2y10E", this);} // tgen
ccc::CC4x2y10 ::CC4x2y10(){ note_ctor("_ZN3ccc8CC4x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y10E, buf);
    ::ccc::CC4x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y10E);
    dp->::ccc::CC4x2y10::~CC4x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y10E(Test__ZN3ccc8CC4x2y10E, "_ZN3ccc8CC4x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y10C1Ev();
extern void _ZN3ccc8CC4x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y10E[] = {
  NSPAIR(_ZN3ccc8CC4x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC4x2y103abcEv();
extern void _ZN3ccc8CC4x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x2y103pqrEv,_ZTv0_n12_N3ccc8CC4x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y103pqrEv,_ZThn4_N3ccc8CC4x2y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x2y103abcEv,_ZTv0_n16_N3ccc8CC4x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y103abcEv,_ZThn4_N3ccc8CC4x2y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x2y103pqrEv,_ZTv0_n12_N3ccc8CC4x2y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x2y103abcEv,_ZTv0_n16_N3ccc8CC4x2y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y10E[] = {
  {&(_ZTVN3ccc8CC4x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y10E[];
static VTBL_ENTRY alt_thunk_names1809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x2y103abcEv,_ZTv0_n16_N3ccc8CC4x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y103abcEv,_ZThn4_N3ccc8CC4x2y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x2y103pqrEv,_ZTv0_n12_N3ccc8CC4x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y103pqrEv,_ZThn4_N3ccc8CC4x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x2y10E = {  "_ZN3ccc8CC4x2y10E", // class name
  bases__ZN3ccc8CC4x2y10E, 2,
  &(vtc__ZN3ccc8CC4x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1809,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y10  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD4x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x2y103abcEv
  ~DD4x2y10(); // tgen
  DD4x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x2y103pqrEv");}
void  ccc::DD4x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x2y103abcEv");}
ccc::DD4x2y10 ::~DD4x2y10(){ note_dtor("_ZN3ccc8DD4x2y10E", this);} // tgen
ccc::DD4x2y10 ::DD4x2y10(){ note_ctor("_ZN3ccc8DD4x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y10E, buf);
    ::ccc::DD4x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y10E);
    dp->::ccc::DD4x2y10::~DD4x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y10E(Test__ZN3ccc8DD4x2y10E, "_ZN3ccc8DD4x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y10C1Ev();
extern void _ZN3ccc8DD4x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y10E[] = {
  NSPAIR(_ZN3ccc8DD4x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y10E[];
extern void _ZN3ccc8DD4x2y103pqrEv();
extern void _ZN3ccc8DD4x2y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x2y103abcEv,_ZTv0_n16_N3ccc8DD4x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y103abcEv,_ZThn4_N3ccc8DD4x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x2y103pqrEv,_ZTv0_n20_N3ccc8DD4x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y103pqrEv,_ZThn4_N3ccc8DD4x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x2y103abcEv,_ZTv0_n16_N3ccc8DD4x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x2y103pqrEv,_ZTv0_n20_N3ccc8DD4x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y10E[] = {
  {&(_ZTVN3ccc8DD4x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y10E[];
static VTBL_ENTRY alt_thunk_names1810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x2y103pqrEv,_ZTv0_n20_N3ccc8DD4x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y103pqrEv,_ZThn4_N3ccc8DD4x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x2y103abcEv,_ZTv0_n16_N3ccc8DD4x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y103abcEv,_ZThn4_N3ccc8DD4x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x2y10E = {  "_ZN3ccc8DD4x2y10E", // class name
  bases__ZN3ccc8DD4x2y10E, 2,
  &(vtc__ZN3ccc8DD4x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1810,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y11  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x2y113efgEv
  ~CC4x2y11(); // tgen
  CC4x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y11E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y113pqrEv");}
void  ccc::CC4x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x2y113efgEv");}
ccc::CC4x2y11 ::~CC4x2y11(){ note_dtor("_ZN3ccc8CC4x2y11E", this);} // tgen
ccc::CC4x2y11 ::CC4x2y11(){ note_ctor("_ZN3ccc8CC4x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y11E, buf);
    ::ccc::CC4x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y11E);
    dp->::ccc::CC4x2y11::~CC4x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y11E(Test__ZN3ccc8CC4x2y11E, "_ZN3ccc8CC4x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y11C1Ev();
extern void _ZN3ccc8CC4x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y11E[] = {
  NSPAIR(_ZN3ccc8CC4x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y11E[];
extern void _ZN3ccc8CC4x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC4x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x2y113pqrEv,_ZTv0_n12_N3ccc8CC4x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y113pqrEv,_ZThn4_N3ccc8CC4x2y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x2y113efgEv,_ZTv0_n20_N3ccc8CC4x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y113efgEv,_ZThn4_N3ccc8CC4x2y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x2y113pqrEv,_ZTv0_n12_N3ccc8CC4x2y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x2y113efgEv,_ZTv0_n20_N3ccc8CC4x2y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y11E[] = {
  {&(_ZTVN3ccc8CC4x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y11E[];
static VTBL_ENTRY alt_thunk_names1811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x2y113efgEv,_ZTv0_n20_N3ccc8CC4x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y113efgEv,_ZThn4_N3ccc8CC4x2y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x2y113pqrEv,_ZTv0_n12_N3ccc8CC4x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y113pqrEv,_ZThn4_N3ccc8CC4x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x2y11E = {  "_ZN3ccc8CC4x2y11E", // class name
  bases__ZN3ccc8CC4x2y11E, 2,
  &(vtc__ZN3ccc8CC4x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1811,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y11  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD4x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x2y113efgEv
  ~DD4x2y11(); // tgen
  DD4x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x2y113pqrEv");}
void  ccc::DD4x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x2y113efgEv");}
ccc::DD4x2y11 ::~DD4x2y11(){ note_dtor("_ZN3ccc8DD4x2y11E", this);} // tgen
ccc::DD4x2y11 ::DD4x2y11(){ note_ctor("_ZN3ccc8DD4x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y11E, buf);
    ::ccc::DD4x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y11E);
    dp->::ccc::DD4x2y11::~DD4x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y11E(Test__ZN3ccc8DD4x2y11E, "_ZN3ccc8DD4x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y11C1Ev();
extern void _ZN3ccc8DD4x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y11E[] = {
  NSPAIR(_ZN3ccc8DD4x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y11E[];
extern void _ZN3ccc8DD4x2y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x2y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x2y113efgEv,_ZTv0_n12_N3ccc8DD4x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y113efgEv,_ZThn4_N3ccc8DD4x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x2y113pqrEv,_ZTv0_n20_N3ccc8DD4x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y113pqrEv,_ZThn4_N3ccc8DD4x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x2y113efgEv,_ZTv0_n12_N3ccc8DD4x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x2y113pqrEv,_ZTv0_n20_N3ccc8DD4x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y11E[] = {
  {&(_ZTVN3ccc8DD4x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y11E[];
static VTBL_ENTRY alt_thunk_names1812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x2y113pqrEv,_ZTv0_n20_N3ccc8DD4x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y113pqrEv,_ZThn4_N3ccc8DD4x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x2y113efgEv,_ZTv0_n12_N3ccc8DD4x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y113efgEv,_ZThn4_N3ccc8DD4x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x2y11E = {  "_ZN3ccc8DD4x2y11E", // class name
  bases__ZN3ccc8DD4x2y11E, 2,
  &(vtc__ZN3ccc8DD4x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1812,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y12  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC4x2y123abcEv
  ~CC4x2y12(); // tgen
  CC4x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x2y123abcEv");}
ccc::CC4x2y12 ::~CC4x2y12(){ note_dtor("_ZN3ccc8CC4x2y12E", this);} // tgen
ccc::CC4x2y12 ::CC4x2y12(){ note_ctor("_ZN3ccc8CC4x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y12E, buf);
    ::ccc::CC4x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y12E);
    dp->::ccc::CC4x2y12::~CC4x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y12E(Test__ZN3ccc8CC4x2y12E, "_ZN3ccc8CC4x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y12C1Ev();
extern void _ZN3ccc8CC4x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y12E[] = {
  NSPAIR(_ZN3ccc8CC4x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC4x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x2y123abcEv,_ZTv0_n16_N3ccc8CC4x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y123abcEv,_ZThn4_N3ccc8CC4x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x2y123abcEv,_ZTv0_n16_N3ccc8CC4x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y12E[] = {
  {&(_ZTVN3ccc8CC4x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y12E[];
static VTBL_ENTRY alt_thunk_names1813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x2y123abcEv,_ZTv0_n16_N3ccc8CC4x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y123abcEv,_ZThn4_N3ccc8CC4x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x2y12E = {  "_ZN3ccc8CC4x2y12E", // class name
  bases__ZN3ccc8CC4x2y12E, 2,
  &(vtc__ZN3ccc8CC4x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1813,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y12  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD4x2y123abcEv
  ~DD4x2y12(); // tgen
  DD4x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x2y123abcEv");}
ccc::DD4x2y12 ::~DD4x2y12(){ note_dtor("_ZN3ccc8DD4x2y12E", this);} // tgen
ccc::DD4x2y12 ::DD4x2y12(){ note_ctor("_ZN3ccc8DD4x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y12E, buf);
    ::ccc::DD4x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y12E);
    dp->::ccc::DD4x2y12::~DD4x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y12E(Test__ZN3ccc8DD4x2y12E, "_ZN3ccc8DD4x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y12C1Ev();
extern void _ZN3ccc8DD4x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y12E[] = {
  NSPAIR(_ZN3ccc8DD4x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x2y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x2y123abcEv,_ZTv0_n16_N3ccc8DD4x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y123abcEv,_ZThn4_N3ccc8DD4x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x2y123abcEv,_ZTv0_n16_N3ccc8DD4x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y12E[] = {
  {&(_ZTVN3ccc8DD4x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y12E[];
static VTBL_ENTRY alt_thunk_names1814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x2y123abcEv,_ZTv0_n16_N3ccc8DD4x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y123abcEv,_ZThn4_N3ccc8DD4x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x2y12E = {  "_ZN3ccc8DD4x2y12E", // class name
  bases__ZN3ccc8DD4x2y12E, 2,
  &(vtc__ZN3ccc8DD4x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1814,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y13  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC4x2y133efgEv
  ~CC4x2y13(); // tgen
  CC4x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x2y133efgEv");}
ccc::CC4x2y13 ::~CC4x2y13(){ note_dtor("_ZN3ccc8CC4x2y13E", this);} // tgen
ccc::CC4x2y13 ::CC4x2y13(){ note_ctor("_ZN3ccc8CC4x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y13E, buf);
    ::ccc::CC4x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y13E);
    dp->::ccc::CC4x2y13::~CC4x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y13E(Test__ZN3ccc8CC4x2y13E, "_ZN3ccc8CC4x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y13C1Ev();
extern void _ZN3ccc8CC4x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y13E[] = {
  NSPAIR(_ZN3ccc8CC4x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y13E[];
extern void _ZN3ccc8CC4x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x2y133efgEv,_ZTv0_n20_N3ccc8CC4x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y133efgEv,_ZThn4_N3ccc8CC4x2y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x2y133efgEv,_ZTv0_n20_N3ccc8CC4x2y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y13E[] = {
  {&(_ZTVN3ccc8CC4x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y13E[];
static VTBL_ENTRY alt_thunk_names1815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x2y133efgEv,_ZTv0_n20_N3ccc8CC4x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y133efgEv,_ZThn4_N3ccc8CC4x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x2y13E = {  "_ZN3ccc8CC4x2y13E", // class name
  bases__ZN3ccc8CC4x2y13E, 2,
  &(vtc__ZN3ccc8CC4x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1815,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y13  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD4x2y133efgEv
  ~DD4x2y13(); // tgen
  DD4x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x2y133efgEv");}
ccc::DD4x2y13 ::~DD4x2y13(){ note_dtor("_ZN3ccc8DD4x2y13E", this);} // tgen
ccc::DD4x2y13 ::DD4x2y13(){ note_ctor("_ZN3ccc8DD4x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y13E, buf);
    ::ccc::DD4x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y13E);
    dp->::ccc::DD4x2y13::~DD4x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y13E(Test__ZN3ccc8DD4x2y13E, "_ZN3ccc8DD4x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y13C1Ev();
extern void _ZN3ccc8DD4x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y13E[] = {
  NSPAIR(_ZN3ccc8DD4x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x2y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x2y133efgEv,_ZTv0_n12_N3ccc8DD4x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y133efgEv,_ZThn4_N3ccc8DD4x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x2y133efgEv,_ZTv0_n12_N3ccc8DD4x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y13E[] = {
  {&(_ZTVN3ccc8DD4x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y13E[];
static VTBL_ENTRY alt_thunk_names1816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x2y133efgEv,_ZTv0_n12_N3ccc8DD4x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y133efgEv,_ZThn4_N3ccc8DD4x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x2y13E = {  "_ZN3ccc8DD4x2y13E", // class name
  bases__ZN3ccc8DD4x2y13E, 2,
  &(vtc__ZN3ccc8DD4x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1816,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y14  : virtual ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y143pqrEv
  ~CC4x2y14(); // tgen
  CC4x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y143pqrEv");}
ccc::CC4x2y14 ::~CC4x2y14(){ note_dtor("_ZN3ccc8CC4x2y14E", this);} // tgen
ccc::CC4x2y14 ::CC4x2y14(){ note_ctor("_ZN3ccc8CC4x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y14E, buf);
    ::ccc::CC4x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y14E);
    dp->::ccc::CC4x2y14::~CC4x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y14E(Test__ZN3ccc8CC4x2y14E, "_ZN3ccc8CC4x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y14C1Ev();
extern void _ZN3ccc8CC4x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y14E[] = {
  NSPAIR(_ZN3ccc8CC4x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC4x2y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x2y143pqrEv,_ZTv0_n12_N3ccc8CC4x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y143pqrEv,_ZThn4_N3ccc8CC4x2y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x2y143pqrEv,_ZTv0_n12_N3ccc8CC4x2y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y14E[] = {
  {&(_ZTVN3ccc8CC4x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y14E[];
static VTBL_ENTRY alt_thunk_names1817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x2y143pqrEv,_ZTv0_n12_N3ccc8CC4x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x2y143pqrEv,_ZThn4_N3ccc8CC4x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x2y14E = {  "_ZN3ccc8CC4x2y14E", // class name
  bases__ZN3ccc8CC4x2y14E, 2,
  &(vtc__ZN3ccc8CC4x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1817,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y14  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD4x2y143pqrEv
  ~DD4x2y14(); // tgen
  DD4x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x2y143pqrEv");}
ccc::DD4x2y14 ::~DD4x2y14(){ note_dtor("_ZN3ccc8DD4x2y14E", this);} // tgen
ccc::DD4x2y14 ::DD4x2y14(){ note_ctor("_ZN3ccc8DD4x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y14E, buf);
    ::ccc::DD4x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y14E);
    dp->::ccc::DD4x2y14::~DD4x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y14E(Test__ZN3ccc8DD4x2y14E, "_ZN3ccc8DD4x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y14C1Ev();
extern void _ZN3ccc8DD4x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y14E[] = {
  NSPAIR(_ZN3ccc8DD4x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y14E[];
extern void _ZN3ccc8DD4x2y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x2y143pqrEv,_ZTv0_n20_N3ccc8DD4x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x2y143pqrEv,_ZThn4_N3ccc8DD4x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x2y143pqrEv,_ZTv0_n20_N3ccc8DD4x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y14E[] = {
  {&(_ZTVN3ccc8DD4x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y14E[];
static VTBL_ENTRY alt_thunk_names1818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x2y143pqrEv,_ZTv0_n20_N3ccc8DD4x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x2y143pqrEv,_ZThn4_N3ccc8DD4x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x2y14E = {  "_ZN3ccc8DD4x2y14E", // class name
  bases__ZN3ccc8DD4x2y14E, 2,
  &(vtc__ZN3ccc8DD4x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1818,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y15  : virtual ::ccc::AA4 , ::ccc::BB2 {
  ~CC4x2y15(); // tgen
  CC4x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x2y15 ::~CC4x2y15(){ note_dtor("_ZN3ccc8CC4x2y15E", this);} // tgen
ccc::CC4x2y15 ::CC4x2y15(){ note_ctor("_ZN3ccc8CC4x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y15E, buf);
    ::ccc::CC4x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC4x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y15E);
    dp->::ccc::CC4x2y15::~CC4x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y15E(Test__ZN3ccc8CC4x2y15E, "_ZN3ccc8CC4x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y15C1Ev();
extern void _ZN3ccc8CC4x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y15E[] = {
  NSPAIR(_ZN3ccc8CC4x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x2y15E[] = {
  {&(_ZTVN3ccc8CC4x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x2y15E[];
Class_Descriptor cd__ZN3ccc8CC4x2y15E = {  "_ZN3ccc8CC4x2y15E", // class name
  bases__ZN3ccc8CC4x2y15E, 2,
  &(vtc__ZN3ccc8CC4x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x2y15  : virtual ::ccc::AA4 , virtual ::ccc::BB2 {
  ~DD4x2y15(); // tgen
  DD4x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x2y15 ::~DD4x2y15(){ note_dtor("_ZN3ccc8DD4x2y15E", this);} // tgen
ccc::DD4x2y15 ::DD4x2y15(){ note_ctor("_ZN3ccc8DD4x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x2y15E, buf);
    ::ccc::DD4x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x2y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD4x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x2y15E);
    dp->::ccc::DD4x2y15::~DD4x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x2y15E(Test__ZN3ccc8DD4x2y15E, "_ZN3ccc8DD4x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x2y15C1Ev();
extern void _ZN3ccc8DD4x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x2y15E[] = {
  NSPAIR(_ZN3ccc8DD4x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD4x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x2y15E[] = {
  {&(_ZTVN3ccc8DD4x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x2y15E[];
Class_Descriptor cd__ZN3ccc8DD4x2y15E = {  "_ZN3ccc8DD4x2y15E", // class name
  bases__ZN3ccc8DD4x2y15E, 2,
  &(vtc__ZN3ccc8DD4x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y0  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y03pqrEv
  ~CC4x3y0(); // tgen
  CC4x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y0E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y03abcEv");}
void  ccc::CC4x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y03efgEv");}
void  ccc::CC4x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y03pqrEv");}
ccc::CC4x3y0 ::~CC4x3y0(){ note_dtor("_ZN3ccc7CC4x3y0E", this);} // tgen
ccc::CC4x3y0 ::CC4x3y0(){ note_ctor("_ZN3ccc7CC4x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y0E, buf);
    ::ccc::CC4x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y0E);
    dp->::ccc::CC4x3y0::~CC4x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y0E(Test__ZN3ccc7CC4x3y0E, "_ZN3ccc7CC4x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y0C1Ev();
extern void _ZN3ccc7CC4x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y0E[] = {
  NSPAIR(_ZN3ccc7CC4x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y0E[];
extern void _ZN3ccc7CC4x3y03efgEv();
extern void _ZN3ccc7CC4x3y03pqrEv();
extern void _ZN3ccc7CC4x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y03pqrEv,_ZTv0_n12_N3ccc7CC4x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03pqrEv,_ZThn4_N3ccc7CC4x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y03abcEv,_ZTv0_n16_N3ccc7CC4x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03abcEv,_ZThn4_N3ccc7CC4x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y03efgEv,_ZTv0_n20_N3ccc7CC4x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03efgEv,_ZThn4_N3ccc7CC4x3y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y03pqrEv,_ZTv0_n12_N3ccc7CC4x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y03abcEv,_ZTv0_n16_N3ccc7CC4x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y03efgEv,_ZTv0_n20_N3ccc7CC4x3y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y0E[] = {
  {&(_ZTVN3ccc7CC4x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y0E[];
static VTBL_ENTRY alt_thunk_names1819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y03efgEv,_ZTv0_n20_N3ccc7CC4x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y03efgEv,_ZThn4_N3ccc7CC4x3y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y03abcEv,_ZTv0_n16_N3ccc7CC4x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y03abcEv,_ZThn4_N3ccc7CC4x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y03pqrEv,_ZTv0_n12_N3ccc7CC4x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y03pqrEv,_ZThn4_N3ccc7CC4x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y0E = {  "_ZN3ccc7CC4x3y0E", // class name
  bases__ZN3ccc7CC4x3y0E, 2,
  &(vtc__ZN3ccc7CC4x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1819,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y0  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD4x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y03pqrEv
  ~DD4x3y0(); // tgen
  DD4x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y03abcEv");}
void  ccc::DD4x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y03efgEv");}
void  ccc::DD4x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y03pqrEv");}
ccc::DD4x3y0 ::~DD4x3y0(){ note_dtor("_ZN3ccc7DD4x3y0E", this);} // tgen
ccc::DD4x3y0 ::DD4x3y0(){ note_ctor("_ZN3ccc7DD4x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y0E, buf);
    ::ccc::DD4x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y0E);
    dp->::ccc::DD4x3y0::~DD4x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y0E(Test__ZN3ccc7DD4x3y0E, "_ZN3ccc7DD4x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y0C1Ev();
extern void _ZN3ccc7DD4x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y0E[] = {
  NSPAIR(_ZN3ccc7DD4x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y0E[];
extern void _ZN3ccc7DD4x3y03pqrEv();
extern void _ZN3ccc7DD4x3y03abcEv();
extern void _ZN3ccc7DD4x3y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y03efgEv,_ZTv0_n12_N3ccc7DD4x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y03efgEv,_ZThn4_N3ccc7DD4x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y03pqrEv,_ZTv0_n16_N3ccc7DD4x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y03pqrEv,_ZThn4_N3ccc7DD4x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y03abcEv,_ZTv0_n20_N3ccc7DD4x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y03abcEv,_ZThn4_N3ccc7DD4x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y03efgEv,_ZTv0_n12_N3ccc7DD4x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y03pqrEv,_ZTv0_n16_N3ccc7DD4x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y03abcEv,_ZTv0_n20_N3ccc7DD4x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y0E[] = {
  {&(_ZTVN3ccc7DD4x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y0E[];
static VTBL_ENTRY alt_thunk_names1820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y03abcEv,_ZTv0_n20_N3ccc7DD4x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y03abcEv,_ZThn4_N3ccc7DD4x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y03pqrEv,_ZTv0_n16_N3ccc7DD4x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y03pqrEv,_ZThn4_N3ccc7DD4x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y03efgEv,_ZTv0_n12_N3ccc7DD4x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y03efgEv,_ZThn4_N3ccc7DD4x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y0E = {  "_ZN3ccc7DD4x3y0E", // class name
  bases__ZN3ccc7DD4x3y0E, 2,
  &(vtc__ZN3ccc7DD4x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1820,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y1  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x3y13efgEv
  ~CC4x3y1(); // tgen
  CC4x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y1E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y13abcEv");}
void  ccc::CC4x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y13pqrEv");}
void  ccc::CC4x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y13efgEv");}
ccc::CC4x3y1 ::~CC4x3y1(){ note_dtor("_ZN3ccc7CC4x3y1E", this);} // tgen
ccc::CC4x3y1 ::CC4x3y1(){ note_ctor("_ZN3ccc7CC4x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y1E, buf);
    ::ccc::CC4x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y1E);
    dp->::ccc::CC4x3y1::~CC4x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y1E(Test__ZN3ccc7CC4x3y1E, "_ZN3ccc7CC4x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y1C1Ev();
extern void _ZN3ccc7CC4x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y1E[] = {
  NSPAIR(_ZN3ccc7CC4x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y1E[];
extern void _ZN3ccc7CC4x3y13efgEv();
extern void _ZN3ccc7CC4x3y13pqrEv();
extern void _ZN3ccc7CC4x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y13pqrEv,_ZTv0_n12_N3ccc7CC4x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13pqrEv,_ZThn4_N3ccc7CC4x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y13abcEv,_ZTv0_n16_N3ccc7CC4x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13abcEv,_ZThn4_N3ccc7CC4x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y13efgEv,_ZTv0_n20_N3ccc7CC4x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13efgEv,_ZThn4_N3ccc7CC4x3y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y13pqrEv,_ZTv0_n12_N3ccc7CC4x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y13abcEv,_ZTv0_n16_N3ccc7CC4x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y13efgEv,_ZTv0_n20_N3ccc7CC4x3y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y1E[] = {
  {&(_ZTVN3ccc7CC4x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y1E[];
static VTBL_ENTRY alt_thunk_names1821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y13efgEv,_ZTv0_n20_N3ccc7CC4x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y13efgEv,_ZThn4_N3ccc7CC4x3y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y13abcEv,_ZTv0_n16_N3ccc7CC4x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y13abcEv,_ZThn4_N3ccc7CC4x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y13pqrEv,_ZTv0_n12_N3ccc7CC4x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y13pqrEv,_ZThn4_N3ccc7CC4x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y1E = {  "_ZN3ccc7CC4x3y1E", // class name
  bases__ZN3ccc7CC4x3y1E, 2,
  &(vtc__ZN3ccc7CC4x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1821,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y1  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD4x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x3y13efgEv
  ~DD4x3y1(); // tgen
  DD4x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y13abcEv");}
void  ccc::DD4x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y13pqrEv");}
void  ccc::DD4x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y13efgEv");}
ccc::DD4x3y1 ::~DD4x3y1(){ note_dtor("_ZN3ccc7DD4x3y1E", this);} // tgen
ccc::DD4x3y1 ::DD4x3y1(){ note_ctor("_ZN3ccc7DD4x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y1E, buf);
    ::ccc::DD4x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y1E);
    dp->::ccc::DD4x3y1::~DD4x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y1E(Test__ZN3ccc7DD4x3y1E, "_ZN3ccc7DD4x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y1C1Ev();
extern void _ZN3ccc7DD4x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y1E[] = {
  NSPAIR(_ZN3ccc7DD4x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y1E[];
extern void _ZN3ccc7DD4x3y13pqrEv();
extern void _ZN3ccc7DD4x3y13abcEv();
extern void _ZN3ccc7DD4x3y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y13efgEv,_ZTv0_n12_N3ccc7DD4x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y13efgEv,_ZThn4_N3ccc7DD4x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y13pqrEv,_ZTv0_n16_N3ccc7DD4x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y13pqrEv,_ZThn4_N3ccc7DD4x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y13abcEv,_ZTv0_n20_N3ccc7DD4x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y13abcEv,_ZThn4_N3ccc7DD4x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y13efgEv,_ZTv0_n12_N3ccc7DD4x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y13pqrEv,_ZTv0_n16_N3ccc7DD4x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y13abcEv,_ZTv0_n20_N3ccc7DD4x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y1E[] = {
  {&(_ZTVN3ccc7DD4x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y1E[];
static VTBL_ENTRY alt_thunk_names1822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y13abcEv,_ZTv0_n20_N3ccc7DD4x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y13abcEv,_ZThn4_N3ccc7DD4x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y13pqrEv,_ZTv0_n16_N3ccc7DD4x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y13pqrEv,_ZThn4_N3ccc7DD4x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y13efgEv,_ZTv0_n12_N3ccc7DD4x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y13efgEv,_ZThn4_N3ccc7DD4x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y1E = {  "_ZN3ccc7DD4x3y1E", // class name
  bases__ZN3ccc7DD4x3y1E, 2,
  &(vtc__ZN3ccc7DD4x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1822,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y2  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y23pqrEv
  ~CC4x3y2(); // tgen
  CC4x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y2E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y23efgEv");}
void  ccc::CC4x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y23abcEv");}
void  ccc::CC4x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y23pqrEv");}
ccc::CC4x3y2 ::~CC4x3y2(){ note_dtor("_ZN3ccc7CC4x3y2E", this);} // tgen
ccc::CC4x3y2 ::CC4x3y2(){ note_ctor("_ZN3ccc7CC4x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y2E, buf);
    ::ccc::CC4x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y2E);
    dp->::ccc::CC4x3y2::~CC4x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y2E(Test__ZN3ccc7CC4x3y2E, "_ZN3ccc7CC4x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y2C1Ev();
extern void _ZN3ccc7CC4x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y2E[] = {
  NSPAIR(_ZN3ccc7CC4x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y2E[];
extern void _ZN3ccc7CC4x3y23efgEv();
extern void _ZN3ccc7CC4x3y23pqrEv();
extern void _ZN3ccc7CC4x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y23pqrEv,_ZTv0_n12_N3ccc7CC4x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23pqrEv,_ZThn4_N3ccc7CC4x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y23abcEv,_ZTv0_n16_N3ccc7CC4x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23abcEv,_ZThn4_N3ccc7CC4x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y23efgEv,_ZTv0_n20_N3ccc7CC4x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23efgEv,_ZThn4_N3ccc7CC4x3y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y23pqrEv,_ZTv0_n12_N3ccc7CC4x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y23abcEv,_ZTv0_n16_N3ccc7CC4x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y23efgEv,_ZTv0_n20_N3ccc7CC4x3y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y2E[] = {
  {&(_ZTVN3ccc7CC4x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y2E[];
static VTBL_ENTRY alt_thunk_names1823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y23efgEv,_ZTv0_n20_N3ccc7CC4x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y23efgEv,_ZThn4_N3ccc7CC4x3y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y23abcEv,_ZTv0_n16_N3ccc7CC4x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y23abcEv,_ZThn4_N3ccc7CC4x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y23pqrEv,_ZTv0_n12_N3ccc7CC4x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y23pqrEv,_ZThn4_N3ccc7CC4x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y2E = {  "_ZN3ccc7CC4x3y2E", // class name
  bases__ZN3ccc7CC4x3y2E, 2,
  &(vtc__ZN3ccc7CC4x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1823,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y2  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD4x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y23pqrEv
  ~DD4x3y2(); // tgen
  DD4x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y23efgEv");}
void  ccc::DD4x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y23abcEv");}
void  ccc::DD4x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y23pqrEv");}
ccc::DD4x3y2 ::~DD4x3y2(){ note_dtor("_ZN3ccc7DD4x3y2E", this);} // tgen
ccc::DD4x3y2 ::DD4x3y2(){ note_ctor("_ZN3ccc7DD4x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y2E, buf);
    ::ccc::DD4x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y2E);
    dp->::ccc::DD4x3y2::~DD4x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y2E(Test__ZN3ccc7DD4x3y2E, "_ZN3ccc7DD4x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y2C1Ev();
extern void _ZN3ccc7DD4x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y2E[] = {
  NSPAIR(_ZN3ccc7DD4x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y2E[];
extern void _ZN3ccc7DD4x3y23pqrEv();
extern void _ZN3ccc7DD4x3y23abcEv();
extern void _ZN3ccc7DD4x3y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y23efgEv,_ZTv0_n12_N3ccc7DD4x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y23efgEv,_ZThn4_N3ccc7DD4x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y23pqrEv,_ZTv0_n16_N3ccc7DD4x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y23pqrEv,_ZThn4_N3ccc7DD4x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y23abcEv,_ZTv0_n20_N3ccc7DD4x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y23abcEv,_ZThn4_N3ccc7DD4x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y23efgEv,_ZTv0_n12_N3ccc7DD4x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y23pqrEv,_ZTv0_n16_N3ccc7DD4x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y23abcEv,_ZTv0_n20_N3ccc7DD4x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y2E[] = {
  {&(_ZTVN3ccc7DD4x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y2E[];
static VTBL_ENTRY alt_thunk_names1824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y23abcEv,_ZTv0_n20_N3ccc7DD4x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y23abcEv,_ZThn4_N3ccc7DD4x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y23pqrEv,_ZTv0_n16_N3ccc7DD4x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y23pqrEv,_ZThn4_N3ccc7DD4x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y23efgEv,_ZTv0_n12_N3ccc7DD4x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y23efgEv,_ZThn4_N3ccc7DD4x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y2E = {  "_ZN3ccc7DD4x3y2E", // class name
  bases__ZN3ccc7DD4x3y2E, 2,
  &(vtc__ZN3ccc7DD4x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1824,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y3  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x3y33abcEv
  ~CC4x3y3(); // tgen
  CC4x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y3E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y33efgEv");}
void  ccc::CC4x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y33pqrEv");}
void  ccc::CC4x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y33abcEv");}
ccc::CC4x3y3 ::~CC4x3y3(){ note_dtor("_ZN3ccc7CC4x3y3E", this);} // tgen
ccc::CC4x3y3 ::CC4x3y3(){ note_ctor("_ZN3ccc7CC4x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y3E, buf);
    ::ccc::CC4x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y3E);
    dp->::ccc::CC4x3y3::~CC4x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y3E(Test__ZN3ccc7CC4x3y3E, "_ZN3ccc7CC4x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y3C1Ev();
extern void _ZN3ccc7CC4x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y3E[] = {
  NSPAIR(_ZN3ccc7CC4x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y3E[];
extern void _ZN3ccc7CC4x3y33efgEv();
extern void _ZN3ccc7CC4x3y33pqrEv();
extern void _ZN3ccc7CC4x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y33pqrEv,_ZTv0_n12_N3ccc7CC4x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33pqrEv,_ZThn4_N3ccc7CC4x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y33abcEv,_ZTv0_n16_N3ccc7CC4x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33abcEv,_ZThn4_N3ccc7CC4x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y33efgEv,_ZTv0_n20_N3ccc7CC4x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33efgEv,_ZThn4_N3ccc7CC4x3y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y33pqrEv,_ZTv0_n12_N3ccc7CC4x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y33abcEv,_ZTv0_n16_N3ccc7CC4x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y33efgEv,_ZTv0_n20_N3ccc7CC4x3y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y3E[] = {
  {&(_ZTVN3ccc7CC4x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y3E[];
static VTBL_ENTRY alt_thunk_names1825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y33efgEv,_ZTv0_n20_N3ccc7CC4x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y33efgEv,_ZThn4_N3ccc7CC4x3y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y33abcEv,_ZTv0_n16_N3ccc7CC4x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y33abcEv,_ZThn4_N3ccc7CC4x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y33pqrEv,_ZTv0_n12_N3ccc7CC4x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y33pqrEv,_ZThn4_N3ccc7CC4x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y3E = {  "_ZN3ccc7CC4x3y3E", // class name
  bases__ZN3ccc7CC4x3y3E, 2,
  &(vtc__ZN3ccc7CC4x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1825,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y3  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD4x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x3y33abcEv
  ~DD4x3y3(); // tgen
  DD4x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y33efgEv");}
void  ccc::DD4x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y33pqrEv");}
void  ccc::DD4x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y33abcEv");}
ccc::DD4x3y3 ::~DD4x3y3(){ note_dtor("_ZN3ccc7DD4x3y3E", this);} // tgen
ccc::DD4x3y3 ::DD4x3y3(){ note_ctor("_ZN3ccc7DD4x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y3E, buf);
    ::ccc::DD4x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y3E);
    dp->::ccc::DD4x3y3::~DD4x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y3E(Test__ZN3ccc7DD4x3y3E, "_ZN3ccc7DD4x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y3C1Ev();
extern void _ZN3ccc7DD4x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y3E[] = {
  NSPAIR(_ZN3ccc7DD4x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y3E[];
extern void _ZN3ccc7DD4x3y33pqrEv();
extern void _ZN3ccc7DD4x3y33abcEv();
extern void _ZN3ccc7DD4x3y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y33efgEv,_ZTv0_n12_N3ccc7DD4x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y33efgEv,_ZThn4_N3ccc7DD4x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y33pqrEv,_ZTv0_n16_N3ccc7DD4x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y33pqrEv,_ZThn4_N3ccc7DD4x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y33abcEv,_ZTv0_n20_N3ccc7DD4x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y33abcEv,_ZThn4_N3ccc7DD4x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y33efgEv,_ZTv0_n12_N3ccc7DD4x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y33pqrEv,_ZTv0_n16_N3ccc7DD4x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y33abcEv,_ZTv0_n20_N3ccc7DD4x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y3E[] = {
  {&(_ZTVN3ccc7DD4x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y3E[];
static VTBL_ENTRY alt_thunk_names1826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y33abcEv,_ZTv0_n20_N3ccc7DD4x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y33abcEv,_ZThn4_N3ccc7DD4x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y33pqrEv,_ZTv0_n16_N3ccc7DD4x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y33pqrEv,_ZThn4_N3ccc7DD4x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y33efgEv,_ZTv0_n12_N3ccc7DD4x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y33efgEv,_ZThn4_N3ccc7DD4x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y3E = {  "_ZN3ccc7DD4x3y3E", // class name
  bases__ZN3ccc7DD4x3y3E, 2,
  &(vtc__ZN3ccc7DD4x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1826,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y4  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC4x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y43efgEv
  ~CC4x3y4(); // tgen
  CC4x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y4E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y43pqrEv");}
void  ccc::CC4x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y43abcEv");}
void  ccc::CC4x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y43efgEv");}
ccc::CC4x3y4 ::~CC4x3y4(){ note_dtor("_ZN3ccc7CC4x3y4E", this);} // tgen
ccc::CC4x3y4 ::CC4x3y4(){ note_ctor("_ZN3ccc7CC4x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y4E, buf);
    ::ccc::CC4x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y4E);
    dp->::ccc::CC4x3y4::~CC4x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y4E(Test__ZN3ccc7CC4x3y4E, "_ZN3ccc7CC4x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y4C1Ev();
extern void _ZN3ccc7CC4x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y4E[] = {
  NSPAIR(_ZN3ccc7CC4x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y4E[];
extern void _ZN3ccc7CC4x3y43efgEv();
extern void _ZN3ccc7CC4x3y43pqrEv();
extern void _ZN3ccc7CC4x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y43pqrEv,_ZTv0_n12_N3ccc7CC4x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43pqrEv,_ZThn4_N3ccc7CC4x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y43abcEv,_ZTv0_n16_N3ccc7CC4x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43abcEv,_ZThn4_N3ccc7CC4x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y43efgEv,_ZTv0_n20_N3ccc7CC4x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43efgEv,_ZThn4_N3ccc7CC4x3y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y43pqrEv,_ZTv0_n12_N3ccc7CC4x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y43abcEv,_ZTv0_n16_N3ccc7CC4x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y43efgEv,_ZTv0_n20_N3ccc7CC4x3y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y4E[] = {
  {&(_ZTVN3ccc7CC4x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y4E[];
static VTBL_ENTRY alt_thunk_names1827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y43efgEv,_ZTv0_n20_N3ccc7CC4x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y43efgEv,_ZThn4_N3ccc7CC4x3y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y43abcEv,_ZTv0_n16_N3ccc7CC4x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y43abcEv,_ZThn4_N3ccc7CC4x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y43pqrEv,_ZTv0_n12_N3ccc7CC4x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y43pqrEv,_ZThn4_N3ccc7CC4x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y4E = {  "_ZN3ccc7CC4x3y4E", // class name
  bases__ZN3ccc7CC4x3y4E, 2,
  &(vtc__ZN3ccc7CC4x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1827,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y4  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD4x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x3y43efgEv
  ~DD4x3y4(); // tgen
  DD4x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y43pqrEv");}
void  ccc::DD4x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y43abcEv");}
void  ccc::DD4x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y43efgEv");}
ccc::DD4x3y4 ::~DD4x3y4(){ note_dtor("_ZN3ccc7DD4x3y4E", this);} // tgen
ccc::DD4x3y4 ::DD4x3y4(){ note_ctor("_ZN3ccc7DD4x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y4E, buf);
    ::ccc::DD4x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y4E);
    dp->::ccc::DD4x3y4::~DD4x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y4E(Test__ZN3ccc7DD4x3y4E, "_ZN3ccc7DD4x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y4C1Ev();
extern void _ZN3ccc7DD4x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y4E[] = {
  NSPAIR(_ZN3ccc7DD4x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y4E[];
extern void _ZN3ccc7DD4x3y43pqrEv();
extern void _ZN3ccc7DD4x3y43abcEv();
extern void _ZN3ccc7DD4x3y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y43efgEv,_ZTv0_n12_N3ccc7DD4x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y43efgEv,_ZThn4_N3ccc7DD4x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y43pqrEv,_ZTv0_n16_N3ccc7DD4x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y43pqrEv,_ZThn4_N3ccc7DD4x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y43abcEv,_ZTv0_n20_N3ccc7DD4x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y43abcEv,_ZThn4_N3ccc7DD4x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y43efgEv,_ZTv0_n12_N3ccc7DD4x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y43pqrEv,_ZTv0_n16_N3ccc7DD4x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y43abcEv,_ZTv0_n20_N3ccc7DD4x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y4E[] = {
  {&(_ZTVN3ccc7DD4x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y4E[];
static VTBL_ENTRY alt_thunk_names1828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y43abcEv,_ZTv0_n20_N3ccc7DD4x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y43abcEv,_ZThn4_N3ccc7DD4x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y43pqrEv,_ZTv0_n16_N3ccc7DD4x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y43pqrEv,_ZThn4_N3ccc7DD4x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y43efgEv,_ZTv0_n12_N3ccc7DD4x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y43efgEv,_ZThn4_N3ccc7DD4x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y4E = {  "_ZN3ccc7DD4x3y4E", // class name
  bases__ZN3ccc7DD4x3y4E, 2,
  &(vtc__ZN3ccc7DD4x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1828,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y5  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC4x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y53abcEv
  ~CC4x3y5(); // tgen
  CC4x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y5E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y53pqrEv");}
void  ccc::CC4x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y53efgEv");}
void  ccc::CC4x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y53abcEv");}
ccc::CC4x3y5 ::~CC4x3y5(){ note_dtor("_ZN3ccc7CC4x3y5E", this);} // tgen
ccc::CC4x3y5 ::CC4x3y5(){ note_ctor("_ZN3ccc7CC4x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y5E, buf);
    ::ccc::CC4x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y5E);
    dp->::ccc::CC4x3y5::~CC4x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y5E(Test__ZN3ccc7CC4x3y5E, "_ZN3ccc7CC4x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y5C1Ev();
extern void _ZN3ccc7CC4x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y5E[] = {
  NSPAIR(_ZN3ccc7CC4x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y5E[];
extern void _ZN3ccc7CC4x3y53efgEv();
extern void _ZN3ccc7CC4x3y53pqrEv();
extern void _ZN3ccc7CC4x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y53pqrEv,_ZTv0_n12_N3ccc7CC4x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53pqrEv,_ZThn4_N3ccc7CC4x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y53abcEv,_ZTv0_n16_N3ccc7CC4x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53abcEv,_ZThn4_N3ccc7CC4x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y53efgEv,_ZTv0_n20_N3ccc7CC4x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53efgEv,_ZThn4_N3ccc7CC4x3y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y53pqrEv,_ZTv0_n12_N3ccc7CC4x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y53abcEv,_ZTv0_n16_N3ccc7CC4x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y53efgEv,_ZTv0_n20_N3ccc7CC4x3y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y5E[] = {
  {&(_ZTVN3ccc7CC4x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y5E[];
static VTBL_ENTRY alt_thunk_names1829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y53efgEv,_ZTv0_n20_N3ccc7CC4x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y53efgEv,_ZThn4_N3ccc7CC4x3y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y53abcEv,_ZTv0_n16_N3ccc7CC4x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y53abcEv,_ZThn4_N3ccc7CC4x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y53pqrEv,_ZTv0_n12_N3ccc7CC4x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y53pqrEv,_ZThn4_N3ccc7CC4x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y5E = {  "_ZN3ccc7CC4x3y5E", // class name
  bases__ZN3ccc7CC4x3y5E, 2,
  &(vtc__ZN3ccc7CC4x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1829,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y5  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD4x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x3y53abcEv
  ~DD4x3y5(); // tgen
  DD4x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y53pqrEv");}
void  ccc::DD4x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y53efgEv");}
void  ccc::DD4x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y53abcEv");}
ccc::DD4x3y5 ::~DD4x3y5(){ note_dtor("_ZN3ccc7DD4x3y5E", this);} // tgen
ccc::DD4x3y5 ::DD4x3y5(){ note_ctor("_ZN3ccc7DD4x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y5E, buf);
    ::ccc::DD4x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y5E);
    dp->::ccc::DD4x3y5::~DD4x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y5E(Test__ZN3ccc7DD4x3y5E, "_ZN3ccc7DD4x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y5C1Ev();
extern void _ZN3ccc7DD4x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y5E[] = {
  NSPAIR(_ZN3ccc7DD4x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y5E[];
extern void _ZN3ccc7DD4x3y53pqrEv();
extern void _ZN3ccc7DD4x3y53abcEv();
extern void _ZN3ccc7DD4x3y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y53efgEv,_ZTv0_n12_N3ccc7DD4x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y53efgEv,_ZThn4_N3ccc7DD4x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y53pqrEv,_ZTv0_n16_N3ccc7DD4x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y53pqrEv,_ZThn4_N3ccc7DD4x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y53abcEv,_ZTv0_n20_N3ccc7DD4x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y53abcEv,_ZThn4_N3ccc7DD4x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y53efgEv,_ZTv0_n12_N3ccc7DD4x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y53pqrEv,_ZTv0_n16_N3ccc7DD4x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y53abcEv,_ZTv0_n20_N3ccc7DD4x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y5E[] = {
  {&(_ZTVN3ccc7DD4x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y5E[];
static VTBL_ENTRY alt_thunk_names1830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y53abcEv,_ZTv0_n20_N3ccc7DD4x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y53abcEv,_ZThn4_N3ccc7DD4x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y53pqrEv,_ZTv0_n16_N3ccc7DD4x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y53pqrEv,_ZThn4_N3ccc7DD4x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y53efgEv,_ZTv0_n12_N3ccc7DD4x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y53efgEv,_ZThn4_N3ccc7DD4x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y5E = {  "_ZN3ccc7DD4x3y5E", // class name
  bases__ZN3ccc7DD4x3y5E, 2,
  &(vtc__ZN3ccc7DD4x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1830,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y6  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y63efgEv
  ~CC4x3y6(); // tgen
  CC4x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y6E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y63abcEv");}
void  ccc::CC4x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y63efgEv");}
ccc::CC4x3y6 ::~CC4x3y6(){ note_dtor("_ZN3ccc7CC4x3y6E", this);} // tgen
ccc::CC4x3y6 ::CC4x3y6(){ note_ctor("_ZN3ccc7CC4x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y6E, buf);
    ::ccc::CC4x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y6E);
    dp->::ccc::CC4x3y6::~CC4x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y6E(Test__ZN3ccc7CC4x3y6E, "_ZN3ccc7CC4x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y6C1Ev();
extern void _ZN3ccc7CC4x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y6E[] = {
  NSPAIR(_ZN3ccc7CC4x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y6E[];
extern void _ZN3ccc7CC4x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC4x3y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y63abcEv,_ZTv0_n16_N3ccc7CC4x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y63abcEv,_ZThn4_N3ccc7CC4x3y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y63efgEv,_ZTv0_n20_N3ccc7CC4x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y63efgEv,_ZThn4_N3ccc7CC4x3y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y63abcEv,_ZTv0_n16_N3ccc7CC4x3y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y63efgEv,_ZTv0_n20_N3ccc7CC4x3y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y6E[] = {
  {&(_ZTVN3ccc7CC4x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y6E[];
static VTBL_ENTRY alt_thunk_names1831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y63efgEv,_ZTv0_n20_N3ccc7CC4x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y63efgEv,_ZThn4_N3ccc7CC4x3y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y63abcEv,_ZTv0_n16_N3ccc7CC4x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y63abcEv,_ZThn4_N3ccc7CC4x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y6E = {  "_ZN3ccc7CC4x3y6E", // class name
  bases__ZN3ccc7CC4x3y6E, 2,
  &(vtc__ZN3ccc7CC4x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1831,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y6  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD4x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x3y63efgEv
  ~DD4x3y6(); // tgen
  DD4x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y63abcEv");}
void  ccc::DD4x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y63efgEv");}
ccc::DD4x3y6 ::~DD4x3y6(){ note_dtor("_ZN3ccc7DD4x3y6E", this);} // tgen
ccc::DD4x3y6 ::DD4x3y6(){ note_ctor("_ZN3ccc7DD4x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y6E, buf);
    ::ccc::DD4x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y6E);
    dp->::ccc::DD4x3y6::~DD4x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y6E(Test__ZN3ccc7DD4x3y6E, "_ZN3ccc7DD4x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y6C1Ev();
extern void _ZN3ccc7DD4x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y6E[] = {
  NSPAIR(_ZN3ccc7DD4x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x3y63abcEv();
extern void _ZN3ccc7DD4x3y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y63efgEv,_ZTv0_n12_N3ccc7DD4x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y63efgEv,_ZThn4_N3ccc7DD4x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y63abcEv,_ZTv0_n20_N3ccc7DD4x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y63abcEv,_ZThn4_N3ccc7DD4x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y63efgEv,_ZTv0_n12_N3ccc7DD4x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y63abcEv,_ZTv0_n20_N3ccc7DD4x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y6E[] = {
  {&(_ZTVN3ccc7DD4x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y6E[];
static VTBL_ENTRY alt_thunk_names1832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y63abcEv,_ZTv0_n20_N3ccc7DD4x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y63abcEv,_ZThn4_N3ccc7DD4x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y63efgEv,_ZTv0_n12_N3ccc7DD4x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y63efgEv,_ZThn4_N3ccc7DD4x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y6E = {  "_ZN3ccc7DD4x3y6E", // class name
  bases__ZN3ccc7DD4x3y6E, 2,
  &(vtc__ZN3ccc7DD4x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1832,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y7  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y73pqrEv
  ~CC4x3y7(); // tgen
  CC4x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y7E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y73abcEv");}
void  ccc::CC4x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y73pqrEv");}
ccc::CC4x3y7 ::~CC4x3y7(){ note_dtor("_ZN3ccc7CC4x3y7E", this);} // tgen
ccc::CC4x3y7 ::CC4x3y7(){ note_ctor("_ZN3ccc7CC4x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y7E, buf);
    ::ccc::CC4x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y7E);
    dp->::ccc::CC4x3y7::~CC4x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y7E(Test__ZN3ccc7CC4x3y7E, "_ZN3ccc7CC4x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y7C1Ev();
extern void _ZN3ccc7CC4x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y7E[] = {
  NSPAIR(_ZN3ccc7CC4x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC4x3y73pqrEv();
extern void _ZN3ccc7CC4x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y73pqrEv,_ZTv0_n12_N3ccc7CC4x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y73pqrEv,_ZThn4_N3ccc7CC4x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y73abcEv,_ZTv0_n16_N3ccc7CC4x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y73abcEv,_ZThn4_N3ccc7CC4x3y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y73pqrEv,_ZTv0_n12_N3ccc7CC4x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y73abcEv,_ZTv0_n16_N3ccc7CC4x3y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y7E[] = {
  {&(_ZTVN3ccc7CC4x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y7E[];
static VTBL_ENTRY alt_thunk_names1833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y73abcEv,_ZTv0_n16_N3ccc7CC4x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y73abcEv,_ZThn4_N3ccc7CC4x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y73pqrEv,_ZTv0_n12_N3ccc7CC4x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y73pqrEv,_ZThn4_N3ccc7CC4x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y7E = {  "_ZN3ccc7CC4x3y7E", // class name
  bases__ZN3ccc7CC4x3y7E, 2,
  &(vtc__ZN3ccc7CC4x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1833,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y7  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD4x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y73pqrEv
  ~DD4x3y7(); // tgen
  DD4x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y73abcEv");}
void  ccc::DD4x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y73pqrEv");}
ccc::DD4x3y7 ::~DD4x3y7(){ note_dtor("_ZN3ccc7DD4x3y7E", this);} // tgen
ccc::DD4x3y7 ::DD4x3y7(){ note_ctor("_ZN3ccc7DD4x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y7E, buf);
    ::ccc::DD4x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y7E);
    dp->::ccc::DD4x3y7::~DD4x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y7E(Test__ZN3ccc7DD4x3y7E, "_ZN3ccc7DD4x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y7C1Ev();
extern void _ZN3ccc7DD4x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y7E[] = {
  NSPAIR(_ZN3ccc7DD4x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y7E[];
extern void _ZN3ccc7DD4x3y73pqrEv();
extern void _ZN3ccc7DD4x3y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y73pqrEv,_ZTv0_n16_N3ccc7DD4x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y73pqrEv,_ZThn4_N3ccc7DD4x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y73abcEv,_ZTv0_n20_N3ccc7DD4x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y73abcEv,_ZThn4_N3ccc7DD4x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y73pqrEv,_ZTv0_n16_N3ccc7DD4x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y73abcEv,_ZTv0_n20_N3ccc7DD4x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y7E[] = {
  {&(_ZTVN3ccc7DD4x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y7E[];
static VTBL_ENTRY alt_thunk_names1834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y73abcEv,_ZTv0_n20_N3ccc7DD4x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y73abcEv,_ZThn4_N3ccc7DD4x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y73pqrEv,_ZTv0_n16_N3ccc7DD4x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y73pqrEv,_ZThn4_N3ccc7DD4x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y7E = {  "_ZN3ccc7DD4x3y7E", // class name
  bases__ZN3ccc7DD4x3y7E, 2,
  &(vtc__ZN3ccc7DD4x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1834,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y8  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y83abcEv
  ~CC4x3y8(); // tgen
  CC4x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y8E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y83efgEv");}
void  ccc::CC4x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y83abcEv");}
ccc::CC4x3y8 ::~CC4x3y8(){ note_dtor("_ZN3ccc7CC4x3y8E", this);} // tgen
ccc::CC4x3y8 ::CC4x3y8(){ note_ctor("_ZN3ccc7CC4x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y8E, buf);
    ::ccc::CC4x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y8E);
    dp->::ccc::CC4x3y8::~CC4x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y8E(Test__ZN3ccc7CC4x3y8E, "_ZN3ccc7CC4x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y8C1Ev();
extern void _ZN3ccc7CC4x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y8E[] = {
  NSPAIR(_ZN3ccc7CC4x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y8E[];
extern void _ZN3ccc7CC4x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC4x3y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x3y83abcEv,_ZTv0_n16_N3ccc7CC4x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y83abcEv,_ZThn4_N3ccc7CC4x3y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y83efgEv,_ZTv0_n20_N3ccc7CC4x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y83efgEv,_ZThn4_N3ccc7CC4x3y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x3y83abcEv,_ZTv0_n16_N3ccc7CC4x3y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y83efgEv,_ZTv0_n20_N3ccc7CC4x3y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y8E[] = {
  {&(_ZTVN3ccc7CC4x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y8E[];
static VTBL_ENTRY alt_thunk_names1835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y83efgEv,_ZTv0_n20_N3ccc7CC4x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y83efgEv,_ZThn4_N3ccc7CC4x3y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x3y83abcEv,_ZTv0_n16_N3ccc7CC4x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y83abcEv,_ZThn4_N3ccc7CC4x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y8E = {  "_ZN3ccc7CC4x3y8E", // class name
  bases__ZN3ccc7CC4x3y8E, 2,
  &(vtc__ZN3ccc7CC4x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1835,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y8  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD4x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x3y83abcEv
  ~DD4x3y8(); // tgen
  DD4x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y83efgEv");}
void  ccc::DD4x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x3y83abcEv");}
ccc::DD4x3y8 ::~DD4x3y8(){ note_dtor("_ZN3ccc7DD4x3y8E", this);} // tgen
ccc::DD4x3y8 ::DD4x3y8(){ note_ctor("_ZN3ccc7DD4x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y8E, buf);
    ::ccc::DD4x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y8E);
    dp->::ccc::DD4x3y8::~DD4x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y8E(Test__ZN3ccc7DD4x3y8E, "_ZN3ccc7DD4x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y8C1Ev();
extern void _ZN3ccc7DD4x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y8E[] = {
  NSPAIR(_ZN3ccc7DD4x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x3y83abcEv();
extern void _ZN3ccc7DD4x3y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y83efgEv,_ZTv0_n12_N3ccc7DD4x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y83efgEv,_ZThn4_N3ccc7DD4x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x3y83abcEv,_ZTv0_n20_N3ccc7DD4x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y83abcEv,_ZThn4_N3ccc7DD4x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y83efgEv,_ZTv0_n12_N3ccc7DD4x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x3y83abcEv,_ZTv0_n20_N3ccc7DD4x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y8E[] = {
  {&(_ZTVN3ccc7DD4x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y8E[];
static VTBL_ENTRY alt_thunk_names1836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x3y83abcEv,_ZTv0_n20_N3ccc7DD4x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y83abcEv,_ZThn4_N3ccc7DD4x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y83efgEv,_ZTv0_n12_N3ccc7DD4x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y83efgEv,_ZThn4_N3ccc7DD4x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y8E = {  "_ZN3ccc7DD4x3y8E", // class name
  bases__ZN3ccc7DD4x3y8E, 2,
  &(vtc__ZN3ccc7DD4x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1836,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y9  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y93pqrEv
  ~CC4x3y9(); // tgen
  CC4x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y9E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y93efgEv");}
void  ccc::CC4x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y93pqrEv");}
ccc::CC4x3y9 ::~CC4x3y9(){ note_dtor("_ZN3ccc7CC4x3y9E", this);} // tgen
ccc::CC4x3y9 ::CC4x3y9(){ note_ctor("_ZN3ccc7CC4x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y9E, buf);
    ::ccc::CC4x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC4x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y9E);
    dp->::ccc::CC4x3y9::~CC4x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y9E(Test__ZN3ccc7CC4x3y9E, "_ZN3ccc7CC4x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y9C1Ev();
extern void _ZN3ccc7CC4x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y9E[] = {
  NSPAIR(_ZN3ccc7CC4x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y9E[];
extern void _ZN3ccc7CC4x3y93efgEv();
extern void _ZN3ccc7CC4x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x3y93pqrEv,_ZTv0_n12_N3ccc7CC4x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y93pqrEv,_ZThn4_N3ccc7CC4x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x3y93efgEv,_ZTv0_n20_N3ccc7CC4x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y93efgEv,_ZThn4_N3ccc7CC4x3y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x3y93pqrEv,_ZTv0_n12_N3ccc7CC4x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x3y93efgEv,_ZTv0_n20_N3ccc7CC4x3y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x3y9E[] = {
  {&(_ZTVN3ccc7CC4x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x3y9E[];
static VTBL_ENTRY alt_thunk_names1837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x3y93efgEv,_ZTv0_n20_N3ccc7CC4x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y93efgEv,_ZThn4_N3ccc7CC4x3y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x3y93pqrEv,_ZTv0_n12_N3ccc7CC4x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x3y93pqrEv,_ZThn4_N3ccc7CC4x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x3y9E = {  "_ZN3ccc7CC4x3y9E", // class name
  bases__ZN3ccc7CC4x3y9E, 2,
  &(vtc__ZN3ccc7CC4x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x3y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1837,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y9  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD4x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x3y93pqrEv
  ~DD4x3y9(); // tgen
  DD4x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x3y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x3y93efgEv");}
void  ccc::DD4x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x3y93pqrEv");}
ccc::DD4x3y9 ::~DD4x3y9(){ note_dtor("_ZN3ccc7DD4x3y9E", this);} // tgen
ccc::DD4x3y9 ::DD4x3y9(){ note_ctor("_ZN3ccc7DD4x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x3y9E, buf);
    ::ccc::DD4x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x3y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD4x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x3y9E);
    dp->::ccc::DD4x3y9::~DD4x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x3y9E(Test__ZN3ccc7DD4x3y9E, "_ZN3ccc7DD4x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x3y9C1Ev();
extern void _ZN3ccc7DD4x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x3y9E[] = {
  NSPAIR(_ZN3ccc7DD4x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD4x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y9E[];
extern void _ZN3ccc7DD4x3y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x3y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x3y93efgEv,_ZTv0_n12_N3ccc7DD4x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y93efgEv,_ZThn4_N3ccc7DD4x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x3y93pqrEv,_ZTv0_n16_N3ccc7DD4x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x3y93pqrEv,_ZThn4_N3ccc7DD4x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x3y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x3y93efgEv,_ZTv0_n12_N3ccc7DD4x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x3y93pqrEv,_ZTv0_n16_N3ccc7DD4x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x3y9E[] = {
  {&(_ZTVN3ccc7DD4x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x3y9E[];
static VTBL_ENTRY alt_thunk_names1838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x3y93pqrEv,_ZTv0_n16_N3ccc7DD4x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y93pqrEv,_ZThn4_N3ccc7DD4x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x3y93efgEv,_ZTv0_n12_N3ccc7DD4x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x3y93efgEv,_ZThn4_N3ccc7DD4x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x3y9E = {  "_ZN3ccc7DD4x3y9E", // class name
  bases__ZN3ccc7DD4x3y9E, 2,
  &(vtc__ZN3ccc7DD4x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x3y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1838,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y10  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x3y103abcEv
  ~CC4x3y10(); // tgen
  CC4x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y10E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y103pqrEv");}
void  ccc::CC4x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x3y103abcEv");}
ccc::CC4x3y10 ::~CC4x3y10(){ note_dtor("_ZN3ccc8CC4x3y10E", this);} // tgen
ccc::CC4x3y10 ::CC4x3y10(){ note_ctor("_ZN3ccc8CC4x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y10E, buf);
    ::ccc::CC4x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y10E);
    dp->::ccc::CC4x3y10::~CC4x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y10E(Test__ZN3ccc8CC4x3y10E, "_ZN3ccc8CC4x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y10C1Ev();
extern void _ZN3ccc8CC4x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y10E[] = {
  NSPAIR(_ZN3ccc8CC4x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC4x3y103pqrEv();
extern void _ZN3ccc8CC4x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x3y103pqrEv,_ZTv0_n12_N3ccc8CC4x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y103pqrEv,_ZThn4_N3ccc8CC4x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x3y103abcEv,_ZTv0_n16_N3ccc8CC4x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y103abcEv,_ZThn4_N3ccc8CC4x3y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x3y103pqrEv,_ZTv0_n12_N3ccc8CC4x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x3y103abcEv,_ZTv0_n16_N3ccc8CC4x3y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y10E[] = {
  {&(_ZTVN3ccc8CC4x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y10E[];
static VTBL_ENTRY alt_thunk_names1839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x3y103abcEv,_ZTv0_n16_N3ccc8CC4x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y103abcEv,_ZThn4_N3ccc8CC4x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x3y103pqrEv,_ZTv0_n12_N3ccc8CC4x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y103pqrEv,_ZThn4_N3ccc8CC4x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x3y10E = {  "_ZN3ccc8CC4x3y10E", // class name
  bases__ZN3ccc8CC4x3y10E, 2,
  &(vtc__ZN3ccc8CC4x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1839,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y10  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD4x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x3y103abcEv
  ~DD4x3y10(); // tgen
  DD4x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x3y103pqrEv");}
void  ccc::DD4x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x3y103abcEv");}
ccc::DD4x3y10 ::~DD4x3y10(){ note_dtor("_ZN3ccc8DD4x3y10E", this);} // tgen
ccc::DD4x3y10 ::DD4x3y10(){ note_ctor("_ZN3ccc8DD4x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y10E, buf);
    ::ccc::DD4x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y10E);
    dp->::ccc::DD4x3y10::~DD4x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y10E(Test__ZN3ccc8DD4x3y10E, "_ZN3ccc8DD4x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y10C1Ev();
extern void _ZN3ccc8DD4x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y10E[] = {
  NSPAIR(_ZN3ccc8DD4x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y10E[];
extern void _ZN3ccc8DD4x3y103pqrEv();
extern void _ZN3ccc8DD4x3y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x3y103pqrEv,_ZTv0_n16_N3ccc8DD4x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y103pqrEv,_ZThn4_N3ccc8DD4x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x3y103abcEv,_ZTv0_n20_N3ccc8DD4x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y103abcEv,_ZThn4_N3ccc8DD4x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x3y103pqrEv,_ZTv0_n16_N3ccc8DD4x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x3y103abcEv,_ZTv0_n20_N3ccc8DD4x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y10E[] = {
  {&(_ZTVN3ccc8DD4x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y10E[];
static VTBL_ENTRY alt_thunk_names1840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x3y103abcEv,_ZTv0_n20_N3ccc8DD4x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y103abcEv,_ZThn4_N3ccc8DD4x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x3y103pqrEv,_ZTv0_n16_N3ccc8DD4x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y103pqrEv,_ZThn4_N3ccc8DD4x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x3y10E = {  "_ZN3ccc8DD4x3y10E", // class name
  bases__ZN3ccc8DD4x3y10E, 2,
  &(vtc__ZN3ccc8DD4x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1840,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y11  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x3y113efgEv
  ~CC4x3y11(); // tgen
  CC4x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y11E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y113pqrEv");}
void  ccc::CC4x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x3y113efgEv");}
ccc::CC4x3y11 ::~CC4x3y11(){ note_dtor("_ZN3ccc8CC4x3y11E", this);} // tgen
ccc::CC4x3y11 ::CC4x3y11(){ note_ctor("_ZN3ccc8CC4x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y11E, buf);
    ::ccc::CC4x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y11E);
    dp->::ccc::CC4x3y11::~CC4x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y11E(Test__ZN3ccc8CC4x3y11E, "_ZN3ccc8CC4x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y11C1Ev();
extern void _ZN3ccc8CC4x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y11E[] = {
  NSPAIR(_ZN3ccc8CC4x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y11E[];
extern void _ZN3ccc8CC4x3y113efgEv();
extern void _ZN3ccc8CC4x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x3y113pqrEv,_ZTv0_n12_N3ccc8CC4x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y113pqrEv,_ZThn4_N3ccc8CC4x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x3y113efgEv,_ZTv0_n20_N3ccc8CC4x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y113efgEv,_ZThn4_N3ccc8CC4x3y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x3y113pqrEv,_ZTv0_n12_N3ccc8CC4x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x3y113efgEv,_ZTv0_n20_N3ccc8CC4x3y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y11E[] = {
  {&(_ZTVN3ccc8CC4x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y11E[];
static VTBL_ENTRY alt_thunk_names1841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x3y113efgEv,_ZTv0_n20_N3ccc8CC4x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y113efgEv,_ZThn4_N3ccc8CC4x3y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x3y113pqrEv,_ZTv0_n12_N3ccc8CC4x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y113pqrEv,_ZThn4_N3ccc8CC4x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x3y11E = {  "_ZN3ccc8CC4x3y11E", // class name
  bases__ZN3ccc8CC4x3y11E, 2,
  &(vtc__ZN3ccc8CC4x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1841,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y11  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD4x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x3y113efgEv
  ~DD4x3y11(); // tgen
  DD4x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x3y113pqrEv");}
void  ccc::DD4x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x3y113efgEv");}
ccc::DD4x3y11 ::~DD4x3y11(){ note_dtor("_ZN3ccc8DD4x3y11E", this);} // tgen
ccc::DD4x3y11 ::DD4x3y11(){ note_ctor("_ZN3ccc8DD4x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y11E, buf);
    ::ccc::DD4x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y11E);
    dp->::ccc::DD4x3y11::~DD4x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y11E(Test__ZN3ccc8DD4x3y11E, "_ZN3ccc8DD4x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y11C1Ev();
extern void _ZN3ccc8DD4x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y11E[] = {
  NSPAIR(_ZN3ccc8DD4x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y11E[];
extern void _ZN3ccc8DD4x3y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x3y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x3y113efgEv,_ZTv0_n12_N3ccc8DD4x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y113efgEv,_ZThn4_N3ccc8DD4x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x3y113pqrEv,_ZTv0_n16_N3ccc8DD4x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y113pqrEv,_ZThn4_N3ccc8DD4x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x3y113efgEv,_ZTv0_n12_N3ccc8DD4x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x3y113pqrEv,_ZTv0_n16_N3ccc8DD4x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y11E[] = {
  {&(_ZTVN3ccc8DD4x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y11E[];
static VTBL_ENTRY alt_thunk_names1842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x3y113pqrEv,_ZTv0_n16_N3ccc8DD4x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y113pqrEv,_ZThn4_N3ccc8DD4x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x3y113efgEv,_ZTv0_n12_N3ccc8DD4x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y113efgEv,_ZThn4_N3ccc8DD4x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x3y11E = {  "_ZN3ccc8DD4x3y11E", // class name
  bases__ZN3ccc8DD4x3y11E, 2,
  &(vtc__ZN3ccc8DD4x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1842,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y12  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC4x3y123abcEv
  ~CC4x3y12(); // tgen
  CC4x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x3y123abcEv");}
ccc::CC4x3y12 ::~CC4x3y12(){ note_dtor("_ZN3ccc8CC4x3y12E", this);} // tgen
ccc::CC4x3y12 ::CC4x3y12(){ note_ctor("_ZN3ccc8CC4x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y12E, buf);
    ::ccc::CC4x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y12E);
    dp->::ccc::CC4x3y12::~CC4x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y12E(Test__ZN3ccc8CC4x3y12E, "_ZN3ccc8CC4x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y12C1Ev();
extern void _ZN3ccc8CC4x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y12E[] = {
  NSPAIR(_ZN3ccc8CC4x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC4x3y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x3y123abcEv,_ZTv0_n16_N3ccc8CC4x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y123abcEv,_ZThn4_N3ccc8CC4x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x3y123abcEv,_ZTv0_n16_N3ccc8CC4x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y12E[] = {
  {&(_ZTVN3ccc8CC4x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y12E[];
static VTBL_ENTRY alt_thunk_names1843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x3y123abcEv,_ZTv0_n16_N3ccc8CC4x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y123abcEv,_ZThn4_N3ccc8CC4x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x3y12E = {  "_ZN3ccc8CC4x3y12E", // class name
  bases__ZN3ccc8CC4x3y12E, 2,
  &(vtc__ZN3ccc8CC4x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1843,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y12  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD4x3y123abcEv
  ~DD4x3y12(); // tgen
  DD4x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x3y123abcEv");}
ccc::DD4x3y12 ::~DD4x3y12(){ note_dtor("_ZN3ccc8DD4x3y12E", this);} // tgen
ccc::DD4x3y12 ::DD4x3y12(){ note_ctor("_ZN3ccc8DD4x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y12E, buf);
    ::ccc::DD4x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y12E);
    dp->::ccc::DD4x3y12::~DD4x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y12E(Test__ZN3ccc8DD4x3y12E, "_ZN3ccc8DD4x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y12C1Ev();
extern void _ZN3ccc8DD4x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y12E[] = {
  NSPAIR(_ZN3ccc8DD4x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x3y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x3y123abcEv,_ZTv0_n20_N3ccc8DD4x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y123abcEv,_ZThn4_N3ccc8DD4x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x3y123abcEv,_ZTv0_n20_N3ccc8DD4x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y12E[] = {
  {&(_ZTVN3ccc8DD4x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y12E[];
static VTBL_ENTRY alt_thunk_names1844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x3y123abcEv,_ZTv0_n20_N3ccc8DD4x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y123abcEv,_ZThn4_N3ccc8DD4x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x3y12E = {  "_ZN3ccc8DD4x3y12E", // class name
  bases__ZN3ccc8DD4x3y12E, 2,
  &(vtc__ZN3ccc8DD4x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1844,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y13  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC4x3y133efgEv
  ~CC4x3y13(); // tgen
  CC4x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x3y133efgEv");}
ccc::CC4x3y13 ::~CC4x3y13(){ note_dtor("_ZN3ccc8CC4x3y13E", this);} // tgen
ccc::CC4x3y13 ::CC4x3y13(){ note_ctor("_ZN3ccc8CC4x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y13E, buf);
    ::ccc::CC4x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y13E);
    dp->::ccc::CC4x3y13::~CC4x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y13E(Test__ZN3ccc8CC4x3y13E, "_ZN3ccc8CC4x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y13C1Ev();
extern void _ZN3ccc8CC4x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y13E[] = {
  NSPAIR(_ZN3ccc8CC4x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y13E[];
extern void _ZN3ccc8CC4x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x3y133efgEv,_ZTv0_n20_N3ccc8CC4x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y133efgEv,_ZThn4_N3ccc8CC4x3y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x3y133efgEv,_ZTv0_n20_N3ccc8CC4x3y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y13E[] = {
  {&(_ZTVN3ccc8CC4x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y13E[];
static VTBL_ENTRY alt_thunk_names1845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x3y133efgEv,_ZTv0_n20_N3ccc8CC4x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y133efgEv,_ZThn4_N3ccc8CC4x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x3y13E = {  "_ZN3ccc8CC4x3y13E", // class name
  bases__ZN3ccc8CC4x3y13E, 2,
  &(vtc__ZN3ccc8CC4x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1845,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y13  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD4x3y133efgEv
  ~DD4x3y13(); // tgen
  DD4x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x3y133efgEv");}
ccc::DD4x3y13 ::~DD4x3y13(){ note_dtor("_ZN3ccc8DD4x3y13E", this);} // tgen
ccc::DD4x3y13 ::DD4x3y13(){ note_ctor("_ZN3ccc8DD4x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y13E, buf);
    ::ccc::DD4x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y13E);
    dp->::ccc::DD4x3y13::~DD4x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y13E(Test__ZN3ccc8DD4x3y13E, "_ZN3ccc8DD4x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y13C1Ev();
extern void _ZN3ccc8DD4x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y13E[] = {
  NSPAIR(_ZN3ccc8DD4x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x3y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x3y133efgEv,_ZTv0_n12_N3ccc8DD4x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y133efgEv,_ZThn4_N3ccc8DD4x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x3y133efgEv,_ZTv0_n12_N3ccc8DD4x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y13E[] = {
  {&(_ZTVN3ccc8DD4x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y13E[];
static VTBL_ENTRY alt_thunk_names1846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x3y133efgEv,_ZTv0_n12_N3ccc8DD4x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y133efgEv,_ZThn4_N3ccc8DD4x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x3y13E = {  "_ZN3ccc8DD4x3y13E", // class name
  bases__ZN3ccc8DD4x3y13E, 2,
  &(vtc__ZN3ccc8DD4x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1846,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y14  : virtual ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y143pqrEv
  ~CC4x3y14(); // tgen
  CC4x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y143pqrEv");}
ccc::CC4x3y14 ::~CC4x3y14(){ note_dtor("_ZN3ccc8CC4x3y14E", this);} // tgen
ccc::CC4x3y14 ::CC4x3y14(){ note_ctor("_ZN3ccc8CC4x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y14E, buf);
    ::ccc::CC4x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y14E);
    dp->::ccc::CC4x3y14::~CC4x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y14E(Test__ZN3ccc8CC4x3y14E, "_ZN3ccc8CC4x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y14C1Ev();
extern void _ZN3ccc8CC4x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y14E[] = {
  NSPAIR(_ZN3ccc8CC4x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC4x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x3y143pqrEv,_ZTv0_n12_N3ccc8CC4x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y143pqrEv,_ZThn4_N3ccc8CC4x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x3y143pqrEv,_ZTv0_n12_N3ccc8CC4x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y14E[] = {
  {&(_ZTVN3ccc8CC4x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y14E[];
static VTBL_ENTRY alt_thunk_names1847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x3y143pqrEv,_ZTv0_n12_N3ccc8CC4x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x3y143pqrEv,_ZThn4_N3ccc8CC4x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x3y14E = {  "_ZN3ccc8CC4x3y14E", // class name
  bases__ZN3ccc8CC4x3y14E, 2,
  &(vtc__ZN3ccc8CC4x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1847,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y14  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD4x3y143pqrEv
  ~DD4x3y14(); // tgen
  DD4x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x3y143pqrEv");}
ccc::DD4x3y14 ::~DD4x3y14(){ note_dtor("_ZN3ccc8DD4x3y14E", this);} // tgen
ccc::DD4x3y14 ::DD4x3y14(){ note_ctor("_ZN3ccc8DD4x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y14E, buf);
    ::ccc::DD4x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y14E);
    dp->::ccc::DD4x3y14::~DD4x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y14E(Test__ZN3ccc8DD4x3y14E, "_ZN3ccc8DD4x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y14C1Ev();
extern void _ZN3ccc8DD4x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y14E[] = {
  NSPAIR(_ZN3ccc8DD4x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y14E[];
extern void _ZN3ccc8DD4x3y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x3y143pqrEv,_ZTv0_n16_N3ccc8DD4x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x3y143pqrEv,_ZThn4_N3ccc8DD4x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x3y143pqrEv,_ZTv0_n16_N3ccc8DD4x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y14E[] = {
  {&(_ZTVN3ccc8DD4x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y14E[];
static VTBL_ENTRY alt_thunk_names1848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x3y143pqrEv,_ZTv0_n16_N3ccc8DD4x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x3y143pqrEv,_ZThn4_N3ccc8DD4x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x3y14E = {  "_ZN3ccc8DD4x3y14E", // class name
  bases__ZN3ccc8DD4x3y14E, 2,
  &(vtc__ZN3ccc8DD4x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1848,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y15  : virtual ::ccc::AA4 , ::ccc::BB3 {
  ~CC4x3y15(); // tgen
  CC4x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x3y15 ::~CC4x3y15(){ note_dtor("_ZN3ccc8CC4x3y15E", this);} // tgen
ccc::CC4x3y15 ::CC4x3y15(){ note_ctor("_ZN3ccc8CC4x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y15E, buf);
    ::ccc::CC4x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC4x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y15E);
    dp->::ccc::CC4x3y15::~CC4x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y15E(Test__ZN3ccc8CC4x3y15E, "_ZN3ccc8CC4x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y15C1Ev();
extern void _ZN3ccc8CC4x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y15E[] = {
  NSPAIR(_ZN3ccc8CC4x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x3y15E[] = {
  {&(_ZTVN3ccc8CC4x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x3y15E[];
Class_Descriptor cd__ZN3ccc8CC4x3y15E = {  "_ZN3ccc8CC4x3y15E", // class name
  bases__ZN3ccc8CC4x3y15E, 2,
  &(vtc__ZN3ccc8CC4x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x3y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x3y15  : virtual ::ccc::AA4 , virtual ::ccc::BB3 {
  ~DD4x3y15(); // tgen
  DD4x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x3y15 ::~DD4x3y15(){ note_dtor("_ZN3ccc8DD4x3y15E", this);} // tgen
ccc::DD4x3y15 ::DD4x3y15(){ note_ctor("_ZN3ccc8DD4x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x3y15E, buf);
    ::ccc::DD4x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x3y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD4x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x3y15E);
    dp->::ccc::DD4x3y15::~DD4x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x3y15E(Test__ZN3ccc8DD4x3y15E, "_ZN3ccc8DD4x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x3y15C1Ev();
extern void _ZN3ccc8DD4x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x3y15E[] = {
  NSPAIR(_ZN3ccc8DD4x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD4x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x3y15E[] = {
  {&(_ZTVN3ccc8DD4x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x3y15E[];
Class_Descriptor cd__ZN3ccc8DD4x3y15E = {  "_ZN3ccc8DD4x3y15E", // class name
  bases__ZN3ccc8DD4x3y15E, 2,
  &(vtc__ZN3ccc8DD4x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x3y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y0  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y03pqrEv
  ~CC4x4y0(); // tgen
  CC4x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y0E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y03abcEv");}
void  ccc::CC4x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y03efgEv");}
void  ccc::CC4x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y03pqrEv");}
ccc::CC4x4y0 ::~CC4x4y0(){ note_dtor("_ZN3ccc7CC4x4y0E", this);} // tgen
ccc::CC4x4y0 ::CC4x4y0(){ note_ctor("_ZN3ccc7CC4x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y0E, buf);
    ::ccc::CC4x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y0E);
    dp->::ccc::CC4x4y0::~CC4x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y0E(Test__ZN3ccc7CC4x4y0E, "_ZN3ccc7CC4x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y0C1Ev();
extern void _ZN3ccc7CC4x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y0E[] = {
  NSPAIR(_ZN3ccc7CC4x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y0E[];
extern void _ZN3ccc7CC4x4y03pqrEv();
extern void _ZN3ccc7CC4x4y03abcEv();
extern void _ZN3ccc7CC4x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y03pqrEv,_ZTv0_n12_N3ccc7CC4x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03pqrEv,_ZThn4_N3ccc7CC4x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y03abcEv,_ZTv0_n16_N3ccc7CC4x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03abcEv,_ZThn4_N3ccc7CC4x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y03efgEv,_ZTv0_n20_N3ccc7CC4x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03efgEv,_ZThn4_N3ccc7CC4x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y03pqrEv,_ZTv0_n12_N3ccc7CC4x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y03abcEv,_ZTv0_n16_N3ccc7CC4x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y03efgEv,_ZTv0_n20_N3ccc7CC4x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y0E[] = {
  {&(_ZTVN3ccc7CC4x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y0E[];
static VTBL_ENTRY alt_thunk_names1849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y03efgEv,_ZTv0_n20_N3ccc7CC4x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y03efgEv,_ZThn4_N3ccc7CC4x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y03abcEv,_ZTv0_n16_N3ccc7CC4x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y03abcEv,_ZThn4_N3ccc7CC4x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y03pqrEv,_ZTv0_n12_N3ccc7CC4x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y03pqrEv,_ZThn4_N3ccc7CC4x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y0E = {  "_ZN3ccc7CC4x4y0E", // class name
  bases__ZN3ccc7CC4x4y0E, 2,
  &(vtc__ZN3ccc7CC4x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1849,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y0  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD4x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y03pqrEv
  ~DD4x4y0(); // tgen
  DD4x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y03abcEv");}
void  ccc::DD4x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y03efgEv");}
void  ccc::DD4x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y03pqrEv");}
ccc::DD4x4y0 ::~DD4x4y0(){ note_dtor("_ZN3ccc7DD4x4y0E", this);} // tgen
ccc::DD4x4y0 ::DD4x4y0(){ note_ctor("_ZN3ccc7DD4x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y0E, buf);
    ::ccc::DD4x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y0E);
    dp->::ccc::DD4x4y0::~DD4x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y0E(Test__ZN3ccc7DD4x4y0E, "_ZN3ccc7DD4x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y0C1Ev();
extern void _ZN3ccc7DD4x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y0E[] = {
  NSPAIR(_ZN3ccc7DD4x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y0E[];
extern void _ZN3ccc7DD4x4y03pqrEv();
extern void _ZN3ccc7DD4x4y03abcEv();
extern void _ZN3ccc7DD4x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y03pqrEv,_ZTv0_n12_N3ccc7DD4x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y03pqrEv,_ZThn4_N3ccc7DD4x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y03abcEv,_ZTv0_n16_N3ccc7DD4x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y03abcEv,_ZThn4_N3ccc7DD4x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y03efgEv,_ZTv0_n20_N3ccc7DD4x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y03efgEv,_ZThn4_N3ccc7DD4x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y03pqrEv,_ZTv0_n12_N3ccc7DD4x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y03abcEv,_ZTv0_n16_N3ccc7DD4x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y03efgEv,_ZTv0_n20_N3ccc7DD4x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y0E[] = {
  {&(_ZTVN3ccc7DD4x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y0E[];
static VTBL_ENTRY alt_thunk_names1850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y03efgEv,_ZTv0_n20_N3ccc7DD4x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y03efgEv,_ZThn4_N3ccc7DD4x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y03abcEv,_ZTv0_n16_N3ccc7DD4x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y03abcEv,_ZThn4_N3ccc7DD4x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y03pqrEv,_ZTv0_n12_N3ccc7DD4x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y03pqrEv,_ZThn4_N3ccc7DD4x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y0E = {  "_ZN3ccc7DD4x4y0E", // class name
  bases__ZN3ccc7DD4x4y0E, 2,
  &(vtc__ZN3ccc7DD4x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1850,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y1  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x4y13efgEv
  ~CC4x4y1(); // tgen
  CC4x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y1E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y13abcEv");}
void  ccc::CC4x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y13pqrEv");}
void  ccc::CC4x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y13efgEv");}
ccc::CC4x4y1 ::~CC4x4y1(){ note_dtor("_ZN3ccc7CC4x4y1E", this);} // tgen
ccc::CC4x4y1 ::CC4x4y1(){ note_ctor("_ZN3ccc7CC4x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y1E, buf);
    ::ccc::CC4x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y1E);
    dp->::ccc::CC4x4y1::~CC4x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y1E(Test__ZN3ccc7CC4x4y1E, "_ZN3ccc7CC4x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y1C1Ev();
extern void _ZN3ccc7CC4x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y1E[] = {
  NSPAIR(_ZN3ccc7CC4x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y1E[];
extern void _ZN3ccc7CC4x4y13pqrEv();
extern void _ZN3ccc7CC4x4y13abcEv();
extern void _ZN3ccc7CC4x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y13pqrEv,_ZTv0_n12_N3ccc7CC4x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13pqrEv,_ZThn4_N3ccc7CC4x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y13abcEv,_ZTv0_n16_N3ccc7CC4x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13abcEv,_ZThn4_N3ccc7CC4x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y13efgEv,_ZTv0_n20_N3ccc7CC4x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13efgEv,_ZThn4_N3ccc7CC4x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y13pqrEv,_ZTv0_n12_N3ccc7CC4x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y13abcEv,_ZTv0_n16_N3ccc7CC4x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y13efgEv,_ZTv0_n20_N3ccc7CC4x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y1E[] = {
  {&(_ZTVN3ccc7CC4x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y1E[];
static VTBL_ENTRY alt_thunk_names1851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y13efgEv,_ZTv0_n20_N3ccc7CC4x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y13efgEv,_ZThn4_N3ccc7CC4x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y13abcEv,_ZTv0_n16_N3ccc7CC4x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y13abcEv,_ZThn4_N3ccc7CC4x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y13pqrEv,_ZTv0_n12_N3ccc7CC4x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y13pqrEv,_ZThn4_N3ccc7CC4x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y1E = {  "_ZN3ccc7CC4x4y1E", // class name
  bases__ZN3ccc7CC4x4y1E, 2,
  &(vtc__ZN3ccc7CC4x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1851,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y1  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD4x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x4y13efgEv
  ~DD4x4y1(); // tgen
  DD4x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y13abcEv");}
void  ccc::DD4x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y13pqrEv");}
void  ccc::DD4x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y13efgEv");}
ccc::DD4x4y1 ::~DD4x4y1(){ note_dtor("_ZN3ccc7DD4x4y1E", this);} // tgen
ccc::DD4x4y1 ::DD4x4y1(){ note_ctor("_ZN3ccc7DD4x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y1E, buf);
    ::ccc::DD4x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y1E);
    dp->::ccc::DD4x4y1::~DD4x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y1E(Test__ZN3ccc7DD4x4y1E, "_ZN3ccc7DD4x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y1C1Ev();
extern void _ZN3ccc7DD4x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y1E[] = {
  NSPAIR(_ZN3ccc7DD4x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y1E[];
extern void _ZN3ccc7DD4x4y13pqrEv();
extern void _ZN3ccc7DD4x4y13abcEv();
extern void _ZN3ccc7DD4x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y13pqrEv,_ZTv0_n12_N3ccc7DD4x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y13pqrEv,_ZThn4_N3ccc7DD4x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y13abcEv,_ZTv0_n16_N3ccc7DD4x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y13abcEv,_ZThn4_N3ccc7DD4x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y13efgEv,_ZTv0_n20_N3ccc7DD4x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y13efgEv,_ZThn4_N3ccc7DD4x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y13pqrEv,_ZTv0_n12_N3ccc7DD4x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y13abcEv,_ZTv0_n16_N3ccc7DD4x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y13efgEv,_ZTv0_n20_N3ccc7DD4x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y1E[] = {
  {&(_ZTVN3ccc7DD4x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y1E[];
static VTBL_ENTRY alt_thunk_names1852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y13efgEv,_ZTv0_n20_N3ccc7DD4x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y13efgEv,_ZThn4_N3ccc7DD4x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y13abcEv,_ZTv0_n16_N3ccc7DD4x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y13abcEv,_ZThn4_N3ccc7DD4x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y13pqrEv,_ZTv0_n12_N3ccc7DD4x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y13pqrEv,_ZThn4_N3ccc7DD4x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y1E = {  "_ZN3ccc7DD4x4y1E", // class name
  bases__ZN3ccc7DD4x4y1E, 2,
  &(vtc__ZN3ccc7DD4x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1852,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y2  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y23pqrEv
  ~CC4x4y2(); // tgen
  CC4x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y2E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y23efgEv");}
void  ccc::CC4x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y23abcEv");}
void  ccc::CC4x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y23pqrEv");}
ccc::CC4x4y2 ::~CC4x4y2(){ note_dtor("_ZN3ccc7CC4x4y2E", this);} // tgen
ccc::CC4x4y2 ::CC4x4y2(){ note_ctor("_ZN3ccc7CC4x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y2E, buf);
    ::ccc::CC4x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y2E);
    dp->::ccc::CC4x4y2::~CC4x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y2E(Test__ZN3ccc7CC4x4y2E, "_ZN3ccc7CC4x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y2C1Ev();
extern void _ZN3ccc7CC4x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y2E[] = {
  NSPAIR(_ZN3ccc7CC4x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y2E[];
extern void _ZN3ccc7CC4x4y23pqrEv();
extern void _ZN3ccc7CC4x4y23abcEv();
extern void _ZN3ccc7CC4x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y23pqrEv,_ZTv0_n12_N3ccc7CC4x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23pqrEv,_ZThn4_N3ccc7CC4x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y23abcEv,_ZTv0_n16_N3ccc7CC4x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23abcEv,_ZThn4_N3ccc7CC4x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y23efgEv,_ZTv0_n20_N3ccc7CC4x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23efgEv,_ZThn4_N3ccc7CC4x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y23pqrEv,_ZTv0_n12_N3ccc7CC4x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y23abcEv,_ZTv0_n16_N3ccc7CC4x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y23efgEv,_ZTv0_n20_N3ccc7CC4x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y2E[] = {
  {&(_ZTVN3ccc7CC4x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y2E[];
static VTBL_ENTRY alt_thunk_names1853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y23efgEv,_ZTv0_n20_N3ccc7CC4x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y23efgEv,_ZThn4_N3ccc7CC4x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y23abcEv,_ZTv0_n16_N3ccc7CC4x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y23abcEv,_ZThn4_N3ccc7CC4x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y23pqrEv,_ZTv0_n12_N3ccc7CC4x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y23pqrEv,_ZThn4_N3ccc7CC4x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y2E = {  "_ZN3ccc7CC4x4y2E", // class name
  bases__ZN3ccc7CC4x4y2E, 2,
  &(vtc__ZN3ccc7CC4x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1853,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y2  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD4x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y23pqrEv
  ~DD4x4y2(); // tgen
  DD4x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y23efgEv");}
void  ccc::DD4x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y23abcEv");}
void  ccc::DD4x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y23pqrEv");}
ccc::DD4x4y2 ::~DD4x4y2(){ note_dtor("_ZN3ccc7DD4x4y2E", this);} // tgen
ccc::DD4x4y2 ::DD4x4y2(){ note_ctor("_ZN3ccc7DD4x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y2E, buf);
    ::ccc::DD4x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y2E);
    dp->::ccc::DD4x4y2::~DD4x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y2E(Test__ZN3ccc7DD4x4y2E, "_ZN3ccc7DD4x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y2C1Ev();
extern void _ZN3ccc7DD4x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y2E[] = {
  NSPAIR(_ZN3ccc7DD4x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y2E[];
extern void _ZN3ccc7DD4x4y23pqrEv();
extern void _ZN3ccc7DD4x4y23abcEv();
extern void _ZN3ccc7DD4x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y23pqrEv,_ZTv0_n12_N3ccc7DD4x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y23pqrEv,_ZThn4_N3ccc7DD4x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y23abcEv,_ZTv0_n16_N3ccc7DD4x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y23abcEv,_ZThn4_N3ccc7DD4x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y23efgEv,_ZTv0_n20_N3ccc7DD4x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y23efgEv,_ZThn4_N3ccc7DD4x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y23pqrEv,_ZTv0_n12_N3ccc7DD4x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y23abcEv,_ZTv0_n16_N3ccc7DD4x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y23efgEv,_ZTv0_n20_N3ccc7DD4x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y2E[] = {
  {&(_ZTVN3ccc7DD4x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y2E[];
static VTBL_ENTRY alt_thunk_names1854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y23efgEv,_ZTv0_n20_N3ccc7DD4x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y23efgEv,_ZThn4_N3ccc7DD4x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y23abcEv,_ZTv0_n16_N3ccc7DD4x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y23abcEv,_ZThn4_N3ccc7DD4x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y23pqrEv,_ZTv0_n12_N3ccc7DD4x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y23pqrEv,_ZThn4_N3ccc7DD4x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y2E = {  "_ZN3ccc7DD4x4y2E", // class name
  bases__ZN3ccc7DD4x4y2E, 2,
  &(vtc__ZN3ccc7DD4x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1854,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y3  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x4y33abcEv
  ~CC4x4y3(); // tgen
  CC4x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y3E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y33efgEv");}
void  ccc::CC4x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y33pqrEv");}
void  ccc::CC4x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y33abcEv");}
ccc::CC4x4y3 ::~CC4x4y3(){ note_dtor("_ZN3ccc7CC4x4y3E", this);} // tgen
ccc::CC4x4y3 ::CC4x4y3(){ note_ctor("_ZN3ccc7CC4x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y3E, buf);
    ::ccc::CC4x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y3E);
    dp->::ccc::CC4x4y3::~CC4x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y3E(Test__ZN3ccc7CC4x4y3E, "_ZN3ccc7CC4x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y3C1Ev();
extern void _ZN3ccc7CC4x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y3E[] = {
  NSPAIR(_ZN3ccc7CC4x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y3E[];
extern void _ZN3ccc7CC4x4y33pqrEv();
extern void _ZN3ccc7CC4x4y33abcEv();
extern void _ZN3ccc7CC4x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y33pqrEv,_ZTv0_n12_N3ccc7CC4x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33pqrEv,_ZThn4_N3ccc7CC4x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y33abcEv,_ZTv0_n16_N3ccc7CC4x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33abcEv,_ZThn4_N3ccc7CC4x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y33efgEv,_ZTv0_n20_N3ccc7CC4x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33efgEv,_ZThn4_N3ccc7CC4x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y33pqrEv,_ZTv0_n12_N3ccc7CC4x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y33abcEv,_ZTv0_n16_N3ccc7CC4x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y33efgEv,_ZTv0_n20_N3ccc7CC4x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y3E[] = {
  {&(_ZTVN3ccc7CC4x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y3E[];
static VTBL_ENTRY alt_thunk_names1855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y33efgEv,_ZTv0_n20_N3ccc7CC4x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y33efgEv,_ZThn4_N3ccc7CC4x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y33abcEv,_ZTv0_n16_N3ccc7CC4x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y33abcEv,_ZThn4_N3ccc7CC4x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y33pqrEv,_ZTv0_n12_N3ccc7CC4x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y33pqrEv,_ZThn4_N3ccc7CC4x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y3E = {  "_ZN3ccc7CC4x4y3E", // class name
  bases__ZN3ccc7CC4x4y3E, 2,
  &(vtc__ZN3ccc7CC4x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1855,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y3  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD4x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x4y33abcEv
  ~DD4x4y3(); // tgen
  DD4x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y33efgEv");}
void  ccc::DD4x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y33pqrEv");}
void  ccc::DD4x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y33abcEv");}
ccc::DD4x4y3 ::~DD4x4y3(){ note_dtor("_ZN3ccc7DD4x4y3E", this);} // tgen
ccc::DD4x4y3 ::DD4x4y3(){ note_ctor("_ZN3ccc7DD4x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y3E, buf);
    ::ccc::DD4x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y3E);
    dp->::ccc::DD4x4y3::~DD4x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y3E(Test__ZN3ccc7DD4x4y3E, "_ZN3ccc7DD4x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y3C1Ev();
extern void _ZN3ccc7DD4x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y3E[] = {
  NSPAIR(_ZN3ccc7DD4x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y3E[];
extern void _ZN3ccc7DD4x4y33pqrEv();
extern void _ZN3ccc7DD4x4y33abcEv();
extern void _ZN3ccc7DD4x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y33pqrEv,_ZTv0_n12_N3ccc7DD4x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y33pqrEv,_ZThn4_N3ccc7DD4x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y33abcEv,_ZTv0_n16_N3ccc7DD4x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y33abcEv,_ZThn4_N3ccc7DD4x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y33efgEv,_ZTv0_n20_N3ccc7DD4x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y33efgEv,_ZThn4_N3ccc7DD4x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y33pqrEv,_ZTv0_n12_N3ccc7DD4x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y33abcEv,_ZTv0_n16_N3ccc7DD4x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y33efgEv,_ZTv0_n20_N3ccc7DD4x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y3E[] = {
  {&(_ZTVN3ccc7DD4x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y3E[];
static VTBL_ENTRY alt_thunk_names1856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y33efgEv,_ZTv0_n20_N3ccc7DD4x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y33efgEv,_ZThn4_N3ccc7DD4x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y33abcEv,_ZTv0_n16_N3ccc7DD4x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y33abcEv,_ZThn4_N3ccc7DD4x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y33pqrEv,_ZTv0_n12_N3ccc7DD4x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y33pqrEv,_ZThn4_N3ccc7DD4x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y3E = {  "_ZN3ccc7DD4x4y3E", // class name
  bases__ZN3ccc7DD4x4y3E, 2,
  &(vtc__ZN3ccc7DD4x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1856,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y4  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC4x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y43efgEv
  ~CC4x4y4(); // tgen
  CC4x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y4E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y43pqrEv");}
void  ccc::CC4x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y43abcEv");}
void  ccc::CC4x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y43efgEv");}
ccc::CC4x4y4 ::~CC4x4y4(){ note_dtor("_ZN3ccc7CC4x4y4E", this);} // tgen
ccc::CC4x4y4 ::CC4x4y4(){ note_ctor("_ZN3ccc7CC4x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y4E, buf);
    ::ccc::CC4x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y4E);
    dp->::ccc::CC4x4y4::~CC4x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y4E(Test__ZN3ccc7CC4x4y4E, "_ZN3ccc7CC4x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y4C1Ev();
extern void _ZN3ccc7CC4x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y4E[] = {
  NSPAIR(_ZN3ccc7CC4x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y4E[];
extern void _ZN3ccc7CC4x4y43pqrEv();
extern void _ZN3ccc7CC4x4y43abcEv();
extern void _ZN3ccc7CC4x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y43pqrEv,_ZTv0_n12_N3ccc7CC4x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43pqrEv,_ZThn4_N3ccc7CC4x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y43abcEv,_ZTv0_n16_N3ccc7CC4x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43abcEv,_ZThn4_N3ccc7CC4x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y43efgEv,_ZTv0_n20_N3ccc7CC4x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43efgEv,_ZThn4_N3ccc7CC4x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y43pqrEv,_ZTv0_n12_N3ccc7CC4x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y43abcEv,_ZTv0_n16_N3ccc7CC4x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y43efgEv,_ZTv0_n20_N3ccc7CC4x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y4E[] = {
  {&(_ZTVN3ccc7CC4x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y4E[];
static VTBL_ENTRY alt_thunk_names1857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y43efgEv,_ZTv0_n20_N3ccc7CC4x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y43efgEv,_ZThn4_N3ccc7CC4x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y43abcEv,_ZTv0_n16_N3ccc7CC4x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y43abcEv,_ZThn4_N3ccc7CC4x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y43pqrEv,_ZTv0_n12_N3ccc7CC4x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y43pqrEv,_ZThn4_N3ccc7CC4x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y4E = {  "_ZN3ccc7CC4x4y4E", // class name
  bases__ZN3ccc7CC4x4y4E, 2,
  &(vtc__ZN3ccc7CC4x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1857,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y4  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD4x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x4y43efgEv
  ~DD4x4y4(); // tgen
  DD4x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y43pqrEv");}
void  ccc::DD4x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y43abcEv");}
void  ccc::DD4x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y43efgEv");}
ccc::DD4x4y4 ::~DD4x4y4(){ note_dtor("_ZN3ccc7DD4x4y4E", this);} // tgen
ccc::DD4x4y4 ::DD4x4y4(){ note_ctor("_ZN3ccc7DD4x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y4E, buf);
    ::ccc::DD4x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y4E);
    dp->::ccc::DD4x4y4::~DD4x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y4E(Test__ZN3ccc7DD4x4y4E, "_ZN3ccc7DD4x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y4C1Ev();
extern void _ZN3ccc7DD4x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y4E[] = {
  NSPAIR(_ZN3ccc7DD4x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y4E[];
extern void _ZN3ccc7DD4x4y43pqrEv();
extern void _ZN3ccc7DD4x4y43abcEv();
extern void _ZN3ccc7DD4x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y43pqrEv,_ZTv0_n12_N3ccc7DD4x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y43pqrEv,_ZThn4_N3ccc7DD4x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y43abcEv,_ZTv0_n16_N3ccc7DD4x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y43abcEv,_ZThn4_N3ccc7DD4x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y43efgEv,_ZTv0_n20_N3ccc7DD4x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y43efgEv,_ZThn4_N3ccc7DD4x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y43pqrEv,_ZTv0_n12_N3ccc7DD4x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y43abcEv,_ZTv0_n16_N3ccc7DD4x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y43efgEv,_ZTv0_n20_N3ccc7DD4x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y4E[] = {
  {&(_ZTVN3ccc7DD4x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y4E[];
static VTBL_ENTRY alt_thunk_names1858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y43efgEv,_ZTv0_n20_N3ccc7DD4x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y43efgEv,_ZThn4_N3ccc7DD4x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y43abcEv,_ZTv0_n16_N3ccc7DD4x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y43abcEv,_ZThn4_N3ccc7DD4x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y43pqrEv,_ZTv0_n12_N3ccc7DD4x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y43pqrEv,_ZThn4_N3ccc7DD4x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y4E = {  "_ZN3ccc7DD4x4y4E", // class name
  bases__ZN3ccc7DD4x4y4E, 2,
  &(vtc__ZN3ccc7DD4x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1858,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y5  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC4x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y53abcEv
  ~CC4x4y5(); // tgen
  CC4x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y5E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y53pqrEv");}
void  ccc::CC4x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y53efgEv");}
void  ccc::CC4x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y53abcEv");}
ccc::CC4x4y5 ::~CC4x4y5(){ note_dtor("_ZN3ccc7CC4x4y5E", this);} // tgen
ccc::CC4x4y5 ::CC4x4y5(){ note_ctor("_ZN3ccc7CC4x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y5E, buf);
    ::ccc::CC4x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y5E);
    dp->::ccc::CC4x4y5::~CC4x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y5E(Test__ZN3ccc7CC4x4y5E, "_ZN3ccc7CC4x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y5C1Ev();
extern void _ZN3ccc7CC4x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y5E[] = {
  NSPAIR(_ZN3ccc7CC4x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y5E[];
extern void _ZN3ccc7CC4x4y53pqrEv();
extern void _ZN3ccc7CC4x4y53abcEv();
extern void _ZN3ccc7CC4x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y53pqrEv,_ZTv0_n12_N3ccc7CC4x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53pqrEv,_ZThn4_N3ccc7CC4x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y53abcEv,_ZTv0_n16_N3ccc7CC4x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53abcEv,_ZThn4_N3ccc7CC4x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y53efgEv,_ZTv0_n20_N3ccc7CC4x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53efgEv,_ZThn4_N3ccc7CC4x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y53pqrEv,_ZTv0_n12_N3ccc7CC4x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y53abcEv,_ZTv0_n16_N3ccc7CC4x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y53efgEv,_ZTv0_n20_N3ccc7CC4x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y5E[] = {
  {&(_ZTVN3ccc7CC4x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y5E[];
static VTBL_ENTRY alt_thunk_names1859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y53efgEv,_ZTv0_n20_N3ccc7CC4x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y53efgEv,_ZThn4_N3ccc7CC4x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y53abcEv,_ZTv0_n16_N3ccc7CC4x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y53abcEv,_ZThn4_N3ccc7CC4x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y53pqrEv,_ZTv0_n12_N3ccc7CC4x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y53pqrEv,_ZThn4_N3ccc7CC4x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y5E = {  "_ZN3ccc7CC4x4y5E", // class name
  bases__ZN3ccc7CC4x4y5E, 2,
  &(vtc__ZN3ccc7CC4x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1859,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y5  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD4x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x4y53abcEv
  ~DD4x4y5(); // tgen
  DD4x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y53pqrEv");}
void  ccc::DD4x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y53efgEv");}
void  ccc::DD4x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y53abcEv");}
ccc::DD4x4y5 ::~DD4x4y5(){ note_dtor("_ZN3ccc7DD4x4y5E", this);} // tgen
ccc::DD4x4y5 ::DD4x4y5(){ note_ctor("_ZN3ccc7DD4x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y5E, buf);
    ::ccc::DD4x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y5E);
    dp->::ccc::DD4x4y5::~DD4x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y5E(Test__ZN3ccc7DD4x4y5E, "_ZN3ccc7DD4x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y5C1Ev();
extern void _ZN3ccc7DD4x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y5E[] = {
  NSPAIR(_ZN3ccc7DD4x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y5E[];
extern void _ZN3ccc7DD4x4y53pqrEv();
extern void _ZN3ccc7DD4x4y53abcEv();
extern void _ZN3ccc7DD4x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y53pqrEv,_ZTv0_n12_N3ccc7DD4x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y53pqrEv,_ZThn4_N3ccc7DD4x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y53abcEv,_ZTv0_n16_N3ccc7DD4x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y53abcEv,_ZThn4_N3ccc7DD4x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y53efgEv,_ZTv0_n20_N3ccc7DD4x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y53efgEv,_ZThn4_N3ccc7DD4x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y53pqrEv,_ZTv0_n12_N3ccc7DD4x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y53abcEv,_ZTv0_n16_N3ccc7DD4x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y53efgEv,_ZTv0_n20_N3ccc7DD4x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y5E[] = {
  {&(_ZTVN3ccc7DD4x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y5E[];
static VTBL_ENTRY alt_thunk_names1860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y53efgEv,_ZTv0_n20_N3ccc7DD4x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y53efgEv,_ZThn4_N3ccc7DD4x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y53abcEv,_ZTv0_n16_N3ccc7DD4x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y53abcEv,_ZThn4_N3ccc7DD4x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y53pqrEv,_ZTv0_n12_N3ccc7DD4x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y53pqrEv,_ZThn4_N3ccc7DD4x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y5E = {  "_ZN3ccc7DD4x4y5E", // class name
  bases__ZN3ccc7DD4x4y5E, 2,
  &(vtc__ZN3ccc7DD4x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1860,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y6  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y63efgEv
  ~CC4x4y6(); // tgen
  CC4x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y6E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y63abcEv");}
void  ccc::CC4x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y63efgEv");}
ccc::CC4x4y6 ::~CC4x4y6(){ note_dtor("_ZN3ccc7CC4x4y6E", this);} // tgen
ccc::CC4x4y6 ::CC4x4y6(){ note_ctor("_ZN3ccc7CC4x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y6E, buf);
    ::ccc::CC4x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y6E);
    dp->::ccc::CC4x4y6::~CC4x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y6E(Test__ZN3ccc7CC4x4y6E, "_ZN3ccc7CC4x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y6C1Ev();
extern void _ZN3ccc7CC4x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y6E[] = {
  NSPAIR(_ZN3ccc7CC4x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC4x4y63abcEv();
extern void _ZN3ccc7CC4x4y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y63abcEv,_ZTv0_n16_N3ccc7CC4x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y63abcEv,_ZThn4_N3ccc7CC4x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y63efgEv,_ZTv0_n20_N3ccc7CC4x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y63efgEv,_ZThn4_N3ccc7CC4x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y63abcEv,_ZTv0_n16_N3ccc7CC4x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y63efgEv,_ZTv0_n20_N3ccc7CC4x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y6E[] = {
  {&(_ZTVN3ccc7CC4x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y6E[];
static VTBL_ENTRY alt_thunk_names1861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y63efgEv,_ZTv0_n20_N3ccc7CC4x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y63efgEv,_ZThn4_N3ccc7CC4x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y63abcEv,_ZTv0_n16_N3ccc7CC4x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y63abcEv,_ZThn4_N3ccc7CC4x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y6E = {  "_ZN3ccc7CC4x4y6E", // class name
  bases__ZN3ccc7CC4x4y6E, 2,
  &(vtc__ZN3ccc7CC4x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1861,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y6  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD4x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x4y63efgEv
  ~DD4x4y6(); // tgen
  DD4x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y63abcEv");}
void  ccc::DD4x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y63efgEv");}
ccc::DD4x4y6 ::~DD4x4y6(){ note_dtor("_ZN3ccc7DD4x4y6E", this);} // tgen
ccc::DD4x4y6 ::DD4x4y6(){ note_ctor("_ZN3ccc7DD4x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y6E, buf);
    ::ccc::DD4x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y6E);
    dp->::ccc::DD4x4y6::~DD4x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y6E(Test__ZN3ccc7DD4x4y6E, "_ZN3ccc7DD4x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y6C1Ev();
extern void _ZN3ccc7DD4x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y6E[] = {
  NSPAIR(_ZN3ccc7DD4x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x4y63abcEv();
extern void _ZN3ccc7DD4x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y63abcEv,_ZTv0_n16_N3ccc7DD4x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y63abcEv,_ZThn4_N3ccc7DD4x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y63efgEv,_ZTv0_n20_N3ccc7DD4x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y63efgEv,_ZThn4_N3ccc7DD4x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y63abcEv,_ZTv0_n16_N3ccc7DD4x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y63efgEv,_ZTv0_n20_N3ccc7DD4x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y6E[] = {
  {&(_ZTVN3ccc7DD4x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y6E[];
static VTBL_ENTRY alt_thunk_names1862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y63efgEv,_ZTv0_n20_N3ccc7DD4x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y63efgEv,_ZThn4_N3ccc7DD4x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y63abcEv,_ZTv0_n16_N3ccc7DD4x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y63abcEv,_ZThn4_N3ccc7DD4x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y6E = {  "_ZN3ccc7DD4x4y6E", // class name
  bases__ZN3ccc7DD4x4y6E, 2,
  &(vtc__ZN3ccc7DD4x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1862,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y7  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y73pqrEv
  ~CC4x4y7(); // tgen
  CC4x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y7E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y73abcEv");}
void  ccc::CC4x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y73pqrEv");}
ccc::CC4x4y7 ::~CC4x4y7(){ note_dtor("_ZN3ccc7CC4x4y7E", this);} // tgen
ccc::CC4x4y7 ::CC4x4y7(){ note_ctor("_ZN3ccc7CC4x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y7E, buf);
    ::ccc::CC4x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y7E);
    dp->::ccc::CC4x4y7::~CC4x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y7E(Test__ZN3ccc7CC4x4y7E, "_ZN3ccc7CC4x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y7C1Ev();
extern void _ZN3ccc7CC4x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y7E[] = {
  NSPAIR(_ZN3ccc7CC4x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y7E[];
extern void _ZN3ccc7CC4x4y73pqrEv();
extern void _ZN3ccc7CC4x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y73pqrEv,_ZTv0_n12_N3ccc7CC4x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y73pqrEv,_ZThn4_N3ccc7CC4x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y73abcEv,_ZTv0_n16_N3ccc7CC4x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y73abcEv,_ZThn4_N3ccc7CC4x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y73pqrEv,_ZTv0_n12_N3ccc7CC4x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y73abcEv,_ZTv0_n16_N3ccc7CC4x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y7E[] = {
  {&(_ZTVN3ccc7CC4x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y7E[];
static VTBL_ENTRY alt_thunk_names1863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y73abcEv,_ZTv0_n16_N3ccc7CC4x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y73abcEv,_ZThn4_N3ccc7CC4x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y73pqrEv,_ZTv0_n12_N3ccc7CC4x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y73pqrEv,_ZThn4_N3ccc7CC4x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y7E = {  "_ZN3ccc7CC4x4y7E", // class name
  bases__ZN3ccc7CC4x4y7E, 2,
  &(vtc__ZN3ccc7CC4x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1863,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y7  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD4x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y73pqrEv
  ~DD4x4y7(); // tgen
  DD4x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y73abcEv");}
void  ccc::DD4x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y73pqrEv");}
ccc::DD4x4y7 ::~DD4x4y7(){ note_dtor("_ZN3ccc7DD4x4y7E", this);} // tgen
ccc::DD4x4y7 ::DD4x4y7(){ note_ctor("_ZN3ccc7DD4x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y7E, buf);
    ::ccc::DD4x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y7E);
    dp->::ccc::DD4x4y7::~DD4x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y7E(Test__ZN3ccc7DD4x4y7E, "_ZN3ccc7DD4x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y7C1Ev();
extern void _ZN3ccc7DD4x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y7E[] = {
  NSPAIR(_ZN3ccc7DD4x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y7E[];
extern void _ZN3ccc7DD4x4y73pqrEv();
extern void _ZN3ccc7DD4x4y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y73pqrEv,_ZTv0_n12_N3ccc7DD4x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y73pqrEv,_ZThn4_N3ccc7DD4x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y73abcEv,_ZTv0_n16_N3ccc7DD4x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y73abcEv,_ZThn4_N3ccc7DD4x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y73pqrEv,_ZTv0_n12_N3ccc7DD4x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y73abcEv,_ZTv0_n16_N3ccc7DD4x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y7E[] = {
  {&(_ZTVN3ccc7DD4x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y7E[];
static VTBL_ENTRY alt_thunk_names1864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y73abcEv,_ZTv0_n16_N3ccc7DD4x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y73abcEv,_ZThn4_N3ccc7DD4x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y73pqrEv,_ZTv0_n12_N3ccc7DD4x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y73pqrEv,_ZThn4_N3ccc7DD4x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y7E = {  "_ZN3ccc7DD4x4y7E", // class name
  bases__ZN3ccc7DD4x4y7E, 2,
  &(vtc__ZN3ccc7DD4x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1864,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y8  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y83abcEv
  ~CC4x4y8(); // tgen
  CC4x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y8E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y83efgEv");}
void  ccc::CC4x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y83abcEv");}
ccc::CC4x4y8 ::~CC4x4y8(){ note_dtor("_ZN3ccc7CC4x4y8E", this);} // tgen
ccc::CC4x4y8 ::CC4x4y8(){ note_ctor("_ZN3ccc7CC4x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y8E, buf);
    ::ccc::CC4x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y8E);
    dp->::ccc::CC4x4y8::~CC4x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y8E(Test__ZN3ccc7CC4x4y8E, "_ZN3ccc7CC4x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y8C1Ev();
extern void _ZN3ccc7CC4x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y8E[] = {
  NSPAIR(_ZN3ccc7CC4x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC4x4y83abcEv();
extern void _ZN3ccc7CC4x4y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x4y83abcEv,_ZTv0_n16_N3ccc7CC4x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y83abcEv,_ZThn4_N3ccc7CC4x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y83efgEv,_ZTv0_n20_N3ccc7CC4x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y83efgEv,_ZThn4_N3ccc7CC4x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x4y83abcEv,_ZTv0_n16_N3ccc7CC4x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y83efgEv,_ZTv0_n20_N3ccc7CC4x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y8E[] = {
  {&(_ZTVN3ccc7CC4x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y8E[];
static VTBL_ENTRY alt_thunk_names1865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y83efgEv,_ZTv0_n20_N3ccc7CC4x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y83efgEv,_ZThn4_N3ccc7CC4x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x4y83abcEv,_ZTv0_n16_N3ccc7CC4x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y83abcEv,_ZThn4_N3ccc7CC4x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y8E = {  "_ZN3ccc7CC4x4y8E", // class name
  bases__ZN3ccc7CC4x4y8E, 2,
  &(vtc__ZN3ccc7CC4x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1865,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y8  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD4x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x4y83abcEv
  ~DD4x4y8(); // tgen
  DD4x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y83efgEv");}
void  ccc::DD4x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x4y83abcEv");}
ccc::DD4x4y8 ::~DD4x4y8(){ note_dtor("_ZN3ccc7DD4x4y8E", this);} // tgen
ccc::DD4x4y8 ::DD4x4y8(){ note_ctor("_ZN3ccc7DD4x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y8E, buf);
    ::ccc::DD4x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y8E);
    dp->::ccc::DD4x4y8::~DD4x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y8E(Test__ZN3ccc7DD4x4y8E, "_ZN3ccc7DD4x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y8C1Ev();
extern void _ZN3ccc7DD4x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y8E[] = {
  NSPAIR(_ZN3ccc7DD4x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x4y83abcEv();
extern void _ZN3ccc7DD4x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x4y83abcEv,_ZTv0_n16_N3ccc7DD4x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y83abcEv,_ZThn4_N3ccc7DD4x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y83efgEv,_ZTv0_n20_N3ccc7DD4x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y83efgEv,_ZThn4_N3ccc7DD4x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x4y83abcEv,_ZTv0_n16_N3ccc7DD4x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y83efgEv,_ZTv0_n20_N3ccc7DD4x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y8E[] = {
  {&(_ZTVN3ccc7DD4x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y8E[];
static VTBL_ENTRY alt_thunk_names1866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y83efgEv,_ZTv0_n20_N3ccc7DD4x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y83efgEv,_ZThn4_N3ccc7DD4x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x4y83abcEv,_ZTv0_n16_N3ccc7DD4x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y83abcEv,_ZThn4_N3ccc7DD4x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y8E = {  "_ZN3ccc7DD4x4y8E", // class name
  bases__ZN3ccc7DD4x4y8E, 2,
  &(vtc__ZN3ccc7DD4x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1866,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y9  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y93pqrEv
  ~CC4x4y9(); // tgen
  CC4x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y9E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y93efgEv");}
void  ccc::CC4x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y93pqrEv");}
ccc::CC4x4y9 ::~CC4x4y9(){ note_dtor("_ZN3ccc7CC4x4y9E", this);} // tgen
ccc::CC4x4y9 ::CC4x4y9(){ note_ctor("_ZN3ccc7CC4x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y9E, buf);
    ::ccc::CC4x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC4x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y9E);
    dp->::ccc::CC4x4y9::~CC4x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y9E(Test__ZN3ccc7CC4x4y9E, "_ZN3ccc7CC4x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y9C1Ev();
extern void _ZN3ccc7CC4x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y9E[] = {
  NSPAIR(_ZN3ccc7CC4x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y9E[];
extern void _ZN3ccc7CC4x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC4x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x4y93pqrEv,_ZTv0_n12_N3ccc7CC4x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y93pqrEv,_ZThn4_N3ccc7CC4x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x4y93efgEv,_ZTv0_n20_N3ccc7CC4x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y93efgEv,_ZThn4_N3ccc7CC4x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x4y93pqrEv,_ZTv0_n12_N3ccc7CC4x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x4y93efgEv,_ZTv0_n20_N3ccc7CC4x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x4y9E[] = {
  {&(_ZTVN3ccc7CC4x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x4y9E[];
static VTBL_ENTRY alt_thunk_names1867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x4y93efgEv,_ZTv0_n20_N3ccc7CC4x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y93efgEv,_ZThn4_N3ccc7CC4x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x4y93pqrEv,_ZTv0_n12_N3ccc7CC4x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x4y93pqrEv,_ZThn4_N3ccc7CC4x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x4y9E = {  "_ZN3ccc7CC4x4y9E", // class name
  bases__ZN3ccc7CC4x4y9E, 2,
  &(vtc__ZN3ccc7CC4x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x4y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1867,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y9  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD4x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x4y93pqrEv
  ~DD4x4y9(); // tgen
  DD4x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x4y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x4y93efgEv");}
void  ccc::DD4x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x4y93pqrEv");}
ccc::DD4x4y9 ::~DD4x4y9(){ note_dtor("_ZN3ccc7DD4x4y9E", this);} // tgen
ccc::DD4x4y9 ::DD4x4y9(){ note_ctor("_ZN3ccc7DD4x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x4y9E, buf);
    ::ccc::DD4x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x4y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD4x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x4y9E);
    dp->::ccc::DD4x4y9::~DD4x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x4y9E(Test__ZN3ccc7DD4x4y9E, "_ZN3ccc7DD4x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x4y9C1Ev();
extern void _ZN3ccc7DD4x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x4y9E[] = {
  NSPAIR(_ZN3ccc7DD4x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD4x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y9E[];
extern void _ZN3ccc7DD4x4y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x4y93pqrEv,_ZTv0_n12_N3ccc7DD4x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y93pqrEv,_ZThn4_N3ccc7DD4x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x4y93efgEv,_ZTv0_n20_N3ccc7DD4x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x4y93efgEv,_ZThn4_N3ccc7DD4x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x4y93pqrEv,_ZTv0_n12_N3ccc7DD4x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x4y93efgEv,_ZTv0_n20_N3ccc7DD4x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x4y9E[] = {
  {&(_ZTVN3ccc7DD4x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x4y9E[];
static VTBL_ENTRY alt_thunk_names1868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x4y93efgEv,_ZTv0_n20_N3ccc7DD4x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y93efgEv,_ZThn4_N3ccc7DD4x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x4y93pqrEv,_ZTv0_n12_N3ccc7DD4x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x4y93pqrEv,_ZThn4_N3ccc7DD4x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x4y9E = {  "_ZN3ccc7DD4x4y9E", // class name
  bases__ZN3ccc7DD4x4y9E, 2,
  &(vtc__ZN3ccc7DD4x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x4y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1868,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y10  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x4y103abcEv
  ~CC4x4y10(); // tgen
  CC4x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y10E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y103pqrEv");}
void  ccc::CC4x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x4y103abcEv");}
ccc::CC4x4y10 ::~CC4x4y10(){ note_dtor("_ZN3ccc8CC4x4y10E", this);} // tgen
ccc::CC4x4y10 ::CC4x4y10(){ note_ctor("_ZN3ccc8CC4x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y10E, buf);
    ::ccc::CC4x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y10E);
    dp->::ccc::CC4x4y10::~CC4x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y10E(Test__ZN3ccc8CC4x4y10E, "_ZN3ccc8CC4x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y10C1Ev();
extern void _ZN3ccc8CC4x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y10E[] = {
  NSPAIR(_ZN3ccc8CC4x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y10E[];
extern void _ZN3ccc8CC4x4y103pqrEv();
extern void _ZN3ccc8CC4x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x4y103pqrEv,_ZTv0_n12_N3ccc8CC4x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y103pqrEv,_ZThn4_N3ccc8CC4x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x4y103abcEv,_ZTv0_n16_N3ccc8CC4x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y103abcEv,_ZThn4_N3ccc8CC4x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x4y103pqrEv,_ZTv0_n12_N3ccc8CC4x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x4y103abcEv,_ZTv0_n16_N3ccc8CC4x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y10E[] = {
  {&(_ZTVN3ccc8CC4x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y10E[];
static VTBL_ENTRY alt_thunk_names1869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x4y103abcEv,_ZTv0_n16_N3ccc8CC4x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y103abcEv,_ZThn4_N3ccc8CC4x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x4y103pqrEv,_ZTv0_n12_N3ccc8CC4x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y103pqrEv,_ZThn4_N3ccc8CC4x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x4y10E = {  "_ZN3ccc8CC4x4y10E", // class name
  bases__ZN3ccc8CC4x4y10E, 2,
  &(vtc__ZN3ccc8CC4x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1869,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y10  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD4x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x4y103abcEv
  ~DD4x4y10(); // tgen
  DD4x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x4y103pqrEv");}
void  ccc::DD4x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x4y103abcEv");}
ccc::DD4x4y10 ::~DD4x4y10(){ note_dtor("_ZN3ccc8DD4x4y10E", this);} // tgen
ccc::DD4x4y10 ::DD4x4y10(){ note_ctor("_ZN3ccc8DD4x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y10E, buf);
    ::ccc::DD4x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y10E);
    dp->::ccc::DD4x4y10::~DD4x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y10E(Test__ZN3ccc8DD4x4y10E, "_ZN3ccc8DD4x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y10C1Ev();
extern void _ZN3ccc8DD4x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y10E[] = {
  NSPAIR(_ZN3ccc8DD4x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y10E[];
extern void _ZN3ccc8DD4x4y103pqrEv();
extern void _ZN3ccc8DD4x4y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x4y103pqrEv,_ZTv0_n12_N3ccc8DD4x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y103pqrEv,_ZThn4_N3ccc8DD4x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x4y103abcEv,_ZTv0_n16_N3ccc8DD4x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y103abcEv,_ZThn4_N3ccc8DD4x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x4y103pqrEv,_ZTv0_n12_N3ccc8DD4x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x4y103abcEv,_ZTv0_n16_N3ccc8DD4x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y10E[] = {
  {&(_ZTVN3ccc8DD4x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y10E[];
static VTBL_ENTRY alt_thunk_names1870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x4y103abcEv,_ZTv0_n16_N3ccc8DD4x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y103abcEv,_ZThn4_N3ccc8DD4x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x4y103pqrEv,_ZTv0_n12_N3ccc8DD4x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y103pqrEv,_ZThn4_N3ccc8DD4x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x4y10E = {  "_ZN3ccc8DD4x4y10E", // class name
  bases__ZN3ccc8DD4x4y10E, 2,
  &(vtc__ZN3ccc8DD4x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1870,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y11  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x4y113efgEv
  ~CC4x4y11(); // tgen
  CC4x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y11E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y113pqrEv");}
void  ccc::CC4x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x4y113efgEv");}
ccc::CC4x4y11 ::~CC4x4y11(){ note_dtor("_ZN3ccc8CC4x4y11E", this);} // tgen
ccc::CC4x4y11 ::CC4x4y11(){ note_ctor("_ZN3ccc8CC4x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y11E, buf);
    ::ccc::CC4x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y11E);
    dp->::ccc::CC4x4y11::~CC4x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y11E(Test__ZN3ccc8CC4x4y11E, "_ZN3ccc8CC4x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y11C1Ev();
extern void _ZN3ccc8CC4x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y11E[] = {
  NSPAIR(_ZN3ccc8CC4x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y11E[];
extern void _ZN3ccc8CC4x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC4x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x4y113pqrEv,_ZTv0_n12_N3ccc8CC4x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y113pqrEv,_ZThn4_N3ccc8CC4x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x4y113efgEv,_ZTv0_n20_N3ccc8CC4x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y113efgEv,_ZThn4_N3ccc8CC4x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x4y113pqrEv,_ZTv0_n12_N3ccc8CC4x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x4y113efgEv,_ZTv0_n20_N3ccc8CC4x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y11E[] = {
  {&(_ZTVN3ccc8CC4x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y11E[];
static VTBL_ENTRY alt_thunk_names1871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x4y113efgEv,_ZTv0_n20_N3ccc8CC4x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y113efgEv,_ZThn4_N3ccc8CC4x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x4y113pqrEv,_ZTv0_n12_N3ccc8CC4x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y113pqrEv,_ZThn4_N3ccc8CC4x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x4y11E = {  "_ZN3ccc8CC4x4y11E", // class name
  bases__ZN3ccc8CC4x4y11E, 2,
  &(vtc__ZN3ccc8CC4x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1871,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y11  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD4x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x4y113efgEv
  ~DD4x4y11(); // tgen
  DD4x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x4y113pqrEv");}
void  ccc::DD4x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x4y113efgEv");}
ccc::DD4x4y11 ::~DD4x4y11(){ note_dtor("_ZN3ccc8DD4x4y11E", this);} // tgen
ccc::DD4x4y11 ::DD4x4y11(){ note_ctor("_ZN3ccc8DD4x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y11E, buf);
    ::ccc::DD4x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y11E);
    dp->::ccc::DD4x4y11::~DD4x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y11E(Test__ZN3ccc8DD4x4y11E, "_ZN3ccc8DD4x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y11C1Ev();
extern void _ZN3ccc8DD4x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y11E[] = {
  NSPAIR(_ZN3ccc8DD4x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y11E[];
extern void _ZN3ccc8DD4x4y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x4y113pqrEv,_ZTv0_n12_N3ccc8DD4x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y113pqrEv,_ZThn4_N3ccc8DD4x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x4y113efgEv,_ZTv0_n20_N3ccc8DD4x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y113efgEv,_ZThn4_N3ccc8DD4x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x4y113pqrEv,_ZTv0_n12_N3ccc8DD4x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x4y113efgEv,_ZTv0_n20_N3ccc8DD4x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y11E[] = {
  {&(_ZTVN3ccc8DD4x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y11E[];
static VTBL_ENTRY alt_thunk_names1872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x4y113efgEv,_ZTv0_n20_N3ccc8DD4x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y113efgEv,_ZThn4_N3ccc8DD4x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x4y113pqrEv,_ZTv0_n12_N3ccc8DD4x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y113pqrEv,_ZThn4_N3ccc8DD4x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x4y11E = {  "_ZN3ccc8DD4x4y11E", // class name
  bases__ZN3ccc8DD4x4y11E, 2,
  &(vtc__ZN3ccc8DD4x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1872,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y12  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC4x4y123abcEv
  ~CC4x4y12(); // tgen
  CC4x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x4y123abcEv");}
ccc::CC4x4y12 ::~CC4x4y12(){ note_dtor("_ZN3ccc8CC4x4y12E", this);} // tgen
ccc::CC4x4y12 ::CC4x4y12(){ note_ctor("_ZN3ccc8CC4x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y12E, buf);
    ::ccc::CC4x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y12E);
    dp->::ccc::CC4x4y12::~CC4x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y12E(Test__ZN3ccc8CC4x4y12E, "_ZN3ccc8CC4x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y12C1Ev();
extern void _ZN3ccc8CC4x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y12E[] = {
  NSPAIR(_ZN3ccc8CC4x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC4x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x4y123abcEv,_ZTv0_n16_N3ccc8CC4x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y123abcEv,_ZThn4_N3ccc8CC4x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x4y123abcEv,_ZTv0_n16_N3ccc8CC4x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y12E[] = {
  {&(_ZTVN3ccc8CC4x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y12E[];
static VTBL_ENTRY alt_thunk_names1873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x4y123abcEv,_ZTv0_n16_N3ccc8CC4x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y123abcEv,_ZThn4_N3ccc8CC4x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x4y12E = {  "_ZN3ccc8CC4x4y12E", // class name
  bases__ZN3ccc8CC4x4y12E, 2,
  &(vtc__ZN3ccc8CC4x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1873,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y12  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD4x4y123abcEv
  ~DD4x4y12(); // tgen
  DD4x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x4y123abcEv");}
ccc::DD4x4y12 ::~DD4x4y12(){ note_dtor("_ZN3ccc8DD4x4y12E", this);} // tgen
ccc::DD4x4y12 ::DD4x4y12(){ note_ctor("_ZN3ccc8DD4x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y12E, buf);
    ::ccc::DD4x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y12E);
    dp->::ccc::DD4x4y12::~DD4x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y12E(Test__ZN3ccc8DD4x4y12E, "_ZN3ccc8DD4x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y12C1Ev();
extern void _ZN3ccc8DD4x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y12E[] = {
  NSPAIR(_ZN3ccc8DD4x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x4y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x4y123abcEv,_ZTv0_n16_N3ccc8DD4x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y123abcEv,_ZThn4_N3ccc8DD4x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x4y123abcEv,_ZTv0_n16_N3ccc8DD4x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y12E[] = {
  {&(_ZTVN3ccc8DD4x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y12E[];
static VTBL_ENTRY alt_thunk_names1874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x4y123abcEv,_ZTv0_n16_N3ccc8DD4x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y123abcEv,_ZThn4_N3ccc8DD4x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x4y12E = {  "_ZN3ccc8DD4x4y12E", // class name
  bases__ZN3ccc8DD4x4y12E, 2,
  &(vtc__ZN3ccc8DD4x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1874,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y13  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC4x4y133efgEv
  ~CC4x4y13(); // tgen
  CC4x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x4y133efgEv");}
ccc::CC4x4y13 ::~CC4x4y13(){ note_dtor("_ZN3ccc8CC4x4y13E", this);} // tgen
ccc::CC4x4y13 ::CC4x4y13(){ note_ctor("_ZN3ccc8CC4x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y13E, buf);
    ::ccc::CC4x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y13E);
    dp->::ccc::CC4x4y13::~CC4x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y13E(Test__ZN3ccc8CC4x4y13E, "_ZN3ccc8CC4x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y13C1Ev();
extern void _ZN3ccc8CC4x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y13E[] = {
  NSPAIR(_ZN3ccc8CC4x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC4x4y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x4y133efgEv,_ZTv0_n20_N3ccc8CC4x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y133efgEv,_ZThn4_N3ccc8CC4x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x4y133efgEv,_ZTv0_n20_N3ccc8CC4x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y13E[] = {
  {&(_ZTVN3ccc8CC4x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y13E[];
static VTBL_ENTRY alt_thunk_names1875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x4y133efgEv,_ZTv0_n20_N3ccc8CC4x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y133efgEv,_ZThn4_N3ccc8CC4x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x4y13E = {  "_ZN3ccc8CC4x4y13E", // class name
  bases__ZN3ccc8CC4x4y13E, 2,
  &(vtc__ZN3ccc8CC4x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1875,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y13  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD4x4y133efgEv
  ~DD4x4y13(); // tgen
  DD4x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x4y133efgEv");}
ccc::DD4x4y13 ::~DD4x4y13(){ note_dtor("_ZN3ccc8DD4x4y13E", this);} // tgen
ccc::DD4x4y13 ::DD4x4y13(){ note_ctor("_ZN3ccc8DD4x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y13E, buf);
    ::ccc::DD4x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y13E);
    dp->::ccc::DD4x4y13::~DD4x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y13E(Test__ZN3ccc8DD4x4y13E, "_ZN3ccc8DD4x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y13C1Ev();
extern void _ZN3ccc8DD4x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y13E[] = {
  NSPAIR(_ZN3ccc8DD4x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x4y133efgEv,_ZTv0_n20_N3ccc8DD4x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y133efgEv,_ZThn4_N3ccc8DD4x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x4y133efgEv,_ZTv0_n20_N3ccc8DD4x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y13E[] = {
  {&(_ZTVN3ccc8DD4x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y13E[];
static VTBL_ENTRY alt_thunk_names1876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x4y133efgEv,_ZTv0_n20_N3ccc8DD4x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y133efgEv,_ZThn4_N3ccc8DD4x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x4y13E = {  "_ZN3ccc8DD4x4y13E", // class name
  bases__ZN3ccc8DD4x4y13E, 2,
  &(vtc__ZN3ccc8DD4x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1876,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y14  : virtual ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y143pqrEv
  ~CC4x4y14(); // tgen
  CC4x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y143pqrEv");}
ccc::CC4x4y14 ::~CC4x4y14(){ note_dtor("_ZN3ccc8CC4x4y14E", this);} // tgen
ccc::CC4x4y14 ::CC4x4y14(){ note_ctor("_ZN3ccc8CC4x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y14E, buf);
    ::ccc::CC4x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y14E);
    dp->::ccc::CC4x4y14::~CC4x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y14E(Test__ZN3ccc8CC4x4y14E, "_ZN3ccc8CC4x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y14C1Ev();
extern void _ZN3ccc8CC4x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y14E[] = {
  NSPAIR(_ZN3ccc8CC4x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y14E[];
extern void _ZN3ccc8CC4x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x4y143pqrEv,_ZTv0_n12_N3ccc8CC4x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y143pqrEv,_ZThn4_N3ccc8CC4x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x4y143pqrEv,_ZTv0_n12_N3ccc8CC4x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y14E[] = {
  {&(_ZTVN3ccc8CC4x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y14E[];
static VTBL_ENTRY alt_thunk_names1877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x4y143pqrEv,_ZTv0_n12_N3ccc8CC4x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x4y143pqrEv,_ZThn4_N3ccc8CC4x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x4y14E = {  "_ZN3ccc8CC4x4y14E", // class name
  bases__ZN3ccc8CC4x4y14E, 2,
  &(vtc__ZN3ccc8CC4x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1877,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y14  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD4x4y143pqrEv
  ~DD4x4y14(); // tgen
  DD4x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x4y143pqrEv");}
ccc::DD4x4y14 ::~DD4x4y14(){ note_dtor("_ZN3ccc8DD4x4y14E", this);} // tgen
ccc::DD4x4y14 ::DD4x4y14(){ note_ctor("_ZN3ccc8DD4x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y14E, buf);
    ::ccc::DD4x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y14E);
    dp->::ccc::DD4x4y14::~DD4x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y14E(Test__ZN3ccc8DD4x4y14E, "_ZN3ccc8DD4x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y14C1Ev();
extern void _ZN3ccc8DD4x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y14E[] = {
  NSPAIR(_ZN3ccc8DD4x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y14E[];
extern void _ZN3ccc8DD4x4y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x4y143pqrEv,_ZTv0_n12_N3ccc8DD4x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x4y143pqrEv,_ZThn4_N3ccc8DD4x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x4y143pqrEv,_ZTv0_n12_N3ccc8DD4x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y14E[] = {
  {&(_ZTVN3ccc8DD4x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y14E[];
static VTBL_ENTRY alt_thunk_names1878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x4y143pqrEv,_ZTv0_n12_N3ccc8DD4x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x4y143pqrEv,_ZThn4_N3ccc8DD4x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x4y14E = {  "_ZN3ccc8DD4x4y14E", // class name
  bases__ZN3ccc8DD4x4y14E, 2,
  &(vtc__ZN3ccc8DD4x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1878,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y15  : virtual ::ccc::AA4 , ::ccc::BB4 {
  ~CC4x4y15(); // tgen
  CC4x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x4y15 ::~CC4x4y15(){ note_dtor("_ZN3ccc8CC4x4y15E", this);} // tgen
ccc::CC4x4y15 ::CC4x4y15(){ note_ctor("_ZN3ccc8CC4x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y15E, buf);
    ::ccc::CC4x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC4x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y15E);
    dp->::ccc::CC4x4y15::~CC4x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y15E(Test__ZN3ccc8CC4x4y15E, "_ZN3ccc8CC4x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y15C1Ev();
extern void _ZN3ccc8CC4x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y15E[] = {
  NSPAIR(_ZN3ccc8CC4x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x4y15E[] = {
  {&(_ZTVN3ccc8CC4x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x4y15E[];
Class_Descriptor cd__ZN3ccc8CC4x4y15E = {  "_ZN3ccc8CC4x4y15E", // class name
  bases__ZN3ccc8CC4x4y15E, 2,
  &(vtc__ZN3ccc8CC4x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x4y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x4y15  : virtual ::ccc::AA4 , virtual ::ccc::BB4 {
  ~DD4x4y15(); // tgen
  DD4x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x4y15 ::~DD4x4y15(){ note_dtor("_ZN3ccc8DD4x4y15E", this);} // tgen
ccc::DD4x4y15 ::DD4x4y15(){ note_ctor("_ZN3ccc8DD4x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x4y15E, buf);
    ::ccc::DD4x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x4y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD4x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x4y15E);
    dp->::ccc::DD4x4y15::~DD4x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x4y15E(Test__ZN3ccc8DD4x4y15E, "_ZN3ccc8DD4x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x4y15C1Ev();
extern void _ZN3ccc8DD4x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x4y15E[] = {
  NSPAIR(_ZN3ccc8DD4x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD4x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x4y15E[] = {
  {&(_ZTVN3ccc8DD4x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x4y15E[];
Class_Descriptor cd__ZN3ccc8DD4x4y15E = {  "_ZN3ccc8DD4x4y15E", // class name
  bases__ZN3ccc8DD4x4y15E, 2,
  &(vtc__ZN3ccc8DD4x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x4y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y0  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y03pqrEv
  ~CC4x5y0(); // tgen
  CC4x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y0E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y03abcEv");}
void  ccc::CC4x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y03efgEv");}
void  ccc::CC4x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y03pqrEv");}
ccc::CC4x5y0 ::~CC4x5y0(){ note_dtor("_ZN3ccc7CC4x5y0E", this);} // tgen
ccc::CC4x5y0 ::CC4x5y0(){ note_ctor("_ZN3ccc7CC4x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y0E, buf);
    ::ccc::CC4x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y0E);
    dp->::ccc::CC4x5y0::~CC4x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y0E(Test__ZN3ccc7CC4x5y0E, "_ZN3ccc7CC4x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y0C1Ev();
extern void _ZN3ccc7CC4x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y0E[] = {
  NSPAIR(_ZN3ccc7CC4x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y0E[];
extern void _ZN3ccc7CC4x5y03pqrEv();
extern void _ZN3ccc7CC4x5y03efgEv();
extern void _ZN3ccc7CC4x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y03pqrEv,_ZTv0_n12_N3ccc7CC4x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03pqrEv,_ZThn4_N3ccc7CC4x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y03abcEv,_ZTv0_n16_N3ccc7CC4x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03abcEv,_ZThn4_N3ccc7CC4x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y03efgEv,_ZTv0_n20_N3ccc7CC4x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03efgEv,_ZThn4_N3ccc7CC4x5y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y03pqrEv,_ZTv0_n12_N3ccc7CC4x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y03abcEv,_ZTv0_n16_N3ccc7CC4x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y03efgEv,_ZTv0_n20_N3ccc7CC4x5y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y0E[] = {
  {&(_ZTVN3ccc7CC4x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y0E[];
static VTBL_ENTRY alt_thunk_names1879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y03efgEv,_ZTv0_n20_N3ccc7CC4x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y03efgEv,_ZThn4_N3ccc7CC4x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y03abcEv,_ZTv0_n16_N3ccc7CC4x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y03abcEv,_ZThn4_N3ccc7CC4x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y03pqrEv,_ZTv0_n12_N3ccc7CC4x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y03pqrEv,_ZThn4_N3ccc7CC4x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y0E = {  "_ZN3ccc7CC4x5y0E", // class name
  bases__ZN3ccc7CC4x5y0E, 2,
  &(vtc__ZN3ccc7CC4x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1879,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y0  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD4x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y03pqrEv
  ~DD4x5y0(); // tgen
  DD4x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y03abcEv");}
void  ccc::DD4x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y03efgEv");}
void  ccc::DD4x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y03pqrEv");}
ccc::DD4x5y0 ::~DD4x5y0(){ note_dtor("_ZN3ccc7DD4x5y0E", this);} // tgen
ccc::DD4x5y0 ::DD4x5y0(){ note_ctor("_ZN3ccc7DD4x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y0E, buf);
    ::ccc::DD4x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y0E);
    dp->::ccc::DD4x5y0::~DD4x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y0E(Test__ZN3ccc7DD4x5y0E, "_ZN3ccc7DD4x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y0C1Ev();
extern void _ZN3ccc7DD4x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y0E[] = {
  NSPAIR(_ZN3ccc7DD4x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y0E[];
extern void _ZN3ccc7DD4x5y03pqrEv();
extern void _ZN3ccc7DD4x5y03abcEv();
extern void _ZN3ccc7DD4x5y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y03pqrEv,_ZTv0_n12_N3ccc7DD4x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y03pqrEv,_ZThn4_N3ccc7DD4x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y03efgEv,_ZTv0_n16_N3ccc7DD4x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y03efgEv,_ZThn4_N3ccc7DD4x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y03abcEv,_ZTv0_n20_N3ccc7DD4x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y03abcEv,_ZThn4_N3ccc7DD4x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y03pqrEv,_ZTv0_n12_N3ccc7DD4x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y03efgEv,_ZTv0_n16_N3ccc7DD4x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y03abcEv,_ZTv0_n20_N3ccc7DD4x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y0E[] = {
  {&(_ZTVN3ccc7DD4x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y0E[];
static VTBL_ENTRY alt_thunk_names1880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y03abcEv,_ZTv0_n20_N3ccc7DD4x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y03abcEv,_ZThn4_N3ccc7DD4x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y03efgEv,_ZTv0_n16_N3ccc7DD4x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y03efgEv,_ZThn4_N3ccc7DD4x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y03pqrEv,_ZTv0_n12_N3ccc7DD4x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y03pqrEv,_ZThn4_N3ccc7DD4x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y0E = {  "_ZN3ccc7DD4x5y0E", // class name
  bases__ZN3ccc7DD4x5y0E, 2,
  &(vtc__ZN3ccc7DD4x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1880,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y1  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x5y13efgEv
  ~CC4x5y1(); // tgen
  CC4x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y1E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y13abcEv");}
void  ccc::CC4x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y13pqrEv");}
void  ccc::CC4x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y13efgEv");}
ccc::CC4x5y1 ::~CC4x5y1(){ note_dtor("_ZN3ccc7CC4x5y1E", this);} // tgen
ccc::CC4x5y1 ::CC4x5y1(){ note_ctor("_ZN3ccc7CC4x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y1E, buf);
    ::ccc::CC4x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y1E);
    dp->::ccc::CC4x5y1::~CC4x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y1E(Test__ZN3ccc7CC4x5y1E, "_ZN3ccc7CC4x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y1C1Ev();
extern void _ZN3ccc7CC4x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y1E[] = {
  NSPAIR(_ZN3ccc7CC4x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y1E[];
extern void _ZN3ccc7CC4x5y13pqrEv();
extern void _ZN3ccc7CC4x5y13efgEv();
extern void _ZN3ccc7CC4x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y13pqrEv,_ZTv0_n12_N3ccc7CC4x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13pqrEv,_ZThn4_N3ccc7CC4x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y13abcEv,_ZTv0_n16_N3ccc7CC4x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13abcEv,_ZThn4_N3ccc7CC4x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y13efgEv,_ZTv0_n20_N3ccc7CC4x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13efgEv,_ZThn4_N3ccc7CC4x5y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y13pqrEv,_ZTv0_n12_N3ccc7CC4x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y13abcEv,_ZTv0_n16_N3ccc7CC4x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y13efgEv,_ZTv0_n20_N3ccc7CC4x5y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y1E[] = {
  {&(_ZTVN3ccc7CC4x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y1E[];
static VTBL_ENTRY alt_thunk_names1881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y13efgEv,_ZTv0_n20_N3ccc7CC4x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y13efgEv,_ZThn4_N3ccc7CC4x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y13abcEv,_ZTv0_n16_N3ccc7CC4x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y13abcEv,_ZThn4_N3ccc7CC4x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y13pqrEv,_ZTv0_n12_N3ccc7CC4x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y13pqrEv,_ZThn4_N3ccc7CC4x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y1E = {  "_ZN3ccc7CC4x5y1E", // class name
  bases__ZN3ccc7CC4x5y1E, 2,
  &(vtc__ZN3ccc7CC4x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1881,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y1  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD4x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x5y13efgEv
  ~DD4x5y1(); // tgen
  DD4x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y13abcEv");}
void  ccc::DD4x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y13pqrEv");}
void  ccc::DD4x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y13efgEv");}
ccc::DD4x5y1 ::~DD4x5y1(){ note_dtor("_ZN3ccc7DD4x5y1E", this);} // tgen
ccc::DD4x5y1 ::DD4x5y1(){ note_ctor("_ZN3ccc7DD4x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y1E, buf);
    ::ccc::DD4x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y1E);
    dp->::ccc::DD4x5y1::~DD4x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y1E(Test__ZN3ccc7DD4x5y1E, "_ZN3ccc7DD4x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y1C1Ev();
extern void _ZN3ccc7DD4x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y1E[] = {
  NSPAIR(_ZN3ccc7DD4x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y1E[];
extern void _ZN3ccc7DD4x5y13pqrEv();
extern void _ZN3ccc7DD4x5y13abcEv();
extern void _ZN3ccc7DD4x5y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y13pqrEv,_ZTv0_n12_N3ccc7DD4x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y13pqrEv,_ZThn4_N3ccc7DD4x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y13efgEv,_ZTv0_n16_N3ccc7DD4x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y13efgEv,_ZThn4_N3ccc7DD4x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y13abcEv,_ZTv0_n20_N3ccc7DD4x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y13abcEv,_ZThn4_N3ccc7DD4x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y13pqrEv,_ZTv0_n12_N3ccc7DD4x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y13efgEv,_ZTv0_n16_N3ccc7DD4x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y13abcEv,_ZTv0_n20_N3ccc7DD4x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y1E[] = {
  {&(_ZTVN3ccc7DD4x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y1E[];
static VTBL_ENTRY alt_thunk_names1882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y13abcEv,_ZTv0_n20_N3ccc7DD4x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y13abcEv,_ZThn4_N3ccc7DD4x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y13efgEv,_ZTv0_n16_N3ccc7DD4x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y13efgEv,_ZThn4_N3ccc7DD4x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y13pqrEv,_ZTv0_n12_N3ccc7DD4x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y13pqrEv,_ZThn4_N3ccc7DD4x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y1E = {  "_ZN3ccc7DD4x5y1E", // class name
  bases__ZN3ccc7DD4x5y1E, 2,
  &(vtc__ZN3ccc7DD4x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1882,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y2  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y23pqrEv
  ~CC4x5y2(); // tgen
  CC4x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y2E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y23efgEv");}
void  ccc::CC4x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y23abcEv");}
void  ccc::CC4x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y23pqrEv");}
ccc::CC4x5y2 ::~CC4x5y2(){ note_dtor("_ZN3ccc7CC4x5y2E", this);} // tgen
ccc::CC4x5y2 ::CC4x5y2(){ note_ctor("_ZN3ccc7CC4x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y2E, buf);
    ::ccc::CC4x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y2E);
    dp->::ccc::CC4x5y2::~CC4x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y2E(Test__ZN3ccc7CC4x5y2E, "_ZN3ccc7CC4x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y2C1Ev();
extern void _ZN3ccc7CC4x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y2E[] = {
  NSPAIR(_ZN3ccc7CC4x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y2E[];
extern void _ZN3ccc7CC4x5y23pqrEv();
extern void _ZN3ccc7CC4x5y23efgEv();
extern void _ZN3ccc7CC4x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y23pqrEv,_ZTv0_n12_N3ccc7CC4x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23pqrEv,_ZThn4_N3ccc7CC4x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y23abcEv,_ZTv0_n16_N3ccc7CC4x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23abcEv,_ZThn4_N3ccc7CC4x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y23efgEv,_ZTv0_n20_N3ccc7CC4x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23efgEv,_ZThn4_N3ccc7CC4x5y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y23pqrEv,_ZTv0_n12_N3ccc7CC4x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y23abcEv,_ZTv0_n16_N3ccc7CC4x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y23efgEv,_ZTv0_n20_N3ccc7CC4x5y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y2E[] = {
  {&(_ZTVN3ccc7CC4x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y2E[];
static VTBL_ENTRY alt_thunk_names1883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y23efgEv,_ZTv0_n20_N3ccc7CC4x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y23efgEv,_ZThn4_N3ccc7CC4x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y23abcEv,_ZTv0_n16_N3ccc7CC4x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y23abcEv,_ZThn4_N3ccc7CC4x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y23pqrEv,_ZTv0_n12_N3ccc7CC4x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y23pqrEv,_ZThn4_N3ccc7CC4x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y2E = {  "_ZN3ccc7CC4x5y2E", // class name
  bases__ZN3ccc7CC4x5y2E, 2,
  &(vtc__ZN3ccc7CC4x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1883,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y2  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD4x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y23pqrEv
  ~DD4x5y2(); // tgen
  DD4x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y23efgEv");}
void  ccc::DD4x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y23abcEv");}
void  ccc::DD4x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y23pqrEv");}
ccc::DD4x5y2 ::~DD4x5y2(){ note_dtor("_ZN3ccc7DD4x5y2E", this);} // tgen
ccc::DD4x5y2 ::DD4x5y2(){ note_ctor("_ZN3ccc7DD4x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y2E, buf);
    ::ccc::DD4x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y2E);
    dp->::ccc::DD4x5y2::~DD4x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y2E(Test__ZN3ccc7DD4x5y2E, "_ZN3ccc7DD4x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y2C1Ev();
extern void _ZN3ccc7DD4x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y2E[] = {
  NSPAIR(_ZN3ccc7DD4x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y2E[];
extern void _ZN3ccc7DD4x5y23pqrEv();
extern void _ZN3ccc7DD4x5y23abcEv();
extern void _ZN3ccc7DD4x5y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y23pqrEv,_ZTv0_n12_N3ccc7DD4x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y23pqrEv,_ZThn4_N3ccc7DD4x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y23efgEv,_ZTv0_n16_N3ccc7DD4x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y23efgEv,_ZThn4_N3ccc7DD4x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y23abcEv,_ZTv0_n20_N3ccc7DD4x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y23abcEv,_ZThn4_N3ccc7DD4x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y23pqrEv,_ZTv0_n12_N3ccc7DD4x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y23efgEv,_ZTv0_n16_N3ccc7DD4x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y23abcEv,_ZTv0_n20_N3ccc7DD4x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y2E[] = {
  {&(_ZTVN3ccc7DD4x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y2E[];
static VTBL_ENTRY alt_thunk_names1884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y23abcEv,_ZTv0_n20_N3ccc7DD4x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y23abcEv,_ZThn4_N3ccc7DD4x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y23efgEv,_ZTv0_n16_N3ccc7DD4x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y23efgEv,_ZThn4_N3ccc7DD4x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y23pqrEv,_ZTv0_n12_N3ccc7DD4x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y23pqrEv,_ZThn4_N3ccc7DD4x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y2E = {  "_ZN3ccc7DD4x5y2E", // class name
  bases__ZN3ccc7DD4x5y2E, 2,
  &(vtc__ZN3ccc7DD4x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1884,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y3  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x5y33abcEv
  ~CC4x5y3(); // tgen
  CC4x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y3E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y33efgEv");}
void  ccc::CC4x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y33pqrEv");}
void  ccc::CC4x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y33abcEv");}
ccc::CC4x5y3 ::~CC4x5y3(){ note_dtor("_ZN3ccc7CC4x5y3E", this);} // tgen
ccc::CC4x5y3 ::CC4x5y3(){ note_ctor("_ZN3ccc7CC4x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y3E, buf);
    ::ccc::CC4x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y3E);
    dp->::ccc::CC4x5y3::~CC4x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y3E(Test__ZN3ccc7CC4x5y3E, "_ZN3ccc7CC4x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y3C1Ev();
extern void _ZN3ccc7CC4x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y3E[] = {
  NSPAIR(_ZN3ccc7CC4x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y3E[];
extern void _ZN3ccc7CC4x5y33pqrEv();
extern void _ZN3ccc7CC4x5y33efgEv();
extern void _ZN3ccc7CC4x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y33pqrEv,_ZTv0_n12_N3ccc7CC4x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33pqrEv,_ZThn4_N3ccc7CC4x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y33abcEv,_ZTv0_n16_N3ccc7CC4x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33abcEv,_ZThn4_N3ccc7CC4x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y33efgEv,_ZTv0_n20_N3ccc7CC4x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33efgEv,_ZThn4_N3ccc7CC4x5y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y33pqrEv,_ZTv0_n12_N3ccc7CC4x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y33abcEv,_ZTv0_n16_N3ccc7CC4x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y33efgEv,_ZTv0_n20_N3ccc7CC4x5y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y3E[] = {
  {&(_ZTVN3ccc7CC4x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y3E[];
static VTBL_ENTRY alt_thunk_names1885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y33efgEv,_ZTv0_n20_N3ccc7CC4x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y33efgEv,_ZThn4_N3ccc7CC4x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y33abcEv,_ZTv0_n16_N3ccc7CC4x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y33abcEv,_ZThn4_N3ccc7CC4x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y33pqrEv,_ZTv0_n12_N3ccc7CC4x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y33pqrEv,_ZThn4_N3ccc7CC4x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y3E = {  "_ZN3ccc7CC4x5y3E", // class name
  bases__ZN3ccc7CC4x5y3E, 2,
  &(vtc__ZN3ccc7CC4x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1885,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y3  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD4x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x5y33abcEv
  ~DD4x5y3(); // tgen
  DD4x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y33efgEv");}
void  ccc::DD4x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y33pqrEv");}
void  ccc::DD4x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y33abcEv");}
ccc::DD4x5y3 ::~DD4x5y3(){ note_dtor("_ZN3ccc7DD4x5y3E", this);} // tgen
ccc::DD4x5y3 ::DD4x5y3(){ note_ctor("_ZN3ccc7DD4x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y3E, buf);
    ::ccc::DD4x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y3E);
    dp->::ccc::DD4x5y3::~DD4x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y3E(Test__ZN3ccc7DD4x5y3E, "_ZN3ccc7DD4x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y3C1Ev();
extern void _ZN3ccc7DD4x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y3E[] = {
  NSPAIR(_ZN3ccc7DD4x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y3E[];
extern void _ZN3ccc7DD4x5y33pqrEv();
extern void _ZN3ccc7DD4x5y33abcEv();
extern void _ZN3ccc7DD4x5y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y33pqrEv,_ZTv0_n12_N3ccc7DD4x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y33pqrEv,_ZThn4_N3ccc7DD4x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y33efgEv,_ZTv0_n16_N3ccc7DD4x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y33efgEv,_ZThn4_N3ccc7DD4x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y33abcEv,_ZTv0_n20_N3ccc7DD4x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y33abcEv,_ZThn4_N3ccc7DD4x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y33pqrEv,_ZTv0_n12_N3ccc7DD4x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y33efgEv,_ZTv0_n16_N3ccc7DD4x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y33abcEv,_ZTv0_n20_N3ccc7DD4x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y3E[] = {
  {&(_ZTVN3ccc7DD4x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y3E[];
static VTBL_ENTRY alt_thunk_names1886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y33abcEv,_ZTv0_n20_N3ccc7DD4x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y33abcEv,_ZThn4_N3ccc7DD4x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y33efgEv,_ZTv0_n16_N3ccc7DD4x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y33efgEv,_ZThn4_N3ccc7DD4x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y33pqrEv,_ZTv0_n12_N3ccc7DD4x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y33pqrEv,_ZThn4_N3ccc7DD4x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y3E = {  "_ZN3ccc7DD4x5y3E", // class name
  bases__ZN3ccc7DD4x5y3E, 2,
  &(vtc__ZN3ccc7DD4x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1886,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y4  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC4x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y43efgEv
  ~CC4x5y4(); // tgen
  CC4x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y4E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y43pqrEv");}
void  ccc::CC4x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y43abcEv");}
void  ccc::CC4x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y43efgEv");}
ccc::CC4x5y4 ::~CC4x5y4(){ note_dtor("_ZN3ccc7CC4x5y4E", this);} // tgen
ccc::CC4x5y4 ::CC4x5y4(){ note_ctor("_ZN3ccc7CC4x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y4E, buf);
    ::ccc::CC4x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y4E);
    dp->::ccc::CC4x5y4::~CC4x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y4E(Test__ZN3ccc7CC4x5y4E, "_ZN3ccc7CC4x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y4C1Ev();
extern void _ZN3ccc7CC4x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y4E[] = {
  NSPAIR(_ZN3ccc7CC4x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y4E[];
extern void _ZN3ccc7CC4x5y43pqrEv();
extern void _ZN3ccc7CC4x5y43efgEv();
extern void _ZN3ccc7CC4x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y43pqrEv,_ZTv0_n12_N3ccc7CC4x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43pqrEv,_ZThn4_N3ccc7CC4x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y43abcEv,_ZTv0_n16_N3ccc7CC4x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43abcEv,_ZThn4_N3ccc7CC4x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y43efgEv,_ZTv0_n20_N3ccc7CC4x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43efgEv,_ZThn4_N3ccc7CC4x5y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y43pqrEv,_ZTv0_n12_N3ccc7CC4x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y43abcEv,_ZTv0_n16_N3ccc7CC4x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y43efgEv,_ZTv0_n20_N3ccc7CC4x5y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y4E[] = {
  {&(_ZTVN3ccc7CC4x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y4E[];
static VTBL_ENTRY alt_thunk_names1887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y43efgEv,_ZTv0_n20_N3ccc7CC4x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y43efgEv,_ZThn4_N3ccc7CC4x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y43abcEv,_ZTv0_n16_N3ccc7CC4x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y43abcEv,_ZThn4_N3ccc7CC4x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y43pqrEv,_ZTv0_n12_N3ccc7CC4x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y43pqrEv,_ZThn4_N3ccc7CC4x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y4E = {  "_ZN3ccc7CC4x5y4E", // class name
  bases__ZN3ccc7CC4x5y4E, 2,
  &(vtc__ZN3ccc7CC4x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1887,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y4  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD4x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x5y43efgEv
  ~DD4x5y4(); // tgen
  DD4x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y43pqrEv");}
void  ccc::DD4x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y43abcEv");}
void  ccc::DD4x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y43efgEv");}
ccc::DD4x5y4 ::~DD4x5y4(){ note_dtor("_ZN3ccc7DD4x5y4E", this);} // tgen
ccc::DD4x5y4 ::DD4x5y4(){ note_ctor("_ZN3ccc7DD4x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y4E, buf);
    ::ccc::DD4x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y4E);
    dp->::ccc::DD4x5y4::~DD4x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y4E(Test__ZN3ccc7DD4x5y4E, "_ZN3ccc7DD4x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y4C1Ev();
extern void _ZN3ccc7DD4x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y4E[] = {
  NSPAIR(_ZN3ccc7DD4x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y4E[];
extern void _ZN3ccc7DD4x5y43pqrEv();
extern void _ZN3ccc7DD4x5y43abcEv();
extern void _ZN3ccc7DD4x5y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y43pqrEv,_ZTv0_n12_N3ccc7DD4x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y43pqrEv,_ZThn4_N3ccc7DD4x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y43efgEv,_ZTv0_n16_N3ccc7DD4x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y43efgEv,_ZThn4_N3ccc7DD4x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y43abcEv,_ZTv0_n20_N3ccc7DD4x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y43abcEv,_ZThn4_N3ccc7DD4x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y43pqrEv,_ZTv0_n12_N3ccc7DD4x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y43efgEv,_ZTv0_n16_N3ccc7DD4x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y43abcEv,_ZTv0_n20_N3ccc7DD4x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y4E[] = {
  {&(_ZTVN3ccc7DD4x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y4E[];
static VTBL_ENTRY alt_thunk_names1888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y43abcEv,_ZTv0_n20_N3ccc7DD4x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y43abcEv,_ZThn4_N3ccc7DD4x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y43efgEv,_ZTv0_n16_N3ccc7DD4x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y43efgEv,_ZThn4_N3ccc7DD4x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y43pqrEv,_ZTv0_n12_N3ccc7DD4x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y43pqrEv,_ZThn4_N3ccc7DD4x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y4E = {  "_ZN3ccc7DD4x5y4E", // class name
  bases__ZN3ccc7DD4x5y4E, 2,
  &(vtc__ZN3ccc7DD4x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1888,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y5  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC4x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y53abcEv
  ~CC4x5y5(); // tgen
  CC4x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y5E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y53pqrEv");}
void  ccc::CC4x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y53efgEv");}
void  ccc::CC4x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y53abcEv");}
ccc::CC4x5y5 ::~CC4x5y5(){ note_dtor("_ZN3ccc7CC4x5y5E", this);} // tgen
ccc::CC4x5y5 ::CC4x5y5(){ note_ctor("_ZN3ccc7CC4x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y5E, buf);
    ::ccc::CC4x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y5E);
    dp->::ccc::CC4x5y5::~CC4x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y5E(Test__ZN3ccc7CC4x5y5E, "_ZN3ccc7CC4x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y5C1Ev();
extern void _ZN3ccc7CC4x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y5E[] = {
  NSPAIR(_ZN3ccc7CC4x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y5E[];
extern void _ZN3ccc7CC4x5y53pqrEv();
extern void _ZN3ccc7CC4x5y53efgEv();
extern void _ZN3ccc7CC4x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y53pqrEv,_ZTv0_n12_N3ccc7CC4x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53pqrEv,_ZThn4_N3ccc7CC4x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y53abcEv,_ZTv0_n16_N3ccc7CC4x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53abcEv,_ZThn4_N3ccc7CC4x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y53efgEv,_ZTv0_n20_N3ccc7CC4x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53efgEv,_ZThn4_N3ccc7CC4x5y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y53pqrEv,_ZTv0_n12_N3ccc7CC4x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y53abcEv,_ZTv0_n16_N3ccc7CC4x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y53efgEv,_ZTv0_n20_N3ccc7CC4x5y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y5E[] = {
  {&(_ZTVN3ccc7CC4x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y5E[];
static VTBL_ENTRY alt_thunk_names1889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y53efgEv,_ZTv0_n20_N3ccc7CC4x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y53efgEv,_ZThn4_N3ccc7CC4x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y53abcEv,_ZTv0_n16_N3ccc7CC4x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y53abcEv,_ZThn4_N3ccc7CC4x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y53pqrEv,_ZTv0_n12_N3ccc7CC4x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y53pqrEv,_ZThn4_N3ccc7CC4x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y5E = {  "_ZN3ccc7CC4x5y5E", // class name
  bases__ZN3ccc7CC4x5y5E, 2,
  &(vtc__ZN3ccc7CC4x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1889,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y5  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD4x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x5y53abcEv
  ~DD4x5y5(); // tgen
  DD4x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y53pqrEv");}
void  ccc::DD4x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y53efgEv");}
void  ccc::DD4x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y53abcEv");}
ccc::DD4x5y5 ::~DD4x5y5(){ note_dtor("_ZN3ccc7DD4x5y5E", this);} // tgen
ccc::DD4x5y5 ::DD4x5y5(){ note_ctor("_ZN3ccc7DD4x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y5E, buf);
    ::ccc::DD4x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y5E);
    dp->::ccc::DD4x5y5::~DD4x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y5E(Test__ZN3ccc7DD4x5y5E, "_ZN3ccc7DD4x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y5C1Ev();
extern void _ZN3ccc7DD4x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y5E[] = {
  NSPAIR(_ZN3ccc7DD4x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y5E[];
extern void _ZN3ccc7DD4x5y53pqrEv();
extern void _ZN3ccc7DD4x5y53abcEv();
extern void _ZN3ccc7DD4x5y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y53pqrEv,_ZTv0_n12_N3ccc7DD4x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y53pqrEv,_ZThn4_N3ccc7DD4x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y53efgEv,_ZTv0_n16_N3ccc7DD4x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y53efgEv,_ZThn4_N3ccc7DD4x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y53abcEv,_ZTv0_n20_N3ccc7DD4x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y53abcEv,_ZThn4_N3ccc7DD4x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y53pqrEv,_ZTv0_n12_N3ccc7DD4x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y53efgEv,_ZTv0_n16_N3ccc7DD4x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y53abcEv,_ZTv0_n20_N3ccc7DD4x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y5E[] = {
  {&(_ZTVN3ccc7DD4x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y5E[];
static VTBL_ENTRY alt_thunk_names1890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y53abcEv,_ZTv0_n20_N3ccc7DD4x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y53abcEv,_ZThn4_N3ccc7DD4x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y53efgEv,_ZTv0_n16_N3ccc7DD4x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y53efgEv,_ZThn4_N3ccc7DD4x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y53pqrEv,_ZTv0_n12_N3ccc7DD4x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y53pqrEv,_ZThn4_N3ccc7DD4x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y5E = {  "_ZN3ccc7DD4x5y5E", // class name
  bases__ZN3ccc7DD4x5y5E, 2,
  &(vtc__ZN3ccc7DD4x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1890,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y6  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y63efgEv
  ~CC4x5y6(); // tgen
  CC4x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y6E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y63abcEv");}
void  ccc::CC4x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y63efgEv");}
ccc::CC4x5y6 ::~CC4x5y6(){ note_dtor("_ZN3ccc7CC4x5y6E", this);} // tgen
ccc::CC4x5y6 ::CC4x5y6(){ note_ctor("_ZN3ccc7CC4x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y6E, buf);
    ::ccc::CC4x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y6E);
    dp->::ccc::CC4x5y6::~CC4x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y6E(Test__ZN3ccc7CC4x5y6E, "_ZN3ccc7CC4x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y6C1Ev();
extern void _ZN3ccc7CC4x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y6E[] = {
  NSPAIR(_ZN3ccc7CC4x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC4x5y63efgEv();
extern void _ZN3ccc7CC4x5y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y63abcEv,_ZTv0_n16_N3ccc7CC4x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y63abcEv,_ZThn4_N3ccc7CC4x5y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y63efgEv,_ZTv0_n20_N3ccc7CC4x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y63efgEv,_ZThn4_N3ccc7CC4x5y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y63abcEv,_ZTv0_n16_N3ccc7CC4x5y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y63efgEv,_ZTv0_n20_N3ccc7CC4x5y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y6E[] = {
  {&(_ZTVN3ccc7CC4x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y6E[];
static VTBL_ENTRY alt_thunk_names1891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y63efgEv,_ZTv0_n20_N3ccc7CC4x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y63efgEv,_ZThn4_N3ccc7CC4x5y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y63abcEv,_ZTv0_n16_N3ccc7CC4x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y63abcEv,_ZThn4_N3ccc7CC4x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y6E = {  "_ZN3ccc7CC4x5y6E", // class name
  bases__ZN3ccc7CC4x5y6E, 2,
  &(vtc__ZN3ccc7CC4x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1891,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y6  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD4x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x5y63efgEv
  ~DD4x5y6(); // tgen
  DD4x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y63abcEv");}
void  ccc::DD4x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y63efgEv");}
ccc::DD4x5y6 ::~DD4x5y6(){ note_dtor("_ZN3ccc7DD4x5y6E", this);} // tgen
ccc::DD4x5y6 ::DD4x5y6(){ note_ctor("_ZN3ccc7DD4x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y6E, buf);
    ::ccc::DD4x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y6E);
    dp->::ccc::DD4x5y6::~DD4x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y6E(Test__ZN3ccc7DD4x5y6E, "_ZN3ccc7DD4x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y6C1Ev();
extern void _ZN3ccc7DD4x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y6E[] = {
  NSPAIR(_ZN3ccc7DD4x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x5y63abcEv();
extern void _ZN3ccc7DD4x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y63efgEv,_ZTv0_n16_N3ccc7DD4x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y63efgEv,_ZThn4_N3ccc7DD4x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y63abcEv,_ZTv0_n20_N3ccc7DD4x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y63abcEv,_ZThn4_N3ccc7DD4x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y63efgEv,_ZTv0_n16_N3ccc7DD4x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y63abcEv,_ZTv0_n20_N3ccc7DD4x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y6E[] = {
  {&(_ZTVN3ccc7DD4x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y6E[];
static VTBL_ENTRY alt_thunk_names1892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y63abcEv,_ZTv0_n20_N3ccc7DD4x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y63abcEv,_ZThn4_N3ccc7DD4x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y63efgEv,_ZTv0_n16_N3ccc7DD4x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y63efgEv,_ZThn4_N3ccc7DD4x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y6E = {  "_ZN3ccc7DD4x5y6E", // class name
  bases__ZN3ccc7DD4x5y6E, 2,
  &(vtc__ZN3ccc7DD4x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1892,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y7  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y73pqrEv
  ~CC4x5y7(); // tgen
  CC4x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y7E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y73abcEv");}
void  ccc::CC4x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y73pqrEv");}
ccc::CC4x5y7 ::~CC4x5y7(){ note_dtor("_ZN3ccc7CC4x5y7E", this);} // tgen
ccc::CC4x5y7 ::CC4x5y7(){ note_ctor("_ZN3ccc7CC4x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y7E, buf);
    ::ccc::CC4x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y7E);
    dp->::ccc::CC4x5y7::~CC4x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y7E(Test__ZN3ccc7CC4x5y7E, "_ZN3ccc7CC4x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y7C1Ev();
extern void _ZN3ccc7CC4x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y7E[] = {
  NSPAIR(_ZN3ccc7CC4x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y7E[];
extern void _ZN3ccc7CC4x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC4x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y73pqrEv,_ZTv0_n12_N3ccc7CC4x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y73pqrEv,_ZThn4_N3ccc7CC4x5y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y73abcEv,_ZTv0_n16_N3ccc7CC4x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y73abcEv,_ZThn4_N3ccc7CC4x5y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y73pqrEv,_ZTv0_n12_N3ccc7CC4x5y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y73abcEv,_ZTv0_n16_N3ccc7CC4x5y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y7E[] = {
  {&(_ZTVN3ccc7CC4x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y7E[];
static VTBL_ENTRY alt_thunk_names1893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y73abcEv,_ZTv0_n16_N3ccc7CC4x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y73abcEv,_ZThn4_N3ccc7CC4x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y73pqrEv,_ZTv0_n12_N3ccc7CC4x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y73pqrEv,_ZThn4_N3ccc7CC4x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y7E = {  "_ZN3ccc7CC4x5y7E", // class name
  bases__ZN3ccc7CC4x5y7E, 2,
  &(vtc__ZN3ccc7CC4x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1893,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y7  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD4x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y73pqrEv
  ~DD4x5y7(); // tgen
  DD4x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y73abcEv");}
void  ccc::DD4x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y73pqrEv");}
ccc::DD4x5y7 ::~DD4x5y7(){ note_dtor("_ZN3ccc7DD4x5y7E", this);} // tgen
ccc::DD4x5y7 ::DD4x5y7(){ note_ctor("_ZN3ccc7DD4x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y7E, buf);
    ::ccc::DD4x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y7E);
    dp->::ccc::DD4x5y7::~DD4x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y7E(Test__ZN3ccc7DD4x5y7E, "_ZN3ccc7DD4x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y7C1Ev();
extern void _ZN3ccc7DD4x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y7E[] = {
  NSPAIR(_ZN3ccc7DD4x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y7E[];
extern void _ZN3ccc7DD4x5y73pqrEv();
extern void _ZN3ccc7DD4x5y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y73pqrEv,_ZTv0_n12_N3ccc7DD4x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y73pqrEv,_ZThn4_N3ccc7DD4x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y73abcEv,_ZTv0_n20_N3ccc7DD4x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y73abcEv,_ZThn4_N3ccc7DD4x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y73pqrEv,_ZTv0_n12_N3ccc7DD4x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y73abcEv,_ZTv0_n20_N3ccc7DD4x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y7E[] = {
  {&(_ZTVN3ccc7DD4x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y7E[];
static VTBL_ENTRY alt_thunk_names1894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y73abcEv,_ZTv0_n20_N3ccc7DD4x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y73abcEv,_ZThn4_N3ccc7DD4x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y73pqrEv,_ZTv0_n12_N3ccc7DD4x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y73pqrEv,_ZThn4_N3ccc7DD4x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y7E = {  "_ZN3ccc7DD4x5y7E", // class name
  bases__ZN3ccc7DD4x5y7E, 2,
  &(vtc__ZN3ccc7DD4x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1894,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y8  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y83abcEv
  ~CC4x5y8(); // tgen
  CC4x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y8E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y83efgEv");}
void  ccc::CC4x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y83abcEv");}
ccc::CC4x5y8 ::~CC4x5y8(){ note_dtor("_ZN3ccc7CC4x5y8E", this);} // tgen
ccc::CC4x5y8 ::CC4x5y8(){ note_ctor("_ZN3ccc7CC4x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y8E, buf);
    ::ccc::CC4x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y8E);
    dp->::ccc::CC4x5y8::~CC4x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y8E(Test__ZN3ccc7CC4x5y8E, "_ZN3ccc7CC4x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y8C1Ev();
extern void _ZN3ccc7CC4x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y8E[] = {
  NSPAIR(_ZN3ccc7CC4x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC4x5y83efgEv();
extern void _ZN3ccc7CC4x5y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x5y83abcEv,_ZTv0_n16_N3ccc7CC4x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y83abcEv,_ZThn4_N3ccc7CC4x5y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y83efgEv,_ZTv0_n20_N3ccc7CC4x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y83efgEv,_ZThn4_N3ccc7CC4x5y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x5y83abcEv,_ZTv0_n16_N3ccc7CC4x5y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y83efgEv,_ZTv0_n20_N3ccc7CC4x5y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y8E[] = {
  {&(_ZTVN3ccc7CC4x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y8E[];
static VTBL_ENTRY alt_thunk_names1895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y83efgEv,_ZTv0_n20_N3ccc7CC4x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y83efgEv,_ZThn4_N3ccc7CC4x5y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x5y83abcEv,_ZTv0_n16_N3ccc7CC4x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y83abcEv,_ZThn4_N3ccc7CC4x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y8E = {  "_ZN3ccc7CC4x5y8E", // class name
  bases__ZN3ccc7CC4x5y8E, 2,
  &(vtc__ZN3ccc7CC4x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1895,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y8  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD4x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x5y83abcEv
  ~DD4x5y8(); // tgen
  DD4x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y83efgEv");}
void  ccc::DD4x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x5y83abcEv");}
ccc::DD4x5y8 ::~DD4x5y8(){ note_dtor("_ZN3ccc7DD4x5y8E", this);} // tgen
ccc::DD4x5y8 ::DD4x5y8(){ note_ctor("_ZN3ccc7DD4x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y8E, buf);
    ::ccc::DD4x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y8E);
    dp->::ccc::DD4x5y8::~DD4x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y8E(Test__ZN3ccc7DD4x5y8E, "_ZN3ccc7DD4x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y8C1Ev();
extern void _ZN3ccc7DD4x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y8E[] = {
  NSPAIR(_ZN3ccc7DD4x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x5y83abcEv();
extern void _ZN3ccc7DD4x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y83efgEv,_ZTv0_n16_N3ccc7DD4x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y83efgEv,_ZThn4_N3ccc7DD4x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD4x5y83abcEv,_ZTv0_n20_N3ccc7DD4x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y83abcEv,_ZThn4_N3ccc7DD4x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y83efgEv,_ZTv0_n16_N3ccc7DD4x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD4x5y83abcEv,_ZTv0_n20_N3ccc7DD4x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y8E[] = {
  {&(_ZTVN3ccc7DD4x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y8E[];
static VTBL_ENTRY alt_thunk_names1896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD4x5y83abcEv,_ZTv0_n20_N3ccc7DD4x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y83abcEv,_ZThn4_N3ccc7DD4x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y83efgEv,_ZTv0_n16_N3ccc7DD4x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y83efgEv,_ZThn4_N3ccc7DD4x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y8E = {  "_ZN3ccc7DD4x5y8E", // class name
  bases__ZN3ccc7DD4x5y8E, 2,
  &(vtc__ZN3ccc7DD4x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1896,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y9  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y93pqrEv
  ~CC4x5y9(); // tgen
  CC4x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y9E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y93efgEv");}
void  ccc::CC4x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y93pqrEv");}
ccc::CC4x5y9 ::~CC4x5y9(){ note_dtor("_ZN3ccc7CC4x5y9E", this);} // tgen
ccc::CC4x5y9 ::CC4x5y9(){ note_ctor("_ZN3ccc7CC4x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y9E, buf);
    ::ccc::CC4x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC4x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y9E);
    dp->::ccc::CC4x5y9::~CC4x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y9E(Test__ZN3ccc7CC4x5y9E, "_ZN3ccc7CC4x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y9C1Ev();
extern void _ZN3ccc7CC4x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y9E[] = {
  NSPAIR(_ZN3ccc7CC4x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y9E[];
extern void _ZN3ccc7CC4x5y93pqrEv();
extern void _ZN3ccc7CC4x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x5y93pqrEv,_ZTv0_n12_N3ccc7CC4x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y93pqrEv,_ZThn4_N3ccc7CC4x5y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x5y93efgEv,_ZTv0_n20_N3ccc7CC4x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y93efgEv,_ZThn4_N3ccc7CC4x5y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x5y93pqrEv,_ZTv0_n12_N3ccc7CC4x5y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x5y93efgEv,_ZTv0_n20_N3ccc7CC4x5y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x5y9E[] = {
  {&(_ZTVN3ccc7CC4x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x5y9E[];
static VTBL_ENTRY alt_thunk_names1897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x5y93efgEv,_ZTv0_n20_N3ccc7CC4x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y93efgEv,_ZThn4_N3ccc7CC4x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x5y93pqrEv,_ZTv0_n12_N3ccc7CC4x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x5y93pqrEv,_ZThn4_N3ccc7CC4x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x5y9E = {  "_ZN3ccc7CC4x5y9E", // class name
  bases__ZN3ccc7CC4x5y9E, 2,
  &(vtc__ZN3ccc7CC4x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x5y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1897,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y9  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD4x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x5y93pqrEv
  ~DD4x5y9(); // tgen
  DD4x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x5y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x5y93efgEv");}
void  ccc::DD4x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x5y93pqrEv");}
ccc::DD4x5y9 ::~DD4x5y9(){ note_dtor("_ZN3ccc7DD4x5y9E", this);} // tgen
ccc::DD4x5y9 ::DD4x5y9(){ note_ctor("_ZN3ccc7DD4x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x5y9E, buf);
    ::ccc::DD4x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x5y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD4x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x5y9E);
    dp->::ccc::DD4x5y9::~DD4x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x5y9E(Test__ZN3ccc7DD4x5y9E, "_ZN3ccc7DD4x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x5y9C1Ev();
extern void _ZN3ccc7DD4x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x5y9E[] = {
  NSPAIR(_ZN3ccc7DD4x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD4x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y9E[];
extern void _ZN3ccc7DD4x5y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x5y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x5y93pqrEv,_ZTv0_n12_N3ccc7DD4x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y93pqrEv,_ZThn4_N3ccc7DD4x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x5y93efgEv,_ZTv0_n16_N3ccc7DD4x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x5y93efgEv,_ZThn4_N3ccc7DD4x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x5y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x5y93pqrEv,_ZTv0_n12_N3ccc7DD4x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x5y93efgEv,_ZTv0_n16_N3ccc7DD4x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x5y9E[] = {
  {&(_ZTVN3ccc7DD4x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD4x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x5y9E[];
static VTBL_ENTRY alt_thunk_names1898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x5y93efgEv,_ZTv0_n16_N3ccc7DD4x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y93efgEv,_ZThn4_N3ccc7DD4x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x5y93pqrEv,_ZTv0_n12_N3ccc7DD4x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x5y93pqrEv,_ZThn4_N3ccc7DD4x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x5y9E = {  "_ZN3ccc7DD4x5y9E", // class name
  bases__ZN3ccc7DD4x5y9E, 2,
  &(vtc__ZN3ccc7DD4x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x5y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1898,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y10  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x5y103abcEv
  ~CC4x5y10(); // tgen
  CC4x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y10E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y103pqrEv");}
void  ccc::CC4x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x5y103abcEv");}
ccc::CC4x5y10 ::~CC4x5y10(){ note_dtor("_ZN3ccc8CC4x5y10E", this);} // tgen
ccc::CC4x5y10 ::CC4x5y10(){ note_ctor("_ZN3ccc8CC4x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y10E, buf);
    ::ccc::CC4x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y10E);
    dp->::ccc::CC4x5y10::~CC4x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y10E(Test__ZN3ccc8CC4x5y10E, "_ZN3ccc8CC4x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y10C1Ev();
extern void _ZN3ccc8CC4x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y10E[] = {
  NSPAIR(_ZN3ccc8CC4x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y10E[];
extern void _ZN3ccc8CC4x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC4x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x5y103pqrEv,_ZTv0_n12_N3ccc8CC4x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y103pqrEv,_ZThn4_N3ccc8CC4x5y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x5y103abcEv,_ZTv0_n16_N3ccc8CC4x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y103abcEv,_ZThn4_N3ccc8CC4x5y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x5y103pqrEv,_ZTv0_n12_N3ccc8CC4x5y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x5y103abcEv,_ZTv0_n16_N3ccc8CC4x5y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y10E[] = {
  {&(_ZTVN3ccc8CC4x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y10E[];
static VTBL_ENTRY alt_thunk_names1899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x5y103abcEv,_ZTv0_n16_N3ccc8CC4x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y103abcEv,_ZThn4_N3ccc8CC4x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x5y103pqrEv,_ZTv0_n12_N3ccc8CC4x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y103pqrEv,_ZThn4_N3ccc8CC4x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x5y10E = {  "_ZN3ccc8CC4x5y10E", // class name
  bases__ZN3ccc8CC4x5y10E, 2,
  &(vtc__ZN3ccc8CC4x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1899,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y10  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD4x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x5y103abcEv
  ~DD4x5y10(); // tgen
  DD4x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x5y103pqrEv");}
void  ccc::DD4x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x5y103abcEv");}
ccc::DD4x5y10 ::~DD4x5y10(){ note_dtor("_ZN3ccc8DD4x5y10E", this);} // tgen
ccc::DD4x5y10 ::DD4x5y10(){ note_ctor("_ZN3ccc8DD4x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y10E, buf);
    ::ccc::DD4x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y10E);
    dp->::ccc::DD4x5y10::~DD4x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y10E(Test__ZN3ccc8DD4x5y10E, "_ZN3ccc8DD4x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y10C1Ev();
extern void _ZN3ccc8DD4x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y10E[] = {
  NSPAIR(_ZN3ccc8DD4x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y10E[];
extern void _ZN3ccc8DD4x5y103pqrEv();
extern void _ZN3ccc8DD4x5y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x5y103pqrEv,_ZTv0_n12_N3ccc8DD4x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y103pqrEv,_ZThn4_N3ccc8DD4x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x5y103abcEv,_ZTv0_n20_N3ccc8DD4x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y103abcEv,_ZThn4_N3ccc8DD4x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x5y103pqrEv,_ZTv0_n12_N3ccc8DD4x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x5y103abcEv,_ZTv0_n20_N3ccc8DD4x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y10E[] = {
  {&(_ZTVN3ccc8DD4x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y10E[];
static VTBL_ENTRY alt_thunk_names1900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x5y103abcEv,_ZTv0_n20_N3ccc8DD4x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y103abcEv,_ZThn4_N3ccc8DD4x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x5y103pqrEv,_ZTv0_n12_N3ccc8DD4x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y103pqrEv,_ZThn4_N3ccc8DD4x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x5y10E = {  "_ZN3ccc8DD4x5y10E", // class name
  bases__ZN3ccc8DD4x5y10E, 2,
  &(vtc__ZN3ccc8DD4x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1900,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y11  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x5y113efgEv
  ~CC4x5y11(); // tgen
  CC4x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y11E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y113pqrEv");}
void  ccc::CC4x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x5y113efgEv");}
ccc::CC4x5y11 ::~CC4x5y11(){ note_dtor("_ZN3ccc8CC4x5y11E", this);} // tgen
ccc::CC4x5y11 ::CC4x5y11(){ note_ctor("_ZN3ccc8CC4x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y11E, buf);
    ::ccc::CC4x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y11E);
    dp->::ccc::CC4x5y11::~CC4x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y11E(Test__ZN3ccc8CC4x5y11E, "_ZN3ccc8CC4x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y11C1Ev();
extern void _ZN3ccc8CC4x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y11E[] = {
  NSPAIR(_ZN3ccc8CC4x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y11E[];
extern void _ZN3ccc8CC4x5y113pqrEv();
extern void _ZN3ccc8CC4x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x5y113pqrEv,_ZTv0_n12_N3ccc8CC4x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y113pqrEv,_ZThn4_N3ccc8CC4x5y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x5y113efgEv,_ZTv0_n20_N3ccc8CC4x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y113efgEv,_ZThn4_N3ccc8CC4x5y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x5y113pqrEv,_ZTv0_n12_N3ccc8CC4x5y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x5y113efgEv,_ZTv0_n20_N3ccc8CC4x5y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y11E[] = {
  {&(_ZTVN3ccc8CC4x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y11E[];
static VTBL_ENTRY alt_thunk_names1901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x5y113efgEv,_ZTv0_n20_N3ccc8CC4x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y113efgEv,_ZThn4_N3ccc8CC4x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x5y113pqrEv,_ZTv0_n12_N3ccc8CC4x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y113pqrEv,_ZThn4_N3ccc8CC4x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x5y11E = {  "_ZN3ccc8CC4x5y11E", // class name
  bases__ZN3ccc8CC4x5y11E, 2,
  &(vtc__ZN3ccc8CC4x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1901,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y11  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD4x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x5y113efgEv
  ~DD4x5y11(); // tgen
  DD4x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x5y113pqrEv");}
void  ccc::DD4x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x5y113efgEv");}
ccc::DD4x5y11 ::~DD4x5y11(){ note_dtor("_ZN3ccc8DD4x5y11E", this);} // tgen
ccc::DD4x5y11 ::DD4x5y11(){ note_ctor("_ZN3ccc8DD4x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y11E, buf);
    ::ccc::DD4x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y11E);
    dp->::ccc::DD4x5y11::~DD4x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y11E(Test__ZN3ccc8DD4x5y11E, "_ZN3ccc8DD4x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y11C1Ev();
extern void _ZN3ccc8DD4x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y11E[] = {
  NSPAIR(_ZN3ccc8DD4x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y11E[];
extern void _ZN3ccc8DD4x5y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x5y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x5y113pqrEv,_ZTv0_n12_N3ccc8DD4x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y113pqrEv,_ZThn4_N3ccc8DD4x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x5y113efgEv,_ZTv0_n16_N3ccc8DD4x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y113efgEv,_ZThn4_N3ccc8DD4x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x5y113pqrEv,_ZTv0_n12_N3ccc8DD4x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x5y113efgEv,_ZTv0_n16_N3ccc8DD4x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y11E[] = {
  {&(_ZTVN3ccc8DD4x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y11E[];
static VTBL_ENTRY alt_thunk_names1902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x5y113efgEv,_ZTv0_n16_N3ccc8DD4x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y113efgEv,_ZThn4_N3ccc8DD4x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x5y113pqrEv,_ZTv0_n12_N3ccc8DD4x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y113pqrEv,_ZThn4_N3ccc8DD4x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x5y11E = {  "_ZN3ccc8DD4x5y11E", // class name
  bases__ZN3ccc8DD4x5y11E, 2,
  &(vtc__ZN3ccc8DD4x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1902,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y12  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC4x5y123abcEv
  ~CC4x5y12(); // tgen
  CC4x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x5y123abcEv");}
ccc::CC4x5y12 ::~CC4x5y12(){ note_dtor("_ZN3ccc8CC4x5y12E", this);} // tgen
ccc::CC4x5y12 ::CC4x5y12(){ note_ctor("_ZN3ccc8CC4x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y12E, buf);
    ::ccc::CC4x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y12E);
    dp->::ccc::CC4x5y12::~CC4x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y12E(Test__ZN3ccc8CC4x5y12E, "_ZN3ccc8CC4x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y12C1Ev();
extern void _ZN3ccc8CC4x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y12E[] = {
  NSPAIR(_ZN3ccc8CC4x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC4x5y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x5y123abcEv,_ZTv0_n16_N3ccc8CC4x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y123abcEv,_ZThn4_N3ccc8CC4x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x5y123abcEv,_ZTv0_n16_N3ccc8CC4x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y12E[] = {
  {&(_ZTVN3ccc8CC4x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y12E[];
static VTBL_ENTRY alt_thunk_names1903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x5y123abcEv,_ZTv0_n16_N3ccc8CC4x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y123abcEv,_ZThn4_N3ccc8CC4x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x5y12E = {  "_ZN3ccc8CC4x5y12E", // class name
  bases__ZN3ccc8CC4x5y12E, 2,
  &(vtc__ZN3ccc8CC4x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1903,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y12  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD4x5y123abcEv
  ~DD4x5y12(); // tgen
  DD4x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD4x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x5y123abcEv");}
ccc::DD4x5y12 ::~DD4x5y12(){ note_dtor("_ZN3ccc8DD4x5y12E", this);} // tgen
ccc::DD4x5y12 ::DD4x5y12(){ note_ctor("_ZN3ccc8DD4x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y12E, buf);
    ::ccc::DD4x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y12E);
    dp->::ccc::DD4x5y12::~DD4x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y12E(Test__ZN3ccc8DD4x5y12E, "_ZN3ccc8DD4x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y12C1Ev();
extern void _ZN3ccc8DD4x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y12E[] = {
  NSPAIR(_ZN3ccc8DD4x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x5y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD4x5y123abcEv,_ZTv0_n20_N3ccc8DD4x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y123abcEv,_ZThn4_N3ccc8DD4x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD4x5y123abcEv,_ZTv0_n20_N3ccc8DD4x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y12E[] = {
  {&(_ZTVN3ccc8DD4x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y12E[];
static VTBL_ENTRY alt_thunk_names1904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD4x5y123abcEv,_ZTv0_n20_N3ccc8DD4x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y123abcEv,_ZThn4_N3ccc8DD4x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x5y12E = {  "_ZN3ccc8DD4x5y12E", // class name
  bases__ZN3ccc8DD4x5y12E, 2,
  &(vtc__ZN3ccc8DD4x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1904,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y13  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC4x5y133efgEv
  ~CC4x5y13(); // tgen
  CC4x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x5y133efgEv");}
ccc::CC4x5y13 ::~CC4x5y13(){ note_dtor("_ZN3ccc8CC4x5y13E", this);} // tgen
ccc::CC4x5y13 ::CC4x5y13(){ note_ctor("_ZN3ccc8CC4x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y13E, buf);
    ::ccc::CC4x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y13E);
    dp->::ccc::CC4x5y13::~CC4x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y13E(Test__ZN3ccc8CC4x5y13E, "_ZN3ccc8CC4x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y13C1Ev();
extern void _ZN3ccc8CC4x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y13E[] = {
  NSPAIR(_ZN3ccc8CC4x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC4x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x5y133efgEv,_ZTv0_n20_N3ccc8CC4x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y133efgEv,_ZThn4_N3ccc8CC4x5y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x5y133efgEv,_ZTv0_n20_N3ccc8CC4x5y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y13E[] = {
  {&(_ZTVN3ccc8CC4x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y13E[];
static VTBL_ENTRY alt_thunk_names1905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x5y133efgEv,_ZTv0_n20_N3ccc8CC4x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y133efgEv,_ZThn4_N3ccc8CC4x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x5y13E = {  "_ZN3ccc8CC4x5y13E", // class name
  bases__ZN3ccc8CC4x5y13E, 2,
  &(vtc__ZN3ccc8CC4x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1905,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y13  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD4x5y133efgEv
  ~DD4x5y13(); // tgen
  DD4x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD4x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x5y133efgEv");}
ccc::DD4x5y13 ::~DD4x5y13(){ note_dtor("_ZN3ccc8DD4x5y13E", this);} // tgen
ccc::DD4x5y13 ::DD4x5y13(){ note_ctor("_ZN3ccc8DD4x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y13E, buf);
    ::ccc::DD4x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y13E);
    dp->::ccc::DD4x5y13::~DD4x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y13E(Test__ZN3ccc8DD4x5y13E, "_ZN3ccc8DD4x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y13C1Ev();
extern void _ZN3ccc8DD4x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y13E[] = {
  NSPAIR(_ZN3ccc8DD4x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x5y133efgEv,_ZTv0_n16_N3ccc8DD4x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y133efgEv,_ZThn4_N3ccc8DD4x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x5y133efgEv,_ZTv0_n16_N3ccc8DD4x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y13E[] = {
  {&(_ZTVN3ccc8DD4x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y13E[];
static VTBL_ENTRY alt_thunk_names1906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x5y133efgEv,_ZTv0_n16_N3ccc8DD4x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y133efgEv,_ZThn4_N3ccc8DD4x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x5y13E = {  "_ZN3ccc8DD4x5y13E", // class name
  bases__ZN3ccc8DD4x5y13E, 2,
  &(vtc__ZN3ccc8DD4x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1906,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y14  : virtual ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y143pqrEv
  ~CC4x5y14(); // tgen
  CC4x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y143pqrEv");}
ccc::CC4x5y14 ::~CC4x5y14(){ note_dtor("_ZN3ccc8CC4x5y14E", this);} // tgen
ccc::CC4x5y14 ::CC4x5y14(){ note_ctor("_ZN3ccc8CC4x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y14E, buf);
    ::ccc::CC4x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y14E);
    dp->::ccc::CC4x5y14::~CC4x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y14E(Test__ZN3ccc8CC4x5y14E, "_ZN3ccc8CC4x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y14C1Ev();
extern void _ZN3ccc8CC4x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y14E[] = {
  NSPAIR(_ZN3ccc8CC4x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y14E[];
extern void _ZN3ccc8CC4x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x5y143pqrEv,_ZTv0_n12_N3ccc8CC4x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y143pqrEv,_ZThn4_N3ccc8CC4x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x5y143pqrEv,_ZTv0_n12_N3ccc8CC4x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y14E[] = {
  {&(_ZTVN3ccc8CC4x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y14E[];
static VTBL_ENTRY alt_thunk_names1907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x5y143pqrEv,_ZTv0_n12_N3ccc8CC4x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x5y143pqrEv,_ZThn4_N3ccc8CC4x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x5y14E = {  "_ZN3ccc8CC4x5y14E", // class name
  bases__ZN3ccc8CC4x5y14E, 2,
  &(vtc__ZN3ccc8CC4x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1907,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y14  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD4x5y143pqrEv
  ~DD4x5y14(); // tgen
  DD4x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x5y143pqrEv");}
ccc::DD4x5y14 ::~DD4x5y14(){ note_dtor("_ZN3ccc8DD4x5y14E", this);} // tgen
ccc::DD4x5y14 ::DD4x5y14(){ note_ctor("_ZN3ccc8DD4x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y14E, buf);
    ::ccc::DD4x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y14E);
    dp->::ccc::DD4x5y14::~DD4x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y14E(Test__ZN3ccc8DD4x5y14E, "_ZN3ccc8DD4x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y14C1Ev();
extern void _ZN3ccc8DD4x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y14E[] = {
  NSPAIR(_ZN3ccc8DD4x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y14E[];
extern void _ZN3ccc8DD4x5y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x5y143pqrEv,_ZTv0_n12_N3ccc8DD4x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x5y143pqrEv,_ZThn4_N3ccc8DD4x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x5y143pqrEv,_ZTv0_n12_N3ccc8DD4x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y14E[] = {
  {&(_ZTVN3ccc8DD4x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y14E[];
static VTBL_ENTRY alt_thunk_names1908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x5y143pqrEv,_ZTv0_n12_N3ccc8DD4x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x5y143pqrEv,_ZThn4_N3ccc8DD4x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x5y14E = {  "_ZN3ccc8DD4x5y14E", // class name
  bases__ZN3ccc8DD4x5y14E, 2,
  &(vtc__ZN3ccc8DD4x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1908,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y15  : virtual ::ccc::AA4 , ::ccc::BB5 {
  ~CC4x5y15(); // tgen
  CC4x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x5y15 ::~CC4x5y15(){ note_dtor("_ZN3ccc8CC4x5y15E", this);} // tgen
ccc::CC4x5y15 ::CC4x5y15(){ note_ctor("_ZN3ccc8CC4x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y15E, buf);
    ::ccc::CC4x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC4x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y15E);
    dp->::ccc::CC4x5y15::~CC4x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y15E(Test__ZN3ccc8CC4x5y15E, "_ZN3ccc8CC4x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y15C1Ev();
extern void _ZN3ccc8CC4x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y15E[] = {
  NSPAIR(_ZN3ccc8CC4x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x5y15E[] = {
  {&(_ZTVN3ccc8CC4x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x5y15E[];
Class_Descriptor cd__ZN3ccc8CC4x5y15E = {  "_ZN3ccc8CC4x5y15E", // class name
  bases__ZN3ccc8CC4x5y15E, 2,
  &(vtc__ZN3ccc8CC4x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x5y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x5y15  : virtual ::ccc::AA4 , virtual ::ccc::BB5 {
  ~DD4x5y15(); // tgen
  DD4x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD4x5y15 ::~DD4x5y15(){ note_dtor("_ZN3ccc8DD4x5y15E", this);} // tgen
ccc::DD4x5y15 ::DD4x5y15(){ note_ctor("_ZN3ccc8DD4x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x5y15E, buf);
    ::ccc::DD4x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x5y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD4x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x5y15E);
    dp->::ccc::DD4x5y15::~DD4x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x5y15E(Test__ZN3ccc8DD4x5y15E, "_ZN3ccc8DD4x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x5y15C1Ev();
extern void _ZN3ccc8DD4x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x5y15E[] = {
  NSPAIR(_ZN3ccc8DD4x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD4x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x5y15E[] = {
  {&(_ZTVN3ccc8DD4x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD4x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x5y15E[];
Class_Descriptor cd__ZN3ccc8DD4x5y15E = {  "_ZN3ccc8DD4x5y15E", // class name
  bases__ZN3ccc8DD4x5y15E, 2,
  &(vtc__ZN3ccc8DD4x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x5y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y0  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y03pqrEv
  ~CC4x6y0(); // tgen
  CC4x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y0E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y03abcEv");}
void  ccc::CC4x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y03efgEv");}
void  ccc::CC4x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y03pqrEv");}
ccc::CC4x6y0 ::~CC4x6y0(){ note_dtor("_ZN3ccc7CC4x6y0E", this);} // tgen
ccc::CC4x6y0 ::CC4x6y0(){ note_ctor("_ZN3ccc7CC4x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y0E, buf);
    ::ccc::CC4x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y0E);
    dp->::ccc::CC4x6y0::~CC4x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y0E(Test__ZN3ccc7CC4x6y0E, "_ZN3ccc7CC4x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y0C1Ev();
extern void _ZN3ccc7CC4x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y0E[] = {
  NSPAIR(_ZN3ccc7CC4x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y0E[];
extern void _ZN3ccc7CC4x6y03abcEv();
extern void _ZN3ccc7CC4x6y03efgEv();
extern void _ZN3ccc7CC4x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y03pqrEv,_ZTv0_n12_N3ccc7CC4x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y03pqrEv,_ZThn4_N3ccc7CC4x6y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y03abcEv,_ZTv0_n16_N3ccc7CC4x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y03abcEv,_ZThn4_N3ccc7CC4x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y03efgEv,_ZTv0_n20_N3ccc7CC4x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y03efgEv,_ZThn4_N3ccc7CC4x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y03pqrEv,_ZTv0_n12_N3ccc7CC4x6y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y03abcEv,_ZTv0_n16_N3ccc7CC4x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y03efgEv,_ZTv0_n20_N3ccc7CC4x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y0E[] = {
  {&(_ZTVN3ccc7CC4x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y0E[];
static VTBL_ENTRY alt_thunk_names1909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y03efgEv,_ZTv0_n20_N3ccc7CC4x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y03efgEv,_ZThn4_N3ccc7CC4x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y03abcEv,_ZTv0_n16_N3ccc7CC4x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y03abcEv,_ZThn4_N3ccc7CC4x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y03pqrEv,_ZTv0_n12_N3ccc7CC4x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y03pqrEv,_ZThn4_N3ccc7CC4x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y0E = {  "_ZN3ccc7CC4x6y0E", // class name
  bases__ZN3ccc7CC4x6y0E, 2,
  &(vtc__ZN3ccc7CC4x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1909,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y0  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD4x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y03pqrEv
  ~DD4x6y0(); // tgen
  DD4x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y03abcEv");}
void  ccc::DD4x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y03efgEv");}
void  ccc::DD4x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y03pqrEv");}
ccc::DD4x6y0 ::~DD4x6y0(){ note_dtor("_ZN3ccc7DD4x6y0E", this);} // tgen
ccc::DD4x6y0 ::DD4x6y0(){ note_ctor("_ZN3ccc7DD4x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y0E, buf);
    ::ccc::DD4x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y0E);
    dp->::ccc::DD4x6y0::~DD4x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y0E(Test__ZN3ccc7DD4x6y0E, "_ZN3ccc7DD4x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y0C1Ev();
extern void _ZN3ccc7DD4x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y0E[] = {
  NSPAIR(_ZN3ccc7DD4x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y0E[];
extern void _ZN3ccc7DD4x6y03pqrEv();
extern void _ZN3ccc7DD4x6y03abcEv();
extern void _ZN3ccc7DD4x6y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y03abcEv,_ZTv0_n12_N3ccc7DD4x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y03abcEv,_ZThn4_N3ccc7DD4x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y03efgEv,_ZTv0_n16_N3ccc7DD4x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y03efgEv,_ZThn4_N3ccc7DD4x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y03abcEv,_ZTv0_n12_N3ccc7DD4x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y03efgEv,_ZTv0_n16_N3ccc7DD4x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y0E[] = {
  {&(_ZTVN3ccc7DD4x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y0E[];
static VTBL_ENTRY alt_thunk_names1910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y03efgEv,_ZTv0_n16_N3ccc7DD4x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y03efgEv,_ZThn4_N3ccc7DD4x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y03abcEv,_ZTv0_n12_N3ccc7DD4x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y03abcEv,_ZThn4_N3ccc7DD4x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y0E = {  "_ZN3ccc7DD4x6y0E", // class name
  bases__ZN3ccc7DD4x6y0E, 2,
  &(vtc__ZN3ccc7DD4x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1910,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y1  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x6y13efgEv
  ~CC4x6y1(); // tgen
  CC4x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y1E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y13abcEv");}
void  ccc::CC4x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y13pqrEv");}
void  ccc::CC4x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y13efgEv");}
ccc::CC4x6y1 ::~CC4x6y1(){ note_dtor("_ZN3ccc7CC4x6y1E", this);} // tgen
ccc::CC4x6y1 ::CC4x6y1(){ note_ctor("_ZN3ccc7CC4x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y1E, buf);
    ::ccc::CC4x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y1E);
    dp->::ccc::CC4x6y1::~CC4x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y1E(Test__ZN3ccc7CC4x6y1E, "_ZN3ccc7CC4x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y1C1Ev();
extern void _ZN3ccc7CC4x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y1E[] = {
  NSPAIR(_ZN3ccc7CC4x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y1E[];
extern void _ZN3ccc7CC4x6y13abcEv();
extern void _ZN3ccc7CC4x6y13efgEv();
extern void _ZN3ccc7CC4x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y13pqrEv,_ZTv0_n12_N3ccc7CC4x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y13pqrEv,_ZThn4_N3ccc7CC4x6y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y13abcEv,_ZTv0_n16_N3ccc7CC4x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y13abcEv,_ZThn4_N3ccc7CC4x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y13efgEv,_ZTv0_n20_N3ccc7CC4x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y13efgEv,_ZThn4_N3ccc7CC4x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y13pqrEv,_ZTv0_n12_N3ccc7CC4x6y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y13abcEv,_ZTv0_n16_N3ccc7CC4x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y13efgEv,_ZTv0_n20_N3ccc7CC4x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y1E[] = {
  {&(_ZTVN3ccc7CC4x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y1E[];
static VTBL_ENTRY alt_thunk_names1911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y13efgEv,_ZTv0_n20_N3ccc7CC4x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y13efgEv,_ZThn4_N3ccc7CC4x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y13abcEv,_ZTv0_n16_N3ccc7CC4x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y13abcEv,_ZThn4_N3ccc7CC4x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y13pqrEv,_ZTv0_n12_N3ccc7CC4x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y13pqrEv,_ZThn4_N3ccc7CC4x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y1E = {  "_ZN3ccc7CC4x6y1E", // class name
  bases__ZN3ccc7CC4x6y1E, 2,
  &(vtc__ZN3ccc7CC4x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1911,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y1  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD4x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x6y13efgEv
  ~DD4x6y1(); // tgen
  DD4x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y13abcEv");}
void  ccc::DD4x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y13pqrEv");}
void  ccc::DD4x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y13efgEv");}
ccc::DD4x6y1 ::~DD4x6y1(){ note_dtor("_ZN3ccc7DD4x6y1E", this);} // tgen
ccc::DD4x6y1 ::DD4x6y1(){ note_ctor("_ZN3ccc7DD4x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y1E, buf);
    ::ccc::DD4x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y1E);
    dp->::ccc::DD4x6y1::~DD4x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y1E(Test__ZN3ccc7DD4x6y1E, "_ZN3ccc7DD4x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y1C1Ev();
extern void _ZN3ccc7DD4x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y1E[] = {
  NSPAIR(_ZN3ccc7DD4x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y1E[];
extern void _ZN3ccc7DD4x6y13pqrEv();
extern void _ZN3ccc7DD4x6y13abcEv();
extern void _ZN3ccc7DD4x6y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y13abcEv,_ZTv0_n12_N3ccc7DD4x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y13abcEv,_ZThn4_N3ccc7DD4x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y13efgEv,_ZTv0_n16_N3ccc7DD4x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y13efgEv,_ZThn4_N3ccc7DD4x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y13abcEv,_ZTv0_n12_N3ccc7DD4x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y13efgEv,_ZTv0_n16_N3ccc7DD4x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y1E[] = {
  {&(_ZTVN3ccc7DD4x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y1E[];
static VTBL_ENTRY alt_thunk_names1912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y13efgEv,_ZTv0_n16_N3ccc7DD4x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y13efgEv,_ZThn4_N3ccc7DD4x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y13abcEv,_ZTv0_n12_N3ccc7DD4x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y13abcEv,_ZThn4_N3ccc7DD4x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y1E = {  "_ZN3ccc7DD4x6y1E", // class name
  bases__ZN3ccc7DD4x6y1E, 2,
  &(vtc__ZN3ccc7DD4x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1912,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y2  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y23pqrEv
  ~CC4x6y2(); // tgen
  CC4x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y2E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y23efgEv");}
void  ccc::CC4x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y23abcEv");}
void  ccc::CC4x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y23pqrEv");}
ccc::CC4x6y2 ::~CC4x6y2(){ note_dtor("_ZN3ccc7CC4x6y2E", this);} // tgen
ccc::CC4x6y2 ::CC4x6y2(){ note_ctor("_ZN3ccc7CC4x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y2E, buf);
    ::ccc::CC4x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y2E);
    dp->::ccc::CC4x6y2::~CC4x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y2E(Test__ZN3ccc7CC4x6y2E, "_ZN3ccc7CC4x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y2C1Ev();
extern void _ZN3ccc7CC4x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y2E[] = {
  NSPAIR(_ZN3ccc7CC4x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y2E[];
extern void _ZN3ccc7CC4x6y23abcEv();
extern void _ZN3ccc7CC4x6y23efgEv();
extern void _ZN3ccc7CC4x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y23pqrEv,_ZTv0_n12_N3ccc7CC4x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y23pqrEv,_ZThn4_N3ccc7CC4x6y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y23abcEv,_ZTv0_n16_N3ccc7CC4x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y23abcEv,_ZThn4_N3ccc7CC4x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y23efgEv,_ZTv0_n20_N3ccc7CC4x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y23efgEv,_ZThn4_N3ccc7CC4x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y23pqrEv,_ZTv0_n12_N3ccc7CC4x6y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y23abcEv,_ZTv0_n16_N3ccc7CC4x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y23efgEv,_ZTv0_n20_N3ccc7CC4x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y2E[] = {
  {&(_ZTVN3ccc7CC4x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y2E[];
static VTBL_ENTRY alt_thunk_names1913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y23efgEv,_ZTv0_n20_N3ccc7CC4x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y23efgEv,_ZThn4_N3ccc7CC4x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y23abcEv,_ZTv0_n16_N3ccc7CC4x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y23abcEv,_ZThn4_N3ccc7CC4x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y23pqrEv,_ZTv0_n12_N3ccc7CC4x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y23pqrEv,_ZThn4_N3ccc7CC4x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y2E = {  "_ZN3ccc7CC4x6y2E", // class name
  bases__ZN3ccc7CC4x6y2E, 2,
  &(vtc__ZN3ccc7CC4x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1913,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y2  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD4x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y23pqrEv
  ~DD4x6y2(); // tgen
  DD4x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y23efgEv");}
void  ccc::DD4x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y23abcEv");}
void  ccc::DD4x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y23pqrEv");}
ccc::DD4x6y2 ::~DD4x6y2(){ note_dtor("_ZN3ccc7DD4x6y2E", this);} // tgen
ccc::DD4x6y2 ::DD4x6y2(){ note_ctor("_ZN3ccc7DD4x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y2E, buf);
    ::ccc::DD4x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y2E);
    dp->::ccc::DD4x6y2::~DD4x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y2E(Test__ZN3ccc7DD4x6y2E, "_ZN3ccc7DD4x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y2C1Ev();
extern void _ZN3ccc7DD4x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y2E[] = {
  NSPAIR(_ZN3ccc7DD4x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y2E[];
extern void _ZN3ccc7DD4x6y23pqrEv();
extern void _ZN3ccc7DD4x6y23abcEv();
extern void _ZN3ccc7DD4x6y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y23abcEv,_ZTv0_n12_N3ccc7DD4x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y23abcEv,_ZThn4_N3ccc7DD4x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y23efgEv,_ZTv0_n16_N3ccc7DD4x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y23efgEv,_ZThn4_N3ccc7DD4x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y23abcEv,_ZTv0_n12_N3ccc7DD4x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y23efgEv,_ZTv0_n16_N3ccc7DD4x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y2E[] = {
  {&(_ZTVN3ccc7DD4x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y2E[];
static VTBL_ENTRY alt_thunk_names1914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y23efgEv,_ZTv0_n16_N3ccc7DD4x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y23efgEv,_ZThn4_N3ccc7DD4x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y23abcEv,_ZTv0_n12_N3ccc7DD4x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y23abcEv,_ZThn4_N3ccc7DD4x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y2E = {  "_ZN3ccc7DD4x6y2E", // class name
  bases__ZN3ccc7DD4x6y2E, 2,
  &(vtc__ZN3ccc7DD4x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1914,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y3  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x6y33abcEv
  ~CC4x6y3(); // tgen
  CC4x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y3E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y33efgEv");}
void  ccc::CC4x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y33pqrEv");}
void  ccc::CC4x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y33abcEv");}
ccc::CC4x6y3 ::~CC4x6y3(){ note_dtor("_ZN3ccc7CC4x6y3E", this);} // tgen
ccc::CC4x6y3 ::CC4x6y3(){ note_ctor("_ZN3ccc7CC4x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y3E, buf);
    ::ccc::CC4x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y3E);
    dp->::ccc::CC4x6y3::~CC4x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y3E(Test__ZN3ccc7CC4x6y3E, "_ZN3ccc7CC4x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y3C1Ev();
extern void _ZN3ccc7CC4x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y3E[] = {
  NSPAIR(_ZN3ccc7CC4x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y3E[];
extern void _ZN3ccc7CC4x6y33abcEv();
extern void _ZN3ccc7CC4x6y33efgEv();
extern void _ZN3ccc7CC4x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y33pqrEv,_ZTv0_n12_N3ccc7CC4x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y33pqrEv,_ZThn4_N3ccc7CC4x6y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y33abcEv,_ZTv0_n16_N3ccc7CC4x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y33abcEv,_ZThn4_N3ccc7CC4x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y33efgEv,_ZTv0_n20_N3ccc7CC4x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y33efgEv,_ZThn4_N3ccc7CC4x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y33pqrEv,_ZTv0_n12_N3ccc7CC4x6y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y33abcEv,_ZTv0_n16_N3ccc7CC4x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y33efgEv,_ZTv0_n20_N3ccc7CC4x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y3E[] = {
  {&(_ZTVN3ccc7CC4x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y3E[];
static VTBL_ENTRY alt_thunk_names1915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y33efgEv,_ZTv0_n20_N3ccc7CC4x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y33efgEv,_ZThn4_N3ccc7CC4x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y33abcEv,_ZTv0_n16_N3ccc7CC4x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y33abcEv,_ZThn4_N3ccc7CC4x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y33pqrEv,_ZTv0_n12_N3ccc7CC4x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y33pqrEv,_ZThn4_N3ccc7CC4x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y3E = {  "_ZN3ccc7CC4x6y3E", // class name
  bases__ZN3ccc7CC4x6y3E, 2,
  &(vtc__ZN3ccc7CC4x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1915,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y3  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD4x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x6y33abcEv
  ~DD4x6y3(); // tgen
  DD4x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y33efgEv");}
void  ccc::DD4x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y33pqrEv");}
void  ccc::DD4x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y33abcEv");}
ccc::DD4x6y3 ::~DD4x6y3(){ note_dtor("_ZN3ccc7DD4x6y3E", this);} // tgen
ccc::DD4x6y3 ::DD4x6y3(){ note_ctor("_ZN3ccc7DD4x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y3E, buf);
    ::ccc::DD4x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y3E);
    dp->::ccc::DD4x6y3::~DD4x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y3E(Test__ZN3ccc7DD4x6y3E, "_ZN3ccc7DD4x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y3C1Ev();
extern void _ZN3ccc7DD4x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y3E[] = {
  NSPAIR(_ZN3ccc7DD4x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y3E[];
extern void _ZN3ccc7DD4x6y33pqrEv();
extern void _ZN3ccc7DD4x6y33abcEv();
extern void _ZN3ccc7DD4x6y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y33abcEv,_ZTv0_n12_N3ccc7DD4x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y33abcEv,_ZThn4_N3ccc7DD4x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y33efgEv,_ZTv0_n16_N3ccc7DD4x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y33efgEv,_ZThn4_N3ccc7DD4x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y33abcEv,_ZTv0_n12_N3ccc7DD4x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y33efgEv,_ZTv0_n16_N3ccc7DD4x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y3E[] = {
  {&(_ZTVN3ccc7DD4x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y3E[];
static VTBL_ENTRY alt_thunk_names1916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y33efgEv,_ZTv0_n16_N3ccc7DD4x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y33efgEv,_ZThn4_N3ccc7DD4x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y33abcEv,_ZTv0_n12_N3ccc7DD4x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y33abcEv,_ZThn4_N3ccc7DD4x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y3E = {  "_ZN3ccc7DD4x6y3E", // class name
  bases__ZN3ccc7DD4x6y3E, 2,
  &(vtc__ZN3ccc7DD4x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1916,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y4  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC4x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y43efgEv
  ~CC4x6y4(); // tgen
  CC4x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y4E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y43pqrEv");}
void  ccc::CC4x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y43abcEv");}
void  ccc::CC4x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y43efgEv");}
ccc::CC4x6y4 ::~CC4x6y4(){ note_dtor("_ZN3ccc7CC4x6y4E", this);} // tgen
ccc::CC4x6y4 ::CC4x6y4(){ note_ctor("_ZN3ccc7CC4x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y4E, buf);
    ::ccc::CC4x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y4E);
    dp->::ccc::CC4x6y4::~CC4x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y4E(Test__ZN3ccc7CC4x6y4E, "_ZN3ccc7CC4x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y4C1Ev();
extern void _ZN3ccc7CC4x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y4E[] = {
  NSPAIR(_ZN3ccc7CC4x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y4E[];
extern void _ZN3ccc7CC4x6y43abcEv();
extern void _ZN3ccc7CC4x6y43efgEv();
extern void _ZN3ccc7CC4x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y43pqrEv,_ZTv0_n12_N3ccc7CC4x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y43pqrEv,_ZThn4_N3ccc7CC4x6y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y43abcEv,_ZTv0_n16_N3ccc7CC4x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y43abcEv,_ZThn4_N3ccc7CC4x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y43efgEv,_ZTv0_n20_N3ccc7CC4x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y43efgEv,_ZThn4_N3ccc7CC4x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y43pqrEv,_ZTv0_n12_N3ccc7CC4x6y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y43abcEv,_ZTv0_n16_N3ccc7CC4x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y43efgEv,_ZTv0_n20_N3ccc7CC4x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y4E[] = {
  {&(_ZTVN3ccc7CC4x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y4E[];
static VTBL_ENTRY alt_thunk_names1917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y43efgEv,_ZTv0_n20_N3ccc7CC4x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y43efgEv,_ZThn4_N3ccc7CC4x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y43abcEv,_ZTv0_n16_N3ccc7CC4x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y43abcEv,_ZThn4_N3ccc7CC4x6y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y43pqrEv,_ZTv0_n12_N3ccc7CC4x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y43pqrEv,_ZThn4_N3ccc7CC4x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y4E = {  "_ZN3ccc7CC4x6y4E", // class name
  bases__ZN3ccc7CC4x6y4E, 2,
  &(vtc__ZN3ccc7CC4x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1917,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y4  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD4x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x6y43efgEv
  ~DD4x6y4(); // tgen
  DD4x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y43pqrEv");}
void  ccc::DD4x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y43abcEv");}
void  ccc::DD4x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y43efgEv");}
ccc::DD4x6y4 ::~DD4x6y4(){ note_dtor("_ZN3ccc7DD4x6y4E", this);} // tgen
ccc::DD4x6y4 ::DD4x6y4(){ note_ctor("_ZN3ccc7DD4x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y4E, buf);
    ::ccc::DD4x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y4E);
    dp->::ccc::DD4x6y4::~DD4x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y4E(Test__ZN3ccc7DD4x6y4E, "_ZN3ccc7DD4x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y4C1Ev();
extern void _ZN3ccc7DD4x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y4E[] = {
  NSPAIR(_ZN3ccc7DD4x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y4E[];
extern void _ZN3ccc7DD4x6y43pqrEv();
extern void _ZN3ccc7DD4x6y43abcEv();
extern void _ZN3ccc7DD4x6y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y43abcEv,_ZTv0_n12_N3ccc7DD4x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y43abcEv,_ZThn4_N3ccc7DD4x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y43efgEv,_ZTv0_n16_N3ccc7DD4x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y43efgEv,_ZThn4_N3ccc7DD4x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y43abcEv,_ZTv0_n12_N3ccc7DD4x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y43efgEv,_ZTv0_n16_N3ccc7DD4x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y4E[] = {
  {&(_ZTVN3ccc7DD4x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y4E[];
static VTBL_ENTRY alt_thunk_names1918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y43efgEv,_ZTv0_n16_N3ccc7DD4x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y43efgEv,_ZThn4_N3ccc7DD4x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y43abcEv,_ZTv0_n12_N3ccc7DD4x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y43abcEv,_ZThn4_N3ccc7DD4x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y4E = {  "_ZN3ccc7DD4x6y4E", // class name
  bases__ZN3ccc7DD4x6y4E, 2,
  &(vtc__ZN3ccc7DD4x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1918,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y5  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC4x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y53abcEv
  ~CC4x6y5(); // tgen
  CC4x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y5E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y53pqrEv");}
void  ccc::CC4x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y53efgEv");}
void  ccc::CC4x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y53abcEv");}
ccc::CC4x6y5 ::~CC4x6y5(){ note_dtor("_ZN3ccc7CC4x6y5E", this);} // tgen
ccc::CC4x6y5 ::CC4x6y5(){ note_ctor("_ZN3ccc7CC4x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y5E, buf);
    ::ccc::CC4x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y5E);
    dp->::ccc::CC4x6y5::~CC4x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y5E(Test__ZN3ccc7CC4x6y5E, "_ZN3ccc7CC4x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y5C1Ev();
extern void _ZN3ccc7CC4x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y5E[] = {
  NSPAIR(_ZN3ccc7CC4x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y5E[];
extern void _ZN3ccc7CC4x6y53abcEv();
extern void _ZN3ccc7CC4x6y53efgEv();
extern void _ZN3ccc7CC4x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y53pqrEv,_ZTv0_n12_N3ccc7CC4x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y53pqrEv,_ZThn4_N3ccc7CC4x6y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y53abcEv,_ZTv0_n16_N3ccc7CC4x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y53abcEv,_ZThn4_N3ccc7CC4x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y53efgEv,_ZTv0_n20_N3ccc7CC4x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y53efgEv,_ZThn4_N3ccc7CC4x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y53pqrEv,_ZTv0_n12_N3ccc7CC4x6y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y53abcEv,_ZTv0_n16_N3ccc7CC4x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y53efgEv,_ZTv0_n20_N3ccc7CC4x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y5E[] = {
  {&(_ZTVN3ccc7CC4x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y5E[];
static VTBL_ENTRY alt_thunk_names1919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y53efgEv,_ZTv0_n20_N3ccc7CC4x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y53efgEv,_ZThn4_N3ccc7CC4x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y53abcEv,_ZTv0_n16_N3ccc7CC4x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y53abcEv,_ZThn4_N3ccc7CC4x6y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y53pqrEv,_ZTv0_n12_N3ccc7CC4x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y53pqrEv,_ZThn4_N3ccc7CC4x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y5E = {  "_ZN3ccc7CC4x6y5E", // class name
  bases__ZN3ccc7CC4x6y5E, 2,
  &(vtc__ZN3ccc7CC4x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1919,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y5  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD4x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x6y53abcEv
  ~DD4x6y5(); // tgen
  DD4x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y53pqrEv");}
void  ccc::DD4x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y53efgEv");}
void  ccc::DD4x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y53abcEv");}
ccc::DD4x6y5 ::~DD4x6y5(){ note_dtor("_ZN3ccc7DD4x6y5E", this);} // tgen
ccc::DD4x6y5 ::DD4x6y5(){ note_ctor("_ZN3ccc7DD4x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y5E, buf);
    ::ccc::DD4x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y5E);
    dp->::ccc::DD4x6y5::~DD4x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y5E(Test__ZN3ccc7DD4x6y5E, "_ZN3ccc7DD4x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y5C1Ev();
extern void _ZN3ccc7DD4x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y5E[] = {
  NSPAIR(_ZN3ccc7DD4x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y5E[];
extern void _ZN3ccc7DD4x6y53pqrEv();
extern void _ZN3ccc7DD4x6y53abcEv();
extern void _ZN3ccc7DD4x6y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y53abcEv,_ZTv0_n12_N3ccc7DD4x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y53abcEv,_ZThn4_N3ccc7DD4x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y53efgEv,_ZTv0_n16_N3ccc7DD4x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y53efgEv,_ZThn4_N3ccc7DD4x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y53abcEv,_ZTv0_n12_N3ccc7DD4x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y53efgEv,_ZTv0_n16_N3ccc7DD4x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y5E[] = {
  {&(_ZTVN3ccc7DD4x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y5E[];
static VTBL_ENTRY alt_thunk_names1920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y53efgEv,_ZTv0_n16_N3ccc7DD4x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y53efgEv,_ZThn4_N3ccc7DD4x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y53abcEv,_ZTv0_n12_N3ccc7DD4x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y53abcEv,_ZThn4_N3ccc7DD4x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y5E = {  "_ZN3ccc7DD4x6y5E", // class name
  bases__ZN3ccc7DD4x6y5E, 2,
  &(vtc__ZN3ccc7DD4x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1920,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y6  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y63efgEv
  ~CC4x6y6(); // tgen
  CC4x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y6E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y63abcEv");}
void  ccc::CC4x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y63efgEv");}
ccc::CC4x6y6 ::~CC4x6y6(){ note_dtor("_ZN3ccc7CC4x6y6E", this);} // tgen
ccc::CC4x6y6 ::CC4x6y6(){ note_ctor("_ZN3ccc7CC4x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y6E, buf);
    ::ccc::CC4x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y6E);
    dp->::ccc::CC4x6y6::~CC4x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y6E(Test__ZN3ccc7CC4x6y6E, "_ZN3ccc7CC4x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y6C1Ev();
extern void _ZN3ccc7CC4x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y6E[] = {
  NSPAIR(_ZN3ccc7CC4x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y6E[];
extern void _ZN3ccc7CC4x6y63abcEv();
extern void _ZN3ccc7CC4x6y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y63abcEv,_ZTv0_n16_N3ccc7CC4x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y63abcEv,_ZThn4_N3ccc7CC4x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y63efgEv,_ZTv0_n20_N3ccc7CC4x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y63efgEv,_ZThn4_N3ccc7CC4x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y63abcEv,_ZTv0_n16_N3ccc7CC4x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y63efgEv,_ZTv0_n20_N3ccc7CC4x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y6E[] = {
  {&(_ZTVN3ccc7CC4x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y6E[];
static VTBL_ENTRY alt_thunk_names1921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y63efgEv,_ZTv0_n20_N3ccc7CC4x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y63efgEv,_ZThn4_N3ccc7CC4x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y63abcEv,_ZTv0_n16_N3ccc7CC4x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y63abcEv,_ZThn4_N3ccc7CC4x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y6E = {  "_ZN3ccc7CC4x6y6E", // class name
  bases__ZN3ccc7CC4x6y6E, 2,
  &(vtc__ZN3ccc7CC4x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1921,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y6  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD4x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x6y63efgEv
  ~DD4x6y6(); // tgen
  DD4x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y63abcEv");}
void  ccc::DD4x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y63efgEv");}
ccc::DD4x6y6 ::~DD4x6y6(){ note_dtor("_ZN3ccc7DD4x6y6E", this);} // tgen
ccc::DD4x6y6 ::DD4x6y6(){ note_ctor("_ZN3ccc7DD4x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y6E, buf);
    ::ccc::DD4x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y6E);
    dp->::ccc::DD4x6y6::~DD4x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y6E(Test__ZN3ccc7DD4x6y6E, "_ZN3ccc7DD4x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y6C1Ev();
extern void _ZN3ccc7DD4x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y6E[] = {
  NSPAIR(_ZN3ccc7DD4x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x6y63abcEv();
extern void _ZN3ccc7DD4x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y63abcEv,_ZTv0_n12_N3ccc7DD4x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y63abcEv,_ZThn4_N3ccc7DD4x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y63efgEv,_ZTv0_n16_N3ccc7DD4x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y63efgEv,_ZThn4_N3ccc7DD4x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y63abcEv,_ZTv0_n12_N3ccc7DD4x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y63efgEv,_ZTv0_n16_N3ccc7DD4x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y6E[] = {
  {&(_ZTVN3ccc7DD4x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y6E[];
static VTBL_ENTRY alt_thunk_names1922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y63efgEv,_ZTv0_n16_N3ccc7DD4x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y63efgEv,_ZThn4_N3ccc7DD4x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y63abcEv,_ZTv0_n12_N3ccc7DD4x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y63abcEv,_ZThn4_N3ccc7DD4x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y6E = {  "_ZN3ccc7DD4x6y6E", // class name
  bases__ZN3ccc7DD4x6y6E, 2,
  &(vtc__ZN3ccc7DD4x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1922,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y7  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y73pqrEv
  ~CC4x6y7(); // tgen
  CC4x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y7E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y73abcEv");}
void  ccc::CC4x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y73pqrEv");}
ccc::CC4x6y7 ::~CC4x6y7(){ note_dtor("_ZN3ccc7CC4x6y7E", this);} // tgen
ccc::CC4x6y7 ::CC4x6y7(){ note_ctor("_ZN3ccc7CC4x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y7E, buf);
    ::ccc::CC4x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y7E);
    dp->::ccc::CC4x6y7::~CC4x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y7E(Test__ZN3ccc7CC4x6y7E, "_ZN3ccc7CC4x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y7C1Ev();
extern void _ZN3ccc7CC4x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y7E[] = {
  NSPAIR(_ZN3ccc7CC4x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y7E[];
extern void _ZN3ccc7CC4x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC4x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y73pqrEv,_ZTv0_n12_N3ccc7CC4x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y73pqrEv,_ZThn4_N3ccc7CC4x6y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y73abcEv,_ZTv0_n16_N3ccc7CC4x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y73abcEv,_ZThn4_N3ccc7CC4x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y73pqrEv,_ZTv0_n12_N3ccc7CC4x6y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y73abcEv,_ZTv0_n16_N3ccc7CC4x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y7E[] = {
  {&(_ZTVN3ccc7CC4x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y7E[];
static VTBL_ENTRY alt_thunk_names1923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y73abcEv,_ZTv0_n16_N3ccc7CC4x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y73abcEv,_ZThn4_N3ccc7CC4x6y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y73pqrEv,_ZTv0_n12_N3ccc7CC4x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y73pqrEv,_ZThn4_N3ccc7CC4x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y7E = {  "_ZN3ccc7CC4x6y7E", // class name
  bases__ZN3ccc7CC4x6y7E, 2,
  &(vtc__ZN3ccc7CC4x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1923,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y7  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD4x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y73pqrEv
  ~DD4x6y7(); // tgen
  DD4x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y73abcEv");}
void  ccc::DD4x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y73pqrEv");}
ccc::DD4x6y7 ::~DD4x6y7(){ note_dtor("_ZN3ccc7DD4x6y7E", this);} // tgen
ccc::DD4x6y7 ::DD4x6y7(){ note_ctor("_ZN3ccc7DD4x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y7E, buf);
    ::ccc::DD4x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y7E);
    dp->::ccc::DD4x6y7::~DD4x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y7E(Test__ZN3ccc7DD4x6y7E, "_ZN3ccc7DD4x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y7C1Ev();
extern void _ZN3ccc7DD4x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y7E[] = {
  NSPAIR(_ZN3ccc7DD4x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y7E[];
extern void _ZN3ccc7DD4x6y73pqrEv();
extern void _ZN3ccc7DD4x6y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y73abcEv,_ZTv0_n12_N3ccc7DD4x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y73abcEv,_ZThn4_N3ccc7DD4x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y73abcEv,_ZTv0_n12_N3ccc7DD4x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y7E[] = {
  {&(_ZTVN3ccc7DD4x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y7E[];
static VTBL_ENTRY alt_thunk_names1924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y73abcEv,_ZTv0_n12_N3ccc7DD4x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y73abcEv,_ZThn4_N3ccc7DD4x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y7E = {  "_ZN3ccc7DD4x6y7E", // class name
  bases__ZN3ccc7DD4x6y7E, 2,
  &(vtc__ZN3ccc7DD4x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1924,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y8  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y83abcEv
  ~CC4x6y8(); // tgen
  CC4x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y8E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y83efgEv");}
void  ccc::CC4x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y83abcEv");}
ccc::CC4x6y8 ::~CC4x6y8(){ note_dtor("_ZN3ccc7CC4x6y8E", this);} // tgen
ccc::CC4x6y8 ::CC4x6y8(){ note_ctor("_ZN3ccc7CC4x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y8E, buf);
    ::ccc::CC4x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y8E);
    dp->::ccc::CC4x6y8::~CC4x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y8E(Test__ZN3ccc7CC4x6y8E, "_ZN3ccc7CC4x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y8C1Ev();
extern void _ZN3ccc7CC4x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y8E[] = {
  NSPAIR(_ZN3ccc7CC4x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y8E[];
extern void _ZN3ccc7CC4x6y83abcEv();
extern void _ZN3ccc7CC4x6y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x6y83abcEv,_ZTv0_n16_N3ccc7CC4x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y83abcEv,_ZThn4_N3ccc7CC4x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y83efgEv,_ZTv0_n20_N3ccc7CC4x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y83efgEv,_ZThn4_N3ccc7CC4x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x6y83abcEv,_ZTv0_n16_N3ccc7CC4x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y83efgEv,_ZTv0_n20_N3ccc7CC4x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y8E[] = {
  {&(_ZTVN3ccc7CC4x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y8E[];
static VTBL_ENTRY alt_thunk_names1925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y83efgEv,_ZTv0_n20_N3ccc7CC4x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y83efgEv,_ZThn4_N3ccc7CC4x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x6y83abcEv,_ZTv0_n16_N3ccc7CC4x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y83abcEv,_ZThn4_N3ccc7CC4x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y8E = {  "_ZN3ccc7CC4x6y8E", // class name
  bases__ZN3ccc7CC4x6y8E, 2,
  &(vtc__ZN3ccc7CC4x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1925,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y8  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD4x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x6y83abcEv
  ~DD4x6y8(); // tgen
  DD4x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y83efgEv");}
void  ccc::DD4x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x6y83abcEv");}
ccc::DD4x6y8 ::~DD4x6y8(){ note_dtor("_ZN3ccc7DD4x6y8E", this);} // tgen
ccc::DD4x6y8 ::DD4x6y8(){ note_ctor("_ZN3ccc7DD4x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y8E, buf);
    ::ccc::DD4x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y8E);
    dp->::ccc::DD4x6y8::~DD4x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y8E(Test__ZN3ccc7DD4x6y8E, "_ZN3ccc7DD4x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y8C1Ev();
extern void _ZN3ccc7DD4x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y8E[] = {
  NSPAIR(_ZN3ccc7DD4x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x6y83abcEv();
extern void _ZN3ccc7DD4x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x6y83abcEv,_ZTv0_n12_N3ccc7DD4x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y83abcEv,_ZThn4_N3ccc7DD4x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y83efgEv,_ZTv0_n16_N3ccc7DD4x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y83efgEv,_ZThn4_N3ccc7DD4x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x6y83abcEv,_ZTv0_n12_N3ccc7DD4x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y83efgEv,_ZTv0_n16_N3ccc7DD4x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y8E[] = {
  {&(_ZTVN3ccc7DD4x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y8E[];
static VTBL_ENTRY alt_thunk_names1926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y83efgEv,_ZTv0_n16_N3ccc7DD4x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y83efgEv,_ZThn4_N3ccc7DD4x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x6y83abcEv,_ZTv0_n12_N3ccc7DD4x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y83abcEv,_ZThn4_N3ccc7DD4x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y8E = {  "_ZN3ccc7DD4x6y8E", // class name
  bases__ZN3ccc7DD4x6y8E, 2,
  &(vtc__ZN3ccc7DD4x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1926,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y9  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y93pqrEv
  ~CC4x6y9(); // tgen
  CC4x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y9E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y93efgEv");}
void  ccc::CC4x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y93pqrEv");}
ccc::CC4x6y9 ::~CC4x6y9(){ note_dtor("_ZN3ccc7CC4x6y9E", this);} // tgen
ccc::CC4x6y9 ::CC4x6y9(){ note_ctor("_ZN3ccc7CC4x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y9E, buf);
    ::ccc::CC4x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC4x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y9E);
    dp->::ccc::CC4x6y9::~CC4x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y9E(Test__ZN3ccc7CC4x6y9E, "_ZN3ccc7CC4x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y9C1Ev();
extern void _ZN3ccc7CC4x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y9E[] = {
  NSPAIR(_ZN3ccc7CC4x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC4x6y93efgEv();
extern void _ZN3ccc7CC4x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x6y93pqrEv,_ZTv0_n12_N3ccc7CC4x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y93pqrEv,_ZThn4_N3ccc7CC4x6y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x6y93efgEv,_ZTv0_n20_N3ccc7CC4x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y93efgEv,_ZThn4_N3ccc7CC4x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x6y93pqrEv,_ZTv0_n12_N3ccc7CC4x6y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x6y93efgEv,_ZTv0_n20_N3ccc7CC4x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x6y9E[] = {
  {&(_ZTVN3ccc7CC4x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x6y9E[];
static VTBL_ENTRY alt_thunk_names1927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x6y93efgEv,_ZTv0_n20_N3ccc7CC4x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y93efgEv,_ZThn4_N3ccc7CC4x6y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x6y93pqrEv,_ZTv0_n12_N3ccc7CC4x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x6y93pqrEv,_ZThn4_N3ccc7CC4x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x6y9E = {  "_ZN3ccc7CC4x6y9E", // class name
  bases__ZN3ccc7CC4x6y9E, 2,
  &(vtc__ZN3ccc7CC4x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x6y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1927,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y9  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD4x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x6y93pqrEv
  ~DD4x6y9(); // tgen
  DD4x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x6y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x6y93efgEv");}
void  ccc::DD4x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x6y93pqrEv");}
ccc::DD4x6y9 ::~DD4x6y9(){ note_dtor("_ZN3ccc7DD4x6y9E", this);} // tgen
ccc::DD4x6y9 ::DD4x6y9(){ note_ctor("_ZN3ccc7DD4x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x6y9E, buf);
    ::ccc::DD4x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x6y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD4x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x6y9E);
    dp->::ccc::DD4x6y9::~DD4x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x6y9E(Test__ZN3ccc7DD4x6y9E, "_ZN3ccc7DD4x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x6y9C1Ev();
extern void _ZN3ccc7DD4x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x6y9E[] = {
  NSPAIR(_ZN3ccc7DD4x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD4x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y9E[];
extern void _ZN3ccc7DD4x6y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x6y93efgEv,_ZTv0_n16_N3ccc7DD4x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x6y93efgEv,_ZThn4_N3ccc7DD4x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x6y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x6y93efgEv,_ZTv0_n16_N3ccc7DD4x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x6y9E[] = {
  {&(_ZTVN3ccc7DD4x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x6y9E[];
static VTBL_ENTRY alt_thunk_names1928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x6y93efgEv,_ZTv0_n16_N3ccc7DD4x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x6y93efgEv,_ZThn4_N3ccc7DD4x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x6y9E = {  "_ZN3ccc7DD4x6y9E", // class name
  bases__ZN3ccc7DD4x6y9E, 2,
  &(vtc__ZN3ccc7DD4x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x6y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1928,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y10  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x6y103abcEv
  ~CC4x6y10(); // tgen
  CC4x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y10E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y103pqrEv");}
void  ccc::CC4x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x6y103abcEv");}
ccc::CC4x6y10 ::~CC4x6y10(){ note_dtor("_ZN3ccc8CC4x6y10E", this);} // tgen
ccc::CC4x6y10 ::CC4x6y10(){ note_ctor("_ZN3ccc8CC4x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y10E, buf);
    ::ccc::CC4x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y10E);
    dp->::ccc::CC4x6y10::~CC4x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y10E(Test__ZN3ccc8CC4x6y10E, "_ZN3ccc8CC4x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y10C1Ev();
extern void _ZN3ccc8CC4x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y10E[] = {
  NSPAIR(_ZN3ccc8CC4x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y10E[];
extern void _ZN3ccc8CC4x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC4x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x6y103pqrEv,_ZTv0_n12_N3ccc8CC4x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y103pqrEv,_ZThn4_N3ccc8CC4x6y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x6y103abcEv,_ZTv0_n16_N3ccc8CC4x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y103abcEv,_ZThn4_N3ccc8CC4x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x6y103pqrEv,_ZTv0_n12_N3ccc8CC4x6y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x6y103abcEv,_ZTv0_n16_N3ccc8CC4x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y10E[] = {
  {&(_ZTVN3ccc8CC4x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y10E[];
static VTBL_ENTRY alt_thunk_names1929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x6y103abcEv,_ZTv0_n16_N3ccc8CC4x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y103abcEv,_ZThn4_N3ccc8CC4x6y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x6y103pqrEv,_ZTv0_n12_N3ccc8CC4x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y103pqrEv,_ZThn4_N3ccc8CC4x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x6y10E = {  "_ZN3ccc8CC4x6y10E", // class name
  bases__ZN3ccc8CC4x6y10E, 2,
  &(vtc__ZN3ccc8CC4x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1929,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y10  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD4x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x6y103abcEv
  ~DD4x6y10(); // tgen
  DD4x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x6y103pqrEv");}
void  ccc::DD4x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x6y103abcEv");}
ccc::DD4x6y10 ::~DD4x6y10(){ note_dtor("_ZN3ccc8DD4x6y10E", this);} // tgen
ccc::DD4x6y10 ::DD4x6y10(){ note_ctor("_ZN3ccc8DD4x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y10E, buf);
    ::ccc::DD4x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y10E);
    dp->::ccc::DD4x6y10::~DD4x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y10E(Test__ZN3ccc8DD4x6y10E, "_ZN3ccc8DD4x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y10C1Ev();
extern void _ZN3ccc8DD4x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y10E[] = {
  NSPAIR(_ZN3ccc8DD4x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y10E[];
extern void _ZN3ccc8DD4x6y103pqrEv();
extern void _ZN3ccc8DD4x6y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x6y103abcEv,_ZTv0_n12_N3ccc8DD4x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x6y103abcEv,_ZThn4_N3ccc8DD4x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x6y103abcEv,_ZTv0_n12_N3ccc8DD4x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y10E[] = {
  {&(_ZTVN3ccc8DD4x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y10E[];
static VTBL_ENTRY alt_thunk_names1930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x6y103abcEv,_ZTv0_n12_N3ccc8DD4x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x6y103abcEv,_ZThn4_N3ccc8DD4x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x6y10E = {  "_ZN3ccc8DD4x6y10E", // class name
  bases__ZN3ccc8DD4x6y10E, 2,
  &(vtc__ZN3ccc8DD4x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1930,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y11  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x6y113efgEv
  ~CC4x6y11(); // tgen
  CC4x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y11E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y113pqrEv");}
void  ccc::CC4x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x6y113efgEv");}
ccc::CC4x6y11 ::~CC4x6y11(){ note_dtor("_ZN3ccc8CC4x6y11E", this);} // tgen
ccc::CC4x6y11 ::CC4x6y11(){ note_ctor("_ZN3ccc8CC4x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y11E, buf);
    ::ccc::CC4x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y11E);
    dp->::ccc::CC4x6y11::~CC4x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y11E(Test__ZN3ccc8CC4x6y11E, "_ZN3ccc8CC4x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y11C1Ev();
extern void _ZN3ccc8CC4x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y11E[] = {
  NSPAIR(_ZN3ccc8CC4x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC4x6y113efgEv();
extern void _ZN3ccc8CC4x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x6y113pqrEv,_ZTv0_n12_N3ccc8CC4x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y113pqrEv,_ZThn4_N3ccc8CC4x6y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x6y113efgEv,_ZTv0_n20_N3ccc8CC4x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y113efgEv,_ZThn4_N3ccc8CC4x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x6y113pqrEv,_ZTv0_n12_N3ccc8CC4x6y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x6y113efgEv,_ZTv0_n20_N3ccc8CC4x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y11E[] = {
  {&(_ZTVN3ccc8CC4x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y11E[];
static VTBL_ENTRY alt_thunk_names1931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x6y113efgEv,_ZTv0_n20_N3ccc8CC4x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y113efgEv,_ZThn4_N3ccc8CC4x6y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x6y113pqrEv,_ZTv0_n12_N3ccc8CC4x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y113pqrEv,_ZThn4_N3ccc8CC4x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x6y11E = {  "_ZN3ccc8CC4x6y11E", // class name
  bases__ZN3ccc8CC4x6y11E, 2,
  &(vtc__ZN3ccc8CC4x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1931,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y11  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD4x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x6y113efgEv
  ~DD4x6y11(); // tgen
  DD4x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x6y113pqrEv");}
void  ccc::DD4x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x6y113efgEv");}
ccc::DD4x6y11 ::~DD4x6y11(){ note_dtor("_ZN3ccc8DD4x6y11E", this);} // tgen
ccc::DD4x6y11 ::DD4x6y11(){ note_ctor("_ZN3ccc8DD4x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y11E, buf);
    ::ccc::DD4x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y11E);
    dp->::ccc::DD4x6y11::~DD4x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y11E(Test__ZN3ccc8DD4x6y11E, "_ZN3ccc8DD4x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y11C1Ev();
extern void _ZN3ccc8DD4x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y11E[] = {
  NSPAIR(_ZN3ccc8DD4x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y11E[];
extern void _ZN3ccc8DD4x6y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x6y113efgEv,_ZTv0_n16_N3ccc8DD4x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x6y113efgEv,_ZThn4_N3ccc8DD4x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x6y113efgEv,_ZTv0_n16_N3ccc8DD4x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y11E[] = {
  {&(_ZTVN3ccc8DD4x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y11E[];
static VTBL_ENTRY alt_thunk_names1932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x6y113efgEv,_ZTv0_n16_N3ccc8DD4x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x6y113efgEv,_ZThn4_N3ccc8DD4x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x6y11E = {  "_ZN3ccc8DD4x6y11E", // class name
  bases__ZN3ccc8DD4x6y11E, 2,
  &(vtc__ZN3ccc8DD4x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1932,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y12  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC4x6y123abcEv
  ~CC4x6y12(); // tgen
  CC4x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x6y123abcEv");}
ccc::CC4x6y12 ::~CC4x6y12(){ note_dtor("_ZN3ccc8CC4x6y12E", this);} // tgen
ccc::CC4x6y12 ::CC4x6y12(){ note_ctor("_ZN3ccc8CC4x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y12E, buf);
    ::ccc::CC4x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y12E);
    dp->::ccc::CC4x6y12::~CC4x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y12E(Test__ZN3ccc8CC4x6y12E, "_ZN3ccc8CC4x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y12C1Ev();
extern void _ZN3ccc8CC4x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y12E[] = {
  NSPAIR(_ZN3ccc8CC4x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y12E[];
extern void _ZN3ccc8CC4x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x6y123abcEv,_ZTv0_n16_N3ccc8CC4x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y123abcEv,_ZThn4_N3ccc8CC4x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x6y123abcEv,_ZTv0_n16_N3ccc8CC4x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y12E[] = {
  {&(_ZTVN3ccc8CC4x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y12E[];
static VTBL_ENTRY alt_thunk_names1933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x6y123abcEv,_ZTv0_n16_N3ccc8CC4x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y123abcEv,_ZThn4_N3ccc8CC4x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x6y12E = {  "_ZN3ccc8CC4x6y12E", // class name
  bases__ZN3ccc8CC4x6y12E, 2,
  &(vtc__ZN3ccc8CC4x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1933,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y12  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD4x6y123abcEv
  ~DD4x6y12(); // tgen
  DD4x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x6y123abcEv");}
ccc::DD4x6y12 ::~DD4x6y12(){ note_dtor("_ZN3ccc8DD4x6y12E", this);} // tgen
ccc::DD4x6y12 ::DD4x6y12(){ note_ctor("_ZN3ccc8DD4x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y12E, buf);
    ::ccc::DD4x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y12E);
    dp->::ccc::DD4x6y12::~DD4x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y12E(Test__ZN3ccc8DD4x6y12E, "_ZN3ccc8DD4x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y12C1Ev();
extern void _ZN3ccc8DD4x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y12E[] = {
  NSPAIR(_ZN3ccc8DD4x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x6y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x6y123abcEv,_ZTv0_n12_N3ccc8DD4x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x6y123abcEv,_ZThn4_N3ccc8DD4x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x6y123abcEv,_ZTv0_n12_N3ccc8DD4x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y12E[] = {
  {&(_ZTVN3ccc8DD4x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y12E[];
static VTBL_ENTRY alt_thunk_names1934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x6y123abcEv,_ZTv0_n12_N3ccc8DD4x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x6y123abcEv,_ZThn4_N3ccc8DD4x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x6y12E = {  "_ZN3ccc8DD4x6y12E", // class name
  bases__ZN3ccc8DD4x6y12E, 2,
  &(vtc__ZN3ccc8DD4x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1934,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y13  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC4x6y133efgEv
  ~CC4x6y13(); // tgen
  CC4x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x6y133efgEv");}
ccc::CC4x6y13 ::~CC4x6y13(){ note_dtor("_ZN3ccc8CC4x6y13E", this);} // tgen
ccc::CC4x6y13 ::CC4x6y13(){ note_ctor("_ZN3ccc8CC4x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y13E, buf);
    ::ccc::CC4x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y13E);
    dp->::ccc::CC4x6y13::~CC4x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y13E(Test__ZN3ccc8CC4x6y13E, "_ZN3ccc8CC4x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y13C1Ev();
extern void _ZN3ccc8CC4x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y13E[] = {
  NSPAIR(_ZN3ccc8CC4x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC4x6y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x6y133efgEv,_ZTv0_n20_N3ccc8CC4x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y133efgEv,_ZThn4_N3ccc8CC4x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x6y133efgEv,_ZTv0_n20_N3ccc8CC4x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y13E[] = {
  {&(_ZTVN3ccc8CC4x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y13E[];
static VTBL_ENTRY alt_thunk_names1935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x6y133efgEv,_ZTv0_n20_N3ccc8CC4x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y133efgEv,_ZThn4_N3ccc8CC4x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x6y13E = {  "_ZN3ccc8CC4x6y13E", // class name
  bases__ZN3ccc8CC4x6y13E, 2,
  &(vtc__ZN3ccc8CC4x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1935,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y13  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD4x6y133efgEv
  ~DD4x6y13(); // tgen
  DD4x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x6y133efgEv");}
ccc::DD4x6y13 ::~DD4x6y13(){ note_dtor("_ZN3ccc8DD4x6y13E", this);} // tgen
ccc::DD4x6y13 ::DD4x6y13(){ note_ctor("_ZN3ccc8DD4x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y13E, buf);
    ::ccc::DD4x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y13E);
    dp->::ccc::DD4x6y13::~DD4x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y13E(Test__ZN3ccc8DD4x6y13E, "_ZN3ccc8DD4x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y13C1Ev();
extern void _ZN3ccc8DD4x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y13E[] = {
  NSPAIR(_ZN3ccc8DD4x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x6y133efgEv,_ZTv0_n16_N3ccc8DD4x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x6y133efgEv,_ZThn4_N3ccc8DD4x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x6y133efgEv,_ZTv0_n16_N3ccc8DD4x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y13E[] = {
  {&(_ZTVN3ccc8DD4x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y13E[];
static VTBL_ENTRY alt_thunk_names1936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x6y133efgEv,_ZTv0_n16_N3ccc8DD4x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x6y133efgEv,_ZThn4_N3ccc8DD4x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x6y13E = {  "_ZN3ccc8DD4x6y13E", // class name
  bases__ZN3ccc8DD4x6y13E, 2,
  &(vtc__ZN3ccc8DD4x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1936,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y14  : virtual ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y143pqrEv
  ~CC4x6y14(); // tgen
  CC4x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y143pqrEv");}
ccc::CC4x6y14 ::~CC4x6y14(){ note_dtor("_ZN3ccc8CC4x6y14E", this);} // tgen
ccc::CC4x6y14 ::CC4x6y14(){ note_ctor("_ZN3ccc8CC4x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y14E, buf);
    ::ccc::CC4x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y14E);
    dp->::ccc::CC4x6y14::~CC4x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y14E(Test__ZN3ccc8CC4x6y14E, "_ZN3ccc8CC4x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y14C1Ev();
extern void _ZN3ccc8CC4x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y14E[] = {
  NSPAIR(_ZN3ccc8CC4x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC4x6y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x6y143pqrEv,_ZTv0_n12_N3ccc8CC4x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y143pqrEv,_ZThn4_N3ccc8CC4x6y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x6y143pqrEv,_ZTv0_n12_N3ccc8CC4x6y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y14E[] = {
  {&(_ZTVN3ccc8CC4x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y14E[];
static VTBL_ENTRY alt_thunk_names1937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x6y143pqrEv,_ZTv0_n12_N3ccc8CC4x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x6y143pqrEv,_ZThn4_N3ccc8CC4x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x6y14E = {  "_ZN3ccc8CC4x6y14E", // class name
  bases__ZN3ccc8CC4x6y14E, 2,
  &(vtc__ZN3ccc8CC4x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1937,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y14  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD4x6y143pqrEv
  ~DD4x6y14(); // tgen
  DD4x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x6y143pqrEv");}
ccc::DD4x6y14 ::~DD4x6y14(){ note_dtor("_ZN3ccc8DD4x6y14E", this);} // tgen
ccc::DD4x6y14 ::DD4x6y14(){ note_ctor("_ZN3ccc8DD4x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y14E, buf);
    ::ccc::DD4x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y14E);
    dp->::ccc::DD4x6y14::~DD4x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y14E(Test__ZN3ccc8DD4x6y14E, "_ZN3ccc8DD4x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y14C1Ev();
extern void _ZN3ccc8DD4x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y14E[] = {
  NSPAIR(_ZN3ccc8DD4x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y14E[];
extern void _ZN3ccc8DD4x6y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y14E[] = {
  {&(_ZTVN3ccc8DD4x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y14E[];
Class_Descriptor cd__ZN3ccc8DD4x6y14E = {  "_ZN3ccc8DD4x6y14E", // class name
  bases__ZN3ccc8DD4x6y14E, 2,
  &(vtc__ZN3ccc8DD4x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y15  : virtual ::ccc::AA4 , ::ccc::BB6 {
  ~CC4x6y15(); // tgen
  CC4x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x6y15 ::~CC4x6y15(){ note_dtor("_ZN3ccc8CC4x6y15E", this);} // tgen
ccc::CC4x6y15 ::CC4x6y15(){ note_ctor("_ZN3ccc8CC4x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y15E, buf);
    ::ccc::CC4x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC4x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y15E);
    dp->::ccc::CC4x6y15::~CC4x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y15E(Test__ZN3ccc8CC4x6y15E, "_ZN3ccc8CC4x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y15C1Ev();
extern void _ZN3ccc8CC4x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y15E[] = {
  NSPAIR(_ZN3ccc8CC4x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x6y15E[] = {
  {&(_ZTVN3ccc8CC4x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x6y15E[];
Class_Descriptor cd__ZN3ccc8CC4x6y15E = {  "_ZN3ccc8CC4x6y15E", // class name
  bases__ZN3ccc8CC4x6y15E, 2,
  &(vtc__ZN3ccc8CC4x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x6y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x6y15  : virtual ::ccc::AA4 , virtual ::ccc::BB6 {
  ~DD4x6y15(); // tgen
  DD4x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x6y15 ::~DD4x6y15(){ note_dtor("_ZN3ccc8DD4x6y15E", this);} // tgen
ccc::DD4x6y15 ::DD4x6y15(){ note_ctor("_ZN3ccc8DD4x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x6y15E, buf);
    ::ccc::DD4x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x6y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD4x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x6y15E);
    dp->::ccc::DD4x6y15::~DD4x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x6y15E(Test__ZN3ccc8DD4x6y15E, "_ZN3ccc8DD4x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x6y15C1Ev();
extern void _ZN3ccc8DD4x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x6y15E[] = {
  NSPAIR(_ZN3ccc8DD4x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD4x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x6y15E[] = {
  {&(_ZTVN3ccc8DD4x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x6y15E[];
Class_Descriptor cd__ZN3ccc8DD4x6y15E = {  "_ZN3ccc8DD4x6y15E", // class name
  bases__ZN3ccc8DD4x6y15E, 2,
  &(vtc__ZN3ccc8DD4x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x6y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y0  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y03pqrEv
  ~CC4x7y0(); // tgen
  CC4x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y0E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y03abcEv");}
void  ccc::CC4x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y03efgEv");}
void  ccc::CC4x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y03pqrEv");}
ccc::CC4x7y0 ::~CC4x7y0(){ note_dtor("_ZN3ccc7CC4x7y0E", this);} // tgen
ccc::CC4x7y0 ::CC4x7y0(){ note_ctor("_ZN3ccc7CC4x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y0E, buf);
    ::ccc::CC4x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y0E);
    dp->::ccc::CC4x7y0::~CC4x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y0E(Test__ZN3ccc7CC4x7y0E, "_ZN3ccc7CC4x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y0C1Ev();
extern void _ZN3ccc7CC4x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y0E[] = {
  NSPAIR(_ZN3ccc7CC4x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y0E[];
extern void _ZN3ccc7CC4x7y03abcEv();
extern void _ZN3ccc7CC4x7y03pqrEv();
extern void _ZN3ccc7CC4x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y03pqrEv,_ZTv0_n12_N3ccc7CC4x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y03pqrEv,_ZThn4_N3ccc7CC4x7y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y03abcEv,_ZTv0_n16_N3ccc7CC4x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y03abcEv,_ZThn4_N3ccc7CC4x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y03efgEv,_ZTv0_n20_N3ccc7CC4x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y03efgEv,_ZThn4_N3ccc7CC4x7y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y03pqrEv,_ZTv0_n12_N3ccc7CC4x7y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y03abcEv,_ZTv0_n16_N3ccc7CC4x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y03efgEv,_ZTv0_n20_N3ccc7CC4x7y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y0E[] = {
  {&(_ZTVN3ccc7CC4x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y0E[];
static VTBL_ENTRY alt_thunk_names1938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y03efgEv,_ZTv0_n20_N3ccc7CC4x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y03efgEv,_ZThn4_N3ccc7CC4x7y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y03abcEv,_ZTv0_n16_N3ccc7CC4x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y03abcEv,_ZThn4_N3ccc7CC4x7y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y03pqrEv,_ZTv0_n12_N3ccc7CC4x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y03pqrEv,_ZThn4_N3ccc7CC4x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y0E = {  "_ZN3ccc7CC4x7y0E", // class name
  bases__ZN3ccc7CC4x7y0E, 2,
  &(vtc__ZN3ccc7CC4x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1938,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y0  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD4x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y03pqrEv
  ~DD4x7y0(); // tgen
  DD4x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y03abcEv");}
void  ccc::DD4x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y03efgEv");}
void  ccc::DD4x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y03pqrEv");}
ccc::DD4x7y0 ::~DD4x7y0(){ note_dtor("_ZN3ccc7DD4x7y0E", this);} // tgen
ccc::DD4x7y0 ::DD4x7y0(){ note_ctor("_ZN3ccc7DD4x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y0E, buf);
    ::ccc::DD4x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y0E);
    dp->::ccc::DD4x7y0::~DD4x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y0E(Test__ZN3ccc7DD4x7y0E, "_ZN3ccc7DD4x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y0C1Ev();
extern void _ZN3ccc7DD4x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y0E[] = {
  NSPAIR(_ZN3ccc7DD4x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y0E[];
extern void _ZN3ccc7DD4x7y03pqrEv();
extern void _ZN3ccc7DD4x7y03abcEv();
extern void _ZN3ccc7DD4x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y03abcEv,_ZTv0_n12_N3ccc7DD4x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y03abcEv,_ZThn4_N3ccc7DD4x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y03pqrEv,_ZTv0_n16_N3ccc7DD4x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y03pqrEv,_ZThn4_N3ccc7DD4x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y03abcEv,_ZTv0_n12_N3ccc7DD4x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y03pqrEv,_ZTv0_n16_N3ccc7DD4x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y0E[] = {
  {&(_ZTVN3ccc7DD4x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y0E[];
static VTBL_ENTRY alt_thunk_names1939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y03pqrEv,_ZTv0_n16_N3ccc7DD4x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y03pqrEv,_ZThn4_N3ccc7DD4x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y03abcEv,_ZTv0_n12_N3ccc7DD4x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y03abcEv,_ZThn4_N3ccc7DD4x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y0E = {  "_ZN3ccc7DD4x7y0E", // class name
  bases__ZN3ccc7DD4x7y0E, 2,
  &(vtc__ZN3ccc7DD4x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1939,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y1  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x7y13efgEv
  ~CC4x7y1(); // tgen
  CC4x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y1E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y13abcEv");}
void  ccc::CC4x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y13pqrEv");}
void  ccc::CC4x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y13efgEv");}
ccc::CC4x7y1 ::~CC4x7y1(){ note_dtor("_ZN3ccc7CC4x7y1E", this);} // tgen
ccc::CC4x7y1 ::CC4x7y1(){ note_ctor("_ZN3ccc7CC4x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y1E, buf);
    ::ccc::CC4x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y1E);
    dp->::ccc::CC4x7y1::~CC4x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y1E(Test__ZN3ccc7CC4x7y1E, "_ZN3ccc7CC4x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y1C1Ev();
extern void _ZN3ccc7CC4x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y1E[] = {
  NSPAIR(_ZN3ccc7CC4x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y1E[];
extern void _ZN3ccc7CC4x7y13abcEv();
extern void _ZN3ccc7CC4x7y13pqrEv();
extern void _ZN3ccc7CC4x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y13pqrEv,_ZTv0_n12_N3ccc7CC4x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y13pqrEv,_ZThn4_N3ccc7CC4x7y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y13abcEv,_ZTv0_n16_N3ccc7CC4x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y13abcEv,_ZThn4_N3ccc7CC4x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y13efgEv,_ZTv0_n20_N3ccc7CC4x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y13efgEv,_ZThn4_N3ccc7CC4x7y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y13pqrEv,_ZTv0_n12_N3ccc7CC4x7y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y13abcEv,_ZTv0_n16_N3ccc7CC4x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y13efgEv,_ZTv0_n20_N3ccc7CC4x7y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y1E[] = {
  {&(_ZTVN3ccc7CC4x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y1E[];
static VTBL_ENTRY alt_thunk_names1940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y13efgEv,_ZTv0_n20_N3ccc7CC4x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y13efgEv,_ZThn4_N3ccc7CC4x7y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y13abcEv,_ZTv0_n16_N3ccc7CC4x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y13abcEv,_ZThn4_N3ccc7CC4x7y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y13pqrEv,_ZTv0_n12_N3ccc7CC4x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y13pqrEv,_ZThn4_N3ccc7CC4x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y1E = {  "_ZN3ccc7CC4x7y1E", // class name
  bases__ZN3ccc7CC4x7y1E, 2,
  &(vtc__ZN3ccc7CC4x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1940,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y1  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD4x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x7y13efgEv
  ~DD4x7y1(); // tgen
  DD4x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y13abcEv");}
void  ccc::DD4x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y13pqrEv");}
void  ccc::DD4x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y13efgEv");}
ccc::DD4x7y1 ::~DD4x7y1(){ note_dtor("_ZN3ccc7DD4x7y1E", this);} // tgen
ccc::DD4x7y1 ::DD4x7y1(){ note_ctor("_ZN3ccc7DD4x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y1E, buf);
    ::ccc::DD4x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y1E);
    dp->::ccc::DD4x7y1::~DD4x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y1E(Test__ZN3ccc7DD4x7y1E, "_ZN3ccc7DD4x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y1C1Ev();
extern void _ZN3ccc7DD4x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y1E[] = {
  NSPAIR(_ZN3ccc7DD4x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y1E[];
extern void _ZN3ccc7DD4x7y13pqrEv();
extern void _ZN3ccc7DD4x7y13abcEv();
extern void _ZN3ccc7DD4x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y13abcEv,_ZTv0_n12_N3ccc7DD4x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y13abcEv,_ZThn4_N3ccc7DD4x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y13pqrEv,_ZTv0_n16_N3ccc7DD4x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y13pqrEv,_ZThn4_N3ccc7DD4x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y13abcEv,_ZTv0_n12_N3ccc7DD4x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y13pqrEv,_ZTv0_n16_N3ccc7DD4x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y1E[] = {
  {&(_ZTVN3ccc7DD4x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y1E[];
static VTBL_ENTRY alt_thunk_names1941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y13pqrEv,_ZTv0_n16_N3ccc7DD4x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y13pqrEv,_ZThn4_N3ccc7DD4x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y13abcEv,_ZTv0_n12_N3ccc7DD4x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y13abcEv,_ZThn4_N3ccc7DD4x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y1E = {  "_ZN3ccc7DD4x7y1E", // class name
  bases__ZN3ccc7DD4x7y1E, 2,
  &(vtc__ZN3ccc7DD4x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1941,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y2  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y23pqrEv
  ~CC4x7y2(); // tgen
  CC4x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y2E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y23efgEv");}
void  ccc::CC4x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y23abcEv");}
void  ccc::CC4x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y23pqrEv");}
ccc::CC4x7y2 ::~CC4x7y2(){ note_dtor("_ZN3ccc7CC4x7y2E", this);} // tgen
ccc::CC4x7y2 ::CC4x7y2(){ note_ctor("_ZN3ccc7CC4x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y2E, buf);
    ::ccc::CC4x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y2E);
    dp->::ccc::CC4x7y2::~CC4x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y2E(Test__ZN3ccc7CC4x7y2E, "_ZN3ccc7CC4x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y2C1Ev();
extern void _ZN3ccc7CC4x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y2E[] = {
  NSPAIR(_ZN3ccc7CC4x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y2E[];
extern void _ZN3ccc7CC4x7y23abcEv();
extern void _ZN3ccc7CC4x7y23pqrEv();
extern void _ZN3ccc7CC4x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y23pqrEv,_ZTv0_n12_N3ccc7CC4x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y23pqrEv,_ZThn4_N3ccc7CC4x7y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y23abcEv,_ZTv0_n16_N3ccc7CC4x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y23abcEv,_ZThn4_N3ccc7CC4x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y23efgEv,_ZTv0_n20_N3ccc7CC4x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y23efgEv,_ZThn4_N3ccc7CC4x7y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y23pqrEv,_ZTv0_n12_N3ccc7CC4x7y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y23abcEv,_ZTv0_n16_N3ccc7CC4x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y23efgEv,_ZTv0_n20_N3ccc7CC4x7y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y2E[] = {
  {&(_ZTVN3ccc7CC4x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y2E[];
static VTBL_ENTRY alt_thunk_names1942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y23efgEv,_ZTv0_n20_N3ccc7CC4x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y23efgEv,_ZThn4_N3ccc7CC4x7y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y23abcEv,_ZTv0_n16_N3ccc7CC4x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y23abcEv,_ZThn4_N3ccc7CC4x7y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y23pqrEv,_ZTv0_n12_N3ccc7CC4x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y23pqrEv,_ZThn4_N3ccc7CC4x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y2E = {  "_ZN3ccc7CC4x7y2E", // class name
  bases__ZN3ccc7CC4x7y2E, 2,
  &(vtc__ZN3ccc7CC4x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1942,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y2  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD4x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y23pqrEv
  ~DD4x7y2(); // tgen
  DD4x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y23efgEv");}
void  ccc::DD4x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y23abcEv");}
void  ccc::DD4x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y23pqrEv");}
ccc::DD4x7y2 ::~DD4x7y2(){ note_dtor("_ZN3ccc7DD4x7y2E", this);} // tgen
ccc::DD4x7y2 ::DD4x7y2(){ note_ctor("_ZN3ccc7DD4x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y2E, buf);
    ::ccc::DD4x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y2E);
    dp->::ccc::DD4x7y2::~DD4x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y2E(Test__ZN3ccc7DD4x7y2E, "_ZN3ccc7DD4x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y2C1Ev();
extern void _ZN3ccc7DD4x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y2E[] = {
  NSPAIR(_ZN3ccc7DD4x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y2E[];
extern void _ZN3ccc7DD4x7y23pqrEv();
extern void _ZN3ccc7DD4x7y23abcEv();
extern void _ZN3ccc7DD4x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y23abcEv,_ZTv0_n12_N3ccc7DD4x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y23abcEv,_ZThn4_N3ccc7DD4x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y23pqrEv,_ZTv0_n16_N3ccc7DD4x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y23pqrEv,_ZThn4_N3ccc7DD4x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y23abcEv,_ZTv0_n12_N3ccc7DD4x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y23pqrEv,_ZTv0_n16_N3ccc7DD4x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y2E[] = {
  {&(_ZTVN3ccc7DD4x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y2E[];
static VTBL_ENTRY alt_thunk_names1943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y23pqrEv,_ZTv0_n16_N3ccc7DD4x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y23pqrEv,_ZThn4_N3ccc7DD4x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y23abcEv,_ZTv0_n12_N3ccc7DD4x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y23abcEv,_ZThn4_N3ccc7DD4x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y2E = {  "_ZN3ccc7DD4x7y2E", // class name
  bases__ZN3ccc7DD4x7y2E, 2,
  &(vtc__ZN3ccc7DD4x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1943,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y3  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x7y33abcEv
  ~CC4x7y3(); // tgen
  CC4x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y3E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y33efgEv");}
void  ccc::CC4x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y33pqrEv");}
void  ccc::CC4x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y33abcEv");}
ccc::CC4x7y3 ::~CC4x7y3(){ note_dtor("_ZN3ccc7CC4x7y3E", this);} // tgen
ccc::CC4x7y3 ::CC4x7y3(){ note_ctor("_ZN3ccc7CC4x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y3E, buf);
    ::ccc::CC4x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y3E);
    dp->::ccc::CC4x7y3::~CC4x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y3E(Test__ZN3ccc7CC4x7y3E, "_ZN3ccc7CC4x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y3C1Ev();
extern void _ZN3ccc7CC4x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y3E[] = {
  NSPAIR(_ZN3ccc7CC4x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y3E[];
extern void _ZN3ccc7CC4x7y33abcEv();
extern void _ZN3ccc7CC4x7y33pqrEv();
extern void _ZN3ccc7CC4x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y33pqrEv,_ZTv0_n12_N3ccc7CC4x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y33pqrEv,_ZThn4_N3ccc7CC4x7y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y33abcEv,_ZTv0_n16_N3ccc7CC4x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y33abcEv,_ZThn4_N3ccc7CC4x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y33efgEv,_ZTv0_n20_N3ccc7CC4x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y33efgEv,_ZThn4_N3ccc7CC4x7y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y33pqrEv,_ZTv0_n12_N3ccc7CC4x7y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y33abcEv,_ZTv0_n16_N3ccc7CC4x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y33efgEv,_ZTv0_n20_N3ccc7CC4x7y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y3E[] = {
  {&(_ZTVN3ccc7CC4x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y3E[];
static VTBL_ENTRY alt_thunk_names1944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y33efgEv,_ZTv0_n20_N3ccc7CC4x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y33efgEv,_ZThn4_N3ccc7CC4x7y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y33abcEv,_ZTv0_n16_N3ccc7CC4x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y33abcEv,_ZThn4_N3ccc7CC4x7y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y33pqrEv,_ZTv0_n12_N3ccc7CC4x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y33pqrEv,_ZThn4_N3ccc7CC4x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y3E = {  "_ZN3ccc7CC4x7y3E", // class name
  bases__ZN3ccc7CC4x7y3E, 2,
  &(vtc__ZN3ccc7CC4x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1944,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y3  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD4x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x7y33abcEv
  ~DD4x7y3(); // tgen
  DD4x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y33efgEv");}
void  ccc::DD4x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y33pqrEv");}
void  ccc::DD4x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y33abcEv");}
ccc::DD4x7y3 ::~DD4x7y3(){ note_dtor("_ZN3ccc7DD4x7y3E", this);} // tgen
ccc::DD4x7y3 ::DD4x7y3(){ note_ctor("_ZN3ccc7DD4x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y3E, buf);
    ::ccc::DD4x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y3E);
    dp->::ccc::DD4x7y3::~DD4x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y3E(Test__ZN3ccc7DD4x7y3E, "_ZN3ccc7DD4x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y3C1Ev();
extern void _ZN3ccc7DD4x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y3E[] = {
  NSPAIR(_ZN3ccc7DD4x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y3E[];
extern void _ZN3ccc7DD4x7y33pqrEv();
extern void _ZN3ccc7DD4x7y33abcEv();
extern void _ZN3ccc7DD4x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y33abcEv,_ZTv0_n12_N3ccc7DD4x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y33abcEv,_ZThn4_N3ccc7DD4x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y33pqrEv,_ZTv0_n16_N3ccc7DD4x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y33pqrEv,_ZThn4_N3ccc7DD4x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y33abcEv,_ZTv0_n12_N3ccc7DD4x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y33pqrEv,_ZTv0_n16_N3ccc7DD4x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y3E[] = {
  {&(_ZTVN3ccc7DD4x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y3E[];
static VTBL_ENTRY alt_thunk_names1945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y33pqrEv,_ZTv0_n16_N3ccc7DD4x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y33pqrEv,_ZThn4_N3ccc7DD4x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y33abcEv,_ZTv0_n12_N3ccc7DD4x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y33abcEv,_ZThn4_N3ccc7DD4x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y3E = {  "_ZN3ccc7DD4x7y3E", // class name
  bases__ZN3ccc7DD4x7y3E, 2,
  &(vtc__ZN3ccc7DD4x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1945,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y4  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC4x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y43efgEv
  ~CC4x7y4(); // tgen
  CC4x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y4E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y43pqrEv");}
void  ccc::CC4x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y43abcEv");}
void  ccc::CC4x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y43efgEv");}
ccc::CC4x7y4 ::~CC4x7y4(){ note_dtor("_ZN3ccc7CC4x7y4E", this);} // tgen
ccc::CC4x7y4 ::CC4x7y4(){ note_ctor("_ZN3ccc7CC4x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y4E, buf);
    ::ccc::CC4x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y4E);
    dp->::ccc::CC4x7y4::~CC4x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y4E(Test__ZN3ccc7CC4x7y4E, "_ZN3ccc7CC4x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y4C1Ev();
extern void _ZN3ccc7CC4x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y4E[] = {
  NSPAIR(_ZN3ccc7CC4x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y4E[];
extern void _ZN3ccc7CC4x7y43abcEv();
extern void _ZN3ccc7CC4x7y43pqrEv();
extern void _ZN3ccc7CC4x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y43pqrEv,_ZTv0_n12_N3ccc7CC4x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y43pqrEv,_ZThn4_N3ccc7CC4x7y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y43abcEv,_ZTv0_n16_N3ccc7CC4x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y43abcEv,_ZThn4_N3ccc7CC4x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y43efgEv,_ZTv0_n20_N3ccc7CC4x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y43efgEv,_ZThn4_N3ccc7CC4x7y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y43pqrEv,_ZTv0_n12_N3ccc7CC4x7y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y43abcEv,_ZTv0_n16_N3ccc7CC4x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y43efgEv,_ZTv0_n20_N3ccc7CC4x7y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y4E[] = {
  {&(_ZTVN3ccc7CC4x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y4E[];
static VTBL_ENTRY alt_thunk_names1946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y43efgEv,_ZTv0_n20_N3ccc7CC4x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y43efgEv,_ZThn4_N3ccc7CC4x7y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y43abcEv,_ZTv0_n16_N3ccc7CC4x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y43abcEv,_ZThn4_N3ccc7CC4x7y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y43pqrEv,_ZTv0_n12_N3ccc7CC4x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y43pqrEv,_ZThn4_N3ccc7CC4x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y4E = {  "_ZN3ccc7CC4x7y4E", // class name
  bases__ZN3ccc7CC4x7y4E, 2,
  &(vtc__ZN3ccc7CC4x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1946,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y4  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD4x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x7y43efgEv
  ~DD4x7y4(); // tgen
  DD4x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y43pqrEv");}
void  ccc::DD4x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y43abcEv");}
void  ccc::DD4x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y43efgEv");}
ccc::DD4x7y4 ::~DD4x7y4(){ note_dtor("_ZN3ccc7DD4x7y4E", this);} // tgen
ccc::DD4x7y4 ::DD4x7y4(){ note_ctor("_ZN3ccc7DD4x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y4E, buf);
    ::ccc::DD4x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y4E);
    dp->::ccc::DD4x7y4::~DD4x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y4E(Test__ZN3ccc7DD4x7y4E, "_ZN3ccc7DD4x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y4C1Ev();
extern void _ZN3ccc7DD4x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y4E[] = {
  NSPAIR(_ZN3ccc7DD4x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y4E[];
extern void _ZN3ccc7DD4x7y43pqrEv();
extern void _ZN3ccc7DD4x7y43abcEv();
extern void _ZN3ccc7DD4x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y43abcEv,_ZTv0_n12_N3ccc7DD4x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y43abcEv,_ZThn4_N3ccc7DD4x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y43pqrEv,_ZTv0_n16_N3ccc7DD4x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y43pqrEv,_ZThn4_N3ccc7DD4x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y43abcEv,_ZTv0_n12_N3ccc7DD4x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y43pqrEv,_ZTv0_n16_N3ccc7DD4x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y4E[] = {
  {&(_ZTVN3ccc7DD4x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y4E[];
static VTBL_ENTRY alt_thunk_names1947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y43pqrEv,_ZTv0_n16_N3ccc7DD4x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y43pqrEv,_ZThn4_N3ccc7DD4x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y43abcEv,_ZTv0_n12_N3ccc7DD4x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y43abcEv,_ZThn4_N3ccc7DD4x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y4E = {  "_ZN3ccc7DD4x7y4E", // class name
  bases__ZN3ccc7DD4x7y4E, 2,
  &(vtc__ZN3ccc7DD4x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1947,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y5  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC4x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y53abcEv
  ~CC4x7y5(); // tgen
  CC4x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y5E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y53pqrEv");}
void  ccc::CC4x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y53efgEv");}
void  ccc::CC4x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y53abcEv");}
ccc::CC4x7y5 ::~CC4x7y5(){ note_dtor("_ZN3ccc7CC4x7y5E", this);} // tgen
ccc::CC4x7y5 ::CC4x7y5(){ note_ctor("_ZN3ccc7CC4x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y5E, buf);
    ::ccc::CC4x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y5E);
    dp->::ccc::CC4x7y5::~CC4x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y5E(Test__ZN3ccc7CC4x7y5E, "_ZN3ccc7CC4x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y5C1Ev();
extern void _ZN3ccc7CC4x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y5E[] = {
  NSPAIR(_ZN3ccc7CC4x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y5E[];
extern void _ZN3ccc7CC4x7y53abcEv();
extern void _ZN3ccc7CC4x7y53pqrEv();
extern void _ZN3ccc7CC4x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y53pqrEv,_ZTv0_n12_N3ccc7CC4x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y53pqrEv,_ZThn4_N3ccc7CC4x7y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y53abcEv,_ZTv0_n16_N3ccc7CC4x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y53abcEv,_ZThn4_N3ccc7CC4x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y53efgEv,_ZTv0_n20_N3ccc7CC4x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y53efgEv,_ZThn4_N3ccc7CC4x7y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y53pqrEv,_ZTv0_n12_N3ccc7CC4x7y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y53abcEv,_ZTv0_n16_N3ccc7CC4x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y53efgEv,_ZTv0_n20_N3ccc7CC4x7y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y5E[] = {
  {&(_ZTVN3ccc7CC4x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y5E[];
static VTBL_ENTRY alt_thunk_names1948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y53efgEv,_ZTv0_n20_N3ccc7CC4x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y53efgEv,_ZThn4_N3ccc7CC4x7y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y53abcEv,_ZTv0_n16_N3ccc7CC4x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y53abcEv,_ZThn4_N3ccc7CC4x7y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y53pqrEv,_ZTv0_n12_N3ccc7CC4x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y53pqrEv,_ZThn4_N3ccc7CC4x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y5E = {  "_ZN3ccc7CC4x7y5E", // class name
  bases__ZN3ccc7CC4x7y5E, 2,
  &(vtc__ZN3ccc7CC4x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1948,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y5  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD4x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x7y53abcEv
  ~DD4x7y5(); // tgen
  DD4x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y53pqrEv");}
void  ccc::DD4x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y53efgEv");}
void  ccc::DD4x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y53abcEv");}
ccc::DD4x7y5 ::~DD4x7y5(){ note_dtor("_ZN3ccc7DD4x7y5E", this);} // tgen
ccc::DD4x7y5 ::DD4x7y5(){ note_ctor("_ZN3ccc7DD4x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y5E, buf);
    ::ccc::DD4x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y5E);
    dp->::ccc::DD4x7y5::~DD4x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y5E(Test__ZN3ccc7DD4x7y5E, "_ZN3ccc7DD4x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y5C1Ev();
extern void _ZN3ccc7DD4x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y5E[] = {
  NSPAIR(_ZN3ccc7DD4x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y5E[];
extern void _ZN3ccc7DD4x7y53pqrEv();
extern void _ZN3ccc7DD4x7y53abcEv();
extern void _ZN3ccc7DD4x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y53abcEv,_ZTv0_n12_N3ccc7DD4x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y53abcEv,_ZThn4_N3ccc7DD4x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y53pqrEv,_ZTv0_n16_N3ccc7DD4x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y53pqrEv,_ZThn4_N3ccc7DD4x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y53abcEv,_ZTv0_n12_N3ccc7DD4x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y53pqrEv,_ZTv0_n16_N3ccc7DD4x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y5E[] = {
  {&(_ZTVN3ccc7DD4x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y5E[];
static VTBL_ENTRY alt_thunk_names1949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y53pqrEv,_ZTv0_n16_N3ccc7DD4x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y53pqrEv,_ZThn4_N3ccc7DD4x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y53abcEv,_ZTv0_n12_N3ccc7DD4x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y53abcEv,_ZThn4_N3ccc7DD4x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y5E = {  "_ZN3ccc7DD4x7y5E", // class name
  bases__ZN3ccc7DD4x7y5E, 2,
  &(vtc__ZN3ccc7DD4x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1949,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y6  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y63efgEv
  ~CC4x7y6(); // tgen
  CC4x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y6E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y63abcEv");}
void  ccc::CC4x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y63efgEv");}
ccc::CC4x7y6 ::~CC4x7y6(){ note_dtor("_ZN3ccc7CC4x7y6E", this);} // tgen
ccc::CC4x7y6 ::CC4x7y6(){ note_ctor("_ZN3ccc7CC4x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y6E, buf);
    ::ccc::CC4x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y6E);
    dp->::ccc::CC4x7y6::~CC4x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y6E(Test__ZN3ccc7CC4x7y6E, "_ZN3ccc7CC4x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y6C1Ev();
extern void _ZN3ccc7CC4x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y6E[] = {
  NSPAIR(_ZN3ccc7CC4x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y6E[];
extern void _ZN3ccc7CC4x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC4x7y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y63abcEv,_ZTv0_n16_N3ccc7CC4x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y63abcEv,_ZThn4_N3ccc7CC4x7y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y63efgEv,_ZTv0_n20_N3ccc7CC4x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y63efgEv,_ZThn4_N3ccc7CC4x7y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y63abcEv,_ZTv0_n16_N3ccc7CC4x7y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y63efgEv,_ZTv0_n20_N3ccc7CC4x7y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y6E[] = {
  {&(_ZTVN3ccc7CC4x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y6E[];
static VTBL_ENTRY alt_thunk_names1950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y63efgEv,_ZTv0_n20_N3ccc7CC4x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y63efgEv,_ZThn4_N3ccc7CC4x7y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y63abcEv,_ZTv0_n16_N3ccc7CC4x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y63abcEv,_ZThn4_N3ccc7CC4x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y6E = {  "_ZN3ccc7CC4x7y6E", // class name
  bases__ZN3ccc7CC4x7y6E, 2,
  &(vtc__ZN3ccc7CC4x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1950,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y6  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD4x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x7y63efgEv
  ~DD4x7y6(); // tgen
  DD4x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y63abcEv");}
void  ccc::DD4x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y63efgEv");}
ccc::DD4x7y6 ::~DD4x7y6(){ note_dtor("_ZN3ccc7DD4x7y6E", this);} // tgen
ccc::DD4x7y6 ::DD4x7y6(){ note_ctor("_ZN3ccc7DD4x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y6E, buf);
    ::ccc::DD4x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y6E);
    dp->::ccc::DD4x7y6::~DD4x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y6E(Test__ZN3ccc7DD4x7y6E, "_ZN3ccc7DD4x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y6C1Ev();
extern void _ZN3ccc7DD4x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y6E[] = {
  NSPAIR(_ZN3ccc7DD4x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x7y63abcEv();
extern void _ZN3ccc7DD4x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y63abcEv,_ZTv0_n12_N3ccc7DD4x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y63abcEv,_ZThn4_N3ccc7DD4x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y63abcEv,_ZTv0_n12_N3ccc7DD4x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y6E[] = {
  {&(_ZTVN3ccc7DD4x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y6E[];
static VTBL_ENTRY alt_thunk_names1951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y63abcEv,_ZTv0_n12_N3ccc7DD4x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y63abcEv,_ZThn4_N3ccc7DD4x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y6E = {  "_ZN3ccc7DD4x7y6E", // class name
  bases__ZN3ccc7DD4x7y6E, 2,
  &(vtc__ZN3ccc7DD4x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1951,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y7  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y73pqrEv
  ~CC4x7y7(); // tgen
  CC4x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y7E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y73abcEv");}
void  ccc::CC4x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y73pqrEv");}
ccc::CC4x7y7 ::~CC4x7y7(){ note_dtor("_ZN3ccc7CC4x7y7E", this);} // tgen
ccc::CC4x7y7 ::CC4x7y7(){ note_ctor("_ZN3ccc7CC4x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y7E, buf);
    ::ccc::CC4x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y7E);
    dp->::ccc::CC4x7y7::~CC4x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y7E(Test__ZN3ccc7CC4x7y7E, "_ZN3ccc7CC4x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y7C1Ev();
extern void _ZN3ccc7CC4x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y7E[] = {
  NSPAIR(_ZN3ccc7CC4x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y7E[];
extern void _ZN3ccc7CC4x7y73abcEv();
extern void _ZN3ccc7CC4x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y73pqrEv,_ZTv0_n12_N3ccc7CC4x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y73pqrEv,_ZThn4_N3ccc7CC4x7y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y73abcEv,_ZTv0_n16_N3ccc7CC4x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y73abcEv,_ZThn4_N3ccc7CC4x7y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y73pqrEv,_ZTv0_n12_N3ccc7CC4x7y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y73abcEv,_ZTv0_n16_N3ccc7CC4x7y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y7E[] = {
  {&(_ZTVN3ccc7CC4x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y7E[];
static VTBL_ENTRY alt_thunk_names1952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y73abcEv,_ZTv0_n16_N3ccc7CC4x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y73abcEv,_ZThn4_N3ccc7CC4x7y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y73pqrEv,_ZTv0_n12_N3ccc7CC4x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y73pqrEv,_ZThn4_N3ccc7CC4x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y7E = {  "_ZN3ccc7CC4x7y7E", // class name
  bases__ZN3ccc7CC4x7y7E, 2,
  &(vtc__ZN3ccc7CC4x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1952,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y7  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD4x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y73pqrEv
  ~DD4x7y7(); // tgen
  DD4x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y73abcEv");}
void  ccc::DD4x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y73pqrEv");}
ccc::DD4x7y7 ::~DD4x7y7(){ note_dtor("_ZN3ccc7DD4x7y7E", this);} // tgen
ccc::DD4x7y7 ::DD4x7y7(){ note_ctor("_ZN3ccc7DD4x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y7E, buf);
    ::ccc::DD4x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y7E);
    dp->::ccc::DD4x7y7::~DD4x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y7E(Test__ZN3ccc7DD4x7y7E, "_ZN3ccc7DD4x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y7C1Ev();
extern void _ZN3ccc7DD4x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y7E[] = {
  NSPAIR(_ZN3ccc7DD4x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y7E[];
extern void _ZN3ccc7DD4x7y73pqrEv();
extern void _ZN3ccc7DD4x7y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y73abcEv,_ZTv0_n12_N3ccc7DD4x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y73abcEv,_ZThn4_N3ccc7DD4x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y73pqrEv,_ZTv0_n16_N3ccc7DD4x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y73pqrEv,_ZThn4_N3ccc7DD4x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y73abcEv,_ZTv0_n12_N3ccc7DD4x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y73pqrEv,_ZTv0_n16_N3ccc7DD4x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y7E[] = {
  {&(_ZTVN3ccc7DD4x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y7E[];
static VTBL_ENTRY alt_thunk_names1953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y73pqrEv,_ZTv0_n16_N3ccc7DD4x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y73pqrEv,_ZThn4_N3ccc7DD4x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y73abcEv,_ZTv0_n12_N3ccc7DD4x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y73abcEv,_ZThn4_N3ccc7DD4x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y7E = {  "_ZN3ccc7DD4x7y7E", // class name
  bases__ZN3ccc7DD4x7y7E, 2,
  &(vtc__ZN3ccc7DD4x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1953,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y8  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y83abcEv
  ~CC4x7y8(); // tgen
  CC4x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y8E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y83efgEv");}
void  ccc::CC4x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y83abcEv");}
ccc::CC4x7y8 ::~CC4x7y8(){ note_dtor("_ZN3ccc7CC4x7y8E", this);} // tgen
ccc::CC4x7y8 ::CC4x7y8(){ note_ctor("_ZN3ccc7CC4x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y8E, buf);
    ::ccc::CC4x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y8E);
    dp->::ccc::CC4x7y8::~CC4x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y8E(Test__ZN3ccc7CC4x7y8E, "_ZN3ccc7CC4x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y8C1Ev();
extern void _ZN3ccc7CC4x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y8E[] = {
  NSPAIR(_ZN3ccc7CC4x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y8E[];
extern void _ZN3ccc7CC4x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC4x7y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x7y83abcEv,_ZTv0_n16_N3ccc7CC4x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y83abcEv,_ZThn4_N3ccc7CC4x7y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y83efgEv,_ZTv0_n20_N3ccc7CC4x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y83efgEv,_ZThn4_N3ccc7CC4x7y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x7y83abcEv,_ZTv0_n16_N3ccc7CC4x7y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y83efgEv,_ZTv0_n20_N3ccc7CC4x7y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y8E[] = {
  {&(_ZTVN3ccc7CC4x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y8E[];
static VTBL_ENTRY alt_thunk_names1954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y83efgEv,_ZTv0_n20_N3ccc7CC4x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y83efgEv,_ZThn4_N3ccc7CC4x7y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x7y83abcEv,_ZTv0_n16_N3ccc7CC4x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y83abcEv,_ZThn4_N3ccc7CC4x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y8E = {  "_ZN3ccc7CC4x7y8E", // class name
  bases__ZN3ccc7CC4x7y8E, 2,
  &(vtc__ZN3ccc7CC4x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1954,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y8  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD4x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x7y83abcEv
  ~DD4x7y8(); // tgen
  DD4x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y83efgEv");}
void  ccc::DD4x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x7y83abcEv");}
ccc::DD4x7y8 ::~DD4x7y8(){ note_dtor("_ZN3ccc7DD4x7y8E", this);} // tgen
ccc::DD4x7y8 ::DD4x7y8(){ note_ctor("_ZN3ccc7DD4x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y8E, buf);
    ::ccc::DD4x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y8E);
    dp->::ccc::DD4x7y8::~DD4x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y8E(Test__ZN3ccc7DD4x7y8E, "_ZN3ccc7DD4x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y8C1Ev();
extern void _ZN3ccc7DD4x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y8E[] = {
  NSPAIR(_ZN3ccc7DD4x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x7y83abcEv();
extern void _ZN3ccc7DD4x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x7y83abcEv,_ZTv0_n12_N3ccc7DD4x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y83abcEv,_ZThn4_N3ccc7DD4x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x7y83abcEv,_ZTv0_n12_N3ccc7DD4x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y8E[] = {
  {&(_ZTVN3ccc7DD4x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y8E[];
static VTBL_ENTRY alt_thunk_names1955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x7y83abcEv,_ZTv0_n12_N3ccc7DD4x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y83abcEv,_ZThn4_N3ccc7DD4x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y8E = {  "_ZN3ccc7DD4x7y8E", // class name
  bases__ZN3ccc7DD4x7y8E, 2,
  &(vtc__ZN3ccc7DD4x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1955,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y9  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y93pqrEv
  ~CC4x7y9(); // tgen
  CC4x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y9E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y93efgEv");}
void  ccc::CC4x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y93pqrEv");}
ccc::CC4x7y9 ::~CC4x7y9(){ note_dtor("_ZN3ccc7CC4x7y9E", this);} // tgen
ccc::CC4x7y9 ::CC4x7y9(){ note_ctor("_ZN3ccc7CC4x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y9E, buf);
    ::ccc::CC4x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC4x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y9E);
    dp->::ccc::CC4x7y9::~CC4x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y9E(Test__ZN3ccc7CC4x7y9E, "_ZN3ccc7CC4x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y9C1Ev();
extern void _ZN3ccc7CC4x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y9E[] = {
  NSPAIR(_ZN3ccc7CC4x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC4x7y93pqrEv();
extern void _ZN3ccc7CC4x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x7y93pqrEv,_ZTv0_n12_N3ccc7CC4x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y93pqrEv,_ZThn4_N3ccc7CC4x7y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x7y93efgEv,_ZTv0_n20_N3ccc7CC4x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y93efgEv,_ZThn4_N3ccc7CC4x7y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x7y93pqrEv,_ZTv0_n12_N3ccc7CC4x7y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x7y93efgEv,_ZTv0_n20_N3ccc7CC4x7y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x7y9E[] = {
  {&(_ZTVN3ccc7CC4x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x7y9E[];
static VTBL_ENTRY alt_thunk_names1956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x7y93efgEv,_ZTv0_n20_N3ccc7CC4x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y93efgEv,_ZThn4_N3ccc7CC4x7y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x7y93pqrEv,_ZTv0_n12_N3ccc7CC4x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x7y93pqrEv,_ZThn4_N3ccc7CC4x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x7y9E = {  "_ZN3ccc7CC4x7y9E", // class name
  bases__ZN3ccc7CC4x7y9E, 2,
  &(vtc__ZN3ccc7CC4x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x7y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1956,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y9  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD4x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x7y93pqrEv
  ~DD4x7y9(); // tgen
  DD4x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x7y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x7y93efgEv");}
void  ccc::DD4x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x7y93pqrEv");}
ccc::DD4x7y9 ::~DD4x7y9(){ note_dtor("_ZN3ccc7DD4x7y9E", this);} // tgen
ccc::DD4x7y9 ::DD4x7y9(){ note_ctor("_ZN3ccc7DD4x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x7y9E, buf);
    ::ccc::DD4x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x7y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD4x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x7y9E);
    dp->::ccc::DD4x7y9::~DD4x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x7y9E(Test__ZN3ccc7DD4x7y9E, "_ZN3ccc7DD4x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x7y9C1Ev();
extern void _ZN3ccc7DD4x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x7y9E[] = {
  NSPAIR(_ZN3ccc7DD4x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD4x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y9E[];
extern void _ZN3ccc7DD4x7y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x7y93pqrEv,_ZTv0_n16_N3ccc7DD4x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x7y93pqrEv,_ZThn4_N3ccc7DD4x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x7y93pqrEv,_ZTv0_n16_N3ccc7DD4x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x7y9E[] = {
  {&(_ZTVN3ccc7DD4x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x7y9E[];
static VTBL_ENTRY alt_thunk_names1957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x7y93pqrEv,_ZTv0_n16_N3ccc7DD4x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x7y93pqrEv,_ZThn4_N3ccc7DD4x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x7y9E = {  "_ZN3ccc7DD4x7y9E", // class name
  bases__ZN3ccc7DD4x7y9E, 2,
  &(vtc__ZN3ccc7DD4x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x7y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1957,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y10  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x7y103abcEv
  ~CC4x7y10(); // tgen
  CC4x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y10E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y103pqrEv");}
void  ccc::CC4x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x7y103abcEv");}
ccc::CC4x7y10 ::~CC4x7y10(){ note_dtor("_ZN3ccc8CC4x7y10E", this);} // tgen
ccc::CC4x7y10 ::CC4x7y10(){ note_ctor("_ZN3ccc8CC4x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y10E, buf);
    ::ccc::CC4x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y10E);
    dp->::ccc::CC4x7y10::~CC4x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y10E(Test__ZN3ccc8CC4x7y10E, "_ZN3ccc8CC4x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y10C1Ev();
extern void _ZN3ccc8CC4x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y10E[] = {
  NSPAIR(_ZN3ccc8CC4x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y10E[];
extern void _ZN3ccc8CC4x7y103abcEv();
extern void _ZN3ccc8CC4x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x7y103pqrEv,_ZTv0_n12_N3ccc8CC4x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y103pqrEv,_ZThn4_N3ccc8CC4x7y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x7y103abcEv,_ZTv0_n16_N3ccc8CC4x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y103abcEv,_ZThn4_N3ccc8CC4x7y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x7y103pqrEv,_ZTv0_n12_N3ccc8CC4x7y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x7y103abcEv,_ZTv0_n16_N3ccc8CC4x7y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y10E[] = {
  {&(_ZTVN3ccc8CC4x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y10E[];
static VTBL_ENTRY alt_thunk_names1958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x7y103abcEv,_ZTv0_n16_N3ccc8CC4x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y103abcEv,_ZThn4_N3ccc8CC4x7y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x7y103pqrEv,_ZTv0_n12_N3ccc8CC4x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y103pqrEv,_ZThn4_N3ccc8CC4x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x7y10E = {  "_ZN3ccc8CC4x7y10E", // class name
  bases__ZN3ccc8CC4x7y10E, 2,
  &(vtc__ZN3ccc8CC4x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1958,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y10  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD4x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x7y103abcEv
  ~DD4x7y10(); // tgen
  DD4x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x7y103pqrEv");}
void  ccc::DD4x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x7y103abcEv");}
ccc::DD4x7y10 ::~DD4x7y10(){ note_dtor("_ZN3ccc8DD4x7y10E", this);} // tgen
ccc::DD4x7y10 ::DD4x7y10(){ note_ctor("_ZN3ccc8DD4x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y10E, buf);
    ::ccc::DD4x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y10E);
    dp->::ccc::DD4x7y10::~DD4x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y10E(Test__ZN3ccc8DD4x7y10E, "_ZN3ccc8DD4x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y10C1Ev();
extern void _ZN3ccc8DD4x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y10E[] = {
  NSPAIR(_ZN3ccc8DD4x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y10E[];
extern void _ZN3ccc8DD4x7y103pqrEv();
extern void _ZN3ccc8DD4x7y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x7y103abcEv,_ZTv0_n12_N3ccc8DD4x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x7y103abcEv,_ZThn4_N3ccc8DD4x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x7y103pqrEv,_ZTv0_n16_N3ccc8DD4x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x7y103pqrEv,_ZThn4_N3ccc8DD4x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x7y103abcEv,_ZTv0_n12_N3ccc8DD4x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x7y103pqrEv,_ZTv0_n16_N3ccc8DD4x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y10E[] = {
  {&(_ZTVN3ccc8DD4x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y10E[];
static VTBL_ENTRY alt_thunk_names1959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x7y103pqrEv,_ZTv0_n16_N3ccc8DD4x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x7y103pqrEv,_ZThn4_N3ccc8DD4x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x7y103abcEv,_ZTv0_n12_N3ccc8DD4x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x7y103abcEv,_ZThn4_N3ccc8DD4x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x7y10E = {  "_ZN3ccc8DD4x7y10E", // class name
  bases__ZN3ccc8DD4x7y10E, 2,
  &(vtc__ZN3ccc8DD4x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1959,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y11  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x7y113efgEv
  ~CC4x7y11(); // tgen
  CC4x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y11E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y113pqrEv");}
void  ccc::CC4x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x7y113efgEv");}
ccc::CC4x7y11 ::~CC4x7y11(){ note_dtor("_ZN3ccc8CC4x7y11E", this);} // tgen
ccc::CC4x7y11 ::CC4x7y11(){ note_ctor("_ZN3ccc8CC4x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y11E, buf);
    ::ccc::CC4x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y11E);
    dp->::ccc::CC4x7y11::~CC4x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y11E(Test__ZN3ccc8CC4x7y11E, "_ZN3ccc8CC4x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y11C1Ev();
extern void _ZN3ccc8CC4x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y11E[] = {
  NSPAIR(_ZN3ccc8CC4x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC4x7y113pqrEv();
extern void _ZN3ccc8CC4x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x7y113pqrEv,_ZTv0_n12_N3ccc8CC4x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y113pqrEv,_ZThn4_N3ccc8CC4x7y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x7y113efgEv,_ZTv0_n20_N3ccc8CC4x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y113efgEv,_ZThn4_N3ccc8CC4x7y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x7y113pqrEv,_ZTv0_n12_N3ccc8CC4x7y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x7y113efgEv,_ZTv0_n20_N3ccc8CC4x7y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y11E[] = {
  {&(_ZTVN3ccc8CC4x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y11E[];
static VTBL_ENTRY alt_thunk_names1960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x7y113efgEv,_ZTv0_n20_N3ccc8CC4x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y113efgEv,_ZThn4_N3ccc8CC4x7y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x7y113pqrEv,_ZTv0_n12_N3ccc8CC4x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y113pqrEv,_ZThn4_N3ccc8CC4x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x7y11E = {  "_ZN3ccc8CC4x7y11E", // class name
  bases__ZN3ccc8CC4x7y11E, 2,
  &(vtc__ZN3ccc8CC4x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1960,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y11  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD4x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x7y113efgEv
  ~DD4x7y11(); // tgen
  DD4x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x7y113pqrEv");}
void  ccc::DD4x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x7y113efgEv");}
ccc::DD4x7y11 ::~DD4x7y11(){ note_dtor("_ZN3ccc8DD4x7y11E", this);} // tgen
ccc::DD4x7y11 ::DD4x7y11(){ note_ctor("_ZN3ccc8DD4x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y11E, buf);
    ::ccc::DD4x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y11E);
    dp->::ccc::DD4x7y11::~DD4x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y11E(Test__ZN3ccc8DD4x7y11E, "_ZN3ccc8DD4x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y11C1Ev();
extern void _ZN3ccc8DD4x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y11E[] = {
  NSPAIR(_ZN3ccc8DD4x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y11E[];
extern void _ZN3ccc8DD4x7y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x7y113pqrEv,_ZTv0_n16_N3ccc8DD4x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x7y113pqrEv,_ZThn4_N3ccc8DD4x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x7y113pqrEv,_ZTv0_n16_N3ccc8DD4x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y11E[] = {
  {&(_ZTVN3ccc8DD4x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y11E[];
static VTBL_ENTRY alt_thunk_names1961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x7y113pqrEv,_ZTv0_n16_N3ccc8DD4x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x7y113pqrEv,_ZThn4_N3ccc8DD4x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x7y11E = {  "_ZN3ccc8DD4x7y11E", // class name
  bases__ZN3ccc8DD4x7y11E, 2,
  &(vtc__ZN3ccc8DD4x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1961,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y12  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC4x7y123abcEv
  ~CC4x7y12(); // tgen
  CC4x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x7y123abcEv");}
ccc::CC4x7y12 ::~CC4x7y12(){ note_dtor("_ZN3ccc8CC4x7y12E", this);} // tgen
ccc::CC4x7y12 ::CC4x7y12(){ note_ctor("_ZN3ccc8CC4x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y12E, buf);
    ::ccc::CC4x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y12E);
    dp->::ccc::CC4x7y12::~CC4x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y12E(Test__ZN3ccc8CC4x7y12E, "_ZN3ccc8CC4x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y12C1Ev();
extern void _ZN3ccc8CC4x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y12E[] = {
  NSPAIR(_ZN3ccc8CC4x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y12E[];
extern void _ZN3ccc8CC4x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x7y123abcEv,_ZTv0_n16_N3ccc8CC4x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y123abcEv,_ZThn4_N3ccc8CC4x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x7y123abcEv,_ZTv0_n16_N3ccc8CC4x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y12E[] = {
  {&(_ZTVN3ccc8CC4x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y12E[];
static VTBL_ENTRY alt_thunk_names1962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x7y123abcEv,_ZTv0_n16_N3ccc8CC4x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y123abcEv,_ZThn4_N3ccc8CC4x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x7y12E = {  "_ZN3ccc8CC4x7y12E", // class name
  bases__ZN3ccc8CC4x7y12E, 2,
  &(vtc__ZN3ccc8CC4x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1962,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y12  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD4x7y123abcEv
  ~DD4x7y12(); // tgen
  DD4x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x7y123abcEv");}
ccc::DD4x7y12 ::~DD4x7y12(){ note_dtor("_ZN3ccc8DD4x7y12E", this);} // tgen
ccc::DD4x7y12 ::DD4x7y12(){ note_ctor("_ZN3ccc8DD4x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y12E, buf);
    ::ccc::DD4x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y12E);
    dp->::ccc::DD4x7y12::~DD4x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y12E(Test__ZN3ccc8DD4x7y12E, "_ZN3ccc8DD4x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y12C1Ev();
extern void _ZN3ccc8DD4x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y12E[] = {
  NSPAIR(_ZN3ccc8DD4x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x7y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x7y123abcEv,_ZTv0_n12_N3ccc8DD4x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x7y123abcEv,_ZThn4_N3ccc8DD4x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x7y123abcEv,_ZTv0_n12_N3ccc8DD4x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y12E[] = {
  {&(_ZTVN3ccc8DD4x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y12E[];
static VTBL_ENTRY alt_thunk_names1963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x7y123abcEv,_ZTv0_n12_N3ccc8DD4x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x7y123abcEv,_ZThn4_N3ccc8DD4x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x7y12E = {  "_ZN3ccc8DD4x7y12E", // class name
  bases__ZN3ccc8DD4x7y12E, 2,
  &(vtc__ZN3ccc8DD4x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1963,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y13  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC4x7y133efgEv
  ~CC4x7y13(); // tgen
  CC4x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x7y133efgEv");}
ccc::CC4x7y13 ::~CC4x7y13(){ note_dtor("_ZN3ccc8CC4x7y13E", this);} // tgen
ccc::CC4x7y13 ::CC4x7y13(){ note_ctor("_ZN3ccc8CC4x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y13E, buf);
    ::ccc::CC4x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y13E);
    dp->::ccc::CC4x7y13::~CC4x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y13E(Test__ZN3ccc8CC4x7y13E, "_ZN3ccc8CC4x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y13C1Ev();
extern void _ZN3ccc8CC4x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y13E[] = {
  NSPAIR(_ZN3ccc8CC4x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC4x7y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x7y133efgEv,_ZTv0_n20_N3ccc8CC4x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y133efgEv,_ZThn4_N3ccc8CC4x7y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x7y133efgEv,_ZTv0_n20_N3ccc8CC4x7y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y13E[] = {
  {&(_ZTVN3ccc8CC4x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y13E[];
static VTBL_ENTRY alt_thunk_names1964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x7y133efgEv,_ZTv0_n20_N3ccc8CC4x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y133efgEv,_ZThn4_N3ccc8CC4x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x7y13E = {  "_ZN3ccc8CC4x7y13E", // class name
  bases__ZN3ccc8CC4x7y13E, 2,
  &(vtc__ZN3ccc8CC4x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1964,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y13  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD4x7y133efgEv
  ~DD4x7y13(); // tgen
  DD4x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x7y133efgEv");}
ccc::DD4x7y13 ::~DD4x7y13(){ note_dtor("_ZN3ccc8DD4x7y13E", this);} // tgen
ccc::DD4x7y13 ::DD4x7y13(){ note_ctor("_ZN3ccc8DD4x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y13E, buf);
    ::ccc::DD4x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y13E);
    dp->::ccc::DD4x7y13::~DD4x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y13E(Test__ZN3ccc8DD4x7y13E, "_ZN3ccc8DD4x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y13C1Ev();
extern void _ZN3ccc8DD4x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y13E[] = {
  NSPAIR(_ZN3ccc8DD4x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y13E[] = {
  {&(_ZTVN3ccc8DD4x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y13E[];
Class_Descriptor cd__ZN3ccc8DD4x7y13E = {  "_ZN3ccc8DD4x7y13E", // class name
  bases__ZN3ccc8DD4x7y13E, 2,
  &(vtc__ZN3ccc8DD4x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y14  : virtual ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y143pqrEv
  ~CC4x7y14(); // tgen
  CC4x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y143pqrEv");}
ccc::CC4x7y14 ::~CC4x7y14(){ note_dtor("_ZN3ccc8CC4x7y14E", this);} // tgen
ccc::CC4x7y14 ::CC4x7y14(){ note_ctor("_ZN3ccc8CC4x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y14E, buf);
    ::ccc::CC4x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y14E);
    dp->::ccc::CC4x7y14::~CC4x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y14E(Test__ZN3ccc8CC4x7y14E, "_ZN3ccc8CC4x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y14C1Ev();
extern void _ZN3ccc8CC4x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y14E[] = {
  NSPAIR(_ZN3ccc8CC4x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC4x7y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x7y143pqrEv,_ZTv0_n12_N3ccc8CC4x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y143pqrEv,_ZThn4_N3ccc8CC4x7y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x7y143pqrEv,_ZTv0_n12_N3ccc8CC4x7y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y14E[] = {
  {&(_ZTVN3ccc8CC4x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y14E[];
static VTBL_ENTRY alt_thunk_names1965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x7y143pqrEv,_ZTv0_n12_N3ccc8CC4x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x7y143pqrEv,_ZThn4_N3ccc8CC4x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x7y14E = {  "_ZN3ccc8CC4x7y14E", // class name
  bases__ZN3ccc8CC4x7y14E, 2,
  &(vtc__ZN3ccc8CC4x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1965,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y14  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD4x7y143pqrEv
  ~DD4x7y14(); // tgen
  DD4x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x7y143pqrEv");}
ccc::DD4x7y14 ::~DD4x7y14(){ note_dtor("_ZN3ccc8DD4x7y14E", this);} // tgen
ccc::DD4x7y14 ::DD4x7y14(){ note_ctor("_ZN3ccc8DD4x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y14E, buf);
    ::ccc::DD4x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y14E);
    dp->::ccc::DD4x7y14::~DD4x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y14E(Test__ZN3ccc8DD4x7y14E, "_ZN3ccc8DD4x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y14C1Ev();
extern void _ZN3ccc8DD4x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y14E[] = {
  NSPAIR(_ZN3ccc8DD4x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y14E[];
extern void _ZN3ccc8DD4x7y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x7y143pqrEv,_ZTv0_n16_N3ccc8DD4x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x7y143pqrEv,_ZThn4_N3ccc8DD4x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x7y143pqrEv,_ZTv0_n16_N3ccc8DD4x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y14E[] = {
  {&(_ZTVN3ccc8DD4x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y14E[];
static VTBL_ENTRY alt_thunk_names1966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x7y143pqrEv,_ZTv0_n16_N3ccc8DD4x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x7y143pqrEv,_ZThn4_N3ccc8DD4x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x7y14E = {  "_ZN3ccc8DD4x7y14E", // class name
  bases__ZN3ccc8DD4x7y14E, 2,
  &(vtc__ZN3ccc8DD4x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1966,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y15  : virtual ::ccc::AA4 , ::ccc::BB7 {
  ~CC4x7y15(); // tgen
  CC4x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x7y15 ::~CC4x7y15(){ note_dtor("_ZN3ccc8CC4x7y15E", this);} // tgen
ccc::CC4x7y15 ::CC4x7y15(){ note_ctor("_ZN3ccc8CC4x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y15E, buf);
    ::ccc::CC4x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC4x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y15E);
    dp->::ccc::CC4x7y15::~CC4x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y15E(Test__ZN3ccc8CC4x7y15E, "_ZN3ccc8CC4x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y15C1Ev();
extern void _ZN3ccc8CC4x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y15E[] = {
  NSPAIR(_ZN3ccc8CC4x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x7y15E[] = {
  {&(_ZTVN3ccc8CC4x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x7y15E[];
Class_Descriptor cd__ZN3ccc8CC4x7y15E = {  "_ZN3ccc8CC4x7y15E", // class name
  bases__ZN3ccc8CC4x7y15E, 2,
  &(vtc__ZN3ccc8CC4x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x7y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x7y15  : virtual ::ccc::AA4 , virtual ::ccc::BB7 {
  ~DD4x7y15(); // tgen
  DD4x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x7y15 ::~DD4x7y15(){ note_dtor("_ZN3ccc8DD4x7y15E", this);} // tgen
ccc::DD4x7y15 ::DD4x7y15(){ note_ctor("_ZN3ccc8DD4x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x7y15E, buf);
    ::ccc::DD4x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x7y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD4x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x7y15E);
    dp->::ccc::DD4x7y15::~DD4x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x7y15E(Test__ZN3ccc8DD4x7y15E, "_ZN3ccc8DD4x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x7y15C1Ev();
extern void _ZN3ccc8DD4x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x7y15E[] = {
  NSPAIR(_ZN3ccc8DD4x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD4x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x7y15E[] = {
  {&(_ZTVN3ccc8DD4x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x7y15E[];
Class_Descriptor cd__ZN3ccc8DD4x7y15E = {  "_ZN3ccc8DD4x7y15E", // class name
  bases__ZN3ccc8DD4x7y15E, 2,
  &(vtc__ZN3ccc8DD4x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x7y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y0  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y03pqrEv
  ~CC4x8y0(); // tgen
  CC4x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y0E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y03abcEv");}
void  ccc::CC4x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y03efgEv");}
void  ccc::CC4x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y03pqrEv");}
ccc::CC4x8y0 ::~CC4x8y0(){ note_dtor("_ZN3ccc7CC4x8y0E", this);} // tgen
ccc::CC4x8y0 ::CC4x8y0(){ note_ctor("_ZN3ccc7CC4x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y0E, buf);
    ::ccc::CC4x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y0E);
    dp->::ccc::CC4x8y0::~CC4x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y0E(Test__ZN3ccc7CC4x8y0E, "_ZN3ccc7CC4x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y0C1Ev();
extern void _ZN3ccc7CC4x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y0E[] = {
  NSPAIR(_ZN3ccc7CC4x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y0E[];
extern void _ZN3ccc7CC4x8y03efgEv();
extern void _ZN3ccc7CC4x8y03abcEv();
extern void _ZN3ccc7CC4x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y03pqrEv,_ZTv0_n12_N3ccc7CC4x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y03pqrEv,_ZThn4_N3ccc7CC4x8y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y03abcEv,_ZTv0_n16_N3ccc7CC4x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y03abcEv,_ZThn4_N3ccc7CC4x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y03efgEv,_ZTv0_n20_N3ccc7CC4x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y03efgEv,_ZThn4_N3ccc7CC4x8y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y03pqrEv,_ZTv0_n12_N3ccc7CC4x8y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y03abcEv,_ZTv0_n16_N3ccc7CC4x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y03efgEv,_ZTv0_n20_N3ccc7CC4x8y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y0E[] = {
  {&(_ZTVN3ccc7CC4x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y0E[];
static VTBL_ENTRY alt_thunk_names1967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y03efgEv,_ZTv0_n20_N3ccc7CC4x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y03efgEv,_ZThn4_N3ccc7CC4x8y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y03abcEv,_ZTv0_n16_N3ccc7CC4x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y03abcEv,_ZThn4_N3ccc7CC4x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y03pqrEv,_ZTv0_n12_N3ccc7CC4x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y03pqrEv,_ZThn4_N3ccc7CC4x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y0E = {  "_ZN3ccc7CC4x8y0E", // class name
  bases__ZN3ccc7CC4x8y0E, 2,
  &(vtc__ZN3ccc7CC4x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1967,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y0  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD4x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y03pqrEv
  ~DD4x8y0(); // tgen
  DD4x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y03abcEv");}
void  ccc::DD4x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y03efgEv");}
void  ccc::DD4x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y03pqrEv");}
ccc::DD4x8y0 ::~DD4x8y0(){ note_dtor("_ZN3ccc7DD4x8y0E", this);} // tgen
ccc::DD4x8y0 ::DD4x8y0(){ note_ctor("_ZN3ccc7DD4x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y0E, buf);
    ::ccc::DD4x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y0E);
    dp->::ccc::DD4x8y0::~DD4x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y0E(Test__ZN3ccc7DD4x8y0E, "_ZN3ccc7DD4x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y0C1Ev();
extern void _ZN3ccc7DD4x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y0E[] = {
  NSPAIR(_ZN3ccc7DD4x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y0E[];
extern void _ZN3ccc7DD4x8y03pqrEv();
extern void _ZN3ccc7DD4x8y03abcEv();
extern void _ZN3ccc7DD4x8y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y03efgEv,_ZTv0_n12_N3ccc7DD4x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y03efgEv,_ZThn4_N3ccc7DD4x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y03abcEv,_ZTv0_n16_N3ccc7DD4x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y03abcEv,_ZThn4_N3ccc7DD4x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y03efgEv,_ZTv0_n12_N3ccc7DD4x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y03abcEv,_ZTv0_n16_N3ccc7DD4x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y0E[] = {
  {&(_ZTVN3ccc7DD4x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y0E[];
static VTBL_ENTRY alt_thunk_names1968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y03abcEv,_ZTv0_n16_N3ccc7DD4x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y03abcEv,_ZThn4_N3ccc7DD4x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y03efgEv,_ZTv0_n12_N3ccc7DD4x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y03efgEv,_ZThn4_N3ccc7DD4x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y0E = {  "_ZN3ccc7DD4x8y0E", // class name
  bases__ZN3ccc7DD4x8y0E, 2,
  &(vtc__ZN3ccc7DD4x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1968,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y1  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x8y13efgEv
  ~CC4x8y1(); // tgen
  CC4x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y1E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y13abcEv");}
void  ccc::CC4x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y13pqrEv");}
void  ccc::CC4x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y13efgEv");}
ccc::CC4x8y1 ::~CC4x8y1(){ note_dtor("_ZN3ccc7CC4x8y1E", this);} // tgen
ccc::CC4x8y1 ::CC4x8y1(){ note_ctor("_ZN3ccc7CC4x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y1E, buf);
    ::ccc::CC4x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y1E);
    dp->::ccc::CC4x8y1::~CC4x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y1E(Test__ZN3ccc7CC4x8y1E, "_ZN3ccc7CC4x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y1C1Ev();
extern void _ZN3ccc7CC4x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y1E[] = {
  NSPAIR(_ZN3ccc7CC4x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y1E[];
extern void _ZN3ccc7CC4x8y13efgEv();
extern void _ZN3ccc7CC4x8y13abcEv();
extern void _ZN3ccc7CC4x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y13pqrEv,_ZTv0_n12_N3ccc7CC4x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y13pqrEv,_ZThn4_N3ccc7CC4x8y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y13abcEv,_ZTv0_n16_N3ccc7CC4x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y13abcEv,_ZThn4_N3ccc7CC4x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y13efgEv,_ZTv0_n20_N3ccc7CC4x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y13efgEv,_ZThn4_N3ccc7CC4x8y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y13pqrEv,_ZTv0_n12_N3ccc7CC4x8y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y13abcEv,_ZTv0_n16_N3ccc7CC4x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y13efgEv,_ZTv0_n20_N3ccc7CC4x8y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y1E[] = {
  {&(_ZTVN3ccc7CC4x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y1E[];
static VTBL_ENTRY alt_thunk_names1969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y13efgEv,_ZTv0_n20_N3ccc7CC4x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y13efgEv,_ZThn4_N3ccc7CC4x8y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y13abcEv,_ZTv0_n16_N3ccc7CC4x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y13abcEv,_ZThn4_N3ccc7CC4x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y13pqrEv,_ZTv0_n12_N3ccc7CC4x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y13pqrEv,_ZThn4_N3ccc7CC4x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y1E = {  "_ZN3ccc7CC4x8y1E", // class name
  bases__ZN3ccc7CC4x8y1E, 2,
  &(vtc__ZN3ccc7CC4x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1969,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y1  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD4x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x8y13efgEv
  ~DD4x8y1(); // tgen
  DD4x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y13abcEv");}
void  ccc::DD4x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y13pqrEv");}
void  ccc::DD4x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y13efgEv");}
ccc::DD4x8y1 ::~DD4x8y1(){ note_dtor("_ZN3ccc7DD4x8y1E", this);} // tgen
ccc::DD4x8y1 ::DD4x8y1(){ note_ctor("_ZN3ccc7DD4x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y1E, buf);
    ::ccc::DD4x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y1E);
    dp->::ccc::DD4x8y1::~DD4x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y1E(Test__ZN3ccc7DD4x8y1E, "_ZN3ccc7DD4x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y1C1Ev();
extern void _ZN3ccc7DD4x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y1E[] = {
  NSPAIR(_ZN3ccc7DD4x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y1E[];
extern void _ZN3ccc7DD4x8y13pqrEv();
extern void _ZN3ccc7DD4x8y13abcEv();
extern void _ZN3ccc7DD4x8y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y13efgEv,_ZTv0_n12_N3ccc7DD4x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y13efgEv,_ZThn4_N3ccc7DD4x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y13abcEv,_ZTv0_n16_N3ccc7DD4x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y13abcEv,_ZThn4_N3ccc7DD4x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y13efgEv,_ZTv0_n12_N3ccc7DD4x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y13abcEv,_ZTv0_n16_N3ccc7DD4x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y1E[] = {
  {&(_ZTVN3ccc7DD4x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y1E[];
static VTBL_ENTRY alt_thunk_names1970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y13abcEv,_ZTv0_n16_N3ccc7DD4x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y13abcEv,_ZThn4_N3ccc7DD4x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y13efgEv,_ZTv0_n12_N3ccc7DD4x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y13efgEv,_ZThn4_N3ccc7DD4x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y1E = {  "_ZN3ccc7DD4x8y1E", // class name
  bases__ZN3ccc7DD4x8y1E, 2,
  &(vtc__ZN3ccc7DD4x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1970,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y2  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y23pqrEv
  ~CC4x8y2(); // tgen
  CC4x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y2E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y23efgEv");}
void  ccc::CC4x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y23abcEv");}
void  ccc::CC4x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y23pqrEv");}
ccc::CC4x8y2 ::~CC4x8y2(){ note_dtor("_ZN3ccc7CC4x8y2E", this);} // tgen
ccc::CC4x8y2 ::CC4x8y2(){ note_ctor("_ZN3ccc7CC4x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y2E, buf);
    ::ccc::CC4x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y2E);
    dp->::ccc::CC4x8y2::~CC4x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y2E(Test__ZN3ccc7CC4x8y2E, "_ZN3ccc7CC4x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y2C1Ev();
extern void _ZN3ccc7CC4x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y2E[] = {
  NSPAIR(_ZN3ccc7CC4x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y2E[];
extern void _ZN3ccc7CC4x8y23efgEv();
extern void _ZN3ccc7CC4x8y23abcEv();
extern void _ZN3ccc7CC4x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y23pqrEv,_ZTv0_n12_N3ccc7CC4x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y23pqrEv,_ZThn4_N3ccc7CC4x8y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y23abcEv,_ZTv0_n16_N3ccc7CC4x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y23abcEv,_ZThn4_N3ccc7CC4x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y23efgEv,_ZTv0_n20_N3ccc7CC4x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y23efgEv,_ZThn4_N3ccc7CC4x8y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y23pqrEv,_ZTv0_n12_N3ccc7CC4x8y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y23abcEv,_ZTv0_n16_N3ccc7CC4x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y23efgEv,_ZTv0_n20_N3ccc7CC4x8y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y2E[] = {
  {&(_ZTVN3ccc7CC4x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y2E[];
static VTBL_ENTRY alt_thunk_names1971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y23efgEv,_ZTv0_n20_N3ccc7CC4x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y23efgEv,_ZThn4_N3ccc7CC4x8y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y23abcEv,_ZTv0_n16_N3ccc7CC4x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y23abcEv,_ZThn4_N3ccc7CC4x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y23pqrEv,_ZTv0_n12_N3ccc7CC4x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y23pqrEv,_ZThn4_N3ccc7CC4x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y2E = {  "_ZN3ccc7CC4x8y2E", // class name
  bases__ZN3ccc7CC4x8y2E, 2,
  &(vtc__ZN3ccc7CC4x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1971,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y2  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD4x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y23pqrEv
  ~DD4x8y2(); // tgen
  DD4x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y23efgEv");}
void  ccc::DD4x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y23abcEv");}
void  ccc::DD4x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y23pqrEv");}
ccc::DD4x8y2 ::~DD4x8y2(){ note_dtor("_ZN3ccc7DD4x8y2E", this);} // tgen
ccc::DD4x8y2 ::DD4x8y2(){ note_ctor("_ZN3ccc7DD4x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y2E, buf);
    ::ccc::DD4x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y2E);
    dp->::ccc::DD4x8y2::~DD4x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y2E(Test__ZN3ccc7DD4x8y2E, "_ZN3ccc7DD4x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y2C1Ev();
extern void _ZN3ccc7DD4x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y2E[] = {
  NSPAIR(_ZN3ccc7DD4x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y2E[];
extern void _ZN3ccc7DD4x8y23pqrEv();
extern void _ZN3ccc7DD4x8y23abcEv();
extern void _ZN3ccc7DD4x8y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y23efgEv,_ZTv0_n12_N3ccc7DD4x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y23efgEv,_ZThn4_N3ccc7DD4x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y23abcEv,_ZTv0_n16_N3ccc7DD4x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y23abcEv,_ZThn4_N3ccc7DD4x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y23efgEv,_ZTv0_n12_N3ccc7DD4x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y23abcEv,_ZTv0_n16_N3ccc7DD4x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y2E[] = {
  {&(_ZTVN3ccc7DD4x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y2E[];
static VTBL_ENTRY alt_thunk_names1972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y23abcEv,_ZTv0_n16_N3ccc7DD4x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y23abcEv,_ZThn4_N3ccc7DD4x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y23efgEv,_ZTv0_n12_N3ccc7DD4x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y23efgEv,_ZThn4_N3ccc7DD4x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y2E = {  "_ZN3ccc7DD4x8y2E", // class name
  bases__ZN3ccc7DD4x8y2E, 2,
  &(vtc__ZN3ccc7DD4x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1972,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y3  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x8y33abcEv
  ~CC4x8y3(); // tgen
  CC4x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y3E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y33efgEv");}
void  ccc::CC4x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y33pqrEv");}
void  ccc::CC4x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y33abcEv");}
ccc::CC4x8y3 ::~CC4x8y3(){ note_dtor("_ZN3ccc7CC4x8y3E", this);} // tgen
ccc::CC4x8y3 ::CC4x8y3(){ note_ctor("_ZN3ccc7CC4x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y3E, buf);
    ::ccc::CC4x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y3E);
    dp->::ccc::CC4x8y3::~CC4x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y3E(Test__ZN3ccc7CC4x8y3E, "_ZN3ccc7CC4x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y3C1Ev();
extern void _ZN3ccc7CC4x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y3E[] = {
  NSPAIR(_ZN3ccc7CC4x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y3E[];
extern void _ZN3ccc7CC4x8y33efgEv();
extern void _ZN3ccc7CC4x8y33abcEv();
extern void _ZN3ccc7CC4x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y33pqrEv,_ZTv0_n12_N3ccc7CC4x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y33pqrEv,_ZThn4_N3ccc7CC4x8y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y33abcEv,_ZTv0_n16_N3ccc7CC4x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y33abcEv,_ZThn4_N3ccc7CC4x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y33efgEv,_ZTv0_n20_N3ccc7CC4x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y33efgEv,_ZThn4_N3ccc7CC4x8y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y33pqrEv,_ZTv0_n12_N3ccc7CC4x8y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y33abcEv,_ZTv0_n16_N3ccc7CC4x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y33efgEv,_ZTv0_n20_N3ccc7CC4x8y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y3E[] = {
  {&(_ZTVN3ccc7CC4x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y3E[];
static VTBL_ENTRY alt_thunk_names1973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y33efgEv,_ZTv0_n20_N3ccc7CC4x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y33efgEv,_ZThn4_N3ccc7CC4x8y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y33abcEv,_ZTv0_n16_N3ccc7CC4x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y33abcEv,_ZThn4_N3ccc7CC4x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y33pqrEv,_ZTv0_n12_N3ccc7CC4x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y33pqrEv,_ZThn4_N3ccc7CC4x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y3E = {  "_ZN3ccc7CC4x8y3E", // class name
  bases__ZN3ccc7CC4x8y3E, 2,
  &(vtc__ZN3ccc7CC4x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1973,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y3  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD4x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x8y33abcEv
  ~DD4x8y3(); // tgen
  DD4x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y33efgEv");}
void  ccc::DD4x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y33pqrEv");}
void  ccc::DD4x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y33abcEv");}
ccc::DD4x8y3 ::~DD4x8y3(){ note_dtor("_ZN3ccc7DD4x8y3E", this);} // tgen
ccc::DD4x8y3 ::DD4x8y3(){ note_ctor("_ZN3ccc7DD4x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y3E, buf);
    ::ccc::DD4x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y3E);
    dp->::ccc::DD4x8y3::~DD4x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y3E(Test__ZN3ccc7DD4x8y3E, "_ZN3ccc7DD4x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y3C1Ev();
extern void _ZN3ccc7DD4x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y3E[] = {
  NSPAIR(_ZN3ccc7DD4x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y3E[];
extern void _ZN3ccc7DD4x8y33pqrEv();
extern void _ZN3ccc7DD4x8y33abcEv();
extern void _ZN3ccc7DD4x8y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y33efgEv,_ZTv0_n12_N3ccc7DD4x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y33efgEv,_ZThn4_N3ccc7DD4x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y33abcEv,_ZTv0_n16_N3ccc7DD4x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y33abcEv,_ZThn4_N3ccc7DD4x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y33efgEv,_ZTv0_n12_N3ccc7DD4x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y33abcEv,_ZTv0_n16_N3ccc7DD4x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y3E[] = {
  {&(_ZTVN3ccc7DD4x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y3E[];
static VTBL_ENTRY alt_thunk_names1974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y33abcEv,_ZTv0_n16_N3ccc7DD4x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y33abcEv,_ZThn4_N3ccc7DD4x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y33efgEv,_ZTv0_n12_N3ccc7DD4x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y33efgEv,_ZThn4_N3ccc7DD4x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y3E = {  "_ZN3ccc7DD4x8y3E", // class name
  bases__ZN3ccc7DD4x8y3E, 2,
  &(vtc__ZN3ccc7DD4x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1974,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y4  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC4x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y43efgEv
  ~CC4x8y4(); // tgen
  CC4x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y4E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y43pqrEv");}
void  ccc::CC4x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y43abcEv");}
void  ccc::CC4x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y43efgEv");}
ccc::CC4x8y4 ::~CC4x8y4(){ note_dtor("_ZN3ccc7CC4x8y4E", this);} // tgen
ccc::CC4x8y4 ::CC4x8y4(){ note_ctor("_ZN3ccc7CC4x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y4E, buf);
    ::ccc::CC4x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y4E);
    dp->::ccc::CC4x8y4::~CC4x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y4E(Test__ZN3ccc7CC4x8y4E, "_ZN3ccc7CC4x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y4C1Ev();
extern void _ZN3ccc7CC4x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y4E[] = {
  NSPAIR(_ZN3ccc7CC4x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y4E[];
extern void _ZN3ccc7CC4x8y43efgEv();
extern void _ZN3ccc7CC4x8y43abcEv();
extern void _ZN3ccc7CC4x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y43pqrEv,_ZTv0_n12_N3ccc7CC4x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y43pqrEv,_ZThn4_N3ccc7CC4x8y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y43abcEv,_ZTv0_n16_N3ccc7CC4x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y43abcEv,_ZThn4_N3ccc7CC4x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y43efgEv,_ZTv0_n20_N3ccc7CC4x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y43efgEv,_ZThn4_N3ccc7CC4x8y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y43pqrEv,_ZTv0_n12_N3ccc7CC4x8y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y43abcEv,_ZTv0_n16_N3ccc7CC4x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y43efgEv,_ZTv0_n20_N3ccc7CC4x8y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y4E[] = {
  {&(_ZTVN3ccc7CC4x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y4E[];
static VTBL_ENTRY alt_thunk_names1975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y43efgEv,_ZTv0_n20_N3ccc7CC4x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y43efgEv,_ZThn4_N3ccc7CC4x8y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y43abcEv,_ZTv0_n16_N3ccc7CC4x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y43abcEv,_ZThn4_N3ccc7CC4x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y43pqrEv,_ZTv0_n12_N3ccc7CC4x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y43pqrEv,_ZThn4_N3ccc7CC4x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y4E = {  "_ZN3ccc7CC4x8y4E", // class name
  bases__ZN3ccc7CC4x8y4E, 2,
  &(vtc__ZN3ccc7CC4x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1975,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y4  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD4x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x8y43efgEv
  ~DD4x8y4(); // tgen
  DD4x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y43pqrEv");}
void  ccc::DD4x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y43abcEv");}
void  ccc::DD4x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y43efgEv");}
ccc::DD4x8y4 ::~DD4x8y4(){ note_dtor("_ZN3ccc7DD4x8y4E", this);} // tgen
ccc::DD4x8y4 ::DD4x8y4(){ note_ctor("_ZN3ccc7DD4x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y4E, buf);
    ::ccc::DD4x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y4E);
    dp->::ccc::DD4x8y4::~DD4x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y4E(Test__ZN3ccc7DD4x8y4E, "_ZN3ccc7DD4x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y4C1Ev();
extern void _ZN3ccc7DD4x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y4E[] = {
  NSPAIR(_ZN3ccc7DD4x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y4E[];
extern void _ZN3ccc7DD4x8y43pqrEv();
extern void _ZN3ccc7DD4x8y43abcEv();
extern void _ZN3ccc7DD4x8y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y43efgEv,_ZTv0_n12_N3ccc7DD4x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y43efgEv,_ZThn4_N3ccc7DD4x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y43abcEv,_ZTv0_n16_N3ccc7DD4x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y43abcEv,_ZThn4_N3ccc7DD4x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y43efgEv,_ZTv0_n12_N3ccc7DD4x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y43abcEv,_ZTv0_n16_N3ccc7DD4x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y4E[] = {
  {&(_ZTVN3ccc7DD4x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y4E[];
static VTBL_ENTRY alt_thunk_names1976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y43abcEv,_ZTv0_n16_N3ccc7DD4x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y43abcEv,_ZThn4_N3ccc7DD4x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y43efgEv,_ZTv0_n12_N3ccc7DD4x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y43efgEv,_ZThn4_N3ccc7DD4x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y4E = {  "_ZN3ccc7DD4x8y4E", // class name
  bases__ZN3ccc7DD4x8y4E, 2,
  &(vtc__ZN3ccc7DD4x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1976,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y5  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC4x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y53abcEv
  ~CC4x8y5(); // tgen
  CC4x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y5E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y53pqrEv");}
void  ccc::CC4x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y53efgEv");}
void  ccc::CC4x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y53abcEv");}
ccc::CC4x8y5 ::~CC4x8y5(){ note_dtor("_ZN3ccc7CC4x8y5E", this);} // tgen
ccc::CC4x8y5 ::CC4x8y5(){ note_ctor("_ZN3ccc7CC4x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y5E, buf);
    ::ccc::CC4x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y5E);
    dp->::ccc::CC4x8y5::~CC4x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y5E(Test__ZN3ccc7CC4x8y5E, "_ZN3ccc7CC4x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y5C1Ev();
extern void _ZN3ccc7CC4x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y5E[] = {
  NSPAIR(_ZN3ccc7CC4x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y5E[];
extern void _ZN3ccc7CC4x8y53efgEv();
extern void _ZN3ccc7CC4x8y53abcEv();
extern void _ZN3ccc7CC4x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y53pqrEv,_ZTv0_n12_N3ccc7CC4x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y53pqrEv,_ZThn4_N3ccc7CC4x8y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y53abcEv,_ZTv0_n16_N3ccc7CC4x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y53abcEv,_ZThn4_N3ccc7CC4x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y53efgEv,_ZTv0_n20_N3ccc7CC4x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y53efgEv,_ZThn4_N3ccc7CC4x8y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y53pqrEv,_ZTv0_n12_N3ccc7CC4x8y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y53abcEv,_ZTv0_n16_N3ccc7CC4x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y53efgEv,_ZTv0_n20_N3ccc7CC4x8y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y5E[] = {
  {&(_ZTVN3ccc7CC4x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y5E[];
static VTBL_ENTRY alt_thunk_names1977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y53efgEv,_ZTv0_n20_N3ccc7CC4x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y53efgEv,_ZThn4_N3ccc7CC4x8y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y53abcEv,_ZTv0_n16_N3ccc7CC4x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y53abcEv,_ZThn4_N3ccc7CC4x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y53pqrEv,_ZTv0_n12_N3ccc7CC4x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y53pqrEv,_ZThn4_N3ccc7CC4x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y5E = {  "_ZN3ccc7CC4x8y5E", // class name
  bases__ZN3ccc7CC4x8y5E, 2,
  &(vtc__ZN3ccc7CC4x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1977,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y5  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD4x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x8y53abcEv
  ~DD4x8y5(); // tgen
  DD4x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y53pqrEv");}
void  ccc::DD4x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y53efgEv");}
void  ccc::DD4x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y53abcEv");}
ccc::DD4x8y5 ::~DD4x8y5(){ note_dtor("_ZN3ccc7DD4x8y5E", this);} // tgen
ccc::DD4x8y5 ::DD4x8y5(){ note_ctor("_ZN3ccc7DD4x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y5E, buf);
    ::ccc::DD4x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y5E);
    dp->::ccc::DD4x8y5::~DD4x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y5E(Test__ZN3ccc7DD4x8y5E, "_ZN3ccc7DD4x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y5C1Ev();
extern void _ZN3ccc7DD4x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y5E[] = {
  NSPAIR(_ZN3ccc7DD4x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y5E[];
extern void _ZN3ccc7DD4x8y53pqrEv();
extern void _ZN3ccc7DD4x8y53abcEv();
extern void _ZN3ccc7DD4x8y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y53efgEv,_ZTv0_n12_N3ccc7DD4x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y53efgEv,_ZThn4_N3ccc7DD4x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y53abcEv,_ZTv0_n16_N3ccc7DD4x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y53abcEv,_ZThn4_N3ccc7DD4x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y53efgEv,_ZTv0_n12_N3ccc7DD4x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y53abcEv,_ZTv0_n16_N3ccc7DD4x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y5E[] = {
  {&(_ZTVN3ccc7DD4x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y5E[];
static VTBL_ENTRY alt_thunk_names1978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y53abcEv,_ZTv0_n16_N3ccc7DD4x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y53abcEv,_ZThn4_N3ccc7DD4x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y53efgEv,_ZTv0_n12_N3ccc7DD4x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y53efgEv,_ZThn4_N3ccc7DD4x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y5E = {  "_ZN3ccc7DD4x8y5E", // class name
  bases__ZN3ccc7DD4x8y5E, 2,
  &(vtc__ZN3ccc7DD4x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1978,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y6  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y63efgEv
  ~CC4x8y6(); // tgen
  CC4x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y6E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y63abcEv");}
void  ccc::CC4x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y63efgEv");}
ccc::CC4x8y6 ::~CC4x8y6(){ note_dtor("_ZN3ccc7CC4x8y6E", this);} // tgen
ccc::CC4x8y6 ::CC4x8y6(){ note_ctor("_ZN3ccc7CC4x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y6E, buf);
    ::ccc::CC4x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y6E);
    dp->::ccc::CC4x8y6::~CC4x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y6E(Test__ZN3ccc7CC4x8y6E, "_ZN3ccc7CC4x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y6C1Ev();
extern void _ZN3ccc7CC4x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y6E[] = {
  NSPAIR(_ZN3ccc7CC4x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y6E[];
extern void _ZN3ccc7CC4x8y63efgEv();
extern void _ZN3ccc7CC4x8y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y63abcEv,_ZTv0_n16_N3ccc7CC4x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y63abcEv,_ZThn4_N3ccc7CC4x8y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y63efgEv,_ZTv0_n20_N3ccc7CC4x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y63efgEv,_ZThn4_N3ccc7CC4x8y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y63abcEv,_ZTv0_n16_N3ccc7CC4x8y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y63efgEv,_ZTv0_n20_N3ccc7CC4x8y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y6E[] = {
  {&(_ZTVN3ccc7CC4x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y6E[];
static VTBL_ENTRY alt_thunk_names1979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y63efgEv,_ZTv0_n20_N3ccc7CC4x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y63efgEv,_ZThn4_N3ccc7CC4x8y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y63abcEv,_ZTv0_n16_N3ccc7CC4x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y63abcEv,_ZThn4_N3ccc7CC4x8y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y6E = {  "_ZN3ccc7CC4x8y6E", // class name
  bases__ZN3ccc7CC4x8y6E, 2,
  &(vtc__ZN3ccc7CC4x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1979,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y6  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD4x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x8y63efgEv
  ~DD4x8y6(); // tgen
  DD4x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y63abcEv");}
void  ccc::DD4x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y63efgEv");}
ccc::DD4x8y6 ::~DD4x8y6(){ note_dtor("_ZN3ccc7DD4x8y6E", this);} // tgen
ccc::DD4x8y6 ::DD4x8y6(){ note_ctor("_ZN3ccc7DD4x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y6E, buf);
    ::ccc::DD4x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y6E);
    dp->::ccc::DD4x8y6::~DD4x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y6E(Test__ZN3ccc7DD4x8y6E, "_ZN3ccc7DD4x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y6C1Ev();
extern void _ZN3ccc7DD4x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y6E[] = {
  NSPAIR(_ZN3ccc7DD4x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x8y63abcEv();
extern void _ZN3ccc7DD4x8y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y63efgEv,_ZTv0_n12_N3ccc7DD4x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y63efgEv,_ZThn4_N3ccc7DD4x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y63abcEv,_ZTv0_n16_N3ccc7DD4x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y63abcEv,_ZThn4_N3ccc7DD4x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y63efgEv,_ZTv0_n12_N3ccc7DD4x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y63abcEv,_ZTv0_n16_N3ccc7DD4x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y6E[] = {
  {&(_ZTVN3ccc7DD4x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y6E[];
static VTBL_ENTRY alt_thunk_names1980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y63abcEv,_ZTv0_n16_N3ccc7DD4x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y63abcEv,_ZThn4_N3ccc7DD4x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y63efgEv,_ZTv0_n12_N3ccc7DD4x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y63efgEv,_ZThn4_N3ccc7DD4x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y6E = {  "_ZN3ccc7DD4x8y6E", // class name
  bases__ZN3ccc7DD4x8y6E, 2,
  &(vtc__ZN3ccc7DD4x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1980,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y7  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y73pqrEv
  ~CC4x8y7(); // tgen
  CC4x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y7E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y73abcEv");}
void  ccc::CC4x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y73pqrEv");}
ccc::CC4x8y7 ::~CC4x8y7(){ note_dtor("_ZN3ccc7CC4x8y7E", this);} // tgen
ccc::CC4x8y7 ::CC4x8y7(){ note_ctor("_ZN3ccc7CC4x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y7E, buf);
    ::ccc::CC4x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y7E);
    dp->::ccc::CC4x8y7::~CC4x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y7E(Test__ZN3ccc7CC4x8y7E, "_ZN3ccc7CC4x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y7C1Ev();
extern void _ZN3ccc7CC4x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y7E[] = {
  NSPAIR(_ZN3ccc7CC4x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC4x8y73abcEv();
extern void _ZN3ccc7CC4x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y73pqrEv,_ZTv0_n12_N3ccc7CC4x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y73pqrEv,_ZThn4_N3ccc7CC4x8y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y73abcEv,_ZTv0_n16_N3ccc7CC4x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y73abcEv,_ZThn4_N3ccc7CC4x8y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y73pqrEv,_ZTv0_n12_N3ccc7CC4x8y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y73abcEv,_ZTv0_n16_N3ccc7CC4x8y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y7E[] = {
  {&(_ZTVN3ccc7CC4x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y7E[];
static VTBL_ENTRY alt_thunk_names1981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y73abcEv,_ZTv0_n16_N3ccc7CC4x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y73abcEv,_ZThn4_N3ccc7CC4x8y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y73pqrEv,_ZTv0_n12_N3ccc7CC4x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y73pqrEv,_ZThn4_N3ccc7CC4x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y7E = {  "_ZN3ccc7CC4x8y7E", // class name
  bases__ZN3ccc7CC4x8y7E, 2,
  &(vtc__ZN3ccc7CC4x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1981,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y7  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD4x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y73pqrEv
  ~DD4x8y7(); // tgen
  DD4x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y73abcEv");}
void  ccc::DD4x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y73pqrEv");}
ccc::DD4x8y7 ::~DD4x8y7(){ note_dtor("_ZN3ccc7DD4x8y7E", this);} // tgen
ccc::DD4x8y7 ::DD4x8y7(){ note_ctor("_ZN3ccc7DD4x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y7E, buf);
    ::ccc::DD4x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y7E);
    dp->::ccc::DD4x8y7::~DD4x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y7E(Test__ZN3ccc7DD4x8y7E, "_ZN3ccc7DD4x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y7C1Ev();
extern void _ZN3ccc7DD4x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y7E[] = {
  NSPAIR(_ZN3ccc7DD4x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y7E[];
extern void _ZN3ccc7DD4x8y73pqrEv();
extern void _ZN3ccc7DD4x8y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y73abcEv,_ZTv0_n16_N3ccc7DD4x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y73abcEv,_ZThn4_N3ccc7DD4x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y73abcEv,_ZTv0_n16_N3ccc7DD4x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y7E[] = {
  {&(_ZTVN3ccc7DD4x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y7E[];
static VTBL_ENTRY alt_thunk_names1982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y73abcEv,_ZTv0_n16_N3ccc7DD4x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y73abcEv,_ZThn4_N3ccc7DD4x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y7E = {  "_ZN3ccc7DD4x8y7E", // class name
  bases__ZN3ccc7DD4x8y7E, 2,
  &(vtc__ZN3ccc7DD4x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1982,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y8  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y83abcEv
  ~CC4x8y8(); // tgen
  CC4x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y8E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y83efgEv");}
void  ccc::CC4x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y83abcEv");}
ccc::CC4x8y8 ::~CC4x8y8(){ note_dtor("_ZN3ccc7CC4x8y8E", this);} // tgen
ccc::CC4x8y8 ::CC4x8y8(){ note_ctor("_ZN3ccc7CC4x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y8E, buf);
    ::ccc::CC4x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y8E);
    dp->::ccc::CC4x8y8::~CC4x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y8E(Test__ZN3ccc7CC4x8y8E, "_ZN3ccc7CC4x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y8C1Ev();
extern void _ZN3ccc7CC4x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y8E[] = {
  NSPAIR(_ZN3ccc7CC4x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y8E[];
extern void _ZN3ccc7CC4x8y83efgEv();
extern void _ZN3ccc7CC4x8y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x8y83abcEv,_ZTv0_n16_N3ccc7CC4x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y83abcEv,_ZThn4_N3ccc7CC4x8y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y83efgEv,_ZTv0_n20_N3ccc7CC4x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y83efgEv,_ZThn4_N3ccc7CC4x8y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x8y83abcEv,_ZTv0_n16_N3ccc7CC4x8y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y83efgEv,_ZTv0_n20_N3ccc7CC4x8y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y8E[] = {
  {&(_ZTVN3ccc7CC4x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y8E[];
static VTBL_ENTRY alt_thunk_names1983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y83efgEv,_ZTv0_n20_N3ccc7CC4x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y83efgEv,_ZThn4_N3ccc7CC4x8y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x8y83abcEv,_ZTv0_n16_N3ccc7CC4x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y83abcEv,_ZThn4_N3ccc7CC4x8y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y8E = {  "_ZN3ccc7CC4x8y8E", // class name
  bases__ZN3ccc7CC4x8y8E, 2,
  &(vtc__ZN3ccc7CC4x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1983,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y8  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD4x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x8y83abcEv
  ~DD4x8y8(); // tgen
  DD4x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y83efgEv");}
void  ccc::DD4x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x8y83abcEv");}
ccc::DD4x8y8 ::~DD4x8y8(){ note_dtor("_ZN3ccc7DD4x8y8E", this);} // tgen
ccc::DD4x8y8 ::DD4x8y8(){ note_ctor("_ZN3ccc7DD4x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y8E, buf);
    ::ccc::DD4x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y8E);
    dp->::ccc::DD4x8y8::~DD4x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y8E(Test__ZN3ccc7DD4x8y8E, "_ZN3ccc7DD4x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y8C1Ev();
extern void _ZN3ccc7DD4x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y8E[] = {
  NSPAIR(_ZN3ccc7DD4x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x8y83abcEv();
extern void _ZN3ccc7DD4x8y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y83efgEv,_ZTv0_n12_N3ccc7DD4x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y83efgEv,_ZThn4_N3ccc7DD4x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x8y83abcEv,_ZTv0_n16_N3ccc7DD4x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y83abcEv,_ZThn4_N3ccc7DD4x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y83efgEv,_ZTv0_n12_N3ccc7DD4x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x8y83abcEv,_ZTv0_n16_N3ccc7DD4x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y8E[] = {
  {&(_ZTVN3ccc7DD4x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y8E[];
static VTBL_ENTRY alt_thunk_names1984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x8y83abcEv,_ZTv0_n16_N3ccc7DD4x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y83abcEv,_ZThn4_N3ccc7DD4x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y83efgEv,_ZTv0_n12_N3ccc7DD4x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y83efgEv,_ZThn4_N3ccc7DD4x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y8E = {  "_ZN3ccc7DD4x8y8E", // class name
  bases__ZN3ccc7DD4x8y8E, 2,
  &(vtc__ZN3ccc7DD4x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1984,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y9  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y93pqrEv
  ~CC4x8y9(); // tgen
  CC4x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y9E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y93efgEv");}
void  ccc::CC4x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y93pqrEv");}
ccc::CC4x8y9 ::~CC4x8y9(){ note_dtor("_ZN3ccc7CC4x8y9E", this);} // tgen
ccc::CC4x8y9 ::CC4x8y9(){ note_ctor("_ZN3ccc7CC4x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y9E, buf);
    ::ccc::CC4x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC4x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y9E);
    dp->::ccc::CC4x8y9::~CC4x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y9E(Test__ZN3ccc7CC4x8y9E, "_ZN3ccc7CC4x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y9C1Ev();
extern void _ZN3ccc7CC4x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y9E[] = {
  NSPAIR(_ZN3ccc7CC4x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y9E[];
extern void _ZN3ccc7CC4x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC4x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x8y93pqrEv,_ZTv0_n12_N3ccc7CC4x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y93pqrEv,_ZThn4_N3ccc7CC4x8y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x8y93efgEv,_ZTv0_n20_N3ccc7CC4x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y93efgEv,_ZThn4_N3ccc7CC4x8y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x8y93pqrEv,_ZTv0_n12_N3ccc7CC4x8y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x8y93efgEv,_ZTv0_n20_N3ccc7CC4x8y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x8y9E[] = {
  {&(_ZTVN3ccc7CC4x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x8y9E[];
static VTBL_ENTRY alt_thunk_names1985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x8y93efgEv,_ZTv0_n20_N3ccc7CC4x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y93efgEv,_ZThn4_N3ccc7CC4x8y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x8y93pqrEv,_ZTv0_n12_N3ccc7CC4x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x8y93pqrEv,_ZThn4_N3ccc7CC4x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x8y9E = {  "_ZN3ccc7CC4x8y9E", // class name
  bases__ZN3ccc7CC4x8y9E, 2,
  &(vtc__ZN3ccc7CC4x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x8y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1985,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y9  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD4x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x8y93pqrEv
  ~DD4x8y9(); // tgen
  DD4x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x8y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x8y93efgEv");}
void  ccc::DD4x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x8y93pqrEv");}
ccc::DD4x8y9 ::~DD4x8y9(){ note_dtor("_ZN3ccc7DD4x8y9E", this);} // tgen
ccc::DD4x8y9 ::DD4x8y9(){ note_ctor("_ZN3ccc7DD4x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x8y9E, buf);
    ::ccc::DD4x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x8y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD4x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x8y9E);
    dp->::ccc::DD4x8y9::~DD4x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x8y9E(Test__ZN3ccc7DD4x8y9E, "_ZN3ccc7DD4x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x8y9C1Ev();
extern void _ZN3ccc7DD4x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x8y9E[] = {
  NSPAIR(_ZN3ccc7DD4x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD4x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y9E[];
extern void _ZN3ccc7DD4x8y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x8y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x8y93efgEv,_ZTv0_n12_N3ccc7DD4x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x8y93efgEv,_ZThn4_N3ccc7DD4x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x8y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x8y93efgEv,_ZTv0_n12_N3ccc7DD4x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x8y9E[] = {
  {&(_ZTVN3ccc7DD4x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x8y9E[];
static VTBL_ENTRY alt_thunk_names1986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x8y93efgEv,_ZTv0_n12_N3ccc7DD4x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x8y93efgEv,_ZThn4_N3ccc7DD4x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x8y9E = {  "_ZN3ccc7DD4x8y9E", // class name
  bases__ZN3ccc7DD4x8y9E, 2,
  &(vtc__ZN3ccc7DD4x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x8y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1986,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y10  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x8y103abcEv
  ~CC4x8y10(); // tgen
  CC4x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y10E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y103pqrEv");}
void  ccc::CC4x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x8y103abcEv");}
ccc::CC4x8y10 ::~CC4x8y10(){ note_dtor("_ZN3ccc8CC4x8y10E", this);} // tgen
ccc::CC4x8y10 ::CC4x8y10(){ note_ctor("_ZN3ccc8CC4x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y10E, buf);
    ::ccc::CC4x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y10E);
    dp->::ccc::CC4x8y10::~CC4x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y10E(Test__ZN3ccc8CC4x8y10E, "_ZN3ccc8CC4x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y10C1Ev();
extern void _ZN3ccc8CC4x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y10E[] = {
  NSPAIR(_ZN3ccc8CC4x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC4x8y103abcEv();
extern void _ZN3ccc8CC4x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x8y103pqrEv,_ZTv0_n12_N3ccc8CC4x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y103pqrEv,_ZThn4_N3ccc8CC4x8y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x8y103abcEv,_ZTv0_n16_N3ccc8CC4x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y103abcEv,_ZThn4_N3ccc8CC4x8y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x8y103pqrEv,_ZTv0_n12_N3ccc8CC4x8y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x8y103abcEv,_ZTv0_n16_N3ccc8CC4x8y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y10E[] = {
  {&(_ZTVN3ccc8CC4x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y10E[];
static VTBL_ENTRY alt_thunk_names1987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x8y103abcEv,_ZTv0_n16_N3ccc8CC4x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y103abcEv,_ZThn4_N3ccc8CC4x8y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x8y103pqrEv,_ZTv0_n12_N3ccc8CC4x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y103pqrEv,_ZThn4_N3ccc8CC4x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x8y10E = {  "_ZN3ccc8CC4x8y10E", // class name
  bases__ZN3ccc8CC4x8y10E, 2,
  &(vtc__ZN3ccc8CC4x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1987,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y10  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD4x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x8y103abcEv
  ~DD4x8y10(); // tgen
  DD4x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x8y103pqrEv");}
void  ccc::DD4x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x8y103abcEv");}
ccc::DD4x8y10 ::~DD4x8y10(){ note_dtor("_ZN3ccc8DD4x8y10E", this);} // tgen
ccc::DD4x8y10 ::DD4x8y10(){ note_ctor("_ZN3ccc8DD4x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y10E, buf);
    ::ccc::DD4x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y10E);
    dp->::ccc::DD4x8y10::~DD4x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y10E(Test__ZN3ccc8DD4x8y10E, "_ZN3ccc8DD4x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y10C1Ev();
extern void _ZN3ccc8DD4x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y10E[] = {
  NSPAIR(_ZN3ccc8DD4x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y10E[];
extern void _ZN3ccc8DD4x8y103pqrEv();
extern void _ZN3ccc8DD4x8y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x8y103abcEv,_ZTv0_n16_N3ccc8DD4x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x8y103abcEv,_ZThn4_N3ccc8DD4x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x8y103abcEv,_ZTv0_n16_N3ccc8DD4x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y10E[] = {
  {&(_ZTVN3ccc8DD4x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y10E[];
static VTBL_ENTRY alt_thunk_names1988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x8y103abcEv,_ZTv0_n16_N3ccc8DD4x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x8y103abcEv,_ZThn4_N3ccc8DD4x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x8y10E = {  "_ZN3ccc8DD4x8y10E", // class name
  bases__ZN3ccc8DD4x8y10E, 2,
  &(vtc__ZN3ccc8DD4x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1988,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y11  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x8y113efgEv
  ~CC4x8y11(); // tgen
  CC4x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y11E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y113pqrEv");}
void  ccc::CC4x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x8y113efgEv");}
ccc::CC4x8y11 ::~CC4x8y11(){ note_dtor("_ZN3ccc8CC4x8y11E", this);} // tgen
ccc::CC4x8y11 ::CC4x8y11(){ note_ctor("_ZN3ccc8CC4x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y11E, buf);
    ::ccc::CC4x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y11E);
    dp->::ccc::CC4x8y11::~CC4x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y11E(Test__ZN3ccc8CC4x8y11E, "_ZN3ccc8CC4x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y11C1Ev();
extern void _ZN3ccc8CC4x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y11E[] = {
  NSPAIR(_ZN3ccc8CC4x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y11E[];
extern void _ZN3ccc8CC4x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC4x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x8y113pqrEv,_ZTv0_n12_N3ccc8CC4x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y113pqrEv,_ZThn4_N3ccc8CC4x8y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x8y113efgEv,_ZTv0_n20_N3ccc8CC4x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y113efgEv,_ZThn4_N3ccc8CC4x8y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x8y113pqrEv,_ZTv0_n12_N3ccc8CC4x8y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x8y113efgEv,_ZTv0_n20_N3ccc8CC4x8y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y11E[] = {
  {&(_ZTVN3ccc8CC4x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y11E[];
static VTBL_ENTRY alt_thunk_names1989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x8y113efgEv,_ZTv0_n20_N3ccc8CC4x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y113efgEv,_ZThn4_N3ccc8CC4x8y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x8y113pqrEv,_ZTv0_n12_N3ccc8CC4x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y113pqrEv,_ZThn4_N3ccc8CC4x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x8y11E = {  "_ZN3ccc8CC4x8y11E", // class name
  bases__ZN3ccc8CC4x8y11E, 2,
  &(vtc__ZN3ccc8CC4x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1989,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y11  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD4x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x8y113efgEv
  ~DD4x8y11(); // tgen
  DD4x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x8y113pqrEv");}
void  ccc::DD4x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x8y113efgEv");}
ccc::DD4x8y11 ::~DD4x8y11(){ note_dtor("_ZN3ccc8DD4x8y11E", this);} // tgen
ccc::DD4x8y11 ::DD4x8y11(){ note_ctor("_ZN3ccc8DD4x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y11E, buf);
    ::ccc::DD4x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y11E);
    dp->::ccc::DD4x8y11::~DD4x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y11E(Test__ZN3ccc8DD4x8y11E, "_ZN3ccc8DD4x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y11C1Ev();
extern void _ZN3ccc8DD4x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y11E[] = {
  NSPAIR(_ZN3ccc8DD4x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y11E[];
extern void _ZN3ccc8DD4x8y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x8y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x8y113efgEv,_ZTv0_n12_N3ccc8DD4x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x8y113efgEv,_ZThn4_N3ccc8DD4x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x8y113efgEv,_ZTv0_n12_N3ccc8DD4x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y11E[] = {
  {&(_ZTVN3ccc8DD4x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y11E[];
static VTBL_ENTRY alt_thunk_names1990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x8y113efgEv,_ZTv0_n12_N3ccc8DD4x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x8y113efgEv,_ZThn4_N3ccc8DD4x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x8y11E = {  "_ZN3ccc8DD4x8y11E", // class name
  bases__ZN3ccc8DD4x8y11E, 2,
  &(vtc__ZN3ccc8DD4x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1990,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y12  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC4x8y123abcEv
  ~CC4x8y12(); // tgen
  CC4x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x8y123abcEv");}
ccc::CC4x8y12 ::~CC4x8y12(){ note_dtor("_ZN3ccc8CC4x8y12E", this);} // tgen
ccc::CC4x8y12 ::CC4x8y12(){ note_ctor("_ZN3ccc8CC4x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y12E, buf);
    ::ccc::CC4x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y12E);
    dp->::ccc::CC4x8y12::~CC4x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y12E(Test__ZN3ccc8CC4x8y12E, "_ZN3ccc8CC4x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y12C1Ev();
extern void _ZN3ccc8CC4x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y12E[] = {
  NSPAIR(_ZN3ccc8CC4x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC4x8y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x8y123abcEv,_ZTv0_n16_N3ccc8CC4x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y123abcEv,_ZThn4_N3ccc8CC4x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x8y123abcEv,_ZTv0_n16_N3ccc8CC4x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y12E[] = {
  {&(_ZTVN3ccc8CC4x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y12E[];
static VTBL_ENTRY alt_thunk_names1991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x8y123abcEv,_ZTv0_n16_N3ccc8CC4x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y123abcEv,_ZThn4_N3ccc8CC4x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x8y12E = {  "_ZN3ccc8CC4x8y12E", // class name
  bases__ZN3ccc8CC4x8y12E, 2,
  &(vtc__ZN3ccc8CC4x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1991,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y12  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD4x8y123abcEv
  ~DD4x8y12(); // tgen
  DD4x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x8y123abcEv");}
ccc::DD4x8y12 ::~DD4x8y12(){ note_dtor("_ZN3ccc8DD4x8y12E", this);} // tgen
ccc::DD4x8y12 ::DD4x8y12(){ note_ctor("_ZN3ccc8DD4x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y12E, buf);
    ::ccc::DD4x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y12E);
    dp->::ccc::DD4x8y12::~DD4x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y12E(Test__ZN3ccc8DD4x8y12E, "_ZN3ccc8DD4x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y12C1Ev();
extern void _ZN3ccc8DD4x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y12E[] = {
  NSPAIR(_ZN3ccc8DD4x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x8y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x8y123abcEv,_ZTv0_n16_N3ccc8DD4x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x8y123abcEv,_ZThn4_N3ccc8DD4x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x8y123abcEv,_ZTv0_n16_N3ccc8DD4x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y12E[] = {
  {&(_ZTVN3ccc8DD4x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y12E[];
static VTBL_ENTRY alt_thunk_names1992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x8y123abcEv,_ZTv0_n16_N3ccc8DD4x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x8y123abcEv,_ZThn4_N3ccc8DD4x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x8y12E = {  "_ZN3ccc8DD4x8y12E", // class name
  bases__ZN3ccc8DD4x8y12E, 2,
  &(vtc__ZN3ccc8DD4x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1992,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y13  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC4x8y133efgEv
  ~CC4x8y13(); // tgen
  CC4x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x8y133efgEv");}
ccc::CC4x8y13 ::~CC4x8y13(){ note_dtor("_ZN3ccc8CC4x8y13E", this);} // tgen
ccc::CC4x8y13 ::CC4x8y13(){ note_ctor("_ZN3ccc8CC4x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y13E, buf);
    ::ccc::CC4x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y13E);
    dp->::ccc::CC4x8y13::~CC4x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y13E(Test__ZN3ccc8CC4x8y13E, "_ZN3ccc8CC4x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y13C1Ev();
extern void _ZN3ccc8CC4x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y13E[] = {
  NSPAIR(_ZN3ccc8CC4x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y13E[];
extern void _ZN3ccc8CC4x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x8y133efgEv,_ZTv0_n20_N3ccc8CC4x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y133efgEv,_ZThn4_N3ccc8CC4x8y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x8y133efgEv,_ZTv0_n20_N3ccc8CC4x8y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y13E[] = {
  {&(_ZTVN3ccc8CC4x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y13E[];
static VTBL_ENTRY alt_thunk_names1993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x8y133efgEv,_ZTv0_n20_N3ccc8CC4x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y133efgEv,_ZThn4_N3ccc8CC4x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x8y13E = {  "_ZN3ccc8CC4x8y13E", // class name
  bases__ZN3ccc8CC4x8y13E, 2,
  &(vtc__ZN3ccc8CC4x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1993,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y13  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD4x8y133efgEv
  ~DD4x8y13(); // tgen
  DD4x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x8y133efgEv");}
ccc::DD4x8y13 ::~DD4x8y13(){ note_dtor("_ZN3ccc8DD4x8y13E", this);} // tgen
ccc::DD4x8y13 ::DD4x8y13(){ note_ctor("_ZN3ccc8DD4x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y13E, buf);
    ::ccc::DD4x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y13E);
    dp->::ccc::DD4x8y13::~DD4x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y13E(Test__ZN3ccc8DD4x8y13E, "_ZN3ccc8DD4x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y13C1Ev();
extern void _ZN3ccc8DD4x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y13E[] = {
  NSPAIR(_ZN3ccc8DD4x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x8y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x8y133efgEv,_ZTv0_n12_N3ccc8DD4x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x8y133efgEv,_ZThn4_N3ccc8DD4x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x8y133efgEv,_ZTv0_n12_N3ccc8DD4x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y13E[] = {
  {&(_ZTVN3ccc8DD4x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y13E[];
static VTBL_ENTRY alt_thunk_names1994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x8y133efgEv,_ZTv0_n12_N3ccc8DD4x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x8y133efgEv,_ZThn4_N3ccc8DD4x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x8y13E = {  "_ZN3ccc8DD4x8y13E", // class name
  bases__ZN3ccc8DD4x8y13E, 2,
  &(vtc__ZN3ccc8DD4x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1994,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y14  : virtual ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y143pqrEv
  ~CC4x8y14(); // tgen
  CC4x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y143pqrEv");}
ccc::CC4x8y14 ::~CC4x8y14(){ note_dtor("_ZN3ccc8CC4x8y14E", this);} // tgen
ccc::CC4x8y14 ::CC4x8y14(){ note_ctor("_ZN3ccc8CC4x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y14E, buf);
    ::ccc::CC4x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y14E);
    dp->::ccc::CC4x8y14::~CC4x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y14E(Test__ZN3ccc8CC4x8y14E, "_ZN3ccc8CC4x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y14C1Ev();
extern void _ZN3ccc8CC4x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y14E[] = {
  NSPAIR(_ZN3ccc8CC4x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC4x8y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x8y143pqrEv,_ZTv0_n12_N3ccc8CC4x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y143pqrEv,_ZThn4_N3ccc8CC4x8y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x8y143pqrEv,_ZTv0_n12_N3ccc8CC4x8y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y14E[] = {
  {&(_ZTVN3ccc8CC4x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y14E[];
static VTBL_ENTRY alt_thunk_names1995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x8y143pqrEv,_ZTv0_n12_N3ccc8CC4x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x8y143pqrEv,_ZThn4_N3ccc8CC4x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x8y14E = {  "_ZN3ccc8CC4x8y14E", // class name
  bases__ZN3ccc8CC4x8y14E, 2,
  &(vtc__ZN3ccc8CC4x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1995,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y14  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD4x8y143pqrEv
  ~DD4x8y14(); // tgen
  DD4x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x8y143pqrEv");}
ccc::DD4x8y14 ::~DD4x8y14(){ note_dtor("_ZN3ccc8DD4x8y14E", this);} // tgen
ccc::DD4x8y14 ::DD4x8y14(){ note_ctor("_ZN3ccc8DD4x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y14E, buf);
    ::ccc::DD4x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y14E);
    dp->::ccc::DD4x8y14::~DD4x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y14E(Test__ZN3ccc8DD4x8y14E, "_ZN3ccc8DD4x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y14C1Ev();
extern void _ZN3ccc8DD4x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y14E[] = {
  NSPAIR(_ZN3ccc8DD4x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y14E[];
extern void _ZN3ccc8DD4x8y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y14E[] = {
  {&(_ZTVN3ccc8DD4x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y14E[];
Class_Descriptor cd__ZN3ccc8DD4x8y14E = {  "_ZN3ccc8DD4x8y14E", // class name
  bases__ZN3ccc8DD4x8y14E, 2,
  &(vtc__ZN3ccc8DD4x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y15  : virtual ::ccc::AA4 , ::ccc::BB8 {
  ~CC4x8y15(); // tgen
  CC4x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x8y15 ::~CC4x8y15(){ note_dtor("_ZN3ccc8CC4x8y15E", this);} // tgen
ccc::CC4x8y15 ::CC4x8y15(){ note_ctor("_ZN3ccc8CC4x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y15E, buf);
    ::ccc::CC4x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC4x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y15E);
    dp->::ccc::CC4x8y15::~CC4x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y15E(Test__ZN3ccc8CC4x8y15E, "_ZN3ccc8CC4x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y15C1Ev();
extern void _ZN3ccc8CC4x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y15E[] = {
  NSPAIR(_ZN3ccc8CC4x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x8y15E[] = {
  {&(_ZTVN3ccc8CC4x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x8y15E[];
Class_Descriptor cd__ZN3ccc8CC4x8y15E = {  "_ZN3ccc8CC4x8y15E", // class name
  bases__ZN3ccc8CC4x8y15E, 2,
  &(vtc__ZN3ccc8CC4x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x8y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x8y15  : virtual ::ccc::AA4 , virtual ::ccc::BB8 {
  ~DD4x8y15(); // tgen
  DD4x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x8y15 ::~DD4x8y15(){ note_dtor("_ZN3ccc8DD4x8y15E", this);} // tgen
ccc::DD4x8y15 ::DD4x8y15(){ note_ctor("_ZN3ccc8DD4x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x8y15E, buf);
    ::ccc::DD4x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x8y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD4x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x8y15E);
    dp->::ccc::DD4x8y15::~DD4x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x8y15E(Test__ZN3ccc8DD4x8y15E, "_ZN3ccc8DD4x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x8y15C1Ev();
extern void _ZN3ccc8DD4x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x8y15E[] = {
  NSPAIR(_ZN3ccc8DD4x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD4x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x8y15E[] = {
  {&(_ZTVN3ccc8DD4x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x8y15E[];
Class_Descriptor cd__ZN3ccc8DD4x8y15E = {  "_ZN3ccc8DD4x8y15E", // class name
  bases__ZN3ccc8DD4x8y15E, 2,
  &(vtc__ZN3ccc8DD4x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x8y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y0  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y03pqrEv
  ~CC4x9y0(); // tgen
  CC4x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y0E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y03abcEv");}
void  ccc::CC4x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y03efgEv");}
void  ccc::CC4x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y03pqrEv");}
ccc::CC4x9y0 ::~CC4x9y0(){ note_dtor("_ZN3ccc7CC4x9y0E", this);} // tgen
ccc::CC4x9y0 ::CC4x9y0(){ note_ctor("_ZN3ccc7CC4x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y0E, buf);
    ::ccc::CC4x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y0E);
    dp->::ccc::CC4x9y0::~CC4x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y0E(Test__ZN3ccc7CC4x9y0E, "_ZN3ccc7CC4x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y0C1Ev();
extern void _ZN3ccc7CC4x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y0E[] = {
  NSPAIR(_ZN3ccc7CC4x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y0E[];
extern void _ZN3ccc7CC4x9y03efgEv();
extern void _ZN3ccc7CC4x9y03pqrEv();
extern void _ZN3ccc7CC4x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y03pqrEv,_ZTv0_n12_N3ccc7CC4x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y03pqrEv,_ZThn4_N3ccc7CC4x9y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y03abcEv,_ZTv0_n16_N3ccc7CC4x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y03abcEv,_ZThn4_N3ccc7CC4x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y03efgEv,_ZTv0_n20_N3ccc7CC4x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y03efgEv,_ZThn4_N3ccc7CC4x9y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y03pqrEv,_ZTv0_n12_N3ccc7CC4x9y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y03abcEv,_ZTv0_n16_N3ccc7CC4x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y03efgEv,_ZTv0_n20_N3ccc7CC4x9y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y0E[] = {
  {&(_ZTVN3ccc7CC4x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y0E[];
static VTBL_ENTRY alt_thunk_names1996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y03efgEv,_ZTv0_n20_N3ccc7CC4x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y03efgEv,_ZThn4_N3ccc7CC4x9y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y03abcEv,_ZTv0_n16_N3ccc7CC4x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y03abcEv,_ZThn4_N3ccc7CC4x9y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y03pqrEv,_ZTv0_n12_N3ccc7CC4x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y03pqrEv,_ZThn4_N3ccc7CC4x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y0E = {  "_ZN3ccc7CC4x9y0E", // class name
  bases__ZN3ccc7CC4x9y0E, 2,
  &(vtc__ZN3ccc7CC4x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1996,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y0  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD4x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD4x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y03pqrEv
  ~DD4x9y0(); // tgen
  DD4x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y03abcEv");}
void  ccc::DD4x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y03efgEv");}
void  ccc::DD4x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y03pqrEv");}
ccc::DD4x9y0 ::~DD4x9y0(){ note_dtor("_ZN3ccc7DD4x9y0E", this);} // tgen
ccc::DD4x9y0 ::DD4x9y0(){ note_ctor("_ZN3ccc7DD4x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y0E, buf);
    ::ccc::DD4x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y0E);
    dp->::ccc::DD4x9y0::~DD4x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y0E(Test__ZN3ccc7DD4x9y0E, "_ZN3ccc7DD4x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y0C1Ev();
extern void _ZN3ccc7DD4x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y0E[] = {
  NSPAIR(_ZN3ccc7DD4x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y0E[];
extern void _ZN3ccc7DD4x9y03pqrEv();
extern void _ZN3ccc7DD4x9y03abcEv();
extern void _ZN3ccc7DD4x9y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y03efgEv,_ZTv0_n12_N3ccc7DD4x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y03efgEv,_ZThn4_N3ccc7DD4x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y03pqrEv,_ZTv0_n16_N3ccc7DD4x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y03pqrEv,_ZThn4_N3ccc7DD4x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y03efgEv,_ZTv0_n12_N3ccc7DD4x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y03pqrEv,_ZTv0_n16_N3ccc7DD4x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y0E[] = {
  {&(_ZTVN3ccc7DD4x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y0E[];
static VTBL_ENTRY alt_thunk_names1997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y03pqrEv,_ZTv0_n16_N3ccc7DD4x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y03pqrEv,_ZThn4_N3ccc7DD4x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y03efgEv,_ZTv0_n12_N3ccc7DD4x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y03efgEv,_ZThn4_N3ccc7DD4x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y0E = {  "_ZN3ccc7DD4x9y0E", // class name
  bases__ZN3ccc7DD4x9y0E, 2,
  &(vtc__ZN3ccc7DD4x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1997,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y1  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x9y13efgEv
  ~CC4x9y1(); // tgen
  CC4x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y1E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y13abcEv");}
void  ccc::CC4x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y13pqrEv");}
void  ccc::CC4x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y13efgEv");}
ccc::CC4x9y1 ::~CC4x9y1(){ note_dtor("_ZN3ccc7CC4x9y1E", this);} // tgen
ccc::CC4x9y1 ::CC4x9y1(){ note_ctor("_ZN3ccc7CC4x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y1E, buf);
    ::ccc::CC4x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y1E);
    dp->::ccc::CC4x9y1::~CC4x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y1E(Test__ZN3ccc7CC4x9y1E, "_ZN3ccc7CC4x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y1C1Ev();
extern void _ZN3ccc7CC4x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y1E[] = {
  NSPAIR(_ZN3ccc7CC4x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y1E[];
extern void _ZN3ccc7CC4x9y13efgEv();
extern void _ZN3ccc7CC4x9y13pqrEv();
extern void _ZN3ccc7CC4x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y13pqrEv,_ZTv0_n12_N3ccc7CC4x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y13pqrEv,_ZThn4_N3ccc7CC4x9y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y13abcEv,_ZTv0_n16_N3ccc7CC4x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y13abcEv,_ZThn4_N3ccc7CC4x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y13efgEv,_ZTv0_n20_N3ccc7CC4x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y13efgEv,_ZThn4_N3ccc7CC4x9y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y13pqrEv,_ZTv0_n12_N3ccc7CC4x9y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y13abcEv,_ZTv0_n16_N3ccc7CC4x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y13efgEv,_ZTv0_n20_N3ccc7CC4x9y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y1E[] = {
  {&(_ZTVN3ccc7CC4x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y1E[];
static VTBL_ENTRY alt_thunk_names1998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y13efgEv,_ZTv0_n20_N3ccc7CC4x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y13efgEv,_ZThn4_N3ccc7CC4x9y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y13abcEv,_ZTv0_n16_N3ccc7CC4x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y13abcEv,_ZThn4_N3ccc7CC4x9y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y13pqrEv,_ZTv0_n12_N3ccc7CC4x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y13pqrEv,_ZThn4_N3ccc7CC4x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y1E = {  "_ZN3ccc7CC4x9y1E", // class name
  bases__ZN3ccc7CC4x9y1E, 2,
  &(vtc__ZN3ccc7CC4x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1998,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y1  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD4x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x9y13efgEv
  ~DD4x9y1(); // tgen
  DD4x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y13abcEv");}
void  ccc::DD4x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y13pqrEv");}
void  ccc::DD4x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y13efgEv");}
ccc::DD4x9y1 ::~DD4x9y1(){ note_dtor("_ZN3ccc7DD4x9y1E", this);} // tgen
ccc::DD4x9y1 ::DD4x9y1(){ note_ctor("_ZN3ccc7DD4x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y1E, buf);
    ::ccc::DD4x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y1E);
    dp->::ccc::DD4x9y1::~DD4x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y1E(Test__ZN3ccc7DD4x9y1E, "_ZN3ccc7DD4x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y1C1Ev();
extern void _ZN3ccc7DD4x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y1E[] = {
  NSPAIR(_ZN3ccc7DD4x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y1E[];
extern void _ZN3ccc7DD4x9y13pqrEv();
extern void _ZN3ccc7DD4x9y13abcEv();
extern void _ZN3ccc7DD4x9y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y13efgEv,_ZTv0_n12_N3ccc7DD4x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y13efgEv,_ZThn4_N3ccc7DD4x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y13pqrEv,_ZTv0_n16_N3ccc7DD4x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y13pqrEv,_ZThn4_N3ccc7DD4x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y13efgEv,_ZTv0_n12_N3ccc7DD4x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y13pqrEv,_ZTv0_n16_N3ccc7DD4x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y1E[] = {
  {&(_ZTVN3ccc7DD4x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y1E[];
static VTBL_ENTRY alt_thunk_names1999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y13pqrEv,_ZTv0_n16_N3ccc7DD4x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y13pqrEv,_ZThn4_N3ccc7DD4x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y13efgEv,_ZTv0_n12_N3ccc7DD4x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y13efgEv,_ZThn4_N3ccc7DD4x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y1E = {  "_ZN3ccc7DD4x9y1E", // class name
  bases__ZN3ccc7DD4x9y1E, 2,
  &(vtc__ZN3ccc7DD4x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1999,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y2  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y23pqrEv
  ~CC4x9y2(); // tgen
  CC4x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y2E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y23efgEv");}
void  ccc::CC4x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y23abcEv");}
void  ccc::CC4x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y23pqrEv");}
ccc::CC4x9y2 ::~CC4x9y2(){ note_dtor("_ZN3ccc7CC4x9y2E", this);} // tgen
ccc::CC4x9y2 ::CC4x9y2(){ note_ctor("_ZN3ccc7CC4x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y2E, buf);
    ::ccc::CC4x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y2E);
    dp->::ccc::CC4x9y2::~CC4x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y2E(Test__ZN3ccc7CC4x9y2E, "_ZN3ccc7CC4x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y2C1Ev();
extern void _ZN3ccc7CC4x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y2E[] = {
  NSPAIR(_ZN3ccc7CC4x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y2E[];
extern void _ZN3ccc7CC4x9y23efgEv();
extern void _ZN3ccc7CC4x9y23pqrEv();
extern void _ZN3ccc7CC4x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y23pqrEv,_ZTv0_n12_N3ccc7CC4x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y23pqrEv,_ZThn4_N3ccc7CC4x9y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y23abcEv,_ZTv0_n16_N3ccc7CC4x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y23abcEv,_ZThn4_N3ccc7CC4x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y23efgEv,_ZTv0_n20_N3ccc7CC4x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y23efgEv,_ZThn4_N3ccc7CC4x9y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y23pqrEv,_ZTv0_n12_N3ccc7CC4x9y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y23abcEv,_ZTv0_n16_N3ccc7CC4x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y23efgEv,_ZTv0_n20_N3ccc7CC4x9y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y2E[] = {
  {&(_ZTVN3ccc7CC4x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y2E[];
static VTBL_ENTRY alt_thunk_names2000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y23efgEv,_ZTv0_n20_N3ccc7CC4x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y23efgEv,_ZThn4_N3ccc7CC4x9y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y23abcEv,_ZTv0_n16_N3ccc7CC4x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y23abcEv,_ZThn4_N3ccc7CC4x9y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y23pqrEv,_ZTv0_n12_N3ccc7CC4x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y23pqrEv,_ZThn4_N3ccc7CC4x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y2E = {  "_ZN3ccc7CC4x9y2E", // class name
  bases__ZN3ccc7CC4x9y2E, 2,
  &(vtc__ZN3ccc7CC4x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2000,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y2  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD4x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD4x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y23pqrEv
  ~DD4x9y2(); // tgen
  DD4x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y23efgEv");}
void  ccc::DD4x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y23abcEv");}
void  ccc::DD4x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y23pqrEv");}
ccc::DD4x9y2 ::~DD4x9y2(){ note_dtor("_ZN3ccc7DD4x9y2E", this);} // tgen
ccc::DD4x9y2 ::DD4x9y2(){ note_ctor("_ZN3ccc7DD4x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y2E, buf);
    ::ccc::DD4x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y2E);
    dp->::ccc::DD4x9y2::~DD4x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y2E(Test__ZN3ccc7DD4x9y2E, "_ZN3ccc7DD4x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y2C1Ev();
extern void _ZN3ccc7DD4x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y2E[] = {
  NSPAIR(_ZN3ccc7DD4x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y2E[];
extern void _ZN3ccc7DD4x9y23pqrEv();
extern void _ZN3ccc7DD4x9y23abcEv();
extern void _ZN3ccc7DD4x9y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y23efgEv,_ZTv0_n12_N3ccc7DD4x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y23efgEv,_ZThn4_N3ccc7DD4x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y23pqrEv,_ZTv0_n16_N3ccc7DD4x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y23pqrEv,_ZThn4_N3ccc7DD4x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y23efgEv,_ZTv0_n12_N3ccc7DD4x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y23pqrEv,_ZTv0_n16_N3ccc7DD4x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y2E[] = {
  {&(_ZTVN3ccc7DD4x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y2E[];
static VTBL_ENTRY alt_thunk_names2001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y23pqrEv,_ZTv0_n16_N3ccc7DD4x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y23pqrEv,_ZThn4_N3ccc7DD4x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y23efgEv,_ZTv0_n12_N3ccc7DD4x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y23efgEv,_ZThn4_N3ccc7DD4x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y2E = {  "_ZN3ccc7DD4x9y2E", // class name
  bases__ZN3ccc7DD4x9y2E, 2,
  &(vtc__ZN3ccc7DD4x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2001,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y3  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x9y33abcEv
  ~CC4x9y3(); // tgen
  CC4x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y3E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y33efgEv");}
void  ccc::CC4x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y33pqrEv");}
void  ccc::CC4x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y33abcEv");}
ccc::CC4x9y3 ::~CC4x9y3(){ note_dtor("_ZN3ccc7CC4x9y3E", this);} // tgen
ccc::CC4x9y3 ::CC4x9y3(){ note_ctor("_ZN3ccc7CC4x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y3E, buf);
    ::ccc::CC4x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y3E);
    dp->::ccc::CC4x9y3::~CC4x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y3E(Test__ZN3ccc7CC4x9y3E, "_ZN3ccc7CC4x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y3C1Ev();
extern void _ZN3ccc7CC4x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y3E[] = {
  NSPAIR(_ZN3ccc7CC4x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y3E[];
extern void _ZN3ccc7CC4x9y33efgEv();
extern void _ZN3ccc7CC4x9y33pqrEv();
extern void _ZN3ccc7CC4x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y33pqrEv,_ZTv0_n12_N3ccc7CC4x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y33pqrEv,_ZThn4_N3ccc7CC4x9y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y33abcEv,_ZTv0_n16_N3ccc7CC4x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y33abcEv,_ZThn4_N3ccc7CC4x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y33efgEv,_ZTv0_n20_N3ccc7CC4x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y33efgEv,_ZThn4_N3ccc7CC4x9y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y33pqrEv,_ZTv0_n12_N3ccc7CC4x9y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y33abcEv,_ZTv0_n16_N3ccc7CC4x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y33efgEv,_ZTv0_n20_N3ccc7CC4x9y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y3E[] = {
  {&(_ZTVN3ccc7CC4x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y3E[];
static VTBL_ENTRY alt_thunk_names2002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y33efgEv,_ZTv0_n20_N3ccc7CC4x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y33efgEv,_ZThn4_N3ccc7CC4x9y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y33abcEv,_ZTv0_n16_N3ccc7CC4x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y33abcEv,_ZThn4_N3ccc7CC4x9y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y33pqrEv,_ZTv0_n12_N3ccc7CC4x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y33pqrEv,_ZThn4_N3ccc7CC4x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y3E = {  "_ZN3ccc7CC4x9y3E", // class name
  bases__ZN3ccc7CC4x9y3E, 2,
  &(vtc__ZN3ccc7CC4x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2002,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y3  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD4x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x9y33abcEv
  ~DD4x9y3(); // tgen
  DD4x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y33efgEv");}
void  ccc::DD4x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y33pqrEv");}
void  ccc::DD4x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y33abcEv");}
ccc::DD4x9y3 ::~DD4x9y3(){ note_dtor("_ZN3ccc7DD4x9y3E", this);} // tgen
ccc::DD4x9y3 ::DD4x9y3(){ note_ctor("_ZN3ccc7DD4x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y3E, buf);
    ::ccc::DD4x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y3E);
    dp->::ccc::DD4x9y3::~DD4x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y3E(Test__ZN3ccc7DD4x9y3E, "_ZN3ccc7DD4x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y3C1Ev();
extern void _ZN3ccc7DD4x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y3E[] = {
  NSPAIR(_ZN3ccc7DD4x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y3E[];
extern void _ZN3ccc7DD4x9y33pqrEv();
extern void _ZN3ccc7DD4x9y33abcEv();
extern void _ZN3ccc7DD4x9y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y33efgEv,_ZTv0_n12_N3ccc7DD4x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y33efgEv,_ZThn4_N3ccc7DD4x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y33pqrEv,_ZTv0_n16_N3ccc7DD4x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y33pqrEv,_ZThn4_N3ccc7DD4x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y33efgEv,_ZTv0_n12_N3ccc7DD4x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y33pqrEv,_ZTv0_n16_N3ccc7DD4x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y3E[] = {
  {&(_ZTVN3ccc7DD4x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y3E[];
static VTBL_ENTRY alt_thunk_names2003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y33pqrEv,_ZTv0_n16_N3ccc7DD4x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y33pqrEv,_ZThn4_N3ccc7DD4x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y33efgEv,_ZTv0_n12_N3ccc7DD4x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y33efgEv,_ZThn4_N3ccc7DD4x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y3E = {  "_ZN3ccc7DD4x9y3E", // class name
  bases__ZN3ccc7DD4x9y3E, 2,
  &(vtc__ZN3ccc7DD4x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2003,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y4  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC4x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y43efgEv
  ~CC4x9y4(); // tgen
  CC4x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y4E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y43pqrEv");}
void  ccc::CC4x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y43abcEv");}
void  ccc::CC4x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y43efgEv");}
ccc::CC4x9y4 ::~CC4x9y4(){ note_dtor("_ZN3ccc7CC4x9y4E", this);} // tgen
ccc::CC4x9y4 ::CC4x9y4(){ note_ctor("_ZN3ccc7CC4x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y4E, buf);
    ::ccc::CC4x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y4E);
    dp->::ccc::CC4x9y4::~CC4x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y4E(Test__ZN3ccc7CC4x9y4E, "_ZN3ccc7CC4x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y4C1Ev();
extern void _ZN3ccc7CC4x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y4E[] = {
  NSPAIR(_ZN3ccc7CC4x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y4E[];
extern void _ZN3ccc7CC4x9y43efgEv();
extern void _ZN3ccc7CC4x9y43pqrEv();
extern void _ZN3ccc7CC4x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y43pqrEv,_ZTv0_n12_N3ccc7CC4x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y43pqrEv,_ZThn4_N3ccc7CC4x9y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y43abcEv,_ZTv0_n16_N3ccc7CC4x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y43abcEv,_ZThn4_N3ccc7CC4x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y43efgEv,_ZTv0_n20_N3ccc7CC4x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y43efgEv,_ZThn4_N3ccc7CC4x9y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y43pqrEv,_ZTv0_n12_N3ccc7CC4x9y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y43abcEv,_ZTv0_n16_N3ccc7CC4x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y43efgEv,_ZTv0_n20_N3ccc7CC4x9y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y4E[] = {
  {&(_ZTVN3ccc7CC4x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y4E[];
static VTBL_ENTRY alt_thunk_names2004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y43efgEv,_ZTv0_n20_N3ccc7CC4x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y43efgEv,_ZThn4_N3ccc7CC4x9y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y43abcEv,_ZTv0_n16_N3ccc7CC4x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y43abcEv,_ZThn4_N3ccc7CC4x9y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y43pqrEv,_ZTv0_n12_N3ccc7CC4x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y43pqrEv,_ZThn4_N3ccc7CC4x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y4E = {  "_ZN3ccc7CC4x9y4E", // class name
  bases__ZN3ccc7CC4x9y4E, 2,
  &(vtc__ZN3ccc7CC4x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2004,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y4  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD4x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD4x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD4x9y43efgEv
  ~DD4x9y4(); // tgen
  DD4x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y43pqrEv");}
void  ccc::DD4x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y43abcEv");}
void  ccc::DD4x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y43efgEv");}
ccc::DD4x9y4 ::~DD4x9y4(){ note_dtor("_ZN3ccc7DD4x9y4E", this);} // tgen
ccc::DD4x9y4 ::DD4x9y4(){ note_ctor("_ZN3ccc7DD4x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y4E, buf);
    ::ccc::DD4x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y4E);
    dp->::ccc::DD4x9y4::~DD4x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y4E(Test__ZN3ccc7DD4x9y4E, "_ZN3ccc7DD4x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y4C1Ev();
extern void _ZN3ccc7DD4x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y4E[] = {
  NSPAIR(_ZN3ccc7DD4x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y4E[];
extern void _ZN3ccc7DD4x9y43pqrEv();
extern void _ZN3ccc7DD4x9y43abcEv();
extern void _ZN3ccc7DD4x9y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y43efgEv,_ZTv0_n12_N3ccc7DD4x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y43efgEv,_ZThn4_N3ccc7DD4x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y43pqrEv,_ZTv0_n16_N3ccc7DD4x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y43pqrEv,_ZThn4_N3ccc7DD4x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y43efgEv,_ZTv0_n12_N3ccc7DD4x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y43pqrEv,_ZTv0_n16_N3ccc7DD4x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y4E[] = {
  {&(_ZTVN3ccc7DD4x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y4E[];
static VTBL_ENTRY alt_thunk_names2005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y43pqrEv,_ZTv0_n16_N3ccc7DD4x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y43pqrEv,_ZThn4_N3ccc7DD4x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y43efgEv,_ZTv0_n12_N3ccc7DD4x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y43efgEv,_ZThn4_N3ccc7DD4x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y4E = {  "_ZN3ccc7DD4x9y4E", // class name
  bases__ZN3ccc7DD4x9y4E, 2,
  &(vtc__ZN3ccc7DD4x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2005,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y5  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC4x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y53abcEv
  ~CC4x9y5(); // tgen
  CC4x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y5E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y53pqrEv");}
void  ccc::CC4x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y53efgEv");}
void  ccc::CC4x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y53abcEv");}
ccc::CC4x9y5 ::~CC4x9y5(){ note_dtor("_ZN3ccc7CC4x9y5E", this);} // tgen
ccc::CC4x9y5 ::CC4x9y5(){ note_ctor("_ZN3ccc7CC4x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y5E, buf);
    ::ccc::CC4x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y5E);
    dp->::ccc::CC4x9y5::~CC4x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y5E(Test__ZN3ccc7CC4x9y5E, "_ZN3ccc7CC4x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y5C1Ev();
extern void _ZN3ccc7CC4x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y5E[] = {
  NSPAIR(_ZN3ccc7CC4x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y5E[];
extern void _ZN3ccc7CC4x9y53efgEv();
extern void _ZN3ccc7CC4x9y53pqrEv();
extern void _ZN3ccc7CC4x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y53pqrEv,_ZTv0_n12_N3ccc7CC4x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y53pqrEv,_ZThn4_N3ccc7CC4x9y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y53abcEv,_ZTv0_n16_N3ccc7CC4x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y53abcEv,_ZThn4_N3ccc7CC4x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y53efgEv,_ZTv0_n20_N3ccc7CC4x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y53efgEv,_ZThn4_N3ccc7CC4x9y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y53pqrEv,_ZTv0_n12_N3ccc7CC4x9y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y53abcEv,_ZTv0_n16_N3ccc7CC4x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y53efgEv,_ZTv0_n20_N3ccc7CC4x9y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y5E[] = {
  {&(_ZTVN3ccc7CC4x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y5E[];
static VTBL_ENTRY alt_thunk_names2006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y53efgEv,_ZTv0_n20_N3ccc7CC4x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y53efgEv,_ZThn4_N3ccc7CC4x9y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y53abcEv,_ZTv0_n16_N3ccc7CC4x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y53abcEv,_ZThn4_N3ccc7CC4x9y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y53pqrEv,_ZTv0_n12_N3ccc7CC4x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y53pqrEv,_ZThn4_N3ccc7CC4x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y5E = {  "_ZN3ccc7CC4x9y5E", // class name
  bases__ZN3ccc7CC4x9y5E, 2,
  &(vtc__ZN3ccc7CC4x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2006,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y5  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD4x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD4x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD4x9y53abcEv
  ~DD4x9y5(); // tgen
  DD4x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y53pqrEv");}
void  ccc::DD4x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y53efgEv");}
void  ccc::DD4x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y53abcEv");}
ccc::DD4x9y5 ::~DD4x9y5(){ note_dtor("_ZN3ccc7DD4x9y5E", this);} // tgen
ccc::DD4x9y5 ::DD4x9y5(){ note_ctor("_ZN3ccc7DD4x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y5E, buf);
    ::ccc::DD4x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y5E);
    dp->::ccc::DD4x9y5::~DD4x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y5E(Test__ZN3ccc7DD4x9y5E, "_ZN3ccc7DD4x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y5C1Ev();
extern void _ZN3ccc7DD4x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y5E[] = {
  NSPAIR(_ZN3ccc7DD4x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y5E[];
extern void _ZN3ccc7DD4x9y53pqrEv();
extern void _ZN3ccc7DD4x9y53abcEv();
extern void _ZN3ccc7DD4x9y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y53efgEv,_ZTv0_n12_N3ccc7DD4x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y53efgEv,_ZThn4_N3ccc7DD4x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y53pqrEv,_ZTv0_n16_N3ccc7DD4x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y53pqrEv,_ZThn4_N3ccc7DD4x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y53efgEv,_ZTv0_n12_N3ccc7DD4x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y53pqrEv,_ZTv0_n16_N3ccc7DD4x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y5E[] = {
  {&(_ZTVN3ccc7DD4x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y5E[];
static VTBL_ENTRY alt_thunk_names2007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y53pqrEv,_ZTv0_n16_N3ccc7DD4x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y53pqrEv,_ZThn4_N3ccc7DD4x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y53efgEv,_ZTv0_n12_N3ccc7DD4x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y53efgEv,_ZThn4_N3ccc7DD4x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y5E = {  "_ZN3ccc7DD4x9y5E", // class name
  bases__ZN3ccc7DD4x9y5E, 2,
  &(vtc__ZN3ccc7DD4x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2007,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y6  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y63efgEv
  ~CC4x9y6(); // tgen
  CC4x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y6E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y63abcEv");}
void  ccc::CC4x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y63efgEv");}
ccc::CC4x9y6 ::~CC4x9y6(){ note_dtor("_ZN3ccc7CC4x9y6E", this);} // tgen
ccc::CC4x9y6 ::CC4x9y6(){ note_ctor("_ZN3ccc7CC4x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y6E, buf);
    ::ccc::CC4x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y6E);
    dp->::ccc::CC4x9y6::~CC4x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y6E(Test__ZN3ccc7CC4x9y6E, "_ZN3ccc7CC4x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y6C1Ev();
extern void _ZN3ccc7CC4x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y6E[] = {
  NSPAIR(_ZN3ccc7CC4x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y6E[];
extern void _ZN3ccc7CC4x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC4x9y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y63abcEv,_ZTv0_n16_N3ccc7CC4x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y63abcEv,_ZThn4_N3ccc7CC4x9y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y63efgEv,_ZTv0_n20_N3ccc7CC4x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y63efgEv,_ZThn4_N3ccc7CC4x9y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y63abcEv,_ZTv0_n16_N3ccc7CC4x9y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y63efgEv,_ZTv0_n20_N3ccc7CC4x9y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y6E[] = {
  {&(_ZTVN3ccc7CC4x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y6E[];
static VTBL_ENTRY alt_thunk_names2008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y63efgEv,_ZTv0_n20_N3ccc7CC4x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y63efgEv,_ZThn4_N3ccc7CC4x9y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y63abcEv,_ZTv0_n16_N3ccc7CC4x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y63abcEv,_ZThn4_N3ccc7CC4x9y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y6E = {  "_ZN3ccc7CC4x9y6E", // class name
  bases__ZN3ccc7CC4x9y6E, 2,
  &(vtc__ZN3ccc7CC4x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2008,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y6  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD4x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD4x9y63efgEv
  ~DD4x9y6(); // tgen
  DD4x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y63abcEv");}
void  ccc::DD4x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y63efgEv");}
ccc::DD4x9y6 ::~DD4x9y6(){ note_dtor("_ZN3ccc7DD4x9y6E", this);} // tgen
ccc::DD4x9y6 ::DD4x9y6(){ note_ctor("_ZN3ccc7DD4x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y6E, buf);
    ::ccc::DD4x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y6E);
    dp->::ccc::DD4x9y6::~DD4x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y6E(Test__ZN3ccc7DD4x9y6E, "_ZN3ccc7DD4x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y6C1Ev();
extern void _ZN3ccc7DD4x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y6E[] = {
  NSPAIR(_ZN3ccc7DD4x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x9y63abcEv();
extern void _ZN3ccc7DD4x9y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y63efgEv,_ZTv0_n12_N3ccc7DD4x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y63efgEv,_ZThn4_N3ccc7DD4x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y63efgEv,_ZTv0_n12_N3ccc7DD4x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y6E[] = {
  {&(_ZTVN3ccc7DD4x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y6E[];
static VTBL_ENTRY alt_thunk_names2009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y63efgEv,_ZTv0_n12_N3ccc7DD4x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y63efgEv,_ZThn4_N3ccc7DD4x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y6E = {  "_ZN3ccc7DD4x9y6E", // class name
  bases__ZN3ccc7DD4x9y6E, 2,
  &(vtc__ZN3ccc7DD4x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2009,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y7  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y73pqrEv
  ~CC4x9y7(); // tgen
  CC4x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y7E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y73abcEv");}
void  ccc::CC4x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y73pqrEv");}
ccc::CC4x9y7 ::~CC4x9y7(){ note_dtor("_ZN3ccc7CC4x9y7E", this);} // tgen
ccc::CC4x9y7 ::CC4x9y7(){ note_ctor("_ZN3ccc7CC4x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y7E, buf);
    ::ccc::CC4x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y7E);
    dp->::ccc::CC4x9y7::~CC4x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y7E(Test__ZN3ccc7CC4x9y7E, "_ZN3ccc7CC4x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y7C1Ev();
extern void _ZN3ccc7CC4x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y7E[] = {
  NSPAIR(_ZN3ccc7CC4x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC4x9y73pqrEv();
extern void _ZN3ccc7CC4x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y73pqrEv,_ZTv0_n12_N3ccc7CC4x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y73pqrEv,_ZThn4_N3ccc7CC4x9y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y73abcEv,_ZTv0_n16_N3ccc7CC4x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y73abcEv,_ZThn4_N3ccc7CC4x9y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y73pqrEv,_ZTv0_n12_N3ccc7CC4x9y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y73abcEv,_ZTv0_n16_N3ccc7CC4x9y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y7E[] = {
  {&(_ZTVN3ccc7CC4x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y7E[];
static VTBL_ENTRY alt_thunk_names2010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y73abcEv,_ZTv0_n16_N3ccc7CC4x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y73abcEv,_ZThn4_N3ccc7CC4x9y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y73pqrEv,_ZTv0_n12_N3ccc7CC4x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y73pqrEv,_ZThn4_N3ccc7CC4x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y7E = {  "_ZN3ccc7CC4x9y7E", // class name
  bases__ZN3ccc7CC4x9y7E, 2,
  &(vtc__ZN3ccc7CC4x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2010,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y7  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD4x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y73pqrEv
  ~DD4x9y7(); // tgen
  DD4x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y73abcEv");}
void  ccc::DD4x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y73pqrEv");}
ccc::DD4x9y7 ::~DD4x9y7(){ note_dtor("_ZN3ccc7DD4x9y7E", this);} // tgen
ccc::DD4x9y7 ::DD4x9y7(){ note_ctor("_ZN3ccc7DD4x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y7E, buf);
    ::ccc::DD4x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y7E);
    dp->::ccc::DD4x9y7::~DD4x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y7E(Test__ZN3ccc7DD4x9y7E, "_ZN3ccc7DD4x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y7C1Ev();
extern void _ZN3ccc7DD4x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y7E[] = {
  NSPAIR(_ZN3ccc7DD4x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y7E[];
extern void _ZN3ccc7DD4x9y73pqrEv();
extern void _ZN3ccc7DD4x9y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y73pqrEv,_ZTv0_n16_N3ccc7DD4x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y73pqrEv,_ZThn4_N3ccc7DD4x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y73pqrEv,_ZTv0_n16_N3ccc7DD4x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y7E[] = {
  {&(_ZTVN3ccc7DD4x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y7E[];
static VTBL_ENTRY alt_thunk_names2011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y73pqrEv,_ZTv0_n16_N3ccc7DD4x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y73pqrEv,_ZThn4_N3ccc7DD4x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y7E = {  "_ZN3ccc7DD4x9y7E", // class name
  bases__ZN3ccc7DD4x9y7E, 2,
  &(vtc__ZN3ccc7DD4x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2011,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y8  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y83abcEv
  ~CC4x9y8(); // tgen
  CC4x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y8E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y83efgEv");}
void  ccc::CC4x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y83abcEv");}
ccc::CC4x9y8 ::~CC4x9y8(){ note_dtor("_ZN3ccc7CC4x9y8E", this);} // tgen
ccc::CC4x9y8 ::CC4x9y8(){ note_ctor("_ZN3ccc7CC4x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y8E, buf);
    ::ccc::CC4x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y8E);
    dp->::ccc::CC4x9y8::~CC4x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y8E(Test__ZN3ccc7CC4x9y8E, "_ZN3ccc7CC4x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y8C1Ev();
extern void _ZN3ccc7CC4x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y8E[] = {
  NSPAIR(_ZN3ccc7CC4x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y8E[];
extern void _ZN3ccc7CC4x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC4x9y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC4x9y83abcEv,_ZTv0_n16_N3ccc7CC4x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y83abcEv,_ZThn4_N3ccc7CC4x9y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y83efgEv,_ZTv0_n20_N3ccc7CC4x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y83efgEv,_ZThn4_N3ccc7CC4x9y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC4x9y83abcEv,_ZTv0_n16_N3ccc7CC4x9y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y83efgEv,_ZTv0_n20_N3ccc7CC4x9y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y8E[] = {
  {&(_ZTVN3ccc7CC4x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC4x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y8E[];
static VTBL_ENTRY alt_thunk_names2012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y83efgEv,_ZTv0_n20_N3ccc7CC4x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y83efgEv,_ZThn4_N3ccc7CC4x9y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC4x9y83abcEv,_ZTv0_n16_N3ccc7CC4x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y83abcEv,_ZThn4_N3ccc7CC4x9y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y8E = {  "_ZN3ccc7CC4x9y8E", // class name
  bases__ZN3ccc7CC4x9y8E, 2,
  &(vtc__ZN3ccc7CC4x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2012,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y8  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD4x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD4x9y83abcEv
  ~DD4x9y8(); // tgen
  DD4x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y83efgEv");}
void  ccc::DD4x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD4x9y83abcEv");}
ccc::DD4x9y8 ::~DD4x9y8(){ note_dtor("_ZN3ccc7DD4x9y8E", this);} // tgen
ccc::DD4x9y8 ::DD4x9y8(){ note_ctor("_ZN3ccc7DD4x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y8E, buf);
    ::ccc::DD4x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y8E);
    dp->::ccc::DD4x9y8::~DD4x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y8E(Test__ZN3ccc7DD4x9y8E, "_ZN3ccc7DD4x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y8C1Ev();
extern void _ZN3ccc7DD4x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y8E[] = {
  NSPAIR(_ZN3ccc7DD4x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7DD4x9y83abcEv();
extern void _ZN3ccc7DD4x9y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y83efgEv,_ZTv0_n12_N3ccc7DD4x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y83efgEv,_ZThn4_N3ccc7DD4x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y83efgEv,_ZTv0_n12_N3ccc7DD4x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y8E[] = {
  {&(_ZTVN3ccc7DD4x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y8E[];
static VTBL_ENTRY alt_thunk_names2013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y83efgEv,_ZTv0_n12_N3ccc7DD4x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y83efgEv,_ZThn4_N3ccc7DD4x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y8E = {  "_ZN3ccc7DD4x9y8E", // class name
  bases__ZN3ccc7DD4x9y8E, 2,
  &(vtc__ZN3ccc7DD4x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2013,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y9  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y93pqrEv
  ~CC4x9y9(); // tgen
  CC4x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y9E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y93efgEv");}
void  ccc::CC4x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y93pqrEv");}
ccc::CC4x9y9 ::~CC4x9y9(){ note_dtor("_ZN3ccc7CC4x9y9E", this);} // tgen
ccc::CC4x9y9 ::CC4x9y9(){ note_ctor("_ZN3ccc7CC4x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y9E, buf);
    ::ccc::CC4x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc7CC4x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC4x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y9E);
    dp->::ccc::CC4x9y9::~CC4x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y9E(Test__ZN3ccc7CC4x9y9E, "_ZN3ccc7CC4x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y9C1Ev();
extern void _ZN3ccc7CC4x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y9E[] = {
  NSPAIR(_ZN3ccc7CC4x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y9E[];
extern void _ZN3ccc7CC4x9y93efgEv();
extern void _ZN3ccc7CC4x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC4x9y93pqrEv,_ZTv0_n12_N3ccc7CC4x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y93pqrEv,_ZThn4_N3ccc7CC4x9y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC4x9y93efgEv,_ZTv0_n20_N3ccc7CC4x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y93efgEv,_ZThn4_N3ccc7CC4x9y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC4x9y93pqrEv,_ZTv0_n12_N3ccc7CC4x9y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC4x9y93efgEv,_ZTv0_n20_N3ccc7CC4x9y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC4x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC4x9y9E[] = {
  {&(_ZTVN3ccc7CC4x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC4x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC4x9y9E[];
static VTBL_ENTRY alt_thunk_names2014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC4x9y93efgEv,_ZTv0_n20_N3ccc7CC4x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y93efgEv,_ZThn4_N3ccc7CC4x9y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC4x9y93pqrEv,_ZTv0_n12_N3ccc7CC4x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC4x9y93pqrEv,_ZThn4_N3ccc7CC4x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC4x9y9E = {  "_ZN3ccc7CC4x9y9E", // class name
  bases__ZN3ccc7CC4x9y9E, 2,
  &(vtc__ZN3ccc7CC4x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC4x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC4x9y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2014,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y9  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD4x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD4x9y93pqrEv
  ~DD4x9y9(); // tgen
  DD4x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD4x9y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD4x9y93efgEv");}
void  ccc::DD4x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD4x9y93pqrEv");}
ccc::DD4x9y9 ::~DD4x9y9(){ note_dtor("_ZN3ccc7DD4x9y9E", this);} // tgen
ccc::DD4x9y9 ::DD4x9y9(){ note_ctor("_ZN3ccc7DD4x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD4x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD4x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD4x9y9E, buf);
    ::ccc::DD4x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD4x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD4x9y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7DD4x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD4x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD4x9y9E);
    dp->::ccc::DD4x9y9::~DD4x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD4x9y9E(Test__ZN3ccc7DD4x9y9E, "_ZN3ccc7DD4x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD4x9y9C1Ev();
extern void _ZN3ccc7DD4x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD4x9y9E[] = {
  NSPAIR(_ZN3ccc7DD4x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD4x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD4x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y9E[];
extern void _ZN3ccc7DD4x9y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7DD4x9y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD4x9y93efgEv,_ZTv0_n12_N3ccc7DD4x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y93efgEv,_ZThn4_N3ccc7DD4x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD4x9y93pqrEv,_ZTv0_n16_N3ccc7DD4x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD4x9y93pqrEv,_ZThn4_N3ccc7DD4x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD4x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD4x9y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD4x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD4x9y93efgEv,_ZTv0_n12_N3ccc7DD4x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD4x9y93pqrEv,_ZTv0_n16_N3ccc7DD4x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD4x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD4x9y9E[] = {
  {&(_ZTVN3ccc7DD4x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD4x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD4x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD4x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD4x9y9E[];
static VTBL_ENTRY alt_thunk_names2015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD4x9y93pqrEv,_ZTv0_n16_N3ccc7DD4x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y93pqrEv,_ZThn4_N3ccc7DD4x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD4x9y93efgEv,_ZTv0_n12_N3ccc7DD4x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD4x9y93efgEv,_ZThn4_N3ccc7DD4x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD4x9y9E = {  "_ZN3ccc7DD4x9y9E", // class name
  bases__ZN3ccc7DD4x9y9E, 2,
  &(vtc__ZN3ccc7DD4x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD4x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD4x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD4x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD4x9y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2015,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y10  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x9y103abcEv
  ~CC4x9y10(); // tgen
  CC4x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y10E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y103pqrEv");}
void  ccc::CC4x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x9y103abcEv");}
ccc::CC4x9y10 ::~CC4x9y10(){ note_dtor("_ZN3ccc8CC4x9y10E", this);} // tgen
ccc::CC4x9y10 ::CC4x9y10(){ note_ctor("_ZN3ccc8CC4x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y10E, buf);
    ::ccc::CC4x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y10E);
    dp->::ccc::CC4x9y10::~CC4x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y10E(Test__ZN3ccc8CC4x9y10E, "_ZN3ccc8CC4x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y10C1Ev();
extern void _ZN3ccc8CC4x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y10E[] = {
  NSPAIR(_ZN3ccc8CC4x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC4x9y103pqrEv();
extern void _ZN3ccc8CC4x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x9y103pqrEv,_ZTv0_n12_N3ccc8CC4x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y103pqrEv,_ZThn4_N3ccc8CC4x9y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x9y103abcEv,_ZTv0_n16_N3ccc8CC4x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y103abcEv,_ZThn4_N3ccc8CC4x9y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x9y103pqrEv,_ZTv0_n12_N3ccc8CC4x9y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x9y103abcEv,_ZTv0_n16_N3ccc8CC4x9y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y10E[] = {
  {&(_ZTVN3ccc8CC4x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y10E[];
static VTBL_ENTRY alt_thunk_names2016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x9y103abcEv,_ZTv0_n16_N3ccc8CC4x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y103abcEv,_ZThn4_N3ccc8CC4x9y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x9y103pqrEv,_ZTv0_n12_N3ccc8CC4x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y103pqrEv,_ZThn4_N3ccc8CC4x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x9y10E = {  "_ZN3ccc8CC4x9y10E", // class name
  bases__ZN3ccc8CC4x9y10E, 2,
  &(vtc__ZN3ccc8CC4x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2016,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y10  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD4x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x9y103abcEv
  ~DD4x9y10(); // tgen
  DD4x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x9y103pqrEv");}
void  ccc::DD4x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x9y103abcEv");}
ccc::DD4x9y10 ::~DD4x9y10(){ note_dtor("_ZN3ccc8DD4x9y10E", this);} // tgen
ccc::DD4x9y10 ::DD4x9y10(){ note_ctor("_ZN3ccc8DD4x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y10E, buf);
    ::ccc::DD4x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y10E);
    dp->::ccc::DD4x9y10::~DD4x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y10E(Test__ZN3ccc8DD4x9y10E, "_ZN3ccc8DD4x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y10C1Ev();
extern void _ZN3ccc8DD4x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y10E[] = {
  NSPAIR(_ZN3ccc8DD4x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y10E[];
extern void _ZN3ccc8DD4x9y103pqrEv();
extern void _ZN3ccc8DD4x9y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x9y103pqrEv,_ZTv0_n16_N3ccc8DD4x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x9y103pqrEv,_ZThn4_N3ccc8DD4x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x9y103pqrEv,_ZTv0_n16_N3ccc8DD4x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y10E[] = {
  {&(_ZTVN3ccc8DD4x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y10E[];
static VTBL_ENTRY alt_thunk_names2017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x9y103pqrEv,_ZTv0_n16_N3ccc8DD4x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x9y103pqrEv,_ZThn4_N3ccc8DD4x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x9y10E = {  "_ZN3ccc8DD4x9y10E", // class name
  bases__ZN3ccc8DD4x9y10E, 2,
  &(vtc__ZN3ccc8DD4x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2017,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y11  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x9y113efgEv
  ~CC4x9y11(); // tgen
  CC4x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y11E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y113pqrEv");}
void  ccc::CC4x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x9y113efgEv");}
ccc::CC4x9y11 ::~CC4x9y11(){ note_dtor("_ZN3ccc8CC4x9y11E", this);} // tgen
ccc::CC4x9y11 ::CC4x9y11(){ note_ctor("_ZN3ccc8CC4x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y11E, buf);
    ::ccc::CC4x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y11E);
    dp->::ccc::CC4x9y11::~CC4x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y11E(Test__ZN3ccc8CC4x9y11E, "_ZN3ccc8CC4x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y11C1Ev();
extern void _ZN3ccc8CC4x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y11E[] = {
  NSPAIR(_ZN3ccc8CC4x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y11E[];
extern void _ZN3ccc8CC4x9y113efgEv();
extern void _ZN3ccc8CC4x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x9y113pqrEv,_ZTv0_n12_N3ccc8CC4x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y113pqrEv,_ZThn4_N3ccc8CC4x9y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x9y113efgEv,_ZTv0_n20_N3ccc8CC4x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y113efgEv,_ZThn4_N3ccc8CC4x9y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x9y113pqrEv,_ZTv0_n12_N3ccc8CC4x9y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x9y113efgEv,_ZTv0_n20_N3ccc8CC4x9y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y11E[] = {
  {&(_ZTVN3ccc8CC4x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y11E[];
static VTBL_ENTRY alt_thunk_names2018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x9y113efgEv,_ZTv0_n20_N3ccc8CC4x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y113efgEv,_ZThn4_N3ccc8CC4x9y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x9y113pqrEv,_ZTv0_n12_N3ccc8CC4x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y113pqrEv,_ZThn4_N3ccc8CC4x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x9y11E = {  "_ZN3ccc8CC4x9y11E", // class name
  bases__ZN3ccc8CC4x9y11E, 2,
  &(vtc__ZN3ccc8CC4x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2018,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y11  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD4x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x9y113efgEv
  ~DD4x9y11(); // tgen
  DD4x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x9y113pqrEv");}
void  ccc::DD4x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x9y113efgEv");}
ccc::DD4x9y11 ::~DD4x9y11(){ note_dtor("_ZN3ccc8DD4x9y11E", this);} // tgen
ccc::DD4x9y11 ::DD4x9y11(){ note_ctor("_ZN3ccc8DD4x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y11E, buf);
    ::ccc::DD4x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y11E);
    dp->::ccc::DD4x9y11::~DD4x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y11E(Test__ZN3ccc8DD4x9y11E, "_ZN3ccc8DD4x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y11C1Ev();
extern void _ZN3ccc8DD4x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y11E[] = {
  NSPAIR(_ZN3ccc8DD4x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y11E[];
extern void _ZN3ccc8DD4x9y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x9y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x9y113efgEv,_ZTv0_n12_N3ccc8DD4x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x9y113efgEv,_ZThn4_N3ccc8DD4x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x9y113pqrEv,_ZTv0_n16_N3ccc8DD4x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x9y113pqrEv,_ZThn4_N3ccc8DD4x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x9y113efgEv,_ZTv0_n12_N3ccc8DD4x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x9y113pqrEv,_ZTv0_n16_N3ccc8DD4x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y11E[] = {
  {&(_ZTVN3ccc8DD4x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y11E[];
static VTBL_ENTRY alt_thunk_names2019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x9y113pqrEv,_ZTv0_n16_N3ccc8DD4x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x9y113pqrEv,_ZThn4_N3ccc8DD4x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x9y113efgEv,_ZTv0_n12_N3ccc8DD4x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x9y113efgEv,_ZThn4_N3ccc8DD4x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x9y11E = {  "_ZN3ccc8DD4x9y11E", // class name
  bases__ZN3ccc8DD4x9y11E, 2,
  &(vtc__ZN3ccc8DD4x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2019,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y12  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC4x9y123abcEv
  ~CC4x9y12(); // tgen
  CC4x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x9y123abcEv");}
ccc::CC4x9y12 ::~CC4x9y12(){ note_dtor("_ZN3ccc8CC4x9y12E", this);} // tgen
ccc::CC4x9y12 ::CC4x9y12(){ note_ctor("_ZN3ccc8CC4x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y12E, buf);
    ::ccc::CC4x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y12E);
    dp->::ccc::CC4x9y12::~CC4x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y12E(Test__ZN3ccc8CC4x9y12E, "_ZN3ccc8CC4x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y12C1Ev();
extern void _ZN3ccc8CC4x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y12E[] = {
  NSPAIR(_ZN3ccc8CC4x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC4x9y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x9y123abcEv,_ZTv0_n16_N3ccc8CC4x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y123abcEv,_ZThn4_N3ccc8CC4x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x9y123abcEv,_ZTv0_n16_N3ccc8CC4x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y12E[] = {
  {&(_ZTVN3ccc8CC4x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y12E[];
static VTBL_ENTRY alt_thunk_names2020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x9y123abcEv,_ZTv0_n16_N3ccc8CC4x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y123abcEv,_ZThn4_N3ccc8CC4x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x9y12E = {  "_ZN3ccc8CC4x9y12E", // class name
  bases__ZN3ccc8CC4x9y12E, 2,
  &(vtc__ZN3ccc8CC4x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2020,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y12  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD4x9y123abcEv
  ~DD4x9y12(); // tgen
  DD4x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x9y123abcEv");}
ccc::DD4x9y12 ::~DD4x9y12(){ note_dtor("_ZN3ccc8DD4x9y12E", this);} // tgen
ccc::DD4x9y12 ::DD4x9y12(){ note_ctor("_ZN3ccc8DD4x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y12E, buf);
    ::ccc::DD4x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y12E);
    dp->::ccc::DD4x9y12::~DD4x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y12E(Test__ZN3ccc8DD4x9y12E, "_ZN3ccc8DD4x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y12C1Ev();
extern void _ZN3ccc8DD4x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y12E[] = {
  NSPAIR(_ZN3ccc8DD4x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x9y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y12E[] = {
  {&(_ZTVN3ccc8DD4x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y12E[];
Class_Descriptor cd__ZN3ccc8DD4x9y12E = {  "_ZN3ccc8DD4x9y12E", // class name
  bases__ZN3ccc8DD4x9y12E, 2,
  &(vtc__ZN3ccc8DD4x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y13  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC4x9y133efgEv
  ~CC4x9y13(); // tgen
  CC4x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x9y133efgEv");}
ccc::CC4x9y13 ::~CC4x9y13(){ note_dtor("_ZN3ccc8CC4x9y13E", this);} // tgen
ccc::CC4x9y13 ::CC4x9y13(){ note_ctor("_ZN3ccc8CC4x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y13E, buf);
    ::ccc::CC4x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y13E);
    dp->::ccc::CC4x9y13::~CC4x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y13E(Test__ZN3ccc8CC4x9y13E, "_ZN3ccc8CC4x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y13C1Ev();
extern void _ZN3ccc8CC4x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y13E[] = {
  NSPAIR(_ZN3ccc8CC4x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y13E[];
extern void _ZN3ccc8CC4x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x9y133efgEv,_ZTv0_n20_N3ccc8CC4x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y133efgEv,_ZThn4_N3ccc8CC4x9y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x9y133efgEv,_ZTv0_n20_N3ccc8CC4x9y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y13E[] = {
  {&(_ZTVN3ccc8CC4x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y13E[];
static VTBL_ENTRY alt_thunk_names2021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x9y133efgEv,_ZTv0_n20_N3ccc8CC4x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y133efgEv,_ZThn4_N3ccc8CC4x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x9y13E = {  "_ZN3ccc8CC4x9y13E", // class name
  bases__ZN3ccc8CC4x9y13E, 2,
  &(vtc__ZN3ccc8CC4x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2021,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y13  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD4x9y133efgEv
  ~DD4x9y13(); // tgen
  DD4x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x9y133efgEv");}
ccc::DD4x9y13 ::~DD4x9y13(){ note_dtor("_ZN3ccc8DD4x9y13E", this);} // tgen
ccc::DD4x9y13 ::DD4x9y13(){ note_ctor("_ZN3ccc8DD4x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y13E, buf);
    ::ccc::DD4x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y13E);
    dp->::ccc::DD4x9y13::~DD4x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y13E(Test__ZN3ccc8DD4x9y13E, "_ZN3ccc8DD4x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y13C1Ev();
extern void _ZN3ccc8DD4x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y13E[] = {
  NSPAIR(_ZN3ccc8DD4x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x9y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x9y133efgEv,_ZTv0_n12_N3ccc8DD4x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x9y133efgEv,_ZThn4_N3ccc8DD4x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x9y133efgEv,_ZTv0_n12_N3ccc8DD4x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y13E[] = {
  {&(_ZTVN3ccc8DD4x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y13E[];
static VTBL_ENTRY alt_thunk_names2022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x9y133efgEv,_ZTv0_n12_N3ccc8DD4x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x9y133efgEv,_ZThn4_N3ccc8DD4x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x9y13E = {  "_ZN3ccc8DD4x9y13E", // class name
  bases__ZN3ccc8DD4x9y13E, 2,
  &(vtc__ZN3ccc8DD4x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2022,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y14  : virtual ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y143pqrEv
  ~CC4x9y14(); // tgen
  CC4x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y143pqrEv");}
ccc::CC4x9y14 ::~CC4x9y14(){ note_dtor("_ZN3ccc8CC4x9y14E", this);} // tgen
ccc::CC4x9y14 ::CC4x9y14(){ note_ctor("_ZN3ccc8CC4x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y14E, buf);
    ::ccc::CC4x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y14E);
    dp->::ccc::CC4x9y14::~CC4x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y14E(Test__ZN3ccc8CC4x9y14E, "_ZN3ccc8CC4x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y14C1Ev();
extern void _ZN3ccc8CC4x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y14E[] = {
  NSPAIR(_ZN3ccc8CC4x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC4x9y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x9y143pqrEv,_ZTv0_n12_N3ccc8CC4x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y143pqrEv,_ZThn4_N3ccc8CC4x9y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x9y143pqrEv,_ZTv0_n12_N3ccc8CC4x9y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y14E[] = {
  {&(_ZTVN3ccc8CC4x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y14E[];
static VTBL_ENTRY alt_thunk_names2023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x9y143pqrEv,_ZTv0_n12_N3ccc8CC4x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x9y143pqrEv,_ZThn4_N3ccc8CC4x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x9y14E = {  "_ZN3ccc8CC4x9y14E", // class name
  bases__ZN3ccc8CC4x9y14E, 2,
  &(vtc__ZN3ccc8CC4x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2023,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y14  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD4x9y143pqrEv
  ~DD4x9y14(); // tgen
  DD4x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x9y143pqrEv");}
ccc::DD4x9y14 ::~DD4x9y14(){ note_dtor("_ZN3ccc8DD4x9y14E", this);} // tgen
ccc::DD4x9y14 ::DD4x9y14(){ note_ctor("_ZN3ccc8DD4x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y14E, buf);
    ::ccc::DD4x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y14E);
    dp->::ccc::DD4x9y14::~DD4x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y14E(Test__ZN3ccc8DD4x9y14E, "_ZN3ccc8DD4x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y14C1Ev();
extern void _ZN3ccc8DD4x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y14E[] = {
  NSPAIR(_ZN3ccc8DD4x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y14E[];
extern void _ZN3ccc8DD4x9y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x9y143pqrEv,_ZTv0_n16_N3ccc8DD4x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x9y143pqrEv,_ZThn4_N3ccc8DD4x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x9y143pqrEv,_ZTv0_n16_N3ccc8DD4x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y14E[] = {
  {&(_ZTVN3ccc8DD4x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y14E[];
static VTBL_ENTRY alt_thunk_names2024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x9y143pqrEv,_ZTv0_n16_N3ccc8DD4x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x9y143pqrEv,_ZThn4_N3ccc8DD4x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x9y14E = {  "_ZN3ccc8DD4x9y14E", // class name
  bases__ZN3ccc8DD4x9y14E, 2,
  &(vtc__ZN3ccc8DD4x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2024,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y15  : virtual ::ccc::AA4 , ::ccc::BB9 {
  ~CC4x9y15(); // tgen
  CC4x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x9y15 ::~CC4x9y15(){ note_dtor("_ZN3ccc8CC4x9y15E", this);} // tgen
ccc::CC4x9y15 ::CC4x9y15(){ note_ctor("_ZN3ccc8CC4x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y15E, buf);
    ::ccc::CC4x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC4x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y15E);
    dp->::ccc::CC4x9y15::~CC4x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y15E(Test__ZN3ccc8CC4x9y15E, "_ZN3ccc8CC4x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y15C1Ev();
extern void _ZN3ccc8CC4x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y15E[] = {
  NSPAIR(_ZN3ccc8CC4x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x9y15E[] = {
  {&(_ZTVN3ccc8CC4x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x9y15E[];
Class_Descriptor cd__ZN3ccc8CC4x9y15E = {  "_ZN3ccc8CC4x9y15E", // class name
  bases__ZN3ccc8CC4x9y15E, 2,
  &(vtc__ZN3ccc8CC4x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x9y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x9y15  : virtual ::ccc::AA4 , virtual ::ccc::BB9 {
  ~DD4x9y15(); // tgen
  DD4x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD4x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x9y15 ::~DD4x9y15(){ note_dtor("_ZN3ccc8DD4x9y15E", this);} // tgen
ccc::DD4x9y15 ::DD4x9y15(){ note_ctor("_ZN3ccc8DD4x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD4x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x9y15E, buf);
    ::ccc::DD4x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x9y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD4x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x9y15E);
    dp->::ccc::DD4x9y15::~DD4x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x9y15E(Test__ZN3ccc8DD4x9y15E, "_ZN3ccc8DD4x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x9y15C1Ev();
extern void _ZN3ccc8DD4x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD4x9y15E[] = {
  NSPAIR(_ZN3ccc8DD4x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD4x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD4x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x9y15E[] = {
  {&(_ZTVN3ccc8DD4x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x9y15E[];
Class_Descriptor cd__ZN3ccc8DD4x9y15E = {  "_ZN3ccc8DD4x9y15E", // class name
  bases__ZN3ccc8DD4x9y15E, 2,
  &(vtc__ZN3ccc8DD4x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x9y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y0  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y03pqrEv
  ~CC4x10y0(); // tgen
  CC4x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y0E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y03abcEv");}
void  ccc::CC4x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y03efgEv");}
void  ccc::CC4x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y03pqrEv");}
ccc::CC4x10y0 ::~CC4x10y0(){ note_dtor("_ZN3ccc8CC4x10y0E", this);} // tgen
ccc::CC4x10y0 ::CC4x10y0(){ note_ctor("_ZN3ccc8CC4x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y0E, buf);
    ::ccc::CC4x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y0E);
    dp->::ccc::CC4x10y0::~CC4x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y0E(Test__ZN3ccc8CC4x10y0E, "_ZN3ccc8CC4x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y0C1Ev();
extern void _ZN3ccc8CC4x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y0E[] = {
  NSPAIR(_ZN3ccc8CC4x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y0E[];
extern void _ZN3ccc8CC4x10y03pqrEv();
extern void _ZN3ccc8CC4x10y03abcEv();
extern void _ZN3ccc8CC4x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y03pqrEv,_ZTv0_n12_N3ccc8CC4x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y03pqrEv,_ZThn4_N3ccc8CC4x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y03abcEv,_ZTv0_n16_N3ccc8CC4x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y03abcEv,_ZThn4_N3ccc8CC4x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y03efgEv,_ZTv0_n20_N3ccc8CC4x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y03efgEv,_ZThn4_N3ccc8CC4x10y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y03pqrEv,_ZTv0_n12_N3ccc8CC4x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y03abcEv,_ZTv0_n16_N3ccc8CC4x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y03efgEv,_ZTv0_n20_N3ccc8CC4x10y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y0E[] = {
  {&(_ZTVN3ccc8CC4x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y0E[];
static VTBL_ENTRY alt_thunk_names2025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y03efgEv,_ZTv0_n20_N3ccc8CC4x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y03efgEv,_ZThn4_N3ccc8CC4x10y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y03abcEv,_ZTv0_n16_N3ccc8CC4x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y03abcEv,_ZThn4_N3ccc8CC4x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y03pqrEv,_ZTv0_n12_N3ccc8CC4x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y03pqrEv,_ZThn4_N3ccc8CC4x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y0E = {  "_ZN3ccc8CC4x10y0E", // class name
  bases__ZN3ccc8CC4x10y0E, 2,
  &(vtc__ZN3ccc8CC4x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2025,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y0  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD4x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y03pqrEv
  ~DD4x10y0(); // tgen
  DD4x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y03abcEv");}
void  ccc::DD4x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y03efgEv");}
void  ccc::DD4x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y03pqrEv");}
ccc::DD4x10y0 ::~DD4x10y0(){ note_dtor("_ZN3ccc8DD4x10y0E", this);} // tgen
ccc::DD4x10y0 ::DD4x10y0(){ note_ctor("_ZN3ccc8DD4x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y0E, buf);
    ::ccc::DD4x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y0E);
    dp->::ccc::DD4x10y0::~DD4x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y0E(Test__ZN3ccc8DD4x10y0E, "_ZN3ccc8DD4x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y0C1Ev();
extern void _ZN3ccc8DD4x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y0E[] = {
  NSPAIR(_ZN3ccc8DD4x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y0E[];
extern void _ZN3ccc8DD4x10y03pqrEv();
extern void _ZN3ccc8DD4x10y03abcEv();
extern void _ZN3ccc8DD4x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y03pqrEv,_ZTv0_n12_N3ccc8DD4x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y03pqrEv,_ZThn4_N3ccc8DD4x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y03abcEv,_ZTv0_n16_N3ccc8DD4x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y03abcEv,_ZThn4_N3ccc8DD4x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y03pqrEv,_ZTv0_n12_N3ccc8DD4x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y03abcEv,_ZTv0_n16_N3ccc8DD4x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y0E[] = {
  {&(_ZTVN3ccc8DD4x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y0E[];
static VTBL_ENTRY alt_thunk_names2026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y03abcEv,_ZTv0_n16_N3ccc8DD4x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y03abcEv,_ZThn4_N3ccc8DD4x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y03pqrEv,_ZTv0_n12_N3ccc8DD4x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y03pqrEv,_ZThn4_N3ccc8DD4x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y0E = {  "_ZN3ccc8DD4x10y0E", // class name
  bases__ZN3ccc8DD4x10y0E, 2,
  &(vtc__ZN3ccc8DD4x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2026,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y1  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x10y13efgEv
  ~CC4x10y1(); // tgen
  CC4x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y1E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y13abcEv");}
void  ccc::CC4x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y13pqrEv");}
void  ccc::CC4x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y13efgEv");}
ccc::CC4x10y1 ::~CC4x10y1(){ note_dtor("_ZN3ccc8CC4x10y1E", this);} // tgen
ccc::CC4x10y1 ::CC4x10y1(){ note_ctor("_ZN3ccc8CC4x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y1E, buf);
    ::ccc::CC4x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y1E);
    dp->::ccc::CC4x10y1::~CC4x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y1E(Test__ZN3ccc8CC4x10y1E, "_ZN3ccc8CC4x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y1C1Ev();
extern void _ZN3ccc8CC4x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y1E[] = {
  NSPAIR(_ZN3ccc8CC4x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y1E[];
extern void _ZN3ccc8CC4x10y13pqrEv();
extern void _ZN3ccc8CC4x10y13abcEv();
extern void _ZN3ccc8CC4x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y13pqrEv,_ZTv0_n12_N3ccc8CC4x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y13pqrEv,_ZThn4_N3ccc8CC4x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y13abcEv,_ZTv0_n16_N3ccc8CC4x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y13abcEv,_ZThn4_N3ccc8CC4x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y13efgEv,_ZTv0_n20_N3ccc8CC4x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y13efgEv,_ZThn4_N3ccc8CC4x10y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y13pqrEv,_ZTv0_n12_N3ccc8CC4x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y13abcEv,_ZTv0_n16_N3ccc8CC4x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y13efgEv,_ZTv0_n20_N3ccc8CC4x10y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y1E[] = {
  {&(_ZTVN3ccc8CC4x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y1E[];
static VTBL_ENTRY alt_thunk_names2027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y13efgEv,_ZTv0_n20_N3ccc8CC4x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y13efgEv,_ZThn4_N3ccc8CC4x10y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y13abcEv,_ZTv0_n16_N3ccc8CC4x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y13abcEv,_ZThn4_N3ccc8CC4x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y13pqrEv,_ZTv0_n12_N3ccc8CC4x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y13pqrEv,_ZThn4_N3ccc8CC4x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y1E = {  "_ZN3ccc8CC4x10y1E", // class name
  bases__ZN3ccc8CC4x10y1E, 2,
  &(vtc__ZN3ccc8CC4x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2027,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y1  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD4x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x10y13efgEv
  ~DD4x10y1(); // tgen
  DD4x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y13abcEv");}
void  ccc::DD4x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y13pqrEv");}
void  ccc::DD4x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y13efgEv");}
ccc::DD4x10y1 ::~DD4x10y1(){ note_dtor("_ZN3ccc8DD4x10y1E", this);} // tgen
ccc::DD4x10y1 ::DD4x10y1(){ note_ctor("_ZN3ccc8DD4x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y1E, buf);
    ::ccc::DD4x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y1E);
    dp->::ccc::DD4x10y1::~DD4x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y1E(Test__ZN3ccc8DD4x10y1E, "_ZN3ccc8DD4x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y1C1Ev();
extern void _ZN3ccc8DD4x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y1E[] = {
  NSPAIR(_ZN3ccc8DD4x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y1E[];
extern void _ZN3ccc8DD4x10y13pqrEv();
extern void _ZN3ccc8DD4x10y13abcEv();
extern void _ZN3ccc8DD4x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y13pqrEv,_ZTv0_n12_N3ccc8DD4x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y13pqrEv,_ZThn4_N3ccc8DD4x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y13abcEv,_ZTv0_n16_N3ccc8DD4x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y13abcEv,_ZThn4_N3ccc8DD4x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y13pqrEv,_ZTv0_n12_N3ccc8DD4x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y13abcEv,_ZTv0_n16_N3ccc8DD4x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y1E[] = {
  {&(_ZTVN3ccc8DD4x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y1E[];
static VTBL_ENTRY alt_thunk_names2028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y13abcEv,_ZTv0_n16_N3ccc8DD4x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y13abcEv,_ZThn4_N3ccc8DD4x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y13pqrEv,_ZTv0_n12_N3ccc8DD4x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y13pqrEv,_ZThn4_N3ccc8DD4x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y1E = {  "_ZN3ccc8DD4x10y1E", // class name
  bases__ZN3ccc8DD4x10y1E, 2,
  &(vtc__ZN3ccc8DD4x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2028,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y2  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y23pqrEv
  ~CC4x10y2(); // tgen
  CC4x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y2E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y23efgEv");}
void  ccc::CC4x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y23abcEv");}
void  ccc::CC4x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y23pqrEv");}
ccc::CC4x10y2 ::~CC4x10y2(){ note_dtor("_ZN3ccc8CC4x10y2E", this);} // tgen
ccc::CC4x10y2 ::CC4x10y2(){ note_ctor("_ZN3ccc8CC4x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y2E, buf);
    ::ccc::CC4x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y2E);
    dp->::ccc::CC4x10y2::~CC4x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y2E(Test__ZN3ccc8CC4x10y2E, "_ZN3ccc8CC4x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y2C1Ev();
extern void _ZN3ccc8CC4x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y2E[] = {
  NSPAIR(_ZN3ccc8CC4x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y2E[];
extern void _ZN3ccc8CC4x10y23pqrEv();
extern void _ZN3ccc8CC4x10y23abcEv();
extern void _ZN3ccc8CC4x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y23pqrEv,_ZTv0_n12_N3ccc8CC4x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y23pqrEv,_ZThn4_N3ccc8CC4x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y23abcEv,_ZTv0_n16_N3ccc8CC4x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y23abcEv,_ZThn4_N3ccc8CC4x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y23efgEv,_ZTv0_n20_N3ccc8CC4x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y23efgEv,_ZThn4_N3ccc8CC4x10y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y23pqrEv,_ZTv0_n12_N3ccc8CC4x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y23abcEv,_ZTv0_n16_N3ccc8CC4x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y23efgEv,_ZTv0_n20_N3ccc8CC4x10y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y2E[] = {
  {&(_ZTVN3ccc8CC4x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y2E[];
static VTBL_ENTRY alt_thunk_names2029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y23efgEv,_ZTv0_n20_N3ccc8CC4x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y23efgEv,_ZThn4_N3ccc8CC4x10y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y23abcEv,_ZTv0_n16_N3ccc8CC4x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y23abcEv,_ZThn4_N3ccc8CC4x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y23pqrEv,_ZTv0_n12_N3ccc8CC4x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y23pqrEv,_ZThn4_N3ccc8CC4x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y2E = {  "_ZN3ccc8CC4x10y2E", // class name
  bases__ZN3ccc8CC4x10y2E, 2,
  &(vtc__ZN3ccc8CC4x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2029,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y2  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD4x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y23pqrEv
  ~DD4x10y2(); // tgen
  DD4x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y23efgEv");}
void  ccc::DD4x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y23abcEv");}
void  ccc::DD4x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y23pqrEv");}
ccc::DD4x10y2 ::~DD4x10y2(){ note_dtor("_ZN3ccc8DD4x10y2E", this);} // tgen
ccc::DD4x10y2 ::DD4x10y2(){ note_ctor("_ZN3ccc8DD4x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y2E, buf);
    ::ccc::DD4x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y2E);
    dp->::ccc::DD4x10y2::~DD4x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y2E(Test__ZN3ccc8DD4x10y2E, "_ZN3ccc8DD4x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y2C1Ev();
extern void _ZN3ccc8DD4x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y2E[] = {
  NSPAIR(_ZN3ccc8DD4x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y2E[];
extern void _ZN3ccc8DD4x10y23pqrEv();
extern void _ZN3ccc8DD4x10y23abcEv();
extern void _ZN3ccc8DD4x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y23pqrEv,_ZTv0_n12_N3ccc8DD4x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y23pqrEv,_ZThn4_N3ccc8DD4x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y23abcEv,_ZTv0_n16_N3ccc8DD4x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y23abcEv,_ZThn4_N3ccc8DD4x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y23pqrEv,_ZTv0_n12_N3ccc8DD4x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y23abcEv,_ZTv0_n16_N3ccc8DD4x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y2E[] = {
  {&(_ZTVN3ccc8DD4x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y2E[];
static VTBL_ENTRY alt_thunk_names2030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y23abcEv,_ZTv0_n16_N3ccc8DD4x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y23abcEv,_ZThn4_N3ccc8DD4x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y23pqrEv,_ZTv0_n12_N3ccc8DD4x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y23pqrEv,_ZThn4_N3ccc8DD4x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y2E = {  "_ZN3ccc8DD4x10y2E", // class name
  bases__ZN3ccc8DD4x10y2E, 2,
  &(vtc__ZN3ccc8DD4x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2030,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y3  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x10y33abcEv
  ~CC4x10y3(); // tgen
  CC4x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y3E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y33efgEv");}
void  ccc::CC4x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y33pqrEv");}
void  ccc::CC4x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y33abcEv");}
ccc::CC4x10y3 ::~CC4x10y3(){ note_dtor("_ZN3ccc8CC4x10y3E", this);} // tgen
ccc::CC4x10y3 ::CC4x10y3(){ note_ctor("_ZN3ccc8CC4x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y3E, buf);
    ::ccc::CC4x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y3E);
    dp->::ccc::CC4x10y3::~CC4x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y3E(Test__ZN3ccc8CC4x10y3E, "_ZN3ccc8CC4x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y3C1Ev();
extern void _ZN3ccc8CC4x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y3E[] = {
  NSPAIR(_ZN3ccc8CC4x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y3E[];
extern void _ZN3ccc8CC4x10y33pqrEv();
extern void _ZN3ccc8CC4x10y33abcEv();
extern void _ZN3ccc8CC4x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y33pqrEv,_ZTv0_n12_N3ccc8CC4x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y33pqrEv,_ZThn4_N3ccc8CC4x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y33abcEv,_ZTv0_n16_N3ccc8CC4x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y33abcEv,_ZThn4_N3ccc8CC4x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y33efgEv,_ZTv0_n20_N3ccc8CC4x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y33efgEv,_ZThn4_N3ccc8CC4x10y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y33pqrEv,_ZTv0_n12_N3ccc8CC4x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y33abcEv,_ZTv0_n16_N3ccc8CC4x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y33efgEv,_ZTv0_n20_N3ccc8CC4x10y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y3E[] = {
  {&(_ZTVN3ccc8CC4x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y3E[];
static VTBL_ENTRY alt_thunk_names2031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y33efgEv,_ZTv0_n20_N3ccc8CC4x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y33efgEv,_ZThn4_N3ccc8CC4x10y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y33abcEv,_ZTv0_n16_N3ccc8CC4x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y33abcEv,_ZThn4_N3ccc8CC4x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y33pqrEv,_ZTv0_n12_N3ccc8CC4x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y33pqrEv,_ZThn4_N3ccc8CC4x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y3E = {  "_ZN3ccc8CC4x10y3E", // class name
  bases__ZN3ccc8CC4x10y3E, 2,
  &(vtc__ZN3ccc8CC4x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2031,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y3  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD4x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x10y33abcEv
  ~DD4x10y3(); // tgen
  DD4x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y33efgEv");}
void  ccc::DD4x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y33pqrEv");}
void  ccc::DD4x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y33abcEv");}
ccc::DD4x10y3 ::~DD4x10y3(){ note_dtor("_ZN3ccc8DD4x10y3E", this);} // tgen
ccc::DD4x10y3 ::DD4x10y3(){ note_ctor("_ZN3ccc8DD4x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y3E, buf);
    ::ccc::DD4x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y3E);
    dp->::ccc::DD4x10y3::~DD4x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y3E(Test__ZN3ccc8DD4x10y3E, "_ZN3ccc8DD4x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y3C1Ev();
extern void _ZN3ccc8DD4x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y3E[] = {
  NSPAIR(_ZN3ccc8DD4x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y3E[];
extern void _ZN3ccc8DD4x10y33pqrEv();
extern void _ZN3ccc8DD4x10y33abcEv();
extern void _ZN3ccc8DD4x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y33pqrEv,_ZTv0_n12_N3ccc8DD4x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y33pqrEv,_ZThn4_N3ccc8DD4x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y33abcEv,_ZTv0_n16_N3ccc8DD4x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y33abcEv,_ZThn4_N3ccc8DD4x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y33pqrEv,_ZTv0_n12_N3ccc8DD4x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y33abcEv,_ZTv0_n16_N3ccc8DD4x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y3E[] = {
  {&(_ZTVN3ccc8DD4x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y3E[];
static VTBL_ENTRY alt_thunk_names2032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y33abcEv,_ZTv0_n16_N3ccc8DD4x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y33abcEv,_ZThn4_N3ccc8DD4x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y33pqrEv,_ZTv0_n12_N3ccc8DD4x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y33pqrEv,_ZThn4_N3ccc8DD4x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y3E = {  "_ZN3ccc8DD4x10y3E", // class name
  bases__ZN3ccc8DD4x10y3E, 2,
  &(vtc__ZN3ccc8DD4x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2032,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y4  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC4x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y43efgEv
  ~CC4x10y4(); // tgen
  CC4x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y4E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y43pqrEv");}
void  ccc::CC4x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y43abcEv");}
void  ccc::CC4x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y43efgEv");}
ccc::CC4x10y4 ::~CC4x10y4(){ note_dtor("_ZN3ccc8CC4x10y4E", this);} // tgen
ccc::CC4x10y4 ::CC4x10y4(){ note_ctor("_ZN3ccc8CC4x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y4E, buf);
    ::ccc::CC4x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y4E);
    dp->::ccc::CC4x10y4::~CC4x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y4E(Test__ZN3ccc8CC4x10y4E, "_ZN3ccc8CC4x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y4C1Ev();
extern void _ZN3ccc8CC4x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y4E[] = {
  NSPAIR(_ZN3ccc8CC4x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y4E[];
extern void _ZN3ccc8CC4x10y43pqrEv();
extern void _ZN3ccc8CC4x10y43abcEv();
extern void _ZN3ccc8CC4x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y43pqrEv,_ZTv0_n12_N3ccc8CC4x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y43pqrEv,_ZThn4_N3ccc8CC4x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y43abcEv,_ZTv0_n16_N3ccc8CC4x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y43abcEv,_ZThn4_N3ccc8CC4x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y43efgEv,_ZTv0_n20_N3ccc8CC4x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y43efgEv,_ZThn4_N3ccc8CC4x10y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y43pqrEv,_ZTv0_n12_N3ccc8CC4x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y43abcEv,_ZTv0_n16_N3ccc8CC4x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y43efgEv,_ZTv0_n20_N3ccc8CC4x10y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y4E[] = {
  {&(_ZTVN3ccc8CC4x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y4E[];
static VTBL_ENTRY alt_thunk_names2033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y43efgEv,_ZTv0_n20_N3ccc8CC4x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y43efgEv,_ZThn4_N3ccc8CC4x10y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y43abcEv,_ZTv0_n16_N3ccc8CC4x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y43abcEv,_ZThn4_N3ccc8CC4x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y43pqrEv,_ZTv0_n12_N3ccc8CC4x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y43pqrEv,_ZThn4_N3ccc8CC4x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y4E = {  "_ZN3ccc8CC4x10y4E", // class name
  bases__ZN3ccc8CC4x10y4E, 2,
  &(vtc__ZN3ccc8CC4x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2033,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y4  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD4x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x10y43efgEv
  ~DD4x10y4(); // tgen
  DD4x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y43pqrEv");}
void  ccc::DD4x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y43abcEv");}
void  ccc::DD4x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y43efgEv");}
ccc::DD4x10y4 ::~DD4x10y4(){ note_dtor("_ZN3ccc8DD4x10y4E", this);} // tgen
ccc::DD4x10y4 ::DD4x10y4(){ note_ctor("_ZN3ccc8DD4x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y4E, buf);
    ::ccc::DD4x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y4E);
    dp->::ccc::DD4x10y4::~DD4x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y4E(Test__ZN3ccc8DD4x10y4E, "_ZN3ccc8DD4x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y4C1Ev();
extern void _ZN3ccc8DD4x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y4E[] = {
  NSPAIR(_ZN3ccc8DD4x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y4E[];
extern void _ZN3ccc8DD4x10y43pqrEv();
extern void _ZN3ccc8DD4x10y43abcEv();
extern void _ZN3ccc8DD4x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y43pqrEv,_ZTv0_n12_N3ccc8DD4x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y43pqrEv,_ZThn4_N3ccc8DD4x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y43abcEv,_ZTv0_n16_N3ccc8DD4x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y43abcEv,_ZThn4_N3ccc8DD4x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y43pqrEv,_ZTv0_n12_N3ccc8DD4x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y43abcEv,_ZTv0_n16_N3ccc8DD4x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y4E[] = {
  {&(_ZTVN3ccc8DD4x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y4E[];
static VTBL_ENTRY alt_thunk_names2034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y43abcEv,_ZTv0_n16_N3ccc8DD4x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y43abcEv,_ZThn4_N3ccc8DD4x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y43pqrEv,_ZTv0_n12_N3ccc8DD4x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y43pqrEv,_ZThn4_N3ccc8DD4x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y4E = {  "_ZN3ccc8DD4x10y4E", // class name
  bases__ZN3ccc8DD4x10y4E, 2,
  &(vtc__ZN3ccc8DD4x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2034,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y5  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC4x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y53abcEv
  ~CC4x10y5(); // tgen
  CC4x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y5E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y53pqrEv");}
void  ccc::CC4x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y53efgEv");}
void  ccc::CC4x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y53abcEv");}
ccc::CC4x10y5 ::~CC4x10y5(){ note_dtor("_ZN3ccc8CC4x10y5E", this);} // tgen
ccc::CC4x10y5 ::CC4x10y5(){ note_ctor("_ZN3ccc8CC4x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y5E, buf);
    ::ccc::CC4x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y5E);
    dp->::ccc::CC4x10y5::~CC4x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y5E(Test__ZN3ccc8CC4x10y5E, "_ZN3ccc8CC4x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y5C1Ev();
extern void _ZN3ccc8CC4x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y5E[] = {
  NSPAIR(_ZN3ccc8CC4x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y5E[];
extern void _ZN3ccc8CC4x10y53pqrEv();
extern void _ZN3ccc8CC4x10y53abcEv();
extern void _ZN3ccc8CC4x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y53pqrEv,_ZTv0_n12_N3ccc8CC4x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y53pqrEv,_ZThn4_N3ccc8CC4x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y53abcEv,_ZTv0_n16_N3ccc8CC4x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y53abcEv,_ZThn4_N3ccc8CC4x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y53efgEv,_ZTv0_n20_N3ccc8CC4x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y53efgEv,_ZThn4_N3ccc8CC4x10y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y53pqrEv,_ZTv0_n12_N3ccc8CC4x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y53abcEv,_ZTv0_n16_N3ccc8CC4x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y53efgEv,_ZTv0_n20_N3ccc8CC4x10y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y5E[] = {
  {&(_ZTVN3ccc8CC4x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y5E[];
static VTBL_ENTRY alt_thunk_names2035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y53efgEv,_ZTv0_n20_N3ccc8CC4x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y53efgEv,_ZThn4_N3ccc8CC4x10y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y53abcEv,_ZTv0_n16_N3ccc8CC4x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y53abcEv,_ZThn4_N3ccc8CC4x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y53pqrEv,_ZTv0_n12_N3ccc8CC4x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y53pqrEv,_ZThn4_N3ccc8CC4x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y5E = {  "_ZN3ccc8CC4x10y5E", // class name
  bases__ZN3ccc8CC4x10y5E, 2,
  &(vtc__ZN3ccc8CC4x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2035,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y5  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD4x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x10y53abcEv
  ~DD4x10y5(); // tgen
  DD4x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y53pqrEv");}
void  ccc::DD4x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y53efgEv");}
void  ccc::DD4x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y53abcEv");}
ccc::DD4x10y5 ::~DD4x10y5(){ note_dtor("_ZN3ccc8DD4x10y5E", this);} // tgen
ccc::DD4x10y5 ::DD4x10y5(){ note_ctor("_ZN3ccc8DD4x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y5E, buf);
    ::ccc::DD4x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y5E);
    dp->::ccc::DD4x10y5::~DD4x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y5E(Test__ZN3ccc8DD4x10y5E, "_ZN3ccc8DD4x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y5C1Ev();
extern void _ZN3ccc8DD4x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y5E[] = {
  NSPAIR(_ZN3ccc8DD4x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y5E[];
extern void _ZN3ccc8DD4x10y53pqrEv();
extern void _ZN3ccc8DD4x10y53abcEv();
extern void _ZN3ccc8DD4x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y53pqrEv,_ZTv0_n12_N3ccc8DD4x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y53pqrEv,_ZThn4_N3ccc8DD4x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y53abcEv,_ZTv0_n16_N3ccc8DD4x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y53abcEv,_ZThn4_N3ccc8DD4x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y53pqrEv,_ZTv0_n12_N3ccc8DD4x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y53abcEv,_ZTv0_n16_N3ccc8DD4x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y5E[] = {
  {&(_ZTVN3ccc8DD4x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y5E[];
static VTBL_ENTRY alt_thunk_names2036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y53abcEv,_ZTv0_n16_N3ccc8DD4x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y53abcEv,_ZThn4_N3ccc8DD4x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y53pqrEv,_ZTv0_n12_N3ccc8DD4x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y53pqrEv,_ZThn4_N3ccc8DD4x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y5E = {  "_ZN3ccc8DD4x10y5E", // class name
  bases__ZN3ccc8DD4x10y5E, 2,
  &(vtc__ZN3ccc8DD4x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2036,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y6  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y63efgEv
  ~CC4x10y6(); // tgen
  CC4x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y6E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y63abcEv");}
void  ccc::CC4x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y63efgEv");}
ccc::CC4x10y6 ::~CC4x10y6(){ note_dtor("_ZN3ccc8CC4x10y6E", this);} // tgen
ccc::CC4x10y6 ::CC4x10y6(){ note_ctor("_ZN3ccc8CC4x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y6E, buf);
    ::ccc::CC4x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y6E);
    dp->::ccc::CC4x10y6::~CC4x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y6E(Test__ZN3ccc8CC4x10y6E, "_ZN3ccc8CC4x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y6C1Ev();
extern void _ZN3ccc8CC4x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y6E[] = {
  NSPAIR(_ZN3ccc8CC4x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC4x10y63abcEv();
extern void _ZN3ccc8CC4x10y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y63abcEv,_ZTv0_n16_N3ccc8CC4x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y63abcEv,_ZThn4_N3ccc8CC4x10y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y63efgEv,_ZTv0_n20_N3ccc8CC4x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y63efgEv,_ZThn4_N3ccc8CC4x10y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y63abcEv,_ZTv0_n16_N3ccc8CC4x10y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y63efgEv,_ZTv0_n20_N3ccc8CC4x10y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y6E[] = {
  {&(_ZTVN3ccc8CC4x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y6E[];
static VTBL_ENTRY alt_thunk_names2037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y63efgEv,_ZTv0_n20_N3ccc8CC4x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y63efgEv,_ZThn4_N3ccc8CC4x10y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y63abcEv,_ZTv0_n16_N3ccc8CC4x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y63abcEv,_ZThn4_N3ccc8CC4x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y6E = {  "_ZN3ccc8CC4x10y6E", // class name
  bases__ZN3ccc8CC4x10y6E, 2,
  &(vtc__ZN3ccc8CC4x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2037,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y6  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD4x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x10y63efgEv
  ~DD4x10y6(); // tgen
  DD4x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y63abcEv");}
void  ccc::DD4x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y63efgEv");}
ccc::DD4x10y6 ::~DD4x10y6(){ note_dtor("_ZN3ccc8DD4x10y6E", this);} // tgen
ccc::DD4x10y6 ::DD4x10y6(){ note_ctor("_ZN3ccc8DD4x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y6E, buf);
    ::ccc::DD4x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y6E);
    dp->::ccc::DD4x10y6::~DD4x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y6E(Test__ZN3ccc8DD4x10y6E, "_ZN3ccc8DD4x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y6C1Ev();
extern void _ZN3ccc8DD4x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y6E[] = {
  NSPAIR(_ZN3ccc8DD4x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x10y63abcEv();
extern void _ZN3ccc8DD4x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y63abcEv,_ZTv0_n16_N3ccc8DD4x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y63abcEv,_ZThn4_N3ccc8DD4x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y63abcEv,_ZTv0_n16_N3ccc8DD4x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y6E[] = {
  {&(_ZTVN3ccc8DD4x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y6E[];
static VTBL_ENTRY alt_thunk_names2038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y63abcEv,_ZTv0_n16_N3ccc8DD4x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y63abcEv,_ZThn4_N3ccc8DD4x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y6E = {  "_ZN3ccc8DD4x10y6E", // class name
  bases__ZN3ccc8DD4x10y6E, 2,
  &(vtc__ZN3ccc8DD4x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2038,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y7  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y73pqrEv
  ~CC4x10y7(); // tgen
  CC4x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y7E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y73abcEv");}
void  ccc::CC4x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y73pqrEv");}
ccc::CC4x10y7 ::~CC4x10y7(){ note_dtor("_ZN3ccc8CC4x10y7E", this);} // tgen
ccc::CC4x10y7 ::CC4x10y7(){ note_ctor("_ZN3ccc8CC4x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y7E, buf);
    ::ccc::CC4x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y7E);
    dp->::ccc::CC4x10y7::~CC4x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y7E(Test__ZN3ccc8CC4x10y7E, "_ZN3ccc8CC4x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y7C1Ev();
extern void _ZN3ccc8CC4x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y7E[] = {
  NSPAIR(_ZN3ccc8CC4x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y7E[];
extern void _ZN3ccc8CC4x10y73pqrEv();
extern void _ZN3ccc8CC4x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y73pqrEv,_ZTv0_n12_N3ccc8CC4x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y73pqrEv,_ZThn4_N3ccc8CC4x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y73abcEv,_ZTv0_n16_N3ccc8CC4x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y73abcEv,_ZThn4_N3ccc8CC4x10y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y73pqrEv,_ZTv0_n12_N3ccc8CC4x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y73abcEv,_ZTv0_n16_N3ccc8CC4x10y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y7E[] = {
  {&(_ZTVN3ccc8CC4x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y7E[];
static VTBL_ENTRY alt_thunk_names2039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y73abcEv,_ZTv0_n16_N3ccc8CC4x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y73abcEv,_ZThn4_N3ccc8CC4x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y73pqrEv,_ZTv0_n12_N3ccc8CC4x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y73pqrEv,_ZThn4_N3ccc8CC4x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y7E = {  "_ZN3ccc8CC4x10y7E", // class name
  bases__ZN3ccc8CC4x10y7E, 2,
  &(vtc__ZN3ccc8CC4x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2039,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y7  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD4x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y73pqrEv
  ~DD4x10y7(); // tgen
  DD4x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y73abcEv");}
void  ccc::DD4x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y73pqrEv");}
ccc::DD4x10y7 ::~DD4x10y7(){ note_dtor("_ZN3ccc8DD4x10y7E", this);} // tgen
ccc::DD4x10y7 ::DD4x10y7(){ note_ctor("_ZN3ccc8DD4x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y7E, buf);
    ::ccc::DD4x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y7E);
    dp->::ccc::DD4x10y7::~DD4x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y7E(Test__ZN3ccc8DD4x10y7E, "_ZN3ccc8DD4x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y7C1Ev();
extern void _ZN3ccc8DD4x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y7E[] = {
  NSPAIR(_ZN3ccc8DD4x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y7E[];
extern void _ZN3ccc8DD4x10y73pqrEv();
extern void _ZN3ccc8DD4x10y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y73pqrEv,_ZTv0_n12_N3ccc8DD4x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y73pqrEv,_ZThn4_N3ccc8DD4x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y73abcEv,_ZTv0_n16_N3ccc8DD4x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y73abcEv,_ZThn4_N3ccc8DD4x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y73pqrEv,_ZTv0_n12_N3ccc8DD4x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y73abcEv,_ZTv0_n16_N3ccc8DD4x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y7E[] = {
  {&(_ZTVN3ccc8DD4x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y7E[];
static VTBL_ENTRY alt_thunk_names2040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y73abcEv,_ZTv0_n16_N3ccc8DD4x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y73abcEv,_ZThn4_N3ccc8DD4x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y73pqrEv,_ZTv0_n12_N3ccc8DD4x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y73pqrEv,_ZThn4_N3ccc8DD4x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y7E = {  "_ZN3ccc8DD4x10y7E", // class name
  bases__ZN3ccc8DD4x10y7E, 2,
  &(vtc__ZN3ccc8DD4x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2040,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y8  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y83abcEv
  ~CC4x10y8(); // tgen
  CC4x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y8E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y83efgEv");}
void  ccc::CC4x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y83abcEv");}
ccc::CC4x10y8 ::~CC4x10y8(){ note_dtor("_ZN3ccc8CC4x10y8E", this);} // tgen
ccc::CC4x10y8 ::CC4x10y8(){ note_ctor("_ZN3ccc8CC4x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y8E, buf);
    ::ccc::CC4x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y8E);
    dp->::ccc::CC4x10y8::~CC4x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y8E(Test__ZN3ccc8CC4x10y8E, "_ZN3ccc8CC4x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y8C1Ev();
extern void _ZN3ccc8CC4x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y8E[] = {
  NSPAIR(_ZN3ccc8CC4x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC4x10y83abcEv();
extern void _ZN3ccc8CC4x10y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x10y83abcEv,_ZTv0_n16_N3ccc8CC4x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y83abcEv,_ZThn4_N3ccc8CC4x10y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y83efgEv,_ZTv0_n20_N3ccc8CC4x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y83efgEv,_ZThn4_N3ccc8CC4x10y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x10y83abcEv,_ZTv0_n16_N3ccc8CC4x10y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y83efgEv,_ZTv0_n20_N3ccc8CC4x10y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y8E[] = {
  {&(_ZTVN3ccc8CC4x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y8E[];
static VTBL_ENTRY alt_thunk_names2041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y83efgEv,_ZTv0_n20_N3ccc8CC4x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y83efgEv,_ZThn4_N3ccc8CC4x10y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x10y83abcEv,_ZTv0_n16_N3ccc8CC4x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y83abcEv,_ZThn4_N3ccc8CC4x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y8E = {  "_ZN3ccc8CC4x10y8E", // class name
  bases__ZN3ccc8CC4x10y8E, 2,
  &(vtc__ZN3ccc8CC4x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2041,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y8  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD4x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x10y83abcEv
  ~DD4x10y8(); // tgen
  DD4x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y83efgEv");}
void  ccc::DD4x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x10y83abcEv");}
ccc::DD4x10y8 ::~DD4x10y8(){ note_dtor("_ZN3ccc8DD4x10y8E", this);} // tgen
ccc::DD4x10y8 ::DD4x10y8(){ note_ctor("_ZN3ccc8DD4x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y8E, buf);
    ::ccc::DD4x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y8E);
    dp->::ccc::DD4x10y8::~DD4x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y8E(Test__ZN3ccc8DD4x10y8E, "_ZN3ccc8DD4x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y8C1Ev();
extern void _ZN3ccc8DD4x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y8E[] = {
  NSPAIR(_ZN3ccc8DD4x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x10y83abcEv();
extern void _ZN3ccc8DD4x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x10y83abcEv,_ZTv0_n16_N3ccc8DD4x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y83abcEv,_ZThn4_N3ccc8DD4x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x10y83abcEv,_ZTv0_n16_N3ccc8DD4x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y8E[] = {
  {&(_ZTVN3ccc8DD4x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y8E[];
static VTBL_ENTRY alt_thunk_names2042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x10y83abcEv,_ZTv0_n16_N3ccc8DD4x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y83abcEv,_ZThn4_N3ccc8DD4x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y8E = {  "_ZN3ccc8DD4x10y8E", // class name
  bases__ZN3ccc8DD4x10y8E, 2,
  &(vtc__ZN3ccc8DD4x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2042,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y9  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y93pqrEv
  ~CC4x10y9(); // tgen
  CC4x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y9E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y93efgEv");}
void  ccc::CC4x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y93pqrEv");}
ccc::CC4x10y9 ::~CC4x10y9(){ note_dtor("_ZN3ccc8CC4x10y9E", this);} // tgen
ccc::CC4x10y9 ::CC4x10y9(){ note_ctor("_ZN3ccc8CC4x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y9E, buf);
    ::ccc::CC4x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC4x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y9E);
    dp->::ccc::CC4x10y9::~CC4x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y9E(Test__ZN3ccc8CC4x10y9E, "_ZN3ccc8CC4x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y9C1Ev();
extern void _ZN3ccc8CC4x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y9E[] = {
  NSPAIR(_ZN3ccc8CC4x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y9E[];
extern void _ZN3ccc8CC4x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC4x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x10y93pqrEv,_ZTv0_n12_N3ccc8CC4x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y93pqrEv,_ZThn4_N3ccc8CC4x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x10y93efgEv,_ZTv0_n20_N3ccc8CC4x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y93efgEv,_ZThn4_N3ccc8CC4x10y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x10y93pqrEv,_ZTv0_n12_N3ccc8CC4x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x10y93efgEv,_ZTv0_n20_N3ccc8CC4x10y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x10y9E[] = {
  {&(_ZTVN3ccc8CC4x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x10y9E[];
static VTBL_ENTRY alt_thunk_names2043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x10y93efgEv,_ZTv0_n20_N3ccc8CC4x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y93efgEv,_ZThn4_N3ccc8CC4x10y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x10y93pqrEv,_ZTv0_n12_N3ccc8CC4x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x10y93pqrEv,_ZThn4_N3ccc8CC4x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x10y9E = {  "_ZN3ccc8CC4x10y9E", // class name
  bases__ZN3ccc8CC4x10y9E, 2,
  &(vtc__ZN3ccc8CC4x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x10y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2043,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y9  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD4x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x10y93pqrEv
  ~DD4x10y9(); // tgen
  DD4x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x10y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x10y93efgEv");}
void  ccc::DD4x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x10y93pqrEv");}
ccc::DD4x10y9 ::~DD4x10y9(){ note_dtor("_ZN3ccc8DD4x10y9E", this);} // tgen
ccc::DD4x10y9 ::DD4x10y9(){ note_ctor("_ZN3ccc8DD4x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x10y9E, buf);
    ::ccc::DD4x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x10y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD4x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x10y9E);
    dp->::ccc::DD4x10y9::~DD4x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x10y9E(Test__ZN3ccc8DD4x10y9E, "_ZN3ccc8DD4x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x10y9C1Ev();
extern void _ZN3ccc8DD4x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x10y9E[] = {
  NSPAIR(_ZN3ccc8DD4x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD4x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y9E[];
extern void _ZN3ccc8DD4x10y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x10y93pqrEv,_ZTv0_n12_N3ccc8DD4x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x10y93pqrEv,_ZThn4_N3ccc8DD4x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x10y93pqrEv,_ZTv0_n12_N3ccc8DD4x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x10y9E[] = {
  {&(_ZTVN3ccc8DD4x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x10y9E[];
static VTBL_ENTRY alt_thunk_names2044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x10y93pqrEv,_ZTv0_n12_N3ccc8DD4x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x10y93pqrEv,_ZThn4_N3ccc8DD4x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x10y9E = {  "_ZN3ccc8DD4x10y9E", // class name
  bases__ZN3ccc8DD4x10y9E, 2,
  &(vtc__ZN3ccc8DD4x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x10y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2044,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y10  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x10y103abcEv
  ~CC4x10y10(); // tgen
  CC4x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y10E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y103pqrEv");}
void  ccc::CC4x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x10y103abcEv");}
ccc::CC4x10y10 ::~CC4x10y10(){ note_dtor("_ZN3ccc9CC4x10y10E", this);} // tgen
ccc::CC4x10y10 ::CC4x10y10(){ note_ctor("_ZN3ccc9CC4x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y10E, buf);
    ::ccc::CC4x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y10E);
    dp->::ccc::CC4x10y10::~CC4x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y10E(Test__ZN3ccc9CC4x10y10E, "_ZN3ccc9CC4x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y10C1Ev();
extern void _ZN3ccc9CC4x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y10E[] = {
  NSPAIR(_ZN3ccc9CC4x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y10E[];
extern void _ZN3ccc9CC4x10y103pqrEv();
extern void _ZN3ccc9CC4x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x10y103pqrEv,_ZTv0_n12_N3ccc9CC4x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y103pqrEv,_ZThn4_N3ccc9CC4x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x10y103abcEv,_ZTv0_n16_N3ccc9CC4x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y103abcEv,_ZThn4_N3ccc9CC4x10y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x10y103pqrEv,_ZTv0_n12_N3ccc9CC4x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x10y103abcEv,_ZTv0_n16_N3ccc9CC4x10y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y10E[] = {
  {&(_ZTVN3ccc9CC4x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y10E[];
static VTBL_ENTRY alt_thunk_names2045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x10y103abcEv,_ZTv0_n16_N3ccc9CC4x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y103abcEv,_ZThn4_N3ccc9CC4x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x10y103pqrEv,_ZTv0_n12_N3ccc9CC4x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y103pqrEv,_ZThn4_N3ccc9CC4x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x10y10E = {  "_ZN3ccc9CC4x10y10E", // class name
  bases__ZN3ccc9CC4x10y10E, 2,
  &(vtc__ZN3ccc9CC4x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2045,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y10  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD4x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x10y103abcEv
  ~DD4x10y10(); // tgen
  DD4x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x10y103pqrEv");}
void  ccc::DD4x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x10y103abcEv");}
ccc::DD4x10y10 ::~DD4x10y10(){ note_dtor("_ZN3ccc9DD4x10y10E", this);} // tgen
ccc::DD4x10y10 ::DD4x10y10(){ note_ctor("_ZN3ccc9DD4x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y10E, buf);
    ::ccc::DD4x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y10E);
    dp->::ccc::DD4x10y10::~DD4x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y10E(Test__ZN3ccc9DD4x10y10E, "_ZN3ccc9DD4x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y10C1Ev();
extern void _ZN3ccc9DD4x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y10E[] = {
  NSPAIR(_ZN3ccc9DD4x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y10E[];
extern void _ZN3ccc9DD4x10y103pqrEv();
extern void _ZN3ccc9DD4x10y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x10y103pqrEv,_ZTv0_n12_N3ccc9DD4x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x10y103pqrEv,_ZThn4_N3ccc9DD4x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD4x10y103abcEv,_ZTv0_n16_N3ccc9DD4x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x10y103abcEv,_ZThn4_N3ccc9DD4x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x10y103pqrEv,_ZTv0_n12_N3ccc9DD4x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD4x10y103abcEv,_ZTv0_n16_N3ccc9DD4x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y10E[] = {
  {&(_ZTVN3ccc9DD4x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y10E[];
static VTBL_ENTRY alt_thunk_names2046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD4x10y103abcEv,_ZTv0_n16_N3ccc9DD4x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x10y103abcEv,_ZThn4_N3ccc9DD4x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x10y103pqrEv,_ZTv0_n12_N3ccc9DD4x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x10y103pqrEv,_ZThn4_N3ccc9DD4x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x10y10E = {  "_ZN3ccc9DD4x10y10E", // class name
  bases__ZN3ccc9DD4x10y10E, 2,
  &(vtc__ZN3ccc9DD4x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2046,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y11  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x10y113efgEv
  ~CC4x10y11(); // tgen
  CC4x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y11E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y113pqrEv");}
void  ccc::CC4x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x10y113efgEv");}
ccc::CC4x10y11 ::~CC4x10y11(){ note_dtor("_ZN3ccc9CC4x10y11E", this);} // tgen
ccc::CC4x10y11 ::CC4x10y11(){ note_ctor("_ZN3ccc9CC4x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y11E, buf);
    ::ccc::CC4x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y11E);
    dp->::ccc::CC4x10y11::~CC4x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y11E(Test__ZN3ccc9CC4x10y11E, "_ZN3ccc9CC4x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y11C1Ev();
extern void _ZN3ccc9CC4x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y11E[] = {
  NSPAIR(_ZN3ccc9CC4x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y11E[];
extern void _ZN3ccc9CC4x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC4x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x10y113pqrEv,_ZTv0_n12_N3ccc9CC4x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y113pqrEv,_ZThn4_N3ccc9CC4x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x10y113efgEv,_ZTv0_n20_N3ccc9CC4x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y113efgEv,_ZThn4_N3ccc9CC4x10y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x10y113pqrEv,_ZTv0_n12_N3ccc9CC4x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x10y113efgEv,_ZTv0_n20_N3ccc9CC4x10y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y11E[] = {
  {&(_ZTVN3ccc9CC4x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y11E[];
static VTBL_ENTRY alt_thunk_names2047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x10y113efgEv,_ZTv0_n20_N3ccc9CC4x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y113efgEv,_ZThn4_N3ccc9CC4x10y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x10y113pqrEv,_ZTv0_n12_N3ccc9CC4x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y113pqrEv,_ZThn4_N3ccc9CC4x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x10y11E = {  "_ZN3ccc9CC4x10y11E", // class name
  bases__ZN3ccc9CC4x10y11E, 2,
  &(vtc__ZN3ccc9CC4x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2047,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y11  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD4x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x10y113efgEv
  ~DD4x10y11(); // tgen
  DD4x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x10y113pqrEv");}
void  ccc::DD4x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x10y113efgEv");}
ccc::DD4x10y11 ::~DD4x10y11(){ note_dtor("_ZN3ccc9DD4x10y11E", this);} // tgen
ccc::DD4x10y11 ::DD4x10y11(){ note_ctor("_ZN3ccc9DD4x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y11E, buf);
    ::ccc::DD4x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y11E);
    dp->::ccc::DD4x10y11::~DD4x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y11E(Test__ZN3ccc9DD4x10y11E, "_ZN3ccc9DD4x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y11C1Ev();
extern void _ZN3ccc9DD4x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y11E[] = {
  NSPAIR(_ZN3ccc9DD4x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y11E[];
extern void _ZN3ccc9DD4x10y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x10y113pqrEv,_ZTv0_n12_N3ccc9DD4x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x10y113pqrEv,_ZThn4_N3ccc9DD4x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x10y113pqrEv,_ZTv0_n12_N3ccc9DD4x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y11E[] = {
  {&(_ZTVN3ccc9DD4x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y11E[];
static VTBL_ENTRY alt_thunk_names2048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x10y113pqrEv,_ZTv0_n12_N3ccc9DD4x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x10y113pqrEv,_ZThn4_N3ccc9DD4x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x10y11E = {  "_ZN3ccc9DD4x10y11E", // class name
  bases__ZN3ccc9DD4x10y11E, 2,
  &(vtc__ZN3ccc9DD4x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2048,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y12  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC4x10y123abcEv
  ~CC4x10y12(); // tgen
  CC4x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x10y123abcEv");}
ccc::CC4x10y12 ::~CC4x10y12(){ note_dtor("_ZN3ccc9CC4x10y12E", this);} // tgen
ccc::CC4x10y12 ::CC4x10y12(){ note_ctor("_ZN3ccc9CC4x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y12E, buf);
    ::ccc::CC4x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y12E);
    dp->::ccc::CC4x10y12::~CC4x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y12E(Test__ZN3ccc9CC4x10y12E, "_ZN3ccc9CC4x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y12C1Ev();
extern void _ZN3ccc9CC4x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y12E[] = {
  NSPAIR(_ZN3ccc9CC4x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC4x10y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x10y123abcEv,_ZTv0_n16_N3ccc9CC4x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y123abcEv,_ZThn4_N3ccc9CC4x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x10y123abcEv,_ZTv0_n16_N3ccc9CC4x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y12E[] = {
  {&(_ZTVN3ccc9CC4x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y12E[];
static VTBL_ENTRY alt_thunk_names2049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x10y123abcEv,_ZTv0_n16_N3ccc9CC4x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y123abcEv,_ZThn4_N3ccc9CC4x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x10y12E = {  "_ZN3ccc9CC4x10y12E", // class name
  bases__ZN3ccc9CC4x10y12E, 2,
  &(vtc__ZN3ccc9CC4x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2049,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y12  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD4x10y123abcEv
  ~DD4x10y12(); // tgen
  DD4x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x10y123abcEv");}
ccc::DD4x10y12 ::~DD4x10y12(){ note_dtor("_ZN3ccc9DD4x10y12E", this);} // tgen
ccc::DD4x10y12 ::DD4x10y12(){ note_ctor("_ZN3ccc9DD4x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y12E, buf);
    ::ccc::DD4x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y12E);
    dp->::ccc::DD4x10y12::~DD4x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y12E(Test__ZN3ccc9DD4x10y12E, "_ZN3ccc9DD4x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y12C1Ev();
extern void _ZN3ccc9DD4x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y12E[] = {
  NSPAIR(_ZN3ccc9DD4x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x10y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD4x10y123abcEv,_ZTv0_n16_N3ccc9DD4x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x10y123abcEv,_ZThn4_N3ccc9DD4x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD4x10y123abcEv,_ZTv0_n16_N3ccc9DD4x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y12E[] = {
  {&(_ZTVN3ccc9DD4x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y12E[];
static VTBL_ENTRY alt_thunk_names2050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD4x10y123abcEv,_ZTv0_n16_N3ccc9DD4x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x10y123abcEv,_ZThn4_N3ccc9DD4x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x10y12E = {  "_ZN3ccc9DD4x10y12E", // class name
  bases__ZN3ccc9DD4x10y12E, 2,
  &(vtc__ZN3ccc9DD4x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2050,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y13  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC4x10y133efgEv
  ~CC4x10y13(); // tgen
  CC4x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x10y133efgEv");}
ccc::CC4x10y13 ::~CC4x10y13(){ note_dtor("_ZN3ccc9CC4x10y13E", this);} // tgen
ccc::CC4x10y13 ::CC4x10y13(){ note_ctor("_ZN3ccc9CC4x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y13E, buf);
    ::ccc::CC4x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y13E);
    dp->::ccc::CC4x10y13::~CC4x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y13E(Test__ZN3ccc9CC4x10y13E, "_ZN3ccc9CC4x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y13C1Ev();
extern void _ZN3ccc9CC4x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y13E[] = {
  NSPAIR(_ZN3ccc9CC4x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC4x10y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x10y133efgEv,_ZTv0_n20_N3ccc9CC4x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y133efgEv,_ZThn4_N3ccc9CC4x10y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x10y133efgEv,_ZTv0_n20_N3ccc9CC4x10y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y13E[] = {
  {&(_ZTVN3ccc9CC4x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y13E[];
static VTBL_ENTRY alt_thunk_names2051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x10y133efgEv,_ZTv0_n20_N3ccc9CC4x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y133efgEv,_ZThn4_N3ccc9CC4x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x10y13E = {  "_ZN3ccc9CC4x10y13E", // class name
  bases__ZN3ccc9CC4x10y13E, 2,
  &(vtc__ZN3ccc9CC4x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2051,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y13  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD4x10y133efgEv
  ~DD4x10y13(); // tgen
  DD4x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x10y133efgEv");}
ccc::DD4x10y13 ::~DD4x10y13(){ note_dtor("_ZN3ccc9DD4x10y13E", this);} // tgen
ccc::DD4x10y13 ::DD4x10y13(){ note_ctor("_ZN3ccc9DD4x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y13E, buf);
    ::ccc::DD4x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y13E);
    dp->::ccc::DD4x10y13::~DD4x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y13E(Test__ZN3ccc9DD4x10y13E, "_ZN3ccc9DD4x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y13C1Ev();
extern void _ZN3ccc9DD4x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y13E[] = {
  NSPAIR(_ZN3ccc9DD4x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y13E[] = {
  {&(_ZTVN3ccc9DD4x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y13E[];
Class_Descriptor cd__ZN3ccc9DD4x10y13E = {  "_ZN3ccc9DD4x10y13E", // class name
  bases__ZN3ccc9DD4x10y13E, 2,
  &(vtc__ZN3ccc9DD4x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y14  : virtual ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y143pqrEv
  ~CC4x10y14(); // tgen
  CC4x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y143pqrEv");}
ccc::CC4x10y14 ::~CC4x10y14(){ note_dtor("_ZN3ccc9CC4x10y14E", this);} // tgen
ccc::CC4x10y14 ::CC4x10y14(){ note_ctor("_ZN3ccc9CC4x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y14E, buf);
    ::ccc::CC4x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y14E);
    dp->::ccc::CC4x10y14::~CC4x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y14E(Test__ZN3ccc9CC4x10y14E, "_ZN3ccc9CC4x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y14C1Ev();
extern void _ZN3ccc9CC4x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y14E[] = {
  NSPAIR(_ZN3ccc9CC4x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y14E[];
extern void _ZN3ccc9CC4x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x10y143pqrEv,_ZTv0_n12_N3ccc9CC4x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y143pqrEv,_ZThn4_N3ccc9CC4x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x10y143pqrEv,_ZTv0_n12_N3ccc9CC4x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y14E[] = {
  {&(_ZTVN3ccc9CC4x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y14E[];
static VTBL_ENTRY alt_thunk_names2052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x10y143pqrEv,_ZTv0_n12_N3ccc9CC4x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x10y143pqrEv,_ZThn4_N3ccc9CC4x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x10y14E = {  "_ZN3ccc9CC4x10y14E", // class name
  bases__ZN3ccc9CC4x10y14E, 2,
  &(vtc__ZN3ccc9CC4x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2052,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y14  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD4x10y143pqrEv
  ~DD4x10y14(); // tgen
  DD4x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x10y143pqrEv");}
ccc::DD4x10y14 ::~DD4x10y14(){ note_dtor("_ZN3ccc9DD4x10y14E", this);} // tgen
ccc::DD4x10y14 ::DD4x10y14(){ note_ctor("_ZN3ccc9DD4x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y14E, buf);
    ::ccc::DD4x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y14E);
    dp->::ccc::DD4x10y14::~DD4x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y14E(Test__ZN3ccc9DD4x10y14E, "_ZN3ccc9DD4x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y14C1Ev();
extern void _ZN3ccc9DD4x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y14E[] = {
  NSPAIR(_ZN3ccc9DD4x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y14E[];
extern void _ZN3ccc9DD4x10y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x10y143pqrEv,_ZTv0_n12_N3ccc9DD4x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x10y143pqrEv,_ZThn4_N3ccc9DD4x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x10y143pqrEv,_ZTv0_n12_N3ccc9DD4x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y14E[] = {
  {&(_ZTVN3ccc9DD4x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y14E[];
static VTBL_ENTRY alt_thunk_names2053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x10y143pqrEv,_ZTv0_n12_N3ccc9DD4x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x10y143pqrEv,_ZThn4_N3ccc9DD4x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x10y14E = {  "_ZN3ccc9DD4x10y14E", // class name
  bases__ZN3ccc9DD4x10y14E, 2,
  &(vtc__ZN3ccc9DD4x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2053,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y15  : virtual ::ccc::AA4 , ::ccc::BB10 {
  ~CC4x10y15(); // tgen
  CC4x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x10y15 ::~CC4x10y15(){ note_dtor("_ZN3ccc9CC4x10y15E", this);} // tgen
ccc::CC4x10y15 ::CC4x10y15(){ note_ctor("_ZN3ccc9CC4x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y15E, buf);
    ::ccc::CC4x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC4x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y15E);
    dp->::ccc::CC4x10y15::~CC4x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y15E(Test__ZN3ccc9CC4x10y15E, "_ZN3ccc9CC4x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y15C1Ev();
extern void _ZN3ccc9CC4x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y15E[] = {
  NSPAIR(_ZN3ccc9CC4x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x10y15E[] = {
  {&(_ZTVN3ccc9CC4x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x10y15E[];
Class_Descriptor cd__ZN3ccc9CC4x10y15E = {  "_ZN3ccc9CC4x10y15E", // class name
  bases__ZN3ccc9CC4x10y15E, 2,
  &(vtc__ZN3ccc9CC4x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x10y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x10y15  : virtual ::ccc::AA4 , virtual ::ccc::BB10 {
  ~DD4x10y15(); // tgen
  DD4x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x10y15 ::~DD4x10y15(){ note_dtor("_ZN3ccc9DD4x10y15E", this);} // tgen
ccc::DD4x10y15 ::DD4x10y15(){ note_ctor("_ZN3ccc9DD4x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x10y15E, buf);
    ::ccc::DD4x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x10y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD4x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x10y15E);
    dp->::ccc::DD4x10y15::~DD4x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x10y15E(Test__ZN3ccc9DD4x10y15E, "_ZN3ccc9DD4x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x10y15C1Ev();
extern void _ZN3ccc9DD4x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x10y15E[] = {
  NSPAIR(_ZN3ccc9DD4x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD4x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x10y15E[] = {
  {&(_ZTVN3ccc9DD4x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x10y15E[];
Class_Descriptor cd__ZN3ccc9DD4x10y15E = {  "_ZN3ccc9DD4x10y15E", // class name
  bases__ZN3ccc9DD4x10y15E, 2,
  &(vtc__ZN3ccc9DD4x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x10y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y0  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y03pqrEv
  ~CC4x11y0(); // tgen
  CC4x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y0E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y03abcEv");}
void  ccc::CC4x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y03efgEv");}
void  ccc::CC4x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y03pqrEv");}
ccc::CC4x11y0 ::~CC4x11y0(){ note_dtor("_ZN3ccc8CC4x11y0E", this);} // tgen
ccc::CC4x11y0 ::CC4x11y0(){ note_ctor("_ZN3ccc8CC4x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y0E, buf);
    ::ccc::CC4x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y0E);
    dp->::ccc::CC4x11y0::~CC4x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y0E(Test__ZN3ccc8CC4x11y0E, "_ZN3ccc8CC4x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y0C1Ev();
extern void _ZN3ccc8CC4x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y0E[] = {
  NSPAIR(_ZN3ccc8CC4x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y0E[];
extern void _ZN3ccc8CC4x11y03pqrEv();
extern void _ZN3ccc8CC4x11y03efgEv();
extern void _ZN3ccc8CC4x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y03pqrEv,_ZTv0_n12_N3ccc8CC4x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y03pqrEv,_ZThn4_N3ccc8CC4x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y03abcEv,_ZTv0_n16_N3ccc8CC4x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y03abcEv,_ZThn4_N3ccc8CC4x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y03efgEv,_ZTv0_n20_N3ccc8CC4x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y03efgEv,_ZThn4_N3ccc8CC4x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y03pqrEv,_ZTv0_n12_N3ccc8CC4x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y03abcEv,_ZTv0_n16_N3ccc8CC4x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y03efgEv,_ZTv0_n20_N3ccc8CC4x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y0E[] = {
  {&(_ZTVN3ccc8CC4x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y0E[];
static VTBL_ENTRY alt_thunk_names2054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y03efgEv,_ZTv0_n20_N3ccc8CC4x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y03efgEv,_ZThn4_N3ccc8CC4x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y03abcEv,_ZTv0_n16_N3ccc8CC4x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y03abcEv,_ZThn4_N3ccc8CC4x11y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y03pqrEv,_ZTv0_n12_N3ccc8CC4x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y03pqrEv,_ZThn4_N3ccc8CC4x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y0E = {  "_ZN3ccc8CC4x11y0E", // class name
  bases__ZN3ccc8CC4x11y0E, 2,
  &(vtc__ZN3ccc8CC4x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2054,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y0  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD4x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y03pqrEv
  ~DD4x11y0(); // tgen
  DD4x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y03abcEv");}
void  ccc::DD4x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y03efgEv");}
void  ccc::DD4x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y03pqrEv");}
ccc::DD4x11y0 ::~DD4x11y0(){ note_dtor("_ZN3ccc8DD4x11y0E", this);} // tgen
ccc::DD4x11y0 ::DD4x11y0(){ note_ctor("_ZN3ccc8DD4x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y0E, buf);
    ::ccc::DD4x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y0E);
    dp->::ccc::DD4x11y0::~DD4x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y0E(Test__ZN3ccc8DD4x11y0E, "_ZN3ccc8DD4x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y0C1Ev();
extern void _ZN3ccc8DD4x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y0E[] = {
  NSPAIR(_ZN3ccc8DD4x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y0E[];
extern void _ZN3ccc8DD4x11y03pqrEv();
extern void _ZN3ccc8DD4x11y03abcEv();
extern void _ZN3ccc8DD4x11y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y03pqrEv,_ZTv0_n12_N3ccc8DD4x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y03pqrEv,_ZThn4_N3ccc8DD4x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y03efgEv,_ZTv0_n16_N3ccc8DD4x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y03efgEv,_ZThn4_N3ccc8DD4x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y03pqrEv,_ZTv0_n12_N3ccc8DD4x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y03efgEv,_ZTv0_n16_N3ccc8DD4x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y0E[] = {
  {&(_ZTVN3ccc8DD4x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y0E[];
static VTBL_ENTRY alt_thunk_names2055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y03efgEv,_ZTv0_n16_N3ccc8DD4x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y03efgEv,_ZThn4_N3ccc8DD4x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y03pqrEv,_ZTv0_n12_N3ccc8DD4x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y03pqrEv,_ZThn4_N3ccc8DD4x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y0E = {  "_ZN3ccc8DD4x11y0E", // class name
  bases__ZN3ccc8DD4x11y0E, 2,
  &(vtc__ZN3ccc8DD4x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2055,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y1  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x11y13efgEv
  ~CC4x11y1(); // tgen
  CC4x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y1E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y13abcEv");}
void  ccc::CC4x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y13pqrEv");}
void  ccc::CC4x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y13efgEv");}
ccc::CC4x11y1 ::~CC4x11y1(){ note_dtor("_ZN3ccc8CC4x11y1E", this);} // tgen
ccc::CC4x11y1 ::CC4x11y1(){ note_ctor("_ZN3ccc8CC4x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y1E, buf);
    ::ccc::CC4x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y1E);
    dp->::ccc::CC4x11y1::~CC4x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y1E(Test__ZN3ccc8CC4x11y1E, "_ZN3ccc8CC4x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y1C1Ev();
extern void _ZN3ccc8CC4x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y1E[] = {
  NSPAIR(_ZN3ccc8CC4x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y1E[];
extern void _ZN3ccc8CC4x11y13pqrEv();
extern void _ZN3ccc8CC4x11y13efgEv();
extern void _ZN3ccc8CC4x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y13pqrEv,_ZTv0_n12_N3ccc8CC4x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y13pqrEv,_ZThn4_N3ccc8CC4x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y13abcEv,_ZTv0_n16_N3ccc8CC4x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y13abcEv,_ZThn4_N3ccc8CC4x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y13efgEv,_ZTv0_n20_N3ccc8CC4x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y13efgEv,_ZThn4_N3ccc8CC4x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y13pqrEv,_ZTv0_n12_N3ccc8CC4x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y13abcEv,_ZTv0_n16_N3ccc8CC4x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y13efgEv,_ZTv0_n20_N3ccc8CC4x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y1E[] = {
  {&(_ZTVN3ccc8CC4x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y1E[];
static VTBL_ENTRY alt_thunk_names2056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y13efgEv,_ZTv0_n20_N3ccc8CC4x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y13efgEv,_ZThn4_N3ccc8CC4x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y13abcEv,_ZTv0_n16_N3ccc8CC4x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y13abcEv,_ZThn4_N3ccc8CC4x11y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y13pqrEv,_ZTv0_n12_N3ccc8CC4x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y13pqrEv,_ZThn4_N3ccc8CC4x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y1E = {  "_ZN3ccc8CC4x11y1E", // class name
  bases__ZN3ccc8CC4x11y1E, 2,
  &(vtc__ZN3ccc8CC4x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2056,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y1  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD4x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x11y13efgEv
  ~DD4x11y1(); // tgen
  DD4x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y13abcEv");}
void  ccc::DD4x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y13pqrEv");}
void  ccc::DD4x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y13efgEv");}
ccc::DD4x11y1 ::~DD4x11y1(){ note_dtor("_ZN3ccc8DD4x11y1E", this);} // tgen
ccc::DD4x11y1 ::DD4x11y1(){ note_ctor("_ZN3ccc8DD4x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y1E, buf);
    ::ccc::DD4x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y1E);
    dp->::ccc::DD4x11y1::~DD4x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y1E(Test__ZN3ccc8DD4x11y1E, "_ZN3ccc8DD4x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y1C1Ev();
extern void _ZN3ccc8DD4x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y1E[] = {
  NSPAIR(_ZN3ccc8DD4x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y1E[];
extern void _ZN3ccc8DD4x11y13pqrEv();
extern void _ZN3ccc8DD4x11y13abcEv();
extern void _ZN3ccc8DD4x11y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y13pqrEv,_ZTv0_n12_N3ccc8DD4x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y13pqrEv,_ZThn4_N3ccc8DD4x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y13efgEv,_ZTv0_n16_N3ccc8DD4x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y13efgEv,_ZThn4_N3ccc8DD4x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y13pqrEv,_ZTv0_n12_N3ccc8DD4x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y13efgEv,_ZTv0_n16_N3ccc8DD4x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y1E[] = {
  {&(_ZTVN3ccc8DD4x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y1E[];
static VTBL_ENTRY alt_thunk_names2057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y13efgEv,_ZTv0_n16_N3ccc8DD4x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y13efgEv,_ZThn4_N3ccc8DD4x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y13pqrEv,_ZTv0_n12_N3ccc8DD4x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y13pqrEv,_ZThn4_N3ccc8DD4x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y1E = {  "_ZN3ccc8DD4x11y1E", // class name
  bases__ZN3ccc8DD4x11y1E, 2,
  &(vtc__ZN3ccc8DD4x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2057,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y2  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y23pqrEv
  ~CC4x11y2(); // tgen
  CC4x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y2E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y23efgEv");}
void  ccc::CC4x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y23abcEv");}
void  ccc::CC4x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y23pqrEv");}
ccc::CC4x11y2 ::~CC4x11y2(){ note_dtor("_ZN3ccc8CC4x11y2E", this);} // tgen
ccc::CC4x11y2 ::CC4x11y2(){ note_ctor("_ZN3ccc8CC4x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y2E, buf);
    ::ccc::CC4x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y2E);
    dp->::ccc::CC4x11y2::~CC4x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y2E(Test__ZN3ccc8CC4x11y2E, "_ZN3ccc8CC4x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y2C1Ev();
extern void _ZN3ccc8CC4x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y2E[] = {
  NSPAIR(_ZN3ccc8CC4x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y2E[];
extern void _ZN3ccc8CC4x11y23pqrEv();
extern void _ZN3ccc8CC4x11y23efgEv();
extern void _ZN3ccc8CC4x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y23pqrEv,_ZTv0_n12_N3ccc8CC4x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y23pqrEv,_ZThn4_N3ccc8CC4x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y23abcEv,_ZTv0_n16_N3ccc8CC4x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y23abcEv,_ZThn4_N3ccc8CC4x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y23efgEv,_ZTv0_n20_N3ccc8CC4x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y23efgEv,_ZThn4_N3ccc8CC4x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y23pqrEv,_ZTv0_n12_N3ccc8CC4x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y23abcEv,_ZTv0_n16_N3ccc8CC4x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y23efgEv,_ZTv0_n20_N3ccc8CC4x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y2E[] = {
  {&(_ZTVN3ccc8CC4x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y2E[];
static VTBL_ENTRY alt_thunk_names2058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y23efgEv,_ZTv0_n20_N3ccc8CC4x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y23efgEv,_ZThn4_N3ccc8CC4x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y23abcEv,_ZTv0_n16_N3ccc8CC4x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y23abcEv,_ZThn4_N3ccc8CC4x11y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y23pqrEv,_ZTv0_n12_N3ccc8CC4x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y23pqrEv,_ZThn4_N3ccc8CC4x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y2E = {  "_ZN3ccc8CC4x11y2E", // class name
  bases__ZN3ccc8CC4x11y2E, 2,
  &(vtc__ZN3ccc8CC4x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2058,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y2  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD4x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y23pqrEv
  ~DD4x11y2(); // tgen
  DD4x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y23efgEv");}
void  ccc::DD4x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y23abcEv");}
void  ccc::DD4x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y23pqrEv");}
ccc::DD4x11y2 ::~DD4x11y2(){ note_dtor("_ZN3ccc8DD4x11y2E", this);} // tgen
ccc::DD4x11y2 ::DD4x11y2(){ note_ctor("_ZN3ccc8DD4x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y2E, buf);
    ::ccc::DD4x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y2E);
    dp->::ccc::DD4x11y2::~DD4x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y2E(Test__ZN3ccc8DD4x11y2E, "_ZN3ccc8DD4x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y2C1Ev();
extern void _ZN3ccc8DD4x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y2E[] = {
  NSPAIR(_ZN3ccc8DD4x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y2E[];
extern void _ZN3ccc8DD4x11y23pqrEv();
extern void _ZN3ccc8DD4x11y23abcEv();
extern void _ZN3ccc8DD4x11y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y23pqrEv,_ZTv0_n12_N3ccc8DD4x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y23pqrEv,_ZThn4_N3ccc8DD4x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y23efgEv,_ZTv0_n16_N3ccc8DD4x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y23efgEv,_ZThn4_N3ccc8DD4x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y23pqrEv,_ZTv0_n12_N3ccc8DD4x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y23efgEv,_ZTv0_n16_N3ccc8DD4x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y2E[] = {
  {&(_ZTVN3ccc8DD4x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y2E[];
static VTBL_ENTRY alt_thunk_names2059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y23efgEv,_ZTv0_n16_N3ccc8DD4x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y23efgEv,_ZThn4_N3ccc8DD4x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y23pqrEv,_ZTv0_n12_N3ccc8DD4x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y23pqrEv,_ZThn4_N3ccc8DD4x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y2E = {  "_ZN3ccc8DD4x11y2E", // class name
  bases__ZN3ccc8DD4x11y2E, 2,
  &(vtc__ZN3ccc8DD4x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2059,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y3  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x11y33abcEv
  ~CC4x11y3(); // tgen
  CC4x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y3E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y33efgEv");}
void  ccc::CC4x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y33pqrEv");}
void  ccc::CC4x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y33abcEv");}
ccc::CC4x11y3 ::~CC4x11y3(){ note_dtor("_ZN3ccc8CC4x11y3E", this);} // tgen
ccc::CC4x11y3 ::CC4x11y3(){ note_ctor("_ZN3ccc8CC4x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y3E, buf);
    ::ccc::CC4x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y3E);
    dp->::ccc::CC4x11y3::~CC4x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y3E(Test__ZN3ccc8CC4x11y3E, "_ZN3ccc8CC4x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y3C1Ev();
extern void _ZN3ccc8CC4x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y3E[] = {
  NSPAIR(_ZN3ccc8CC4x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y3E[];
extern void _ZN3ccc8CC4x11y33pqrEv();
extern void _ZN3ccc8CC4x11y33efgEv();
extern void _ZN3ccc8CC4x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y33pqrEv,_ZTv0_n12_N3ccc8CC4x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y33pqrEv,_ZThn4_N3ccc8CC4x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y33abcEv,_ZTv0_n16_N3ccc8CC4x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y33abcEv,_ZThn4_N3ccc8CC4x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y33efgEv,_ZTv0_n20_N3ccc8CC4x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y33efgEv,_ZThn4_N3ccc8CC4x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y33pqrEv,_ZTv0_n12_N3ccc8CC4x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y33abcEv,_ZTv0_n16_N3ccc8CC4x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y33efgEv,_ZTv0_n20_N3ccc8CC4x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y3E[] = {
  {&(_ZTVN3ccc8CC4x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y3E[];
static VTBL_ENTRY alt_thunk_names2060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y33efgEv,_ZTv0_n20_N3ccc8CC4x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y33efgEv,_ZThn4_N3ccc8CC4x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y33abcEv,_ZTv0_n16_N3ccc8CC4x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y33abcEv,_ZThn4_N3ccc8CC4x11y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y33pqrEv,_ZTv0_n12_N3ccc8CC4x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y33pqrEv,_ZThn4_N3ccc8CC4x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y3E = {  "_ZN3ccc8CC4x11y3E", // class name
  bases__ZN3ccc8CC4x11y3E, 2,
  &(vtc__ZN3ccc8CC4x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2060,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y3  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD4x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x11y33abcEv
  ~DD4x11y3(); // tgen
  DD4x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y33efgEv");}
void  ccc::DD4x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y33pqrEv");}
void  ccc::DD4x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y33abcEv");}
ccc::DD4x11y3 ::~DD4x11y3(){ note_dtor("_ZN3ccc8DD4x11y3E", this);} // tgen
ccc::DD4x11y3 ::DD4x11y3(){ note_ctor("_ZN3ccc8DD4x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y3E, buf);
    ::ccc::DD4x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y3E);
    dp->::ccc::DD4x11y3::~DD4x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y3E(Test__ZN3ccc8DD4x11y3E, "_ZN3ccc8DD4x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y3C1Ev();
extern void _ZN3ccc8DD4x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y3E[] = {
  NSPAIR(_ZN3ccc8DD4x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y3E[];
extern void _ZN3ccc8DD4x11y33pqrEv();
extern void _ZN3ccc8DD4x11y33abcEv();
extern void _ZN3ccc8DD4x11y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y33pqrEv,_ZTv0_n12_N3ccc8DD4x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y33pqrEv,_ZThn4_N3ccc8DD4x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y33efgEv,_ZTv0_n16_N3ccc8DD4x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y33efgEv,_ZThn4_N3ccc8DD4x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y33pqrEv,_ZTv0_n12_N3ccc8DD4x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y33efgEv,_ZTv0_n16_N3ccc8DD4x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y3E[] = {
  {&(_ZTVN3ccc8DD4x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y3E[];
static VTBL_ENTRY alt_thunk_names2061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y33efgEv,_ZTv0_n16_N3ccc8DD4x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y33efgEv,_ZThn4_N3ccc8DD4x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y33pqrEv,_ZTv0_n12_N3ccc8DD4x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y33pqrEv,_ZThn4_N3ccc8DD4x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y3E = {  "_ZN3ccc8DD4x11y3E", // class name
  bases__ZN3ccc8DD4x11y3E, 2,
  &(vtc__ZN3ccc8DD4x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2061,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y4  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC4x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y43efgEv
  ~CC4x11y4(); // tgen
  CC4x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y4E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y43pqrEv");}
void  ccc::CC4x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y43abcEv");}
void  ccc::CC4x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y43efgEv");}
ccc::CC4x11y4 ::~CC4x11y4(){ note_dtor("_ZN3ccc8CC4x11y4E", this);} // tgen
ccc::CC4x11y4 ::CC4x11y4(){ note_ctor("_ZN3ccc8CC4x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y4E, buf);
    ::ccc::CC4x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y4E);
    dp->::ccc::CC4x11y4::~CC4x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y4E(Test__ZN3ccc8CC4x11y4E, "_ZN3ccc8CC4x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y4C1Ev();
extern void _ZN3ccc8CC4x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y4E[] = {
  NSPAIR(_ZN3ccc8CC4x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y4E[];
extern void _ZN3ccc8CC4x11y43pqrEv();
extern void _ZN3ccc8CC4x11y43efgEv();
extern void _ZN3ccc8CC4x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y43pqrEv,_ZTv0_n12_N3ccc8CC4x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y43pqrEv,_ZThn4_N3ccc8CC4x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y43abcEv,_ZTv0_n16_N3ccc8CC4x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y43abcEv,_ZThn4_N3ccc8CC4x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y43efgEv,_ZTv0_n20_N3ccc8CC4x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y43efgEv,_ZThn4_N3ccc8CC4x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y43pqrEv,_ZTv0_n12_N3ccc8CC4x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y43abcEv,_ZTv0_n16_N3ccc8CC4x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y43efgEv,_ZTv0_n20_N3ccc8CC4x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y4E[] = {
  {&(_ZTVN3ccc8CC4x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y4E[];
static VTBL_ENTRY alt_thunk_names2062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y43efgEv,_ZTv0_n20_N3ccc8CC4x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y43efgEv,_ZThn4_N3ccc8CC4x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y43abcEv,_ZTv0_n16_N3ccc8CC4x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y43abcEv,_ZThn4_N3ccc8CC4x11y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y43pqrEv,_ZTv0_n12_N3ccc8CC4x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y43pqrEv,_ZThn4_N3ccc8CC4x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y4E = {  "_ZN3ccc8CC4x11y4E", // class name
  bases__ZN3ccc8CC4x11y4E, 2,
  &(vtc__ZN3ccc8CC4x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2062,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y4  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD4x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x11y43efgEv
  ~DD4x11y4(); // tgen
  DD4x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y43pqrEv");}
void  ccc::DD4x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y43abcEv");}
void  ccc::DD4x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y43efgEv");}
ccc::DD4x11y4 ::~DD4x11y4(){ note_dtor("_ZN3ccc8DD4x11y4E", this);} // tgen
ccc::DD4x11y4 ::DD4x11y4(){ note_ctor("_ZN3ccc8DD4x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y4E, buf);
    ::ccc::DD4x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y4E);
    dp->::ccc::DD4x11y4::~DD4x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y4E(Test__ZN3ccc8DD4x11y4E, "_ZN3ccc8DD4x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y4C1Ev();
extern void _ZN3ccc8DD4x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y4E[] = {
  NSPAIR(_ZN3ccc8DD4x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y4E[];
extern void _ZN3ccc8DD4x11y43pqrEv();
extern void _ZN3ccc8DD4x11y43abcEv();
extern void _ZN3ccc8DD4x11y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y43pqrEv,_ZTv0_n12_N3ccc8DD4x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y43pqrEv,_ZThn4_N3ccc8DD4x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y43efgEv,_ZTv0_n16_N3ccc8DD4x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y43efgEv,_ZThn4_N3ccc8DD4x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y43pqrEv,_ZTv0_n12_N3ccc8DD4x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y43efgEv,_ZTv0_n16_N3ccc8DD4x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y4E[] = {
  {&(_ZTVN3ccc8DD4x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y4E[];
static VTBL_ENTRY alt_thunk_names2063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y43efgEv,_ZTv0_n16_N3ccc8DD4x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y43efgEv,_ZThn4_N3ccc8DD4x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y43pqrEv,_ZTv0_n12_N3ccc8DD4x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y43pqrEv,_ZThn4_N3ccc8DD4x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y4E = {  "_ZN3ccc8DD4x11y4E", // class name
  bases__ZN3ccc8DD4x11y4E, 2,
  &(vtc__ZN3ccc8DD4x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2063,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y5  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC4x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y53abcEv
  ~CC4x11y5(); // tgen
  CC4x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y5E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y53pqrEv");}
void  ccc::CC4x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y53efgEv");}
void  ccc::CC4x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y53abcEv");}
ccc::CC4x11y5 ::~CC4x11y5(){ note_dtor("_ZN3ccc8CC4x11y5E", this);} // tgen
ccc::CC4x11y5 ::CC4x11y5(){ note_ctor("_ZN3ccc8CC4x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y5E, buf);
    ::ccc::CC4x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y5E);
    dp->::ccc::CC4x11y5::~CC4x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y5E(Test__ZN3ccc8CC4x11y5E, "_ZN3ccc8CC4x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y5C1Ev();
extern void _ZN3ccc8CC4x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y5E[] = {
  NSPAIR(_ZN3ccc8CC4x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y5E[];
extern void _ZN3ccc8CC4x11y53pqrEv();
extern void _ZN3ccc8CC4x11y53efgEv();
extern void _ZN3ccc8CC4x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y53pqrEv,_ZTv0_n12_N3ccc8CC4x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y53pqrEv,_ZThn4_N3ccc8CC4x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y53abcEv,_ZTv0_n16_N3ccc8CC4x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y53abcEv,_ZThn4_N3ccc8CC4x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y53efgEv,_ZTv0_n20_N3ccc8CC4x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y53efgEv,_ZThn4_N3ccc8CC4x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y53pqrEv,_ZTv0_n12_N3ccc8CC4x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y53abcEv,_ZTv0_n16_N3ccc8CC4x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y53efgEv,_ZTv0_n20_N3ccc8CC4x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y5E[] = {
  {&(_ZTVN3ccc8CC4x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y5E[];
static VTBL_ENTRY alt_thunk_names2064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y53efgEv,_ZTv0_n20_N3ccc8CC4x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y53efgEv,_ZThn4_N3ccc8CC4x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y53abcEv,_ZTv0_n16_N3ccc8CC4x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y53abcEv,_ZThn4_N3ccc8CC4x11y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y53pqrEv,_ZTv0_n12_N3ccc8CC4x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y53pqrEv,_ZThn4_N3ccc8CC4x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y5E = {  "_ZN3ccc8CC4x11y5E", // class name
  bases__ZN3ccc8CC4x11y5E, 2,
  &(vtc__ZN3ccc8CC4x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2064,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y5  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD4x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x11y53abcEv
  ~DD4x11y5(); // tgen
  DD4x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y53pqrEv");}
void  ccc::DD4x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y53efgEv");}
void  ccc::DD4x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y53abcEv");}
ccc::DD4x11y5 ::~DD4x11y5(){ note_dtor("_ZN3ccc8DD4x11y5E", this);} // tgen
ccc::DD4x11y5 ::DD4x11y5(){ note_ctor("_ZN3ccc8DD4x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y5E, buf);
    ::ccc::DD4x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y5E);
    dp->::ccc::DD4x11y5::~DD4x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y5E(Test__ZN3ccc8DD4x11y5E, "_ZN3ccc8DD4x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y5C1Ev();
extern void _ZN3ccc8DD4x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y5E[] = {
  NSPAIR(_ZN3ccc8DD4x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y5E[];
extern void _ZN3ccc8DD4x11y53pqrEv();
extern void _ZN3ccc8DD4x11y53abcEv();
extern void _ZN3ccc8DD4x11y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y53pqrEv,_ZTv0_n12_N3ccc8DD4x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y53pqrEv,_ZThn4_N3ccc8DD4x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y53efgEv,_ZTv0_n16_N3ccc8DD4x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y53efgEv,_ZThn4_N3ccc8DD4x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y53pqrEv,_ZTv0_n12_N3ccc8DD4x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y53efgEv,_ZTv0_n16_N3ccc8DD4x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y5E[] = {
  {&(_ZTVN3ccc8DD4x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y5E[];
static VTBL_ENTRY alt_thunk_names2065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y53efgEv,_ZTv0_n16_N3ccc8DD4x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y53efgEv,_ZThn4_N3ccc8DD4x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y53pqrEv,_ZTv0_n12_N3ccc8DD4x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y53pqrEv,_ZThn4_N3ccc8DD4x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y5E = {  "_ZN3ccc8DD4x11y5E", // class name
  bases__ZN3ccc8DD4x11y5E, 2,
  &(vtc__ZN3ccc8DD4x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2065,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y6  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y63efgEv
  ~CC4x11y6(); // tgen
  CC4x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y6E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y63abcEv");}
void  ccc::CC4x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y63efgEv");}
ccc::CC4x11y6 ::~CC4x11y6(){ note_dtor("_ZN3ccc8CC4x11y6E", this);} // tgen
ccc::CC4x11y6 ::CC4x11y6(){ note_ctor("_ZN3ccc8CC4x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y6E, buf);
    ::ccc::CC4x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y6E);
    dp->::ccc::CC4x11y6::~CC4x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y6E(Test__ZN3ccc8CC4x11y6E, "_ZN3ccc8CC4x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y6C1Ev();
extern void _ZN3ccc8CC4x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y6E[] = {
  NSPAIR(_ZN3ccc8CC4x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC4x11y63efgEv();
extern void _ZN3ccc8CC4x11y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y63abcEv,_ZTv0_n16_N3ccc8CC4x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y63abcEv,_ZThn4_N3ccc8CC4x11y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y63efgEv,_ZTv0_n20_N3ccc8CC4x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y63efgEv,_ZThn4_N3ccc8CC4x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y63abcEv,_ZTv0_n16_N3ccc8CC4x11y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y63efgEv,_ZTv0_n20_N3ccc8CC4x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y6E[] = {
  {&(_ZTVN3ccc8CC4x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y6E[];
static VTBL_ENTRY alt_thunk_names2066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y63efgEv,_ZTv0_n20_N3ccc8CC4x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y63efgEv,_ZThn4_N3ccc8CC4x11y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y63abcEv,_ZTv0_n16_N3ccc8CC4x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y63abcEv,_ZThn4_N3ccc8CC4x11y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y6E = {  "_ZN3ccc8CC4x11y6E", // class name
  bases__ZN3ccc8CC4x11y6E, 2,
  &(vtc__ZN3ccc8CC4x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2066,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y6  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD4x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x11y63efgEv
  ~DD4x11y6(); // tgen
  DD4x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y63abcEv");}
void  ccc::DD4x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y63efgEv");}
ccc::DD4x11y6 ::~DD4x11y6(){ note_dtor("_ZN3ccc8DD4x11y6E", this);} // tgen
ccc::DD4x11y6 ::DD4x11y6(){ note_ctor("_ZN3ccc8DD4x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y6E, buf);
    ::ccc::DD4x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y6E);
    dp->::ccc::DD4x11y6::~DD4x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y6E(Test__ZN3ccc8DD4x11y6E, "_ZN3ccc8DD4x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y6C1Ev();
extern void _ZN3ccc8DD4x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y6E[] = {
  NSPAIR(_ZN3ccc8DD4x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x11y63abcEv();
extern void _ZN3ccc8DD4x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y63efgEv,_ZTv0_n16_N3ccc8DD4x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y63efgEv,_ZThn4_N3ccc8DD4x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y63efgEv,_ZTv0_n16_N3ccc8DD4x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y6E[] = {
  {&(_ZTVN3ccc8DD4x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y6E[];
static VTBL_ENTRY alt_thunk_names2067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y63efgEv,_ZTv0_n16_N3ccc8DD4x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y63efgEv,_ZThn4_N3ccc8DD4x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y6E = {  "_ZN3ccc8DD4x11y6E", // class name
  bases__ZN3ccc8DD4x11y6E, 2,
  &(vtc__ZN3ccc8DD4x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2067,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y7  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y73pqrEv
  ~CC4x11y7(); // tgen
  CC4x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y7E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y73abcEv");}
void  ccc::CC4x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y73pqrEv");}
ccc::CC4x11y7 ::~CC4x11y7(){ note_dtor("_ZN3ccc8CC4x11y7E", this);} // tgen
ccc::CC4x11y7 ::CC4x11y7(){ note_ctor("_ZN3ccc8CC4x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y7E, buf);
    ::ccc::CC4x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y7E);
    dp->::ccc::CC4x11y7::~CC4x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y7E(Test__ZN3ccc8CC4x11y7E, "_ZN3ccc8CC4x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y7C1Ev();
extern void _ZN3ccc8CC4x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y7E[] = {
  NSPAIR(_ZN3ccc8CC4x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y7E[];
extern void _ZN3ccc8CC4x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC4x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y73pqrEv,_ZTv0_n12_N3ccc8CC4x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y73pqrEv,_ZThn4_N3ccc8CC4x11y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y73abcEv,_ZTv0_n16_N3ccc8CC4x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y73abcEv,_ZThn4_N3ccc8CC4x11y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y73pqrEv,_ZTv0_n12_N3ccc8CC4x11y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y73abcEv,_ZTv0_n16_N3ccc8CC4x11y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y7E[] = {
  {&(_ZTVN3ccc8CC4x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y7E[];
static VTBL_ENTRY alt_thunk_names2068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y73abcEv,_ZTv0_n16_N3ccc8CC4x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y73abcEv,_ZThn4_N3ccc8CC4x11y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y73pqrEv,_ZTv0_n12_N3ccc8CC4x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y73pqrEv,_ZThn4_N3ccc8CC4x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y7E = {  "_ZN3ccc8CC4x11y7E", // class name
  bases__ZN3ccc8CC4x11y7E, 2,
  &(vtc__ZN3ccc8CC4x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2068,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y7  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD4x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y73pqrEv
  ~DD4x11y7(); // tgen
  DD4x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y73abcEv");}
void  ccc::DD4x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y73pqrEv");}
ccc::DD4x11y7 ::~DD4x11y7(){ note_dtor("_ZN3ccc8DD4x11y7E", this);} // tgen
ccc::DD4x11y7 ::DD4x11y7(){ note_ctor("_ZN3ccc8DD4x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y7E, buf);
    ::ccc::DD4x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y7E);
    dp->::ccc::DD4x11y7::~DD4x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y7E(Test__ZN3ccc8DD4x11y7E, "_ZN3ccc8DD4x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y7C1Ev();
extern void _ZN3ccc8DD4x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y7E[] = {
  NSPAIR(_ZN3ccc8DD4x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y7E[];
extern void _ZN3ccc8DD4x11y73pqrEv();
extern void _ZN3ccc8DD4x11y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y73pqrEv,_ZTv0_n12_N3ccc8DD4x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y73pqrEv,_ZThn4_N3ccc8DD4x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y73pqrEv,_ZTv0_n12_N3ccc8DD4x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y7E[] = {
  {&(_ZTVN3ccc8DD4x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y7E[];
static VTBL_ENTRY alt_thunk_names2069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y73pqrEv,_ZTv0_n12_N3ccc8DD4x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y73pqrEv,_ZThn4_N3ccc8DD4x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y7E = {  "_ZN3ccc8DD4x11y7E", // class name
  bases__ZN3ccc8DD4x11y7E, 2,
  &(vtc__ZN3ccc8DD4x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2069,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y8  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y83abcEv
  ~CC4x11y8(); // tgen
  CC4x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y8E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y83efgEv");}
void  ccc::CC4x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y83abcEv");}
ccc::CC4x11y8 ::~CC4x11y8(){ note_dtor("_ZN3ccc8CC4x11y8E", this);} // tgen
ccc::CC4x11y8 ::CC4x11y8(){ note_ctor("_ZN3ccc8CC4x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y8E, buf);
    ::ccc::CC4x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y8E);
    dp->::ccc::CC4x11y8::~CC4x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y8E(Test__ZN3ccc8CC4x11y8E, "_ZN3ccc8CC4x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y8C1Ev();
extern void _ZN3ccc8CC4x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y8E[] = {
  NSPAIR(_ZN3ccc8CC4x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC4x11y83efgEv();
extern void _ZN3ccc8CC4x11y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x11y83abcEv,_ZTv0_n16_N3ccc8CC4x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y83abcEv,_ZThn4_N3ccc8CC4x11y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y83efgEv,_ZTv0_n20_N3ccc8CC4x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y83efgEv,_ZThn4_N3ccc8CC4x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x11y83abcEv,_ZTv0_n16_N3ccc8CC4x11y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y83efgEv,_ZTv0_n20_N3ccc8CC4x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y8E[] = {
  {&(_ZTVN3ccc8CC4x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y8E[];
static VTBL_ENTRY alt_thunk_names2070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y83efgEv,_ZTv0_n20_N3ccc8CC4x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y83efgEv,_ZThn4_N3ccc8CC4x11y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x11y83abcEv,_ZTv0_n16_N3ccc8CC4x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y83abcEv,_ZThn4_N3ccc8CC4x11y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y8E = {  "_ZN3ccc8CC4x11y8E", // class name
  bases__ZN3ccc8CC4x11y8E, 2,
  &(vtc__ZN3ccc8CC4x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2070,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y8  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD4x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x11y83abcEv
  ~DD4x11y8(); // tgen
  DD4x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y83efgEv");}
void  ccc::DD4x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x11y83abcEv");}
ccc::DD4x11y8 ::~DD4x11y8(){ note_dtor("_ZN3ccc8DD4x11y8E", this);} // tgen
ccc::DD4x11y8 ::DD4x11y8(){ note_ctor("_ZN3ccc8DD4x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y8E, buf);
    ::ccc::DD4x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y8E);
    dp->::ccc::DD4x11y8::~DD4x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y8E(Test__ZN3ccc8DD4x11y8E, "_ZN3ccc8DD4x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y8C1Ev();
extern void _ZN3ccc8DD4x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y8E[] = {
  NSPAIR(_ZN3ccc8DD4x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x11y83abcEv();
extern void _ZN3ccc8DD4x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y83efgEv,_ZTv0_n16_N3ccc8DD4x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y83efgEv,_ZThn4_N3ccc8DD4x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y83efgEv,_ZTv0_n16_N3ccc8DD4x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y8E[] = {
  {&(_ZTVN3ccc8DD4x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y8E[];
static VTBL_ENTRY alt_thunk_names2071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y83efgEv,_ZTv0_n16_N3ccc8DD4x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y83efgEv,_ZThn4_N3ccc8DD4x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y8E = {  "_ZN3ccc8DD4x11y8E", // class name
  bases__ZN3ccc8DD4x11y8E, 2,
  &(vtc__ZN3ccc8DD4x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2071,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y9  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y93pqrEv
  ~CC4x11y9(); // tgen
  CC4x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y9E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y93efgEv");}
void  ccc::CC4x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y93pqrEv");}
ccc::CC4x11y9 ::~CC4x11y9(){ note_dtor("_ZN3ccc8CC4x11y9E", this);} // tgen
ccc::CC4x11y9 ::CC4x11y9(){ note_ctor("_ZN3ccc8CC4x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y9E, buf);
    ::ccc::CC4x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC4x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y9E);
    dp->::ccc::CC4x11y9::~CC4x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y9E(Test__ZN3ccc8CC4x11y9E, "_ZN3ccc8CC4x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y9C1Ev();
extern void _ZN3ccc8CC4x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y9E[] = {
  NSPAIR(_ZN3ccc8CC4x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y9E[];
extern void _ZN3ccc8CC4x11y93pqrEv();
extern void _ZN3ccc8CC4x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x11y93pqrEv,_ZTv0_n12_N3ccc8CC4x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y93pqrEv,_ZThn4_N3ccc8CC4x11y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x11y93efgEv,_ZTv0_n20_N3ccc8CC4x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y93efgEv,_ZThn4_N3ccc8CC4x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x11y93pqrEv,_ZTv0_n12_N3ccc8CC4x11y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x11y93efgEv,_ZTv0_n20_N3ccc8CC4x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x11y9E[] = {
  {&(_ZTVN3ccc8CC4x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x11y9E[];
static VTBL_ENTRY alt_thunk_names2072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x11y93efgEv,_ZTv0_n20_N3ccc8CC4x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y93efgEv,_ZThn4_N3ccc8CC4x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x11y93pqrEv,_ZTv0_n12_N3ccc8CC4x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x11y93pqrEv,_ZThn4_N3ccc8CC4x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x11y9E = {  "_ZN3ccc8CC4x11y9E", // class name
  bases__ZN3ccc8CC4x11y9E, 2,
  &(vtc__ZN3ccc8CC4x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x11y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2072,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y9  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD4x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x11y93pqrEv
  ~DD4x11y9(); // tgen
  DD4x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x11y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x11y93efgEv");}
void  ccc::DD4x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x11y93pqrEv");}
ccc::DD4x11y9 ::~DD4x11y9(){ note_dtor("_ZN3ccc8DD4x11y9E", this);} // tgen
ccc::DD4x11y9 ::DD4x11y9(){ note_ctor("_ZN3ccc8DD4x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x11y9E, buf);
    ::ccc::DD4x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x11y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD4x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x11y9E);
    dp->::ccc::DD4x11y9::~DD4x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x11y9E(Test__ZN3ccc8DD4x11y9E, "_ZN3ccc8DD4x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x11y9C1Ev();
extern void _ZN3ccc8DD4x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x11y9E[] = {
  NSPAIR(_ZN3ccc8DD4x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD4x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y9E[];
extern void _ZN3ccc8DD4x11y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x11y93pqrEv,_ZTv0_n12_N3ccc8DD4x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y93pqrEv,_ZThn4_N3ccc8DD4x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD4x11y93efgEv,_ZTv0_n16_N3ccc8DD4x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x11y93efgEv,_ZThn4_N3ccc8DD4x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x11y93pqrEv,_ZTv0_n12_N3ccc8DD4x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD4x11y93efgEv,_ZTv0_n16_N3ccc8DD4x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x11y9E[] = {
  {&(_ZTVN3ccc8DD4x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD4x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x11y9E[];
static VTBL_ENTRY alt_thunk_names2073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD4x11y93efgEv,_ZTv0_n16_N3ccc8DD4x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y93efgEv,_ZThn4_N3ccc8DD4x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x11y93pqrEv,_ZTv0_n12_N3ccc8DD4x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x11y93pqrEv,_ZThn4_N3ccc8DD4x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x11y9E = {  "_ZN3ccc8DD4x11y9E", // class name
  bases__ZN3ccc8DD4x11y9E, 2,
  &(vtc__ZN3ccc8DD4x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x11y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2073,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y10  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x11y103abcEv
  ~CC4x11y10(); // tgen
  CC4x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y10E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y103pqrEv");}
void  ccc::CC4x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x11y103abcEv");}
ccc::CC4x11y10 ::~CC4x11y10(){ note_dtor("_ZN3ccc9CC4x11y10E", this);} // tgen
ccc::CC4x11y10 ::CC4x11y10(){ note_ctor("_ZN3ccc9CC4x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y10E, buf);
    ::ccc::CC4x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y10E);
    dp->::ccc::CC4x11y10::~CC4x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y10E(Test__ZN3ccc9CC4x11y10E, "_ZN3ccc9CC4x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y10C1Ev();
extern void _ZN3ccc9CC4x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y10E[] = {
  NSPAIR(_ZN3ccc9CC4x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y10E[];
extern void _ZN3ccc9CC4x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC4x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x11y103pqrEv,_ZTv0_n12_N3ccc9CC4x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y103pqrEv,_ZThn4_N3ccc9CC4x11y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x11y103abcEv,_ZTv0_n16_N3ccc9CC4x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y103abcEv,_ZThn4_N3ccc9CC4x11y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x11y103pqrEv,_ZTv0_n12_N3ccc9CC4x11y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x11y103abcEv,_ZTv0_n16_N3ccc9CC4x11y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y10E[] = {
  {&(_ZTVN3ccc9CC4x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y10E[];
static VTBL_ENTRY alt_thunk_names2074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x11y103abcEv,_ZTv0_n16_N3ccc9CC4x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y103abcEv,_ZThn4_N3ccc9CC4x11y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x11y103pqrEv,_ZTv0_n12_N3ccc9CC4x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y103pqrEv,_ZThn4_N3ccc9CC4x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x11y10E = {  "_ZN3ccc9CC4x11y10E", // class name
  bases__ZN3ccc9CC4x11y10E, 2,
  &(vtc__ZN3ccc9CC4x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2074,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y10  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD4x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x11y103abcEv
  ~DD4x11y10(); // tgen
  DD4x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x11y103pqrEv");}
void  ccc::DD4x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x11y103abcEv");}
ccc::DD4x11y10 ::~DD4x11y10(){ note_dtor("_ZN3ccc9DD4x11y10E", this);} // tgen
ccc::DD4x11y10 ::DD4x11y10(){ note_ctor("_ZN3ccc9DD4x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y10E, buf);
    ::ccc::DD4x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y10E);
    dp->::ccc::DD4x11y10::~DD4x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y10E(Test__ZN3ccc9DD4x11y10E, "_ZN3ccc9DD4x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y10C1Ev();
extern void _ZN3ccc9DD4x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y10E[] = {
  NSPAIR(_ZN3ccc9DD4x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y10E[];
extern void _ZN3ccc9DD4x11y103pqrEv();
extern void _ZN3ccc9DD4x11y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x11y103pqrEv,_ZTv0_n12_N3ccc9DD4x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x11y103pqrEv,_ZThn4_N3ccc9DD4x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x11y103pqrEv,_ZTv0_n12_N3ccc9DD4x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y10E[] = {
  {&(_ZTVN3ccc9DD4x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y10E[];
static VTBL_ENTRY alt_thunk_names2075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x11y103pqrEv,_ZTv0_n12_N3ccc9DD4x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x11y103pqrEv,_ZThn4_N3ccc9DD4x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x11y10E = {  "_ZN3ccc9DD4x11y10E", // class name
  bases__ZN3ccc9DD4x11y10E, 2,
  &(vtc__ZN3ccc9DD4x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2075,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y11  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x11y113efgEv
  ~CC4x11y11(); // tgen
  CC4x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y11E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y113pqrEv");}
void  ccc::CC4x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x11y113efgEv");}
ccc::CC4x11y11 ::~CC4x11y11(){ note_dtor("_ZN3ccc9CC4x11y11E", this);} // tgen
ccc::CC4x11y11 ::CC4x11y11(){ note_ctor("_ZN3ccc9CC4x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y11E, buf);
    ::ccc::CC4x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y11E);
    dp->::ccc::CC4x11y11::~CC4x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y11E(Test__ZN3ccc9CC4x11y11E, "_ZN3ccc9CC4x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y11C1Ev();
extern void _ZN3ccc9CC4x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y11E[] = {
  NSPAIR(_ZN3ccc9CC4x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y11E[];
extern void _ZN3ccc9CC4x11y113pqrEv();
extern void _ZN3ccc9CC4x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x11y113pqrEv,_ZTv0_n12_N3ccc9CC4x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y113pqrEv,_ZThn4_N3ccc9CC4x11y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x11y113efgEv,_ZTv0_n20_N3ccc9CC4x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y113efgEv,_ZThn4_N3ccc9CC4x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x11y113pqrEv,_ZTv0_n12_N3ccc9CC4x11y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x11y113efgEv,_ZTv0_n20_N3ccc9CC4x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y11E[] = {
  {&(_ZTVN3ccc9CC4x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y11E[];
static VTBL_ENTRY alt_thunk_names2076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x11y113efgEv,_ZTv0_n20_N3ccc9CC4x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y113efgEv,_ZThn4_N3ccc9CC4x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x11y113pqrEv,_ZTv0_n12_N3ccc9CC4x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y113pqrEv,_ZThn4_N3ccc9CC4x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x11y11E = {  "_ZN3ccc9CC4x11y11E", // class name
  bases__ZN3ccc9CC4x11y11E, 2,
  &(vtc__ZN3ccc9CC4x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2076,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y11  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD4x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x11y113efgEv
  ~DD4x11y11(); // tgen
  DD4x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x11y113pqrEv");}
void  ccc::DD4x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x11y113efgEv");}
ccc::DD4x11y11 ::~DD4x11y11(){ note_dtor("_ZN3ccc9DD4x11y11E", this);} // tgen
ccc::DD4x11y11 ::DD4x11y11(){ note_ctor("_ZN3ccc9DD4x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y11E, buf);
    ::ccc::DD4x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y11E);
    dp->::ccc::DD4x11y11::~DD4x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y11E(Test__ZN3ccc9DD4x11y11E, "_ZN3ccc9DD4x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y11C1Ev();
extern void _ZN3ccc9DD4x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y11E[] = {
  NSPAIR(_ZN3ccc9DD4x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y11E[];
extern void _ZN3ccc9DD4x11y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x11y113pqrEv,_ZTv0_n12_N3ccc9DD4x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x11y113pqrEv,_ZThn4_N3ccc9DD4x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD4x11y113efgEv,_ZTv0_n16_N3ccc9DD4x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x11y113efgEv,_ZThn4_N3ccc9DD4x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x11y113pqrEv,_ZTv0_n12_N3ccc9DD4x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD4x11y113efgEv,_ZTv0_n16_N3ccc9DD4x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y11E[] = {
  {&(_ZTVN3ccc9DD4x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y11E[];
static VTBL_ENTRY alt_thunk_names2077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD4x11y113efgEv,_ZTv0_n16_N3ccc9DD4x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x11y113efgEv,_ZThn4_N3ccc9DD4x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x11y113pqrEv,_ZTv0_n12_N3ccc9DD4x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x11y113pqrEv,_ZThn4_N3ccc9DD4x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x11y11E = {  "_ZN3ccc9DD4x11y11E", // class name
  bases__ZN3ccc9DD4x11y11E, 2,
  &(vtc__ZN3ccc9DD4x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2077,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y12  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC4x11y123abcEv
  ~CC4x11y12(); // tgen
  CC4x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x11y123abcEv");}
ccc::CC4x11y12 ::~CC4x11y12(){ note_dtor("_ZN3ccc9CC4x11y12E", this);} // tgen
ccc::CC4x11y12 ::CC4x11y12(){ note_ctor("_ZN3ccc9CC4x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y12E, buf);
    ::ccc::CC4x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y12E);
    dp->::ccc::CC4x11y12::~CC4x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y12E(Test__ZN3ccc9CC4x11y12E, "_ZN3ccc9CC4x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y12C1Ev();
extern void _ZN3ccc9CC4x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y12E[] = {
  NSPAIR(_ZN3ccc9CC4x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC4x11y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x11y123abcEv,_ZTv0_n16_N3ccc9CC4x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y123abcEv,_ZThn4_N3ccc9CC4x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x11y123abcEv,_ZTv0_n16_N3ccc9CC4x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y12E[] = {
  {&(_ZTVN3ccc9CC4x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y12E[];
static VTBL_ENTRY alt_thunk_names2078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x11y123abcEv,_ZTv0_n16_N3ccc9CC4x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y123abcEv,_ZThn4_N3ccc9CC4x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x11y12E = {  "_ZN3ccc9CC4x11y12E", // class name
  bases__ZN3ccc9CC4x11y12E, 2,
  &(vtc__ZN3ccc9CC4x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2078,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y12  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD4x11y123abcEv
  ~DD4x11y12(); // tgen
  DD4x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD4x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x11y123abcEv");}
ccc::DD4x11y12 ::~DD4x11y12(){ note_dtor("_ZN3ccc9DD4x11y12E", this);} // tgen
ccc::DD4x11y12 ::DD4x11y12(){ note_ctor("_ZN3ccc9DD4x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y12E, buf);
    ::ccc::DD4x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y12E);
    dp->::ccc::DD4x11y12::~DD4x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y12E(Test__ZN3ccc9DD4x11y12E, "_ZN3ccc9DD4x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y12C1Ev();
extern void _ZN3ccc9DD4x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y12E[] = {
  NSPAIR(_ZN3ccc9DD4x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x11y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y12E[] = {
  {&(_ZTVN3ccc9DD4x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y12E[];
Class_Descriptor cd__ZN3ccc9DD4x11y12E = {  "_ZN3ccc9DD4x11y12E", // class name
  bases__ZN3ccc9DD4x11y12E, 2,
  &(vtc__ZN3ccc9DD4x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y13  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC4x11y133efgEv
  ~CC4x11y13(); // tgen
  CC4x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x11y133efgEv");}
ccc::CC4x11y13 ::~CC4x11y13(){ note_dtor("_ZN3ccc9CC4x11y13E", this);} // tgen
ccc::CC4x11y13 ::CC4x11y13(){ note_ctor("_ZN3ccc9CC4x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y13E, buf);
    ::ccc::CC4x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y13E);
    dp->::ccc::CC4x11y13::~CC4x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y13E(Test__ZN3ccc9CC4x11y13E, "_ZN3ccc9CC4x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y13C1Ev();
extern void _ZN3ccc9CC4x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y13E[] = {
  NSPAIR(_ZN3ccc9CC4x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC4x11y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x11y133efgEv,_ZTv0_n20_N3ccc9CC4x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y133efgEv,_ZThn4_N3ccc9CC4x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x11y133efgEv,_ZTv0_n20_N3ccc9CC4x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y13E[] = {
  {&(_ZTVN3ccc9CC4x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y13E[];
static VTBL_ENTRY alt_thunk_names2079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x11y133efgEv,_ZTv0_n20_N3ccc9CC4x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y133efgEv,_ZThn4_N3ccc9CC4x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x11y13E = {  "_ZN3ccc9CC4x11y13E", // class name
  bases__ZN3ccc9CC4x11y13E, 2,
  &(vtc__ZN3ccc9CC4x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2079,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y13  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD4x11y133efgEv
  ~DD4x11y13(); // tgen
  DD4x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD4x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x11y133efgEv");}
ccc::DD4x11y13 ::~DD4x11y13(){ note_dtor("_ZN3ccc9DD4x11y13E", this);} // tgen
ccc::DD4x11y13 ::DD4x11y13(){ note_ctor("_ZN3ccc9DD4x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y13E, buf);
    ::ccc::DD4x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y13E);
    dp->::ccc::DD4x11y13::~DD4x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y13E(Test__ZN3ccc9DD4x11y13E, "_ZN3ccc9DD4x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y13C1Ev();
extern void _ZN3ccc9DD4x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y13E[] = {
  NSPAIR(_ZN3ccc9DD4x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD4x11y133efgEv,_ZTv0_n16_N3ccc9DD4x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x11y133efgEv,_ZThn4_N3ccc9DD4x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD4x11y133efgEv,_ZTv0_n16_N3ccc9DD4x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y13E[] = {
  {&(_ZTVN3ccc9DD4x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y13E[];
static VTBL_ENTRY alt_thunk_names2080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD4x11y133efgEv,_ZTv0_n16_N3ccc9DD4x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x11y133efgEv,_ZThn4_N3ccc9DD4x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x11y13E = {  "_ZN3ccc9DD4x11y13E", // class name
  bases__ZN3ccc9DD4x11y13E, 2,
  &(vtc__ZN3ccc9DD4x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2080,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y14  : virtual ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y143pqrEv
  ~CC4x11y14(); // tgen
  CC4x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y143pqrEv");}
ccc::CC4x11y14 ::~CC4x11y14(){ note_dtor("_ZN3ccc9CC4x11y14E", this);} // tgen
ccc::CC4x11y14 ::CC4x11y14(){ note_ctor("_ZN3ccc9CC4x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y14E, buf);
    ::ccc::CC4x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y14E);
    dp->::ccc::CC4x11y14::~CC4x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y14E(Test__ZN3ccc9CC4x11y14E, "_ZN3ccc9CC4x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y14C1Ev();
extern void _ZN3ccc9CC4x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y14E[] = {
  NSPAIR(_ZN3ccc9CC4x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y14E[];
extern void _ZN3ccc9CC4x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x11y143pqrEv,_ZTv0_n12_N3ccc9CC4x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y143pqrEv,_ZThn4_N3ccc9CC4x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x11y143pqrEv,_ZTv0_n12_N3ccc9CC4x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y14E[] = {
  {&(_ZTVN3ccc9CC4x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y14E[];
static VTBL_ENTRY alt_thunk_names2081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x11y143pqrEv,_ZTv0_n12_N3ccc9CC4x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x11y143pqrEv,_ZThn4_N3ccc9CC4x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x11y14E = {  "_ZN3ccc9CC4x11y14E", // class name
  bases__ZN3ccc9CC4x11y14E, 2,
  &(vtc__ZN3ccc9CC4x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2081,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y14  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD4x11y143pqrEv
  ~DD4x11y14(); // tgen
  DD4x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD4x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x11y143pqrEv");}
ccc::DD4x11y14 ::~DD4x11y14(){ note_dtor("_ZN3ccc9DD4x11y14E", this);} // tgen
ccc::DD4x11y14 ::DD4x11y14(){ note_ctor("_ZN3ccc9DD4x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y14E, buf);
    ::ccc::DD4x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y14E);
    dp->::ccc::DD4x11y14::~DD4x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y14E(Test__ZN3ccc9DD4x11y14E, "_ZN3ccc9DD4x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y14C1Ev();
extern void _ZN3ccc9DD4x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y14E[] = {
  NSPAIR(_ZN3ccc9DD4x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y14E[];
extern void _ZN3ccc9DD4x11y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x11y143pqrEv,_ZTv0_n12_N3ccc9DD4x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x11y143pqrEv,_ZThn4_N3ccc9DD4x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x11y143pqrEv,_ZTv0_n12_N3ccc9DD4x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y14E[] = {
  {&(_ZTVN3ccc9DD4x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y14E[];
static VTBL_ENTRY alt_thunk_names2082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x11y143pqrEv,_ZTv0_n12_N3ccc9DD4x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x11y143pqrEv,_ZThn4_N3ccc9DD4x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x11y14E = {  "_ZN3ccc9DD4x11y14E", // class name
  bases__ZN3ccc9DD4x11y14E, 2,
  &(vtc__ZN3ccc9DD4x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2082,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y15  : virtual ::ccc::AA4 , ::ccc::BB11 {
  ~CC4x11y15(); // tgen
  CC4x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x11y15 ::~CC4x11y15(){ note_dtor("_ZN3ccc9CC4x11y15E", this);} // tgen
ccc::CC4x11y15 ::CC4x11y15(){ note_ctor("_ZN3ccc9CC4x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y15E, buf);
    ::ccc::CC4x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC4x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y15E);
    dp->::ccc::CC4x11y15::~CC4x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y15E(Test__ZN3ccc9CC4x11y15E, "_ZN3ccc9CC4x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y15C1Ev();
extern void _ZN3ccc9CC4x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y15E[] = {
  NSPAIR(_ZN3ccc9CC4x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x11y15E[] = {
  {&(_ZTVN3ccc9CC4x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x11y15E[];
Class_Descriptor cd__ZN3ccc9CC4x11y15E = {  "_ZN3ccc9CC4x11y15E", // class name
  bases__ZN3ccc9CC4x11y15E, 2,
  &(vtc__ZN3ccc9CC4x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x11y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x11y15  : virtual ::ccc::AA4 , virtual ::ccc::BB11 {
  ~DD4x11y15(); // tgen
  DD4x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD4x11y15 ::~DD4x11y15(){ note_dtor("_ZN3ccc9DD4x11y15E", this);} // tgen
ccc::DD4x11y15 ::DD4x11y15(){ note_ctor("_ZN3ccc9DD4x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x11y15E, buf);
    ::ccc::DD4x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x11y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD4x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x11y15E);
    dp->::ccc::DD4x11y15::~DD4x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x11y15E(Test__ZN3ccc9DD4x11y15E, "_ZN3ccc9DD4x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x11y15C1Ev();
extern void _ZN3ccc9DD4x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x11y15E[] = {
  NSPAIR(_ZN3ccc9DD4x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD4x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x11y15E[] = {
  {&(_ZTVN3ccc9DD4x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD4x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x11y15E[];
Class_Descriptor cd__ZN3ccc9DD4x11y15E = {  "_ZN3ccc9DD4x11y15E", // class name
  bases__ZN3ccc9DD4x11y15E, 2,
  &(vtc__ZN3ccc9DD4x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x11y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y0  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y03pqrEv
  ~CC4x12y0(); // tgen
  CC4x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y0E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y03abcEv");}
void  ccc::CC4x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y03efgEv");}
void  ccc::CC4x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y03pqrEv");}
ccc::CC4x12y0 ::~CC4x12y0(){ note_dtor("_ZN3ccc8CC4x12y0E", this);} // tgen
ccc::CC4x12y0 ::CC4x12y0(){ note_ctor("_ZN3ccc8CC4x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y0E, buf);
    ::ccc::CC4x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y0E);
    dp->::ccc::CC4x12y0::~CC4x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y0E(Test__ZN3ccc8CC4x12y0E, "_ZN3ccc8CC4x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y0C1Ev();
extern void _ZN3ccc8CC4x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y0E[] = {
  NSPAIR(_ZN3ccc8CC4x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y0E[];
extern void _ZN3ccc8CC4x12y03abcEv();
extern void _ZN3ccc8CC4x12y03efgEv();
extern void _ZN3ccc8CC4x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y03pqrEv,_ZTv0_n12_N3ccc8CC4x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y03pqrEv,_ZThn4_N3ccc8CC4x12y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y03abcEv,_ZTv0_n16_N3ccc8CC4x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y03abcEv,_ZThn4_N3ccc8CC4x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y03efgEv,_ZTv0_n20_N3ccc8CC4x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y03efgEv,_ZThn4_N3ccc8CC4x12y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y03pqrEv,_ZTv0_n12_N3ccc8CC4x12y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y03abcEv,_ZTv0_n16_N3ccc8CC4x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y03efgEv,_ZTv0_n20_N3ccc8CC4x12y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y0E[] = {
  {&(_ZTVN3ccc8CC4x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y0E[];
static VTBL_ENTRY alt_thunk_names2083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y03efgEv,_ZTv0_n20_N3ccc8CC4x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y03efgEv,_ZThn4_N3ccc8CC4x12y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y03abcEv,_ZTv0_n16_N3ccc8CC4x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y03abcEv,_ZThn4_N3ccc8CC4x12y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y03pqrEv,_ZTv0_n12_N3ccc8CC4x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y03pqrEv,_ZThn4_N3ccc8CC4x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y0E = {  "_ZN3ccc8CC4x12y0E", // class name
  bases__ZN3ccc8CC4x12y0E, 2,
  &(vtc__ZN3ccc8CC4x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2083,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y0  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD4x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y03pqrEv
  ~DD4x12y0(); // tgen
  DD4x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y03abcEv");}
void  ccc::DD4x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y03efgEv");}
void  ccc::DD4x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y03pqrEv");}
ccc::DD4x12y0 ::~DD4x12y0(){ note_dtor("_ZN3ccc8DD4x12y0E", this);} // tgen
ccc::DD4x12y0 ::DD4x12y0(){ note_ctor("_ZN3ccc8DD4x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y0E, buf);
    ::ccc::DD4x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y0E);
    dp->::ccc::DD4x12y0::~DD4x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y0E(Test__ZN3ccc8DD4x12y0E, "_ZN3ccc8DD4x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y0C1Ev();
extern void _ZN3ccc8DD4x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y0E[] = {
  NSPAIR(_ZN3ccc8DD4x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y0E[];
extern void _ZN3ccc8DD4x12y03pqrEv();
extern void _ZN3ccc8DD4x12y03abcEv();
extern void _ZN3ccc8DD4x12y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y03abcEv,_ZTv0_n12_N3ccc8DD4x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y03abcEv,_ZThn4_N3ccc8DD4x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y03abcEv,_ZTv0_n12_N3ccc8DD4x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y0E[] = {
  {&(_ZTVN3ccc8DD4x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y0E[];
static VTBL_ENTRY alt_thunk_names2084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y03abcEv,_ZTv0_n12_N3ccc8DD4x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y03abcEv,_ZThn4_N3ccc8DD4x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y0E = {  "_ZN3ccc8DD4x12y0E", // class name
  bases__ZN3ccc8DD4x12y0E, 2,
  &(vtc__ZN3ccc8DD4x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2084,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y1  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x12y13efgEv
  ~CC4x12y1(); // tgen
  CC4x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y1E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y13abcEv");}
void  ccc::CC4x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y13pqrEv");}
void  ccc::CC4x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y13efgEv");}
ccc::CC4x12y1 ::~CC4x12y1(){ note_dtor("_ZN3ccc8CC4x12y1E", this);} // tgen
ccc::CC4x12y1 ::CC4x12y1(){ note_ctor("_ZN3ccc8CC4x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y1E, buf);
    ::ccc::CC4x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y1E);
    dp->::ccc::CC4x12y1::~CC4x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y1E(Test__ZN3ccc8CC4x12y1E, "_ZN3ccc8CC4x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y1C1Ev();
extern void _ZN3ccc8CC4x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y1E[] = {
  NSPAIR(_ZN3ccc8CC4x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y1E[];
extern void _ZN3ccc8CC4x12y13abcEv();
extern void _ZN3ccc8CC4x12y13pqrEv();
extern void _ZN3ccc8CC4x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y13pqrEv,_ZTv0_n12_N3ccc8CC4x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y13pqrEv,_ZThn4_N3ccc8CC4x12y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y13abcEv,_ZTv0_n16_N3ccc8CC4x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y13abcEv,_ZThn4_N3ccc8CC4x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y13efgEv,_ZTv0_n20_N3ccc8CC4x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y13efgEv,_ZThn4_N3ccc8CC4x12y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y13pqrEv,_ZTv0_n12_N3ccc8CC4x12y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y13abcEv,_ZTv0_n16_N3ccc8CC4x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y13efgEv,_ZTv0_n20_N3ccc8CC4x12y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y1E[] = {
  {&(_ZTVN3ccc8CC4x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y1E[];
static VTBL_ENTRY alt_thunk_names2085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y13efgEv,_ZTv0_n20_N3ccc8CC4x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y13efgEv,_ZThn4_N3ccc8CC4x12y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y13abcEv,_ZTv0_n16_N3ccc8CC4x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y13abcEv,_ZThn4_N3ccc8CC4x12y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y13pqrEv,_ZTv0_n12_N3ccc8CC4x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y13pqrEv,_ZThn4_N3ccc8CC4x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y1E = {  "_ZN3ccc8CC4x12y1E", // class name
  bases__ZN3ccc8CC4x12y1E, 2,
  &(vtc__ZN3ccc8CC4x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2085,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y1  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD4x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x12y13efgEv
  ~DD4x12y1(); // tgen
  DD4x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y13abcEv");}
void  ccc::DD4x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y13pqrEv");}
void  ccc::DD4x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y13efgEv");}
ccc::DD4x12y1 ::~DD4x12y1(){ note_dtor("_ZN3ccc8DD4x12y1E", this);} // tgen
ccc::DD4x12y1 ::DD4x12y1(){ note_ctor("_ZN3ccc8DD4x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y1E, buf);
    ::ccc::DD4x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y1E);
    dp->::ccc::DD4x12y1::~DD4x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y1E(Test__ZN3ccc8DD4x12y1E, "_ZN3ccc8DD4x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y1C1Ev();
extern void _ZN3ccc8DD4x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y1E[] = {
  NSPAIR(_ZN3ccc8DD4x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y1E[];
extern void _ZN3ccc8DD4x12y13pqrEv();
extern void _ZN3ccc8DD4x12y13abcEv();
extern void _ZN3ccc8DD4x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y13abcEv,_ZTv0_n12_N3ccc8DD4x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y13abcEv,_ZThn4_N3ccc8DD4x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y13abcEv,_ZTv0_n12_N3ccc8DD4x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y1E[] = {
  {&(_ZTVN3ccc8DD4x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y1E[];
static VTBL_ENTRY alt_thunk_names2086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y13abcEv,_ZTv0_n12_N3ccc8DD4x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y13abcEv,_ZThn4_N3ccc8DD4x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y1E = {  "_ZN3ccc8DD4x12y1E", // class name
  bases__ZN3ccc8DD4x12y1E, 2,
  &(vtc__ZN3ccc8DD4x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2086,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y2  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y23pqrEv
  ~CC4x12y2(); // tgen
  CC4x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y2E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y23efgEv");}
void  ccc::CC4x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y23abcEv");}
void  ccc::CC4x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y23pqrEv");}
ccc::CC4x12y2 ::~CC4x12y2(){ note_dtor("_ZN3ccc8CC4x12y2E", this);} // tgen
ccc::CC4x12y2 ::CC4x12y2(){ note_ctor("_ZN3ccc8CC4x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y2E, buf);
    ::ccc::CC4x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y2E);
    dp->::ccc::CC4x12y2::~CC4x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y2E(Test__ZN3ccc8CC4x12y2E, "_ZN3ccc8CC4x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y2C1Ev();
extern void _ZN3ccc8CC4x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y2E[] = {
  NSPAIR(_ZN3ccc8CC4x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y2E[];
extern void _ZN3ccc8CC4x12y23abcEv();
extern void _ZN3ccc8CC4x12y23efgEv();
extern void _ZN3ccc8CC4x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y23pqrEv,_ZTv0_n12_N3ccc8CC4x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y23pqrEv,_ZThn4_N3ccc8CC4x12y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y23abcEv,_ZTv0_n16_N3ccc8CC4x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y23abcEv,_ZThn4_N3ccc8CC4x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y23efgEv,_ZTv0_n20_N3ccc8CC4x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y23efgEv,_ZThn4_N3ccc8CC4x12y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y23pqrEv,_ZTv0_n12_N3ccc8CC4x12y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y23abcEv,_ZTv0_n16_N3ccc8CC4x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y23efgEv,_ZTv0_n20_N3ccc8CC4x12y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y2E[] = {
  {&(_ZTVN3ccc8CC4x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y2E[];
static VTBL_ENTRY alt_thunk_names2087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y23efgEv,_ZTv0_n20_N3ccc8CC4x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y23efgEv,_ZThn4_N3ccc8CC4x12y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y23abcEv,_ZTv0_n16_N3ccc8CC4x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y23abcEv,_ZThn4_N3ccc8CC4x12y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y23pqrEv,_ZTv0_n12_N3ccc8CC4x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y23pqrEv,_ZThn4_N3ccc8CC4x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y2E = {  "_ZN3ccc8CC4x12y2E", // class name
  bases__ZN3ccc8CC4x12y2E, 2,
  &(vtc__ZN3ccc8CC4x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2087,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y2  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD4x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y23pqrEv
  ~DD4x12y2(); // tgen
  DD4x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y23efgEv");}
void  ccc::DD4x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y23abcEv");}
void  ccc::DD4x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y23pqrEv");}
ccc::DD4x12y2 ::~DD4x12y2(){ note_dtor("_ZN3ccc8DD4x12y2E", this);} // tgen
ccc::DD4x12y2 ::DD4x12y2(){ note_ctor("_ZN3ccc8DD4x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y2E, buf);
    ::ccc::DD4x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y2E);
    dp->::ccc::DD4x12y2::~DD4x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y2E(Test__ZN3ccc8DD4x12y2E, "_ZN3ccc8DD4x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y2C1Ev();
extern void _ZN3ccc8DD4x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y2E[] = {
  NSPAIR(_ZN3ccc8DD4x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y2E[];
extern void _ZN3ccc8DD4x12y23pqrEv();
extern void _ZN3ccc8DD4x12y23abcEv();
extern void _ZN3ccc8DD4x12y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y23abcEv,_ZTv0_n12_N3ccc8DD4x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y23abcEv,_ZThn4_N3ccc8DD4x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y23abcEv,_ZTv0_n12_N3ccc8DD4x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y2E[] = {
  {&(_ZTVN3ccc8DD4x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y2E[];
static VTBL_ENTRY alt_thunk_names2088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y23abcEv,_ZTv0_n12_N3ccc8DD4x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y23abcEv,_ZThn4_N3ccc8DD4x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y2E = {  "_ZN3ccc8DD4x12y2E", // class name
  bases__ZN3ccc8DD4x12y2E, 2,
  &(vtc__ZN3ccc8DD4x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2088,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y3  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x12y33abcEv
  ~CC4x12y3(); // tgen
  CC4x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y3E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y33efgEv");}
void  ccc::CC4x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y33pqrEv");}
void  ccc::CC4x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y33abcEv");}
ccc::CC4x12y3 ::~CC4x12y3(){ note_dtor("_ZN3ccc8CC4x12y3E", this);} // tgen
ccc::CC4x12y3 ::CC4x12y3(){ note_ctor("_ZN3ccc8CC4x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y3E, buf);
    ::ccc::CC4x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y3E);
    dp->::ccc::CC4x12y3::~CC4x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y3E(Test__ZN3ccc8CC4x12y3E, "_ZN3ccc8CC4x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y3C1Ev();
extern void _ZN3ccc8CC4x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y3E[] = {
  NSPAIR(_ZN3ccc8CC4x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y3E[];
extern void _ZN3ccc8CC4x12y33abcEv();
extern void _ZN3ccc8CC4x12y33efgEv();
extern void _ZN3ccc8CC4x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y33pqrEv,_ZTv0_n12_N3ccc8CC4x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y33pqrEv,_ZThn4_N3ccc8CC4x12y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y33abcEv,_ZTv0_n16_N3ccc8CC4x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y33abcEv,_ZThn4_N3ccc8CC4x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y33efgEv,_ZTv0_n20_N3ccc8CC4x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y33efgEv,_ZThn4_N3ccc8CC4x12y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y33pqrEv,_ZTv0_n12_N3ccc8CC4x12y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y33abcEv,_ZTv0_n16_N3ccc8CC4x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y33efgEv,_ZTv0_n20_N3ccc8CC4x12y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y3E[] = {
  {&(_ZTVN3ccc8CC4x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y3E[];
static VTBL_ENTRY alt_thunk_names2089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y33efgEv,_ZTv0_n20_N3ccc8CC4x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y33efgEv,_ZThn4_N3ccc8CC4x12y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y33abcEv,_ZTv0_n16_N3ccc8CC4x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y33abcEv,_ZThn4_N3ccc8CC4x12y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y33pqrEv,_ZTv0_n12_N3ccc8CC4x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y33pqrEv,_ZThn4_N3ccc8CC4x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y3E = {  "_ZN3ccc8CC4x12y3E", // class name
  bases__ZN3ccc8CC4x12y3E, 2,
  &(vtc__ZN3ccc8CC4x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2089,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y3  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD4x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x12y33abcEv
  ~DD4x12y3(); // tgen
  DD4x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y33efgEv");}
void  ccc::DD4x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y33pqrEv");}
void  ccc::DD4x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y33abcEv");}
ccc::DD4x12y3 ::~DD4x12y3(){ note_dtor("_ZN3ccc8DD4x12y3E", this);} // tgen
ccc::DD4x12y3 ::DD4x12y3(){ note_ctor("_ZN3ccc8DD4x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y3E, buf);
    ::ccc::DD4x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y3E);
    dp->::ccc::DD4x12y3::~DD4x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y3E(Test__ZN3ccc8DD4x12y3E, "_ZN3ccc8DD4x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y3C1Ev();
extern void _ZN3ccc8DD4x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y3E[] = {
  NSPAIR(_ZN3ccc8DD4x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y3E[];
extern void _ZN3ccc8DD4x12y33pqrEv();
extern void _ZN3ccc8DD4x12y33abcEv();
extern void _ZN3ccc8DD4x12y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y33abcEv,_ZTv0_n12_N3ccc8DD4x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y33abcEv,_ZThn4_N3ccc8DD4x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y33abcEv,_ZTv0_n12_N3ccc8DD4x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y3E[] = {
  {&(_ZTVN3ccc8DD4x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y3E[];
static VTBL_ENTRY alt_thunk_names2090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y33abcEv,_ZTv0_n12_N3ccc8DD4x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y33abcEv,_ZThn4_N3ccc8DD4x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y3E = {  "_ZN3ccc8DD4x12y3E", // class name
  bases__ZN3ccc8DD4x12y3E, 2,
  &(vtc__ZN3ccc8DD4x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2090,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y4  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC4x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y43efgEv
  ~CC4x12y4(); // tgen
  CC4x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y4E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y43pqrEv");}
void  ccc::CC4x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y43abcEv");}
void  ccc::CC4x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y43efgEv");}
ccc::CC4x12y4 ::~CC4x12y4(){ note_dtor("_ZN3ccc8CC4x12y4E", this);} // tgen
ccc::CC4x12y4 ::CC4x12y4(){ note_ctor("_ZN3ccc8CC4x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y4E, buf);
    ::ccc::CC4x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y4E);
    dp->::ccc::CC4x12y4::~CC4x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y4E(Test__ZN3ccc8CC4x12y4E, "_ZN3ccc8CC4x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y4C1Ev();
extern void _ZN3ccc8CC4x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y4E[] = {
  NSPAIR(_ZN3ccc8CC4x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y4E[];
extern void _ZN3ccc8CC4x12y43abcEv();
extern void _ZN3ccc8CC4x12y43pqrEv();
extern void _ZN3ccc8CC4x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y43pqrEv,_ZTv0_n12_N3ccc8CC4x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y43pqrEv,_ZThn4_N3ccc8CC4x12y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y43abcEv,_ZTv0_n16_N3ccc8CC4x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y43abcEv,_ZThn4_N3ccc8CC4x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y43efgEv,_ZTv0_n20_N3ccc8CC4x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y43efgEv,_ZThn4_N3ccc8CC4x12y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y43pqrEv,_ZTv0_n12_N3ccc8CC4x12y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y43abcEv,_ZTv0_n16_N3ccc8CC4x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y43efgEv,_ZTv0_n20_N3ccc8CC4x12y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y4E[] = {
  {&(_ZTVN3ccc8CC4x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y4E[];
static VTBL_ENTRY alt_thunk_names2091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y43efgEv,_ZTv0_n20_N3ccc8CC4x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y43efgEv,_ZThn4_N3ccc8CC4x12y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y43abcEv,_ZTv0_n16_N3ccc8CC4x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y43abcEv,_ZThn4_N3ccc8CC4x12y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y43pqrEv,_ZTv0_n12_N3ccc8CC4x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y43pqrEv,_ZThn4_N3ccc8CC4x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y4E = {  "_ZN3ccc8CC4x12y4E", // class name
  bases__ZN3ccc8CC4x12y4E, 2,
  &(vtc__ZN3ccc8CC4x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2091,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y4  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD4x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x12y43efgEv
  ~DD4x12y4(); // tgen
  DD4x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y43pqrEv");}
void  ccc::DD4x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y43abcEv");}
void  ccc::DD4x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y43efgEv");}
ccc::DD4x12y4 ::~DD4x12y4(){ note_dtor("_ZN3ccc8DD4x12y4E", this);} // tgen
ccc::DD4x12y4 ::DD4x12y4(){ note_ctor("_ZN3ccc8DD4x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y4E, buf);
    ::ccc::DD4x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y4E);
    dp->::ccc::DD4x12y4::~DD4x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y4E(Test__ZN3ccc8DD4x12y4E, "_ZN3ccc8DD4x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y4C1Ev();
extern void _ZN3ccc8DD4x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y4E[] = {
  NSPAIR(_ZN3ccc8DD4x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y4E[];
extern void _ZN3ccc8DD4x12y43pqrEv();
extern void _ZN3ccc8DD4x12y43abcEv();
extern void _ZN3ccc8DD4x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y43abcEv,_ZTv0_n12_N3ccc8DD4x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y43abcEv,_ZThn4_N3ccc8DD4x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y43abcEv,_ZTv0_n12_N3ccc8DD4x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y4E[] = {
  {&(_ZTVN3ccc8DD4x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y4E[];
static VTBL_ENTRY alt_thunk_names2092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y43abcEv,_ZTv0_n12_N3ccc8DD4x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y43abcEv,_ZThn4_N3ccc8DD4x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y4E = {  "_ZN3ccc8DD4x12y4E", // class name
  bases__ZN3ccc8DD4x12y4E, 2,
  &(vtc__ZN3ccc8DD4x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2092,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y5  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC4x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y53abcEv
  ~CC4x12y5(); // tgen
  CC4x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y5E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y53pqrEv");}
void  ccc::CC4x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y53efgEv");}
void  ccc::CC4x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y53abcEv");}
ccc::CC4x12y5 ::~CC4x12y5(){ note_dtor("_ZN3ccc8CC4x12y5E", this);} // tgen
ccc::CC4x12y5 ::CC4x12y5(){ note_ctor("_ZN3ccc8CC4x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y5E, buf);
    ::ccc::CC4x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y5E);
    dp->::ccc::CC4x12y5::~CC4x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y5E(Test__ZN3ccc8CC4x12y5E, "_ZN3ccc8CC4x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y5C1Ev();
extern void _ZN3ccc8CC4x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y5E[] = {
  NSPAIR(_ZN3ccc8CC4x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y5E[];
extern void _ZN3ccc8CC4x12y53abcEv();
extern void _ZN3ccc8CC4x12y53pqrEv();
extern void _ZN3ccc8CC4x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y53pqrEv,_ZTv0_n12_N3ccc8CC4x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y53pqrEv,_ZThn4_N3ccc8CC4x12y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y53abcEv,_ZTv0_n16_N3ccc8CC4x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y53abcEv,_ZThn4_N3ccc8CC4x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y53efgEv,_ZTv0_n20_N3ccc8CC4x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y53efgEv,_ZThn4_N3ccc8CC4x12y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y53pqrEv,_ZTv0_n12_N3ccc8CC4x12y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y53abcEv,_ZTv0_n16_N3ccc8CC4x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y53efgEv,_ZTv0_n20_N3ccc8CC4x12y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y5E[] = {
  {&(_ZTVN3ccc8CC4x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y5E[];
static VTBL_ENTRY alt_thunk_names2093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y53efgEv,_ZTv0_n20_N3ccc8CC4x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y53efgEv,_ZThn4_N3ccc8CC4x12y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y53abcEv,_ZTv0_n16_N3ccc8CC4x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y53abcEv,_ZThn4_N3ccc8CC4x12y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y53pqrEv,_ZTv0_n12_N3ccc8CC4x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y53pqrEv,_ZThn4_N3ccc8CC4x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y5E = {  "_ZN3ccc8CC4x12y5E", // class name
  bases__ZN3ccc8CC4x12y5E, 2,
  &(vtc__ZN3ccc8CC4x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2093,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y5  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD4x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x12y53abcEv
  ~DD4x12y5(); // tgen
  DD4x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y53pqrEv");}
void  ccc::DD4x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y53efgEv");}
void  ccc::DD4x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y53abcEv");}
ccc::DD4x12y5 ::~DD4x12y5(){ note_dtor("_ZN3ccc8DD4x12y5E", this);} // tgen
ccc::DD4x12y5 ::DD4x12y5(){ note_ctor("_ZN3ccc8DD4x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y5E, buf);
    ::ccc::DD4x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y5E);
    dp->::ccc::DD4x12y5::~DD4x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y5E(Test__ZN3ccc8DD4x12y5E, "_ZN3ccc8DD4x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y5C1Ev();
extern void _ZN3ccc8DD4x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y5E[] = {
  NSPAIR(_ZN3ccc8DD4x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y5E[];
extern void _ZN3ccc8DD4x12y53pqrEv();
extern void _ZN3ccc8DD4x12y53abcEv();
extern void _ZN3ccc8DD4x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y53abcEv,_ZTv0_n12_N3ccc8DD4x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y53abcEv,_ZThn4_N3ccc8DD4x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y53abcEv,_ZTv0_n12_N3ccc8DD4x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y5E[] = {
  {&(_ZTVN3ccc8DD4x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y5E[];
static VTBL_ENTRY alt_thunk_names2094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y53abcEv,_ZTv0_n12_N3ccc8DD4x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y53abcEv,_ZThn4_N3ccc8DD4x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y5E = {  "_ZN3ccc8DD4x12y5E", // class name
  bases__ZN3ccc8DD4x12y5E, 2,
  &(vtc__ZN3ccc8DD4x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2094,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y6  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y63efgEv
  ~CC4x12y6(); // tgen
  CC4x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y6E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y63abcEv");}
void  ccc::CC4x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y63efgEv");}
ccc::CC4x12y6 ::~CC4x12y6(){ note_dtor("_ZN3ccc8CC4x12y6E", this);} // tgen
ccc::CC4x12y6 ::CC4x12y6(){ note_ctor("_ZN3ccc8CC4x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y6E, buf);
    ::ccc::CC4x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y6E);
    dp->::ccc::CC4x12y6::~CC4x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y6E(Test__ZN3ccc8CC4x12y6E, "_ZN3ccc8CC4x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y6C1Ev();
extern void _ZN3ccc8CC4x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y6E[] = {
  NSPAIR(_ZN3ccc8CC4x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y6E[];
extern void _ZN3ccc8CC4x12y63abcEv();
extern void _ZN3ccc8CC4x12y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y63abcEv,_ZTv0_n16_N3ccc8CC4x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y63abcEv,_ZThn4_N3ccc8CC4x12y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y63efgEv,_ZTv0_n20_N3ccc8CC4x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y63efgEv,_ZThn4_N3ccc8CC4x12y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y63abcEv,_ZTv0_n16_N3ccc8CC4x12y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y63efgEv,_ZTv0_n20_N3ccc8CC4x12y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y6E[] = {
  {&(_ZTVN3ccc8CC4x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y6E[];
static VTBL_ENTRY alt_thunk_names2095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y63efgEv,_ZTv0_n20_N3ccc8CC4x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y63efgEv,_ZThn4_N3ccc8CC4x12y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y63abcEv,_ZTv0_n16_N3ccc8CC4x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y63abcEv,_ZThn4_N3ccc8CC4x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y6E = {  "_ZN3ccc8CC4x12y6E", // class name
  bases__ZN3ccc8CC4x12y6E, 2,
  &(vtc__ZN3ccc8CC4x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2095,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y6  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD4x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x12y63efgEv
  ~DD4x12y6(); // tgen
  DD4x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y63abcEv");}
void  ccc::DD4x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y63efgEv");}
ccc::DD4x12y6 ::~DD4x12y6(){ note_dtor("_ZN3ccc8DD4x12y6E", this);} // tgen
ccc::DD4x12y6 ::DD4x12y6(){ note_ctor("_ZN3ccc8DD4x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y6E, buf);
    ::ccc::DD4x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y6E);
    dp->::ccc::DD4x12y6::~DD4x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y6E(Test__ZN3ccc8DD4x12y6E, "_ZN3ccc8DD4x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y6C1Ev();
extern void _ZN3ccc8DD4x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y6E[] = {
  NSPAIR(_ZN3ccc8DD4x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x12y63abcEv();
extern void _ZN3ccc8DD4x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y63abcEv,_ZTv0_n12_N3ccc8DD4x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y63abcEv,_ZThn4_N3ccc8DD4x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y63abcEv,_ZTv0_n12_N3ccc8DD4x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y6E[] = {
  {&(_ZTVN3ccc8DD4x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y6E[];
static VTBL_ENTRY alt_thunk_names2096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y63abcEv,_ZTv0_n12_N3ccc8DD4x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y63abcEv,_ZThn4_N3ccc8DD4x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y6E = {  "_ZN3ccc8DD4x12y6E", // class name
  bases__ZN3ccc8DD4x12y6E, 2,
  &(vtc__ZN3ccc8DD4x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2096,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y7  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y73pqrEv
  ~CC4x12y7(); // tgen
  CC4x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y7E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y73abcEv");}
void  ccc::CC4x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y73pqrEv");}
ccc::CC4x12y7 ::~CC4x12y7(){ note_dtor("_ZN3ccc8CC4x12y7E", this);} // tgen
ccc::CC4x12y7 ::CC4x12y7(){ note_ctor("_ZN3ccc8CC4x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y7E, buf);
    ::ccc::CC4x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y7E);
    dp->::ccc::CC4x12y7::~CC4x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y7E(Test__ZN3ccc8CC4x12y7E, "_ZN3ccc8CC4x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y7C1Ev();
extern void _ZN3ccc8CC4x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y7E[] = {
  NSPAIR(_ZN3ccc8CC4x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y7E[];
extern void _ZN3ccc8CC4x12y73abcEv();
extern void _ZN3ccc8CC4x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y73pqrEv,_ZTv0_n12_N3ccc8CC4x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y73pqrEv,_ZThn4_N3ccc8CC4x12y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y73abcEv,_ZTv0_n16_N3ccc8CC4x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y73abcEv,_ZThn4_N3ccc8CC4x12y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y73pqrEv,_ZTv0_n12_N3ccc8CC4x12y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y73abcEv,_ZTv0_n16_N3ccc8CC4x12y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y7E[] = {
  {&(_ZTVN3ccc8CC4x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y7E[];
static VTBL_ENTRY alt_thunk_names2097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y73abcEv,_ZTv0_n16_N3ccc8CC4x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y73abcEv,_ZThn4_N3ccc8CC4x12y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y73pqrEv,_ZTv0_n12_N3ccc8CC4x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y73pqrEv,_ZThn4_N3ccc8CC4x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y7E = {  "_ZN3ccc8CC4x12y7E", // class name
  bases__ZN3ccc8CC4x12y7E, 2,
  &(vtc__ZN3ccc8CC4x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2097,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y7  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD4x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y73pqrEv
  ~DD4x12y7(); // tgen
  DD4x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y73abcEv");}
void  ccc::DD4x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y73pqrEv");}
ccc::DD4x12y7 ::~DD4x12y7(){ note_dtor("_ZN3ccc8DD4x12y7E", this);} // tgen
ccc::DD4x12y7 ::DD4x12y7(){ note_ctor("_ZN3ccc8DD4x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y7E, buf);
    ::ccc::DD4x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y7E);
    dp->::ccc::DD4x12y7::~DD4x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y7E(Test__ZN3ccc8DD4x12y7E, "_ZN3ccc8DD4x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y7C1Ev();
extern void _ZN3ccc8DD4x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y7E[] = {
  NSPAIR(_ZN3ccc8DD4x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y7E[];
extern void _ZN3ccc8DD4x12y73pqrEv();
extern void _ZN3ccc8DD4x12y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y73abcEv,_ZTv0_n12_N3ccc8DD4x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y73abcEv,_ZThn4_N3ccc8DD4x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y73abcEv,_ZTv0_n12_N3ccc8DD4x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y7E[] = {
  {&(_ZTVN3ccc8DD4x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y7E[];
static VTBL_ENTRY alt_thunk_names2098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y73abcEv,_ZTv0_n12_N3ccc8DD4x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y73abcEv,_ZThn4_N3ccc8DD4x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y7E = {  "_ZN3ccc8DD4x12y7E", // class name
  bases__ZN3ccc8DD4x12y7E, 2,
  &(vtc__ZN3ccc8DD4x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2098,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y8  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y83abcEv
  ~CC4x12y8(); // tgen
  CC4x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y8E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y83efgEv");}
void  ccc::CC4x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y83abcEv");}
ccc::CC4x12y8 ::~CC4x12y8(){ note_dtor("_ZN3ccc8CC4x12y8E", this);} // tgen
ccc::CC4x12y8 ::CC4x12y8(){ note_ctor("_ZN3ccc8CC4x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y8E, buf);
    ::ccc::CC4x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y8E);
    dp->::ccc::CC4x12y8::~CC4x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y8E(Test__ZN3ccc8CC4x12y8E, "_ZN3ccc8CC4x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y8C1Ev();
extern void _ZN3ccc8CC4x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y8E[] = {
  NSPAIR(_ZN3ccc8CC4x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y8E[];
extern void _ZN3ccc8CC4x12y83abcEv();
extern void _ZN3ccc8CC4x12y83efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x12y83abcEv,_ZTv0_n16_N3ccc8CC4x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y83abcEv,_ZThn4_N3ccc8CC4x12y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y83efgEv,_ZTv0_n20_N3ccc8CC4x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y83efgEv,_ZThn4_N3ccc8CC4x12y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x12y83abcEv,_ZTv0_n16_N3ccc8CC4x12y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y83efgEv,_ZTv0_n20_N3ccc8CC4x12y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y8E[] = {
  {&(_ZTVN3ccc8CC4x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y8E[];
static VTBL_ENTRY alt_thunk_names2099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y83efgEv,_ZTv0_n20_N3ccc8CC4x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y83efgEv,_ZThn4_N3ccc8CC4x12y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x12y83abcEv,_ZTv0_n16_N3ccc8CC4x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y83abcEv,_ZThn4_N3ccc8CC4x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y8E = {  "_ZN3ccc8CC4x12y8E", // class name
  bases__ZN3ccc8CC4x12y8E, 2,
  &(vtc__ZN3ccc8CC4x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2099,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y8  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD4x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x12y83abcEv
  ~DD4x12y8(); // tgen
  DD4x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y83efgEv");}
void  ccc::DD4x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x12y83abcEv");}
ccc::DD4x12y8 ::~DD4x12y8(){ note_dtor("_ZN3ccc8DD4x12y8E", this);} // tgen
ccc::DD4x12y8 ::DD4x12y8(){ note_ctor("_ZN3ccc8DD4x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y8E, buf);
    ::ccc::DD4x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y8E);
    dp->::ccc::DD4x12y8::~DD4x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y8E(Test__ZN3ccc8DD4x12y8E, "_ZN3ccc8DD4x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y8C1Ev();
extern void _ZN3ccc8DD4x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y8E[] = {
  NSPAIR(_ZN3ccc8DD4x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x12y83abcEv();
extern void _ZN3ccc8DD4x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x12y83abcEv,_ZTv0_n12_N3ccc8DD4x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x12y83abcEv,_ZThn4_N3ccc8DD4x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x12y83abcEv,_ZTv0_n12_N3ccc8DD4x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y8E[] = {
  {&(_ZTVN3ccc8DD4x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y8E[];
static VTBL_ENTRY alt_thunk_names2100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x12y83abcEv,_ZTv0_n12_N3ccc8DD4x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x12y83abcEv,_ZThn4_N3ccc8DD4x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x12y8E = {  "_ZN3ccc8DD4x12y8E", // class name
  bases__ZN3ccc8DD4x12y8E, 2,
  &(vtc__ZN3ccc8DD4x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y9  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y93pqrEv
  ~CC4x12y9(); // tgen
  CC4x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y9E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y93efgEv");}
void  ccc::CC4x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y93pqrEv");}
ccc::CC4x12y9 ::~CC4x12y9(){ note_dtor("_ZN3ccc8CC4x12y9E", this);} // tgen
ccc::CC4x12y9 ::CC4x12y9(){ note_ctor("_ZN3ccc8CC4x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y9E, buf);
    ::ccc::CC4x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC4x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y9E);
    dp->::ccc::CC4x12y9::~CC4x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y9E(Test__ZN3ccc8CC4x12y9E, "_ZN3ccc8CC4x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y9C1Ev();
extern void _ZN3ccc8CC4x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y9E[] = {
  NSPAIR(_ZN3ccc8CC4x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC4x12y93efgEv();
extern void _ZN3ccc8CC4x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x12y93pqrEv,_ZTv0_n12_N3ccc8CC4x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y93pqrEv,_ZThn4_N3ccc8CC4x12y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x12y93efgEv,_ZTv0_n20_N3ccc8CC4x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y93efgEv,_ZThn4_N3ccc8CC4x12y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x12y93pqrEv,_ZTv0_n12_N3ccc8CC4x12y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x12y93efgEv,_ZTv0_n20_N3ccc8CC4x12y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x12y9E[] = {
  {&(_ZTVN3ccc8CC4x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x12y9E[];
static VTBL_ENTRY alt_thunk_names2101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x12y93efgEv,_ZTv0_n20_N3ccc8CC4x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y93efgEv,_ZThn4_N3ccc8CC4x12y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x12y93pqrEv,_ZTv0_n12_N3ccc8CC4x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x12y93pqrEv,_ZThn4_N3ccc8CC4x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x12y9E = {  "_ZN3ccc8CC4x12y9E", // class name
  bases__ZN3ccc8CC4x12y9E, 2,
  &(vtc__ZN3ccc8CC4x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x12y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y9  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD4x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x12y93pqrEv
  ~DD4x12y9(); // tgen
  DD4x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x12y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x12y93efgEv");}
void  ccc::DD4x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x12y93pqrEv");}
ccc::DD4x12y9 ::~DD4x12y9(){ note_dtor("_ZN3ccc8DD4x12y9E", this);} // tgen
ccc::DD4x12y9 ::DD4x12y9(){ note_ctor("_ZN3ccc8DD4x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x12y9E, buf);
    ::ccc::DD4x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x12y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD4x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x12y9E);
    dp->::ccc::DD4x12y9::~DD4x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x12y9E(Test__ZN3ccc8DD4x12y9E, "_ZN3ccc8DD4x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x12y9C1Ev();
extern void _ZN3ccc8DD4x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x12y9E[] = {
  NSPAIR(_ZN3ccc8DD4x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD4x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y9E[];
extern void _ZN3ccc8DD4x12y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x12y93efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x12y9E[] = {
  {&(_ZTVN3ccc8DD4x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x12y9E[];
Class_Descriptor cd__ZN3ccc8DD4x12y9E = {  "_ZN3ccc8DD4x12y9E", // class name
  bases__ZN3ccc8DD4x12y9E, 2,
  &(vtc__ZN3ccc8DD4x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x12y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y10  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x12y103abcEv
  ~CC4x12y10(); // tgen
  CC4x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y10E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y103pqrEv");}
void  ccc::CC4x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x12y103abcEv");}
ccc::CC4x12y10 ::~CC4x12y10(){ note_dtor("_ZN3ccc9CC4x12y10E", this);} // tgen
ccc::CC4x12y10 ::CC4x12y10(){ note_ctor("_ZN3ccc9CC4x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y10E, buf);
    ::ccc::CC4x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y10E);
    dp->::ccc::CC4x12y10::~CC4x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y10E(Test__ZN3ccc9CC4x12y10E, "_ZN3ccc9CC4x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y10C1Ev();
extern void _ZN3ccc9CC4x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y10E[] = {
  NSPAIR(_ZN3ccc9CC4x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y10E[];
extern void _ZN3ccc9CC4x12y103abcEv();
extern void _ZN3ccc9CC4x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x12y103pqrEv,_ZTv0_n12_N3ccc9CC4x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y103pqrEv,_ZThn4_N3ccc9CC4x12y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x12y103abcEv,_ZTv0_n16_N3ccc9CC4x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y103abcEv,_ZThn4_N3ccc9CC4x12y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x12y103pqrEv,_ZTv0_n12_N3ccc9CC4x12y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x12y103abcEv,_ZTv0_n16_N3ccc9CC4x12y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y10E[] = {
  {&(_ZTVN3ccc9CC4x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y10E[];
static VTBL_ENTRY alt_thunk_names2102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x12y103abcEv,_ZTv0_n16_N3ccc9CC4x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y103abcEv,_ZThn4_N3ccc9CC4x12y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x12y103pqrEv,_ZTv0_n12_N3ccc9CC4x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y103pqrEv,_ZThn4_N3ccc9CC4x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x12y10E = {  "_ZN3ccc9CC4x12y10E", // class name
  bases__ZN3ccc9CC4x12y10E, 2,
  &(vtc__ZN3ccc9CC4x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y10  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD4x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x12y103abcEv
  ~DD4x12y10(); // tgen
  DD4x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x12y103pqrEv");}
void  ccc::DD4x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x12y103abcEv");}
ccc::DD4x12y10 ::~DD4x12y10(){ note_dtor("_ZN3ccc9DD4x12y10E", this);} // tgen
ccc::DD4x12y10 ::DD4x12y10(){ note_ctor("_ZN3ccc9DD4x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y10E, buf);
    ::ccc::DD4x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y10E);
    dp->::ccc::DD4x12y10::~DD4x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y10E(Test__ZN3ccc9DD4x12y10E, "_ZN3ccc9DD4x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y10C1Ev();
extern void _ZN3ccc9DD4x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y10E[] = {
  NSPAIR(_ZN3ccc9DD4x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y10E[];
extern void _ZN3ccc9DD4x12y103pqrEv();
extern void _ZN3ccc9DD4x12y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x12y103abcEv,_ZTv0_n12_N3ccc9DD4x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x12y103abcEv,_ZThn4_N3ccc9DD4x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x12y103abcEv,_ZTv0_n12_N3ccc9DD4x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y10E[] = {
  {&(_ZTVN3ccc9DD4x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y10E[];
static VTBL_ENTRY alt_thunk_names2103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x12y103abcEv,_ZTv0_n12_N3ccc9DD4x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x12y103abcEv,_ZThn4_N3ccc9DD4x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x12y10E = {  "_ZN3ccc9DD4x12y10E", // class name
  bases__ZN3ccc9DD4x12y10E, 2,
  &(vtc__ZN3ccc9DD4x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2103,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y11  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x12y113efgEv
  ~CC4x12y11(); // tgen
  CC4x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y11E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y113pqrEv");}
void  ccc::CC4x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x12y113efgEv");}
ccc::CC4x12y11 ::~CC4x12y11(){ note_dtor("_ZN3ccc9CC4x12y11E", this);} // tgen
ccc::CC4x12y11 ::CC4x12y11(){ note_ctor("_ZN3ccc9CC4x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y11E, buf);
    ::ccc::CC4x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y11E);
    dp->::ccc::CC4x12y11::~CC4x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y11E(Test__ZN3ccc9CC4x12y11E, "_ZN3ccc9CC4x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y11C1Ev();
extern void _ZN3ccc9CC4x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y11E[] = {
  NSPAIR(_ZN3ccc9CC4x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC4x12y113pqrEv();
extern void _ZN3ccc9CC4x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x12y113pqrEv,_ZTv0_n12_N3ccc9CC4x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y113pqrEv,_ZThn4_N3ccc9CC4x12y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x12y113efgEv,_ZTv0_n20_N3ccc9CC4x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y113efgEv,_ZThn4_N3ccc9CC4x12y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x12y113pqrEv,_ZTv0_n12_N3ccc9CC4x12y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x12y113efgEv,_ZTv0_n20_N3ccc9CC4x12y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y11E[] = {
  {&(_ZTVN3ccc9CC4x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y11E[];
static VTBL_ENTRY alt_thunk_names2104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x12y113efgEv,_ZTv0_n20_N3ccc9CC4x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y113efgEv,_ZThn4_N3ccc9CC4x12y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x12y113pqrEv,_ZTv0_n12_N3ccc9CC4x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y113pqrEv,_ZThn4_N3ccc9CC4x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x12y11E = {  "_ZN3ccc9CC4x12y11E", // class name
  bases__ZN3ccc9CC4x12y11E, 2,
  &(vtc__ZN3ccc9CC4x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2104,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y11  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD4x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x12y113efgEv
  ~DD4x12y11(); // tgen
  DD4x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x12y113pqrEv");}
void  ccc::DD4x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x12y113efgEv");}
ccc::DD4x12y11 ::~DD4x12y11(){ note_dtor("_ZN3ccc9DD4x12y11E", this);} // tgen
ccc::DD4x12y11 ::DD4x12y11(){ note_ctor("_ZN3ccc9DD4x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y11E, buf);
    ::ccc::DD4x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y11E);
    dp->::ccc::DD4x12y11::~DD4x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y11E(Test__ZN3ccc9DD4x12y11E, "_ZN3ccc9DD4x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y11C1Ev();
extern void _ZN3ccc9DD4x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y11E[] = {
  NSPAIR(_ZN3ccc9DD4x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y11E[];
extern void _ZN3ccc9DD4x12y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y11E[] = {
  {&(_ZTVN3ccc9DD4x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y11E[];
Class_Descriptor cd__ZN3ccc9DD4x12y11E = {  "_ZN3ccc9DD4x12y11E", // class name
  bases__ZN3ccc9DD4x12y11E, 2,
  &(vtc__ZN3ccc9DD4x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y12  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC4x12y123abcEv
  ~CC4x12y12(); // tgen
  CC4x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y12E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x12y123abcEv");}
ccc::CC4x12y12 ::~CC4x12y12(){ note_dtor("_ZN3ccc9CC4x12y12E", this);} // tgen
ccc::CC4x12y12 ::CC4x12y12(){ note_ctor("_ZN3ccc9CC4x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y12E, buf);
    ::ccc::CC4x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y12E);
    dp->::ccc::CC4x12y12::~CC4x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y12E(Test__ZN3ccc9CC4x12y12E, "_ZN3ccc9CC4x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y12C1Ev();
extern void _ZN3ccc9CC4x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y12E[] = {
  NSPAIR(_ZN3ccc9CC4x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y12E[];
extern void _ZN3ccc9CC4x12y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x12y123abcEv,_ZTv0_n16_N3ccc9CC4x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y123abcEv,_ZThn4_N3ccc9CC4x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x12y123abcEv,_ZTv0_n16_N3ccc9CC4x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y12E[] = {
  {&(_ZTVN3ccc9CC4x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y12E[];
static VTBL_ENTRY alt_thunk_names2105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x12y123abcEv,_ZTv0_n16_N3ccc9CC4x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y123abcEv,_ZThn4_N3ccc9CC4x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x12y12E = {  "_ZN3ccc9CC4x12y12E", // class name
  bases__ZN3ccc9CC4x12y12E, 2,
  &(vtc__ZN3ccc9CC4x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2105,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y12  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD4x12y123abcEv
  ~DD4x12y12(); // tgen
  DD4x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD4x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x12y123abcEv");}
ccc::DD4x12y12 ::~DD4x12y12(){ note_dtor("_ZN3ccc9DD4x12y12E", this);} // tgen
ccc::DD4x12y12 ::DD4x12y12(){ note_ctor("_ZN3ccc9DD4x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y12E, buf);
    ::ccc::DD4x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y12E);
    dp->::ccc::DD4x12y12::~DD4x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y12E(Test__ZN3ccc9DD4x12y12E, "_ZN3ccc9DD4x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y12C1Ev();
extern void _ZN3ccc9DD4x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y12E[] = {
  NSPAIR(_ZN3ccc9DD4x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x12y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x12y123abcEv,_ZTv0_n12_N3ccc9DD4x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x12y123abcEv,_ZThn4_N3ccc9DD4x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x12y123abcEv,_ZTv0_n12_N3ccc9DD4x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y12E[] = {
  {&(_ZTVN3ccc9DD4x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y12E[];
static VTBL_ENTRY alt_thunk_names2106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x12y123abcEv,_ZTv0_n12_N3ccc9DD4x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x12y123abcEv,_ZThn4_N3ccc9DD4x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x12y12E = {  "_ZN3ccc9DD4x12y12E", // class name
  bases__ZN3ccc9DD4x12y12E, 2,
  &(vtc__ZN3ccc9DD4x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2106,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y13  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC4x12y133efgEv
  ~CC4x12y13(); // tgen
  CC4x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x12y133efgEv");}
ccc::CC4x12y13 ::~CC4x12y13(){ note_dtor("_ZN3ccc9CC4x12y13E", this);} // tgen
ccc::CC4x12y13 ::CC4x12y13(){ note_ctor("_ZN3ccc9CC4x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y13E, buf);
    ::ccc::CC4x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y13E);
    dp->::ccc::CC4x12y13::~CC4x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y13E(Test__ZN3ccc9CC4x12y13E, "_ZN3ccc9CC4x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y13C1Ev();
extern void _ZN3ccc9CC4x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y13E[] = {
  NSPAIR(_ZN3ccc9CC4x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC4x12y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x12y133efgEv,_ZTv0_n20_N3ccc9CC4x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y133efgEv,_ZThn4_N3ccc9CC4x12y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x12y133efgEv,_ZTv0_n20_N3ccc9CC4x12y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y13E[] = {
  {&(_ZTVN3ccc9CC4x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y13E[];
static VTBL_ENTRY alt_thunk_names2107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x12y133efgEv,_ZTv0_n20_N3ccc9CC4x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y133efgEv,_ZThn4_N3ccc9CC4x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x12y13E = {  "_ZN3ccc9CC4x12y13E", // class name
  bases__ZN3ccc9CC4x12y13E, 2,
  &(vtc__ZN3ccc9CC4x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2107,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y13  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD4x12y133efgEv
  ~DD4x12y13(); // tgen
  DD4x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x12y133efgEv");}
ccc::DD4x12y13 ::~DD4x12y13(){ note_dtor("_ZN3ccc9DD4x12y13E", this);} // tgen
ccc::DD4x12y13 ::DD4x12y13(){ note_ctor("_ZN3ccc9DD4x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y13E, buf);
    ::ccc::DD4x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y13E);
    dp->::ccc::DD4x12y13::~DD4x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y13E(Test__ZN3ccc9DD4x12y13E, "_ZN3ccc9DD4x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y13C1Ev();
extern void _ZN3ccc9DD4x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y13E[] = {
  NSPAIR(_ZN3ccc9DD4x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y13E[] = {
  {&(_ZTVN3ccc9DD4x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y13E[];
Class_Descriptor cd__ZN3ccc9DD4x12y13E = {  "_ZN3ccc9DD4x12y13E", // class name
  bases__ZN3ccc9DD4x12y13E, 2,
  &(vtc__ZN3ccc9DD4x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y14  : virtual ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y143pqrEv
  ~CC4x12y14(); // tgen
  CC4x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y143pqrEv");}
ccc::CC4x12y14 ::~CC4x12y14(){ note_dtor("_ZN3ccc9CC4x12y14E", this);} // tgen
ccc::CC4x12y14 ::CC4x12y14(){ note_ctor("_ZN3ccc9CC4x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y14E, buf);
    ::ccc::CC4x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y14E);
    dp->::ccc::CC4x12y14::~CC4x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y14E(Test__ZN3ccc9CC4x12y14E, "_ZN3ccc9CC4x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y14C1Ev();
extern void _ZN3ccc9CC4x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y14E[] = {
  NSPAIR(_ZN3ccc9CC4x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC4x12y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x12y143pqrEv,_ZTv0_n12_N3ccc9CC4x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y143pqrEv,_ZThn4_N3ccc9CC4x12y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x12y143pqrEv,_ZTv0_n12_N3ccc9CC4x12y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y14E[] = {
  {&(_ZTVN3ccc9CC4x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y14E[];
static VTBL_ENTRY alt_thunk_names2108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x12y143pqrEv,_ZTv0_n12_N3ccc9CC4x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x12y143pqrEv,_ZThn4_N3ccc9CC4x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x12y14E = {  "_ZN3ccc9CC4x12y14E", // class name
  bases__ZN3ccc9CC4x12y14E, 2,
  &(vtc__ZN3ccc9CC4x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y14  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD4x12y143pqrEv
  ~DD4x12y14(); // tgen
  DD4x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x12y143pqrEv");}
ccc::DD4x12y14 ::~DD4x12y14(){ note_dtor("_ZN3ccc9DD4x12y14E", this);} // tgen
ccc::DD4x12y14 ::DD4x12y14(){ note_ctor("_ZN3ccc9DD4x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y14E, buf);
    ::ccc::DD4x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y14E);
    dp->::ccc::DD4x12y14::~DD4x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y14E(Test__ZN3ccc9DD4x12y14E, "_ZN3ccc9DD4x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y14C1Ev();
extern void _ZN3ccc9DD4x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y14E[] = {
  NSPAIR(_ZN3ccc9DD4x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y14E[];
extern void _ZN3ccc9DD4x12y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y14E[] = {
  {&(_ZTVN3ccc9DD4x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y14E[];
Class_Descriptor cd__ZN3ccc9DD4x12y14E = {  "_ZN3ccc9DD4x12y14E", // class name
  bases__ZN3ccc9DD4x12y14E, 2,
  &(vtc__ZN3ccc9DD4x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y15  : virtual ::ccc::AA4 , ::ccc::BB12 {
  ~CC4x12y15(); // tgen
  CC4x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x12y15 ::~CC4x12y15(){ note_dtor("_ZN3ccc9CC4x12y15E", this);} // tgen
ccc::CC4x12y15 ::CC4x12y15(){ note_ctor("_ZN3ccc9CC4x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y15E, buf);
    ::ccc::CC4x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC4x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y15E);
    dp->::ccc::CC4x12y15::~CC4x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y15E(Test__ZN3ccc9CC4x12y15E, "_ZN3ccc9CC4x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y15C1Ev();
extern void _ZN3ccc9CC4x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y15E[] = {
  NSPAIR(_ZN3ccc9CC4x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x12y15E[] = {
  {&(_ZTVN3ccc9CC4x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x12y15E[];
Class_Descriptor cd__ZN3ccc9CC4x12y15E = {  "_ZN3ccc9CC4x12y15E", // class name
  bases__ZN3ccc9CC4x12y15E, 2,
  &(vtc__ZN3ccc9CC4x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x12y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x12y15  : virtual ::ccc::AA4 , virtual ::ccc::BB12 {
  ~DD4x12y15(); // tgen
  DD4x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD4x12y15 ::~DD4x12y15(){ note_dtor("_ZN3ccc9DD4x12y15E", this);} // tgen
ccc::DD4x12y15 ::DD4x12y15(){ note_ctor("_ZN3ccc9DD4x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x12y15E, buf);
    ::ccc::DD4x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x12y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD4x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x12y15E);
    dp->::ccc::DD4x12y15::~DD4x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x12y15E(Test__ZN3ccc9DD4x12y15E, "_ZN3ccc9DD4x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x12y15C1Ev();
extern void _ZN3ccc9DD4x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x12y15E[] = {
  NSPAIR(_ZN3ccc9DD4x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD4x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x12y15E[] = {
  {&(_ZTVN3ccc9DD4x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x12y15E[];
Class_Descriptor cd__ZN3ccc9DD4x12y15E = {  "_ZN3ccc9DD4x12y15E", // class name
  bases__ZN3ccc9DD4x12y15E, 2,
  &(vtc__ZN3ccc9DD4x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x12y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y0  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y03pqrEv
  ~CC4x13y0(); // tgen
  CC4x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y0E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y03abcEv");}
void  ccc::CC4x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y03efgEv");}
void  ccc::CC4x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y03pqrEv");}
ccc::CC4x13y0 ::~CC4x13y0(){ note_dtor("_ZN3ccc8CC4x13y0E", this);} // tgen
ccc::CC4x13y0 ::CC4x13y0(){ note_ctor("_ZN3ccc8CC4x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y0E, buf);
    ::ccc::CC4x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y0E);
    dp->::ccc::CC4x13y0::~CC4x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y0E(Test__ZN3ccc8CC4x13y0E, "_ZN3ccc8CC4x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y0C1Ev();
extern void _ZN3ccc8CC4x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y0E[] = {
  NSPAIR(_ZN3ccc8CC4x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y0E[];
extern void _ZN3ccc8CC4x13y03efgEv();
extern void _ZN3ccc8CC4x13y03abcEv();
extern void _ZN3ccc8CC4x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y03pqrEv,_ZTv0_n12_N3ccc8CC4x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y03pqrEv,_ZThn4_N3ccc8CC4x13y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y03abcEv,_ZTv0_n16_N3ccc8CC4x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y03abcEv,_ZThn4_N3ccc8CC4x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y03efgEv,_ZTv0_n20_N3ccc8CC4x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y03efgEv,_ZThn4_N3ccc8CC4x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y03pqrEv,_ZTv0_n12_N3ccc8CC4x13y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y03abcEv,_ZTv0_n16_N3ccc8CC4x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y03efgEv,_ZTv0_n20_N3ccc8CC4x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y0E[] = {
  {&(_ZTVN3ccc8CC4x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y0E[];
static VTBL_ENTRY alt_thunk_names2109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y03efgEv,_ZTv0_n20_N3ccc8CC4x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y03efgEv,_ZThn4_N3ccc8CC4x13y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y03abcEv,_ZTv0_n16_N3ccc8CC4x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y03abcEv,_ZThn4_N3ccc8CC4x13y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y03pqrEv,_ZTv0_n12_N3ccc8CC4x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y03pqrEv,_ZThn4_N3ccc8CC4x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y0E = {  "_ZN3ccc8CC4x13y0E", // class name
  bases__ZN3ccc8CC4x13y0E, 2,
  &(vtc__ZN3ccc8CC4x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y0  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD4x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y03pqrEv
  ~DD4x13y0(); // tgen
  DD4x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y03abcEv");}
void  ccc::DD4x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y03efgEv");}
void  ccc::DD4x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y03pqrEv");}
ccc::DD4x13y0 ::~DD4x13y0(){ note_dtor("_ZN3ccc8DD4x13y0E", this);} // tgen
ccc::DD4x13y0 ::DD4x13y0(){ note_ctor("_ZN3ccc8DD4x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y0E, buf);
    ::ccc::DD4x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y0E);
    dp->::ccc::DD4x13y0::~DD4x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y0E(Test__ZN3ccc8DD4x13y0E, "_ZN3ccc8DD4x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y0C1Ev();
extern void _ZN3ccc8DD4x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y0E[] = {
  NSPAIR(_ZN3ccc8DD4x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y0E[];
extern void _ZN3ccc8DD4x13y03pqrEv();
extern void _ZN3ccc8DD4x13y03abcEv();
extern void _ZN3ccc8DD4x13y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y03efgEv,_ZTv0_n12_N3ccc8DD4x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y03efgEv,_ZThn4_N3ccc8DD4x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y03efgEv,_ZTv0_n12_N3ccc8DD4x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y0E[] = {
  {&(_ZTVN3ccc8DD4x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y0E[];
static VTBL_ENTRY alt_thunk_names2110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y03efgEv,_ZTv0_n12_N3ccc8DD4x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y03efgEv,_ZThn4_N3ccc8DD4x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y0E = {  "_ZN3ccc8DD4x13y0E", // class name
  bases__ZN3ccc8DD4x13y0E, 2,
  &(vtc__ZN3ccc8DD4x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y1  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x13y13efgEv
  ~CC4x13y1(); // tgen
  CC4x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y1E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y13abcEv");}
void  ccc::CC4x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y13pqrEv");}
void  ccc::CC4x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y13efgEv");}
ccc::CC4x13y1 ::~CC4x13y1(){ note_dtor("_ZN3ccc8CC4x13y1E", this);} // tgen
ccc::CC4x13y1 ::CC4x13y1(){ note_ctor("_ZN3ccc8CC4x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y1E, buf);
    ::ccc::CC4x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y1E);
    dp->::ccc::CC4x13y1::~CC4x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y1E(Test__ZN3ccc8CC4x13y1E, "_ZN3ccc8CC4x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y1C1Ev();
extern void _ZN3ccc8CC4x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y1E[] = {
  NSPAIR(_ZN3ccc8CC4x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y1E[];
extern void _ZN3ccc8CC4x13y13efgEv();
extern void _ZN3ccc8CC4x13y13abcEv();
extern void _ZN3ccc8CC4x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y13pqrEv,_ZTv0_n12_N3ccc8CC4x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y13pqrEv,_ZThn4_N3ccc8CC4x13y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y13abcEv,_ZTv0_n16_N3ccc8CC4x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y13abcEv,_ZThn4_N3ccc8CC4x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y13efgEv,_ZTv0_n20_N3ccc8CC4x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y13efgEv,_ZThn4_N3ccc8CC4x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y13pqrEv,_ZTv0_n12_N3ccc8CC4x13y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y13abcEv,_ZTv0_n16_N3ccc8CC4x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y13efgEv,_ZTv0_n20_N3ccc8CC4x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y1E[] = {
  {&(_ZTVN3ccc8CC4x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y1E[];
static VTBL_ENTRY alt_thunk_names2111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y13efgEv,_ZTv0_n20_N3ccc8CC4x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y13efgEv,_ZThn4_N3ccc8CC4x13y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y13abcEv,_ZTv0_n16_N3ccc8CC4x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y13abcEv,_ZThn4_N3ccc8CC4x13y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y13pqrEv,_ZTv0_n12_N3ccc8CC4x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y13pqrEv,_ZThn4_N3ccc8CC4x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y1E = {  "_ZN3ccc8CC4x13y1E", // class name
  bases__ZN3ccc8CC4x13y1E, 2,
  &(vtc__ZN3ccc8CC4x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y1  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD4x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x13y13efgEv
  ~DD4x13y1(); // tgen
  DD4x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y13abcEv");}
void  ccc::DD4x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y13pqrEv");}
void  ccc::DD4x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y13efgEv");}
ccc::DD4x13y1 ::~DD4x13y1(){ note_dtor("_ZN3ccc8DD4x13y1E", this);} // tgen
ccc::DD4x13y1 ::DD4x13y1(){ note_ctor("_ZN3ccc8DD4x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y1E, buf);
    ::ccc::DD4x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y1E);
    dp->::ccc::DD4x13y1::~DD4x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y1E(Test__ZN3ccc8DD4x13y1E, "_ZN3ccc8DD4x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y1C1Ev();
extern void _ZN3ccc8DD4x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y1E[] = {
  NSPAIR(_ZN3ccc8DD4x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y1E[];
extern void _ZN3ccc8DD4x13y13pqrEv();
extern void _ZN3ccc8DD4x13y13abcEv();
extern void _ZN3ccc8DD4x13y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y13efgEv,_ZTv0_n12_N3ccc8DD4x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y13efgEv,_ZThn4_N3ccc8DD4x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y13efgEv,_ZTv0_n12_N3ccc8DD4x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y1E[] = {
  {&(_ZTVN3ccc8DD4x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y1E[];
static VTBL_ENTRY alt_thunk_names2112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y13efgEv,_ZTv0_n12_N3ccc8DD4x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y13efgEv,_ZThn4_N3ccc8DD4x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y1E = {  "_ZN3ccc8DD4x13y1E", // class name
  bases__ZN3ccc8DD4x13y1E, 2,
  &(vtc__ZN3ccc8DD4x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y2  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y23pqrEv
  ~CC4x13y2(); // tgen
  CC4x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y2E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y23efgEv");}
void  ccc::CC4x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y23abcEv");}
void  ccc::CC4x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y23pqrEv");}
ccc::CC4x13y2 ::~CC4x13y2(){ note_dtor("_ZN3ccc8CC4x13y2E", this);} // tgen
ccc::CC4x13y2 ::CC4x13y2(){ note_ctor("_ZN3ccc8CC4x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y2E, buf);
    ::ccc::CC4x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y2E);
    dp->::ccc::CC4x13y2::~CC4x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y2E(Test__ZN3ccc8CC4x13y2E, "_ZN3ccc8CC4x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y2C1Ev();
extern void _ZN3ccc8CC4x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y2E[] = {
  NSPAIR(_ZN3ccc8CC4x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y2E[];
extern void _ZN3ccc8CC4x13y23efgEv();
extern void _ZN3ccc8CC4x13y23abcEv();
extern void _ZN3ccc8CC4x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y23pqrEv,_ZTv0_n12_N3ccc8CC4x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y23pqrEv,_ZThn4_N3ccc8CC4x13y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y23abcEv,_ZTv0_n16_N3ccc8CC4x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y23abcEv,_ZThn4_N3ccc8CC4x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y23efgEv,_ZTv0_n20_N3ccc8CC4x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y23efgEv,_ZThn4_N3ccc8CC4x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y23pqrEv,_ZTv0_n12_N3ccc8CC4x13y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y23abcEv,_ZTv0_n16_N3ccc8CC4x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y23efgEv,_ZTv0_n20_N3ccc8CC4x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y2E[] = {
  {&(_ZTVN3ccc8CC4x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y2E[];
static VTBL_ENTRY alt_thunk_names2113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y23efgEv,_ZTv0_n20_N3ccc8CC4x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y23efgEv,_ZThn4_N3ccc8CC4x13y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y23abcEv,_ZTv0_n16_N3ccc8CC4x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y23abcEv,_ZThn4_N3ccc8CC4x13y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y23pqrEv,_ZTv0_n12_N3ccc8CC4x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y23pqrEv,_ZThn4_N3ccc8CC4x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y2E = {  "_ZN3ccc8CC4x13y2E", // class name
  bases__ZN3ccc8CC4x13y2E, 2,
  &(vtc__ZN3ccc8CC4x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y2  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD4x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y23pqrEv
  ~DD4x13y2(); // tgen
  DD4x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y23efgEv");}
void  ccc::DD4x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y23abcEv");}
void  ccc::DD4x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y23pqrEv");}
ccc::DD4x13y2 ::~DD4x13y2(){ note_dtor("_ZN3ccc8DD4x13y2E", this);} // tgen
ccc::DD4x13y2 ::DD4x13y2(){ note_ctor("_ZN3ccc8DD4x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y2E, buf);
    ::ccc::DD4x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y2E);
    dp->::ccc::DD4x13y2::~DD4x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y2E(Test__ZN3ccc8DD4x13y2E, "_ZN3ccc8DD4x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y2C1Ev();
extern void _ZN3ccc8DD4x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y2E[] = {
  NSPAIR(_ZN3ccc8DD4x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y2E[];
extern void _ZN3ccc8DD4x13y23pqrEv();
extern void _ZN3ccc8DD4x13y23abcEv();
extern void _ZN3ccc8DD4x13y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y23efgEv,_ZTv0_n12_N3ccc8DD4x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y23efgEv,_ZThn4_N3ccc8DD4x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y23efgEv,_ZTv0_n12_N3ccc8DD4x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y2E[] = {
  {&(_ZTVN3ccc8DD4x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y2E[];
static VTBL_ENTRY alt_thunk_names2114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y23efgEv,_ZTv0_n12_N3ccc8DD4x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y23efgEv,_ZThn4_N3ccc8DD4x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y2E = {  "_ZN3ccc8DD4x13y2E", // class name
  bases__ZN3ccc8DD4x13y2E, 2,
  &(vtc__ZN3ccc8DD4x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y3  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x13y33abcEv
  ~CC4x13y3(); // tgen
  CC4x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y3E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y33efgEv");}
void  ccc::CC4x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y33pqrEv");}
void  ccc::CC4x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y33abcEv");}
ccc::CC4x13y3 ::~CC4x13y3(){ note_dtor("_ZN3ccc8CC4x13y3E", this);} // tgen
ccc::CC4x13y3 ::CC4x13y3(){ note_ctor("_ZN3ccc8CC4x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y3E, buf);
    ::ccc::CC4x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y3E);
    dp->::ccc::CC4x13y3::~CC4x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y3E(Test__ZN3ccc8CC4x13y3E, "_ZN3ccc8CC4x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y3C1Ev();
extern void _ZN3ccc8CC4x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y3E[] = {
  NSPAIR(_ZN3ccc8CC4x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y3E[];
extern void _ZN3ccc8CC4x13y33efgEv();
extern void _ZN3ccc8CC4x13y33pqrEv();
extern void _ZN3ccc8CC4x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y33pqrEv,_ZTv0_n12_N3ccc8CC4x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y33pqrEv,_ZThn4_N3ccc8CC4x13y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y33abcEv,_ZTv0_n16_N3ccc8CC4x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y33abcEv,_ZThn4_N3ccc8CC4x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y33efgEv,_ZTv0_n20_N3ccc8CC4x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y33efgEv,_ZThn4_N3ccc8CC4x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y33pqrEv,_ZTv0_n12_N3ccc8CC4x13y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y33abcEv,_ZTv0_n16_N3ccc8CC4x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y33efgEv,_ZTv0_n20_N3ccc8CC4x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y3E[] = {
  {&(_ZTVN3ccc8CC4x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y3E[];
static VTBL_ENTRY alt_thunk_names2115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y33efgEv,_ZTv0_n20_N3ccc8CC4x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y33efgEv,_ZThn4_N3ccc8CC4x13y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y33abcEv,_ZTv0_n16_N3ccc8CC4x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y33abcEv,_ZThn4_N3ccc8CC4x13y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y33pqrEv,_ZTv0_n12_N3ccc8CC4x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y33pqrEv,_ZThn4_N3ccc8CC4x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y3E = {  "_ZN3ccc8CC4x13y3E", // class name
  bases__ZN3ccc8CC4x13y3E, 2,
  &(vtc__ZN3ccc8CC4x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y3  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD4x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x13y33abcEv
  ~DD4x13y3(); // tgen
  DD4x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y33efgEv");}
void  ccc::DD4x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y33pqrEv");}
void  ccc::DD4x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y33abcEv");}
ccc::DD4x13y3 ::~DD4x13y3(){ note_dtor("_ZN3ccc8DD4x13y3E", this);} // tgen
ccc::DD4x13y3 ::DD4x13y3(){ note_ctor("_ZN3ccc8DD4x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y3E, buf);
    ::ccc::DD4x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y3E);
    dp->::ccc::DD4x13y3::~DD4x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y3E(Test__ZN3ccc8DD4x13y3E, "_ZN3ccc8DD4x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y3C1Ev();
extern void _ZN3ccc8DD4x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y3E[] = {
  NSPAIR(_ZN3ccc8DD4x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y3E[];
extern void _ZN3ccc8DD4x13y33pqrEv();
extern void _ZN3ccc8DD4x13y33abcEv();
extern void _ZN3ccc8DD4x13y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y33efgEv,_ZTv0_n12_N3ccc8DD4x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y33efgEv,_ZThn4_N3ccc8DD4x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y33efgEv,_ZTv0_n12_N3ccc8DD4x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y3E[] = {
  {&(_ZTVN3ccc8DD4x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y3E[];
static VTBL_ENTRY alt_thunk_names2116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y33efgEv,_ZTv0_n12_N3ccc8DD4x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y33efgEv,_ZThn4_N3ccc8DD4x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y3E = {  "_ZN3ccc8DD4x13y3E", // class name
  bases__ZN3ccc8DD4x13y3E, 2,
  &(vtc__ZN3ccc8DD4x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y4  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC4x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y43efgEv
  ~CC4x13y4(); // tgen
  CC4x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y4E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y43pqrEv");}
void  ccc::CC4x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y43abcEv");}
void  ccc::CC4x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y43efgEv");}
ccc::CC4x13y4 ::~CC4x13y4(){ note_dtor("_ZN3ccc8CC4x13y4E", this);} // tgen
ccc::CC4x13y4 ::CC4x13y4(){ note_ctor("_ZN3ccc8CC4x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y4E, buf);
    ::ccc::CC4x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y4E);
    dp->::ccc::CC4x13y4::~CC4x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y4E(Test__ZN3ccc8CC4x13y4E, "_ZN3ccc8CC4x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y4C1Ev();
extern void _ZN3ccc8CC4x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y4E[] = {
  NSPAIR(_ZN3ccc8CC4x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y4E[];
extern void _ZN3ccc8CC4x13y43efgEv();
extern void _ZN3ccc8CC4x13y43pqrEv();
extern void _ZN3ccc8CC4x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y43pqrEv,_ZTv0_n12_N3ccc8CC4x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y43pqrEv,_ZThn4_N3ccc8CC4x13y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y43abcEv,_ZTv0_n16_N3ccc8CC4x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y43abcEv,_ZThn4_N3ccc8CC4x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y43efgEv,_ZTv0_n20_N3ccc8CC4x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y43efgEv,_ZThn4_N3ccc8CC4x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y43pqrEv,_ZTv0_n12_N3ccc8CC4x13y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y43abcEv,_ZTv0_n16_N3ccc8CC4x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y43efgEv,_ZTv0_n20_N3ccc8CC4x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y4E[] = {
  {&(_ZTVN3ccc8CC4x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y4E[];
static VTBL_ENTRY alt_thunk_names2117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y43efgEv,_ZTv0_n20_N3ccc8CC4x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y43efgEv,_ZThn4_N3ccc8CC4x13y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y43abcEv,_ZTv0_n16_N3ccc8CC4x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y43abcEv,_ZThn4_N3ccc8CC4x13y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y43pqrEv,_ZTv0_n12_N3ccc8CC4x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y43pqrEv,_ZThn4_N3ccc8CC4x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y4E = {  "_ZN3ccc8CC4x13y4E", // class name
  bases__ZN3ccc8CC4x13y4E, 2,
  &(vtc__ZN3ccc8CC4x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y4  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD4x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x13y43efgEv
  ~DD4x13y4(); // tgen
  DD4x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y43pqrEv");}
void  ccc::DD4x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y43abcEv");}
void  ccc::DD4x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y43efgEv");}
ccc::DD4x13y4 ::~DD4x13y4(){ note_dtor("_ZN3ccc8DD4x13y4E", this);} // tgen
ccc::DD4x13y4 ::DD4x13y4(){ note_ctor("_ZN3ccc8DD4x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y4E, buf);
    ::ccc::DD4x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y4E);
    dp->::ccc::DD4x13y4::~DD4x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y4E(Test__ZN3ccc8DD4x13y4E, "_ZN3ccc8DD4x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y4C1Ev();
extern void _ZN3ccc8DD4x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y4E[] = {
  NSPAIR(_ZN3ccc8DD4x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y4E[];
extern void _ZN3ccc8DD4x13y43pqrEv();
extern void _ZN3ccc8DD4x13y43abcEv();
extern void _ZN3ccc8DD4x13y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y43efgEv,_ZTv0_n12_N3ccc8DD4x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y43efgEv,_ZThn4_N3ccc8DD4x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y43efgEv,_ZTv0_n12_N3ccc8DD4x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y4E[] = {
  {&(_ZTVN3ccc8DD4x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y4E[];
static VTBL_ENTRY alt_thunk_names2118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y43efgEv,_ZTv0_n12_N3ccc8DD4x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y43efgEv,_ZThn4_N3ccc8DD4x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y4E = {  "_ZN3ccc8DD4x13y4E", // class name
  bases__ZN3ccc8DD4x13y4E, 2,
  &(vtc__ZN3ccc8DD4x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y5  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC4x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y53abcEv
  ~CC4x13y5(); // tgen
  CC4x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y5E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y53pqrEv");}
void  ccc::CC4x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y53efgEv");}
void  ccc::CC4x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y53abcEv");}
ccc::CC4x13y5 ::~CC4x13y5(){ note_dtor("_ZN3ccc8CC4x13y5E", this);} // tgen
ccc::CC4x13y5 ::CC4x13y5(){ note_ctor("_ZN3ccc8CC4x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y5E, buf);
    ::ccc::CC4x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y5E);
    dp->::ccc::CC4x13y5::~CC4x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y5E(Test__ZN3ccc8CC4x13y5E, "_ZN3ccc8CC4x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y5C1Ev();
extern void _ZN3ccc8CC4x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y5E[] = {
  NSPAIR(_ZN3ccc8CC4x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y5E[];
extern void _ZN3ccc8CC4x13y53efgEv();
extern void _ZN3ccc8CC4x13y53pqrEv();
extern void _ZN3ccc8CC4x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y53pqrEv,_ZTv0_n12_N3ccc8CC4x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y53pqrEv,_ZThn4_N3ccc8CC4x13y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y53abcEv,_ZTv0_n16_N3ccc8CC4x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y53abcEv,_ZThn4_N3ccc8CC4x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y53efgEv,_ZTv0_n20_N3ccc8CC4x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y53efgEv,_ZThn4_N3ccc8CC4x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y53pqrEv,_ZTv0_n12_N3ccc8CC4x13y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y53abcEv,_ZTv0_n16_N3ccc8CC4x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y53efgEv,_ZTv0_n20_N3ccc8CC4x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y5E[] = {
  {&(_ZTVN3ccc8CC4x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y5E[];
static VTBL_ENTRY alt_thunk_names2119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y53efgEv,_ZTv0_n20_N3ccc8CC4x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y53efgEv,_ZThn4_N3ccc8CC4x13y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y53abcEv,_ZTv0_n16_N3ccc8CC4x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y53abcEv,_ZThn4_N3ccc8CC4x13y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y53pqrEv,_ZTv0_n12_N3ccc8CC4x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y53pqrEv,_ZThn4_N3ccc8CC4x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y5E = {  "_ZN3ccc8CC4x13y5E", // class name
  bases__ZN3ccc8CC4x13y5E, 2,
  &(vtc__ZN3ccc8CC4x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y5  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD4x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x13y53abcEv
  ~DD4x13y5(); // tgen
  DD4x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y53pqrEv");}
void  ccc::DD4x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y53efgEv");}
void  ccc::DD4x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y53abcEv");}
ccc::DD4x13y5 ::~DD4x13y5(){ note_dtor("_ZN3ccc8DD4x13y5E", this);} // tgen
ccc::DD4x13y5 ::DD4x13y5(){ note_ctor("_ZN3ccc8DD4x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y5E, buf);
    ::ccc::DD4x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y5E);
    dp->::ccc::DD4x13y5::~DD4x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y5E(Test__ZN3ccc8DD4x13y5E, "_ZN3ccc8DD4x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y5C1Ev();
extern void _ZN3ccc8DD4x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y5E[] = {
  NSPAIR(_ZN3ccc8DD4x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y5E[];
extern void _ZN3ccc8DD4x13y53pqrEv();
extern void _ZN3ccc8DD4x13y53abcEv();
extern void _ZN3ccc8DD4x13y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y53efgEv,_ZTv0_n12_N3ccc8DD4x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y53efgEv,_ZThn4_N3ccc8DD4x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y53efgEv,_ZTv0_n12_N3ccc8DD4x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y5E[] = {
  {&(_ZTVN3ccc8DD4x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y5E[];
static VTBL_ENTRY alt_thunk_names2120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y53efgEv,_ZTv0_n12_N3ccc8DD4x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y53efgEv,_ZThn4_N3ccc8DD4x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y5E = {  "_ZN3ccc8DD4x13y5E", // class name
  bases__ZN3ccc8DD4x13y5E, 2,
  &(vtc__ZN3ccc8DD4x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y6  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y63efgEv
  ~CC4x13y6(); // tgen
  CC4x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y6E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y63abcEv");}
void  ccc::CC4x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y63efgEv");}
ccc::CC4x13y6 ::~CC4x13y6(){ note_dtor("_ZN3ccc8CC4x13y6E", this);} // tgen
ccc::CC4x13y6 ::CC4x13y6(){ note_ctor("_ZN3ccc8CC4x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y6E, buf);
    ::ccc::CC4x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y6E);
    dp->::ccc::CC4x13y6::~CC4x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y6E(Test__ZN3ccc8CC4x13y6E, "_ZN3ccc8CC4x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y6C1Ev();
extern void _ZN3ccc8CC4x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y6E[] = {
  NSPAIR(_ZN3ccc8CC4x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y6E[];
extern void _ZN3ccc8CC4x13y63efgEv();
extern void _ZN3ccc8CC4x13y63abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y63abcEv,_ZTv0_n16_N3ccc8CC4x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y63abcEv,_ZThn4_N3ccc8CC4x13y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y63efgEv,_ZTv0_n20_N3ccc8CC4x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y63efgEv,_ZThn4_N3ccc8CC4x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y63abcEv,_ZTv0_n16_N3ccc8CC4x13y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y63efgEv,_ZTv0_n20_N3ccc8CC4x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y6E[] = {
  {&(_ZTVN3ccc8CC4x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y6E[];
static VTBL_ENTRY alt_thunk_names2121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y63efgEv,_ZTv0_n20_N3ccc8CC4x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y63efgEv,_ZThn4_N3ccc8CC4x13y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y63abcEv,_ZTv0_n16_N3ccc8CC4x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y63abcEv,_ZThn4_N3ccc8CC4x13y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y6E = {  "_ZN3ccc8CC4x13y6E", // class name
  bases__ZN3ccc8CC4x13y6E, 2,
  &(vtc__ZN3ccc8CC4x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2121,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y6  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD4x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x13y63efgEv
  ~DD4x13y6(); // tgen
  DD4x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y63abcEv");}
void  ccc::DD4x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y63efgEv");}
ccc::DD4x13y6 ::~DD4x13y6(){ note_dtor("_ZN3ccc8DD4x13y6E", this);} // tgen
ccc::DD4x13y6 ::DD4x13y6(){ note_ctor("_ZN3ccc8DD4x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y6E, buf);
    ::ccc::DD4x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y6E);
    dp->::ccc::DD4x13y6::~DD4x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y6E(Test__ZN3ccc8DD4x13y6E, "_ZN3ccc8DD4x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y6C1Ev();
extern void _ZN3ccc8DD4x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y6E[] = {
  NSPAIR(_ZN3ccc8DD4x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x13y63abcEv();
extern void _ZN3ccc8DD4x13y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y63efgEv,_ZTv0_n12_N3ccc8DD4x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y63efgEv,_ZThn4_N3ccc8DD4x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y63efgEv,_ZTv0_n12_N3ccc8DD4x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y6E[] = {
  {&(_ZTVN3ccc8DD4x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y6E[];
static VTBL_ENTRY alt_thunk_names2122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y63efgEv,_ZTv0_n12_N3ccc8DD4x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y63efgEv,_ZThn4_N3ccc8DD4x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y6E = {  "_ZN3ccc8DD4x13y6E", // class name
  bases__ZN3ccc8DD4x13y6E, 2,
  &(vtc__ZN3ccc8DD4x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2122,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y7  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y73pqrEv
  ~CC4x13y7(); // tgen
  CC4x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y7E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y73abcEv");}
void  ccc::CC4x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y73pqrEv");}
ccc::CC4x13y7 ::~CC4x13y7(){ note_dtor("_ZN3ccc8CC4x13y7E", this);} // tgen
ccc::CC4x13y7 ::CC4x13y7(){ note_ctor("_ZN3ccc8CC4x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y7E, buf);
    ::ccc::CC4x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y7E);
    dp->::ccc::CC4x13y7::~CC4x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y7E(Test__ZN3ccc8CC4x13y7E, "_ZN3ccc8CC4x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y7C1Ev();
extern void _ZN3ccc8CC4x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y7E[] = {
  NSPAIR(_ZN3ccc8CC4x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC4x13y73abcEv();
extern void _ZN3ccc8CC4x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y73pqrEv,_ZTv0_n12_N3ccc8CC4x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y73pqrEv,_ZThn4_N3ccc8CC4x13y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y73abcEv,_ZTv0_n16_N3ccc8CC4x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y73abcEv,_ZThn4_N3ccc8CC4x13y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y73pqrEv,_ZTv0_n12_N3ccc8CC4x13y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y73abcEv,_ZTv0_n16_N3ccc8CC4x13y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y7E[] = {
  {&(_ZTVN3ccc8CC4x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y7E[];
static VTBL_ENTRY alt_thunk_names2123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y73abcEv,_ZTv0_n16_N3ccc8CC4x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y73abcEv,_ZThn4_N3ccc8CC4x13y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y73pqrEv,_ZTv0_n12_N3ccc8CC4x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y73pqrEv,_ZThn4_N3ccc8CC4x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y7E = {  "_ZN3ccc8CC4x13y7E", // class name
  bases__ZN3ccc8CC4x13y7E, 2,
  &(vtc__ZN3ccc8CC4x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2123,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y7  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD4x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y73pqrEv
  ~DD4x13y7(); // tgen
  DD4x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y73abcEv");}
void  ccc::DD4x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y73pqrEv");}
ccc::DD4x13y7 ::~DD4x13y7(){ note_dtor("_ZN3ccc8DD4x13y7E", this);} // tgen
ccc::DD4x13y7 ::DD4x13y7(){ note_ctor("_ZN3ccc8DD4x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y7E, buf);
    ::ccc::DD4x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y7E);
    dp->::ccc::DD4x13y7::~DD4x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y7E(Test__ZN3ccc8DD4x13y7E, "_ZN3ccc8DD4x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y7C1Ev();
extern void _ZN3ccc8DD4x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y7E[] = {
  NSPAIR(_ZN3ccc8DD4x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y7E[];
extern void _ZN3ccc8DD4x13y73pqrEv();
extern void _ZN3ccc8DD4x13y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y7E[] = {
  {&(_ZTVN3ccc8DD4x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y7E[];
Class_Descriptor cd__ZN3ccc8DD4x13y7E = {  "_ZN3ccc8DD4x13y7E", // class name
  bases__ZN3ccc8DD4x13y7E, 2,
  &(vtc__ZN3ccc8DD4x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y8  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y83abcEv
  ~CC4x13y8(); // tgen
  CC4x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y8E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y83efgEv");}
void  ccc::CC4x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y83abcEv");}
ccc::CC4x13y8 ::~CC4x13y8(){ note_dtor("_ZN3ccc8CC4x13y8E", this);} // tgen
ccc::CC4x13y8 ::CC4x13y8(){ note_ctor("_ZN3ccc8CC4x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y8E, buf);
    ::ccc::CC4x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y8E);
    dp->::ccc::CC4x13y8::~CC4x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y8E(Test__ZN3ccc8CC4x13y8E, "_ZN3ccc8CC4x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y8C1Ev();
extern void _ZN3ccc8CC4x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y8E[] = {
  NSPAIR(_ZN3ccc8CC4x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y8E[];
extern void _ZN3ccc8CC4x13y83efgEv();
extern void _ZN3ccc8CC4x13y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x13y83abcEv,_ZTv0_n16_N3ccc8CC4x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y83abcEv,_ZThn4_N3ccc8CC4x13y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y83efgEv,_ZTv0_n20_N3ccc8CC4x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y83efgEv,_ZThn4_N3ccc8CC4x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x13y83abcEv,_ZTv0_n16_N3ccc8CC4x13y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y83efgEv,_ZTv0_n20_N3ccc8CC4x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y8E[] = {
  {&(_ZTVN3ccc8CC4x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y8E[];
static VTBL_ENTRY alt_thunk_names2124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y83efgEv,_ZTv0_n20_N3ccc8CC4x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y83efgEv,_ZThn4_N3ccc8CC4x13y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x13y83abcEv,_ZTv0_n16_N3ccc8CC4x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y83abcEv,_ZThn4_N3ccc8CC4x13y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y8E = {  "_ZN3ccc8CC4x13y8E", // class name
  bases__ZN3ccc8CC4x13y8E, 2,
  &(vtc__ZN3ccc8CC4x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y8  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD4x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x13y83abcEv
  ~DD4x13y8(); // tgen
  DD4x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y83efgEv");}
void  ccc::DD4x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x13y83abcEv");}
ccc::DD4x13y8 ::~DD4x13y8(){ note_dtor("_ZN3ccc8DD4x13y8E", this);} // tgen
ccc::DD4x13y8 ::DD4x13y8(){ note_ctor("_ZN3ccc8DD4x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y8E, buf);
    ::ccc::DD4x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y8E);
    dp->::ccc::DD4x13y8::~DD4x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y8E(Test__ZN3ccc8DD4x13y8E, "_ZN3ccc8DD4x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y8C1Ev();
extern void _ZN3ccc8DD4x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y8E[] = {
  NSPAIR(_ZN3ccc8DD4x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x13y83abcEv();
extern void _ZN3ccc8DD4x13y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y83efgEv,_ZTv0_n12_N3ccc8DD4x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y83efgEv,_ZThn4_N3ccc8DD4x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y83efgEv,_ZTv0_n12_N3ccc8DD4x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y8E[] = {
  {&(_ZTVN3ccc8DD4x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y8E[];
static VTBL_ENTRY alt_thunk_names2125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y83efgEv,_ZTv0_n12_N3ccc8DD4x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y83efgEv,_ZThn4_N3ccc8DD4x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y8E = {  "_ZN3ccc8DD4x13y8E", // class name
  bases__ZN3ccc8DD4x13y8E, 2,
  &(vtc__ZN3ccc8DD4x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2125,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y9  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y93pqrEv
  ~CC4x13y9(); // tgen
  CC4x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y9E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y93efgEv");}
void  ccc::CC4x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y93pqrEv");}
ccc::CC4x13y9 ::~CC4x13y9(){ note_dtor("_ZN3ccc8CC4x13y9E", this);} // tgen
ccc::CC4x13y9 ::CC4x13y9(){ note_ctor("_ZN3ccc8CC4x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y9E, buf);
    ::ccc::CC4x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC4x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y9E);
    dp->::ccc::CC4x13y9::~CC4x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y9E(Test__ZN3ccc8CC4x13y9E, "_ZN3ccc8CC4x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y9C1Ev();
extern void _ZN3ccc8CC4x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y9E[] = {
  NSPAIR(_ZN3ccc8CC4x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y9E[];
extern void _ZN3ccc8CC4x13y93efgEv();
extern void _ZN3ccc8CC4x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x13y93pqrEv,_ZTv0_n12_N3ccc8CC4x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y93pqrEv,_ZThn4_N3ccc8CC4x13y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x13y93efgEv,_ZTv0_n20_N3ccc8CC4x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y93efgEv,_ZThn4_N3ccc8CC4x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x13y93pqrEv,_ZTv0_n12_N3ccc8CC4x13y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x13y93efgEv,_ZTv0_n20_N3ccc8CC4x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x13y9E[] = {
  {&(_ZTVN3ccc8CC4x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x13y9E[];
static VTBL_ENTRY alt_thunk_names2126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x13y93efgEv,_ZTv0_n20_N3ccc8CC4x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y93efgEv,_ZThn4_N3ccc8CC4x13y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x13y93pqrEv,_ZTv0_n12_N3ccc8CC4x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x13y93pqrEv,_ZThn4_N3ccc8CC4x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x13y9E = {  "_ZN3ccc8CC4x13y9E", // class name
  bases__ZN3ccc8CC4x13y9E, 2,
  &(vtc__ZN3ccc8CC4x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x13y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y9  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD4x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x13y93pqrEv
  ~DD4x13y9(); // tgen
  DD4x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x13y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x13y93efgEv");}
void  ccc::DD4x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x13y93pqrEv");}
ccc::DD4x13y9 ::~DD4x13y9(){ note_dtor("_ZN3ccc8DD4x13y9E", this);} // tgen
ccc::DD4x13y9 ::DD4x13y9(){ note_ctor("_ZN3ccc8DD4x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x13y9E, buf);
    ::ccc::DD4x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x13y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD4x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x13y9E);
    dp->::ccc::DD4x13y9::~DD4x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x13y9E(Test__ZN3ccc8DD4x13y9E, "_ZN3ccc8DD4x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x13y9C1Ev();
extern void _ZN3ccc8DD4x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x13y9E[] = {
  NSPAIR(_ZN3ccc8DD4x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD4x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y9E[];
extern void _ZN3ccc8DD4x13y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x13y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x13y93efgEv,_ZTv0_n12_N3ccc8DD4x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x13y93efgEv,_ZThn4_N3ccc8DD4x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x13y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x13y93efgEv,_ZTv0_n12_N3ccc8DD4x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x13y9E[] = {
  {&(_ZTVN3ccc8DD4x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x13y9E[];
static VTBL_ENTRY alt_thunk_names2127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x13y93efgEv,_ZTv0_n12_N3ccc8DD4x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x13y93efgEv,_ZThn4_N3ccc8DD4x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x13y9E = {  "_ZN3ccc8DD4x13y9E", // class name
  bases__ZN3ccc8DD4x13y9E, 2,
  &(vtc__ZN3ccc8DD4x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x13y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y10  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x13y103abcEv
  ~CC4x13y10(); // tgen
  CC4x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y10E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y103pqrEv");}
void  ccc::CC4x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x13y103abcEv");}
ccc::CC4x13y10 ::~CC4x13y10(){ note_dtor("_ZN3ccc9CC4x13y10E", this);} // tgen
ccc::CC4x13y10 ::CC4x13y10(){ note_ctor("_ZN3ccc9CC4x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y10E, buf);
    ::ccc::CC4x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y10E);
    dp->::ccc::CC4x13y10::~CC4x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y10E(Test__ZN3ccc9CC4x13y10E, "_ZN3ccc9CC4x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y10C1Ev();
extern void _ZN3ccc9CC4x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y10E[] = {
  NSPAIR(_ZN3ccc9CC4x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC4x13y103pqrEv();
extern void _ZN3ccc9CC4x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x13y103pqrEv,_ZTv0_n12_N3ccc9CC4x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y103pqrEv,_ZThn4_N3ccc9CC4x13y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x13y103abcEv,_ZTv0_n16_N3ccc9CC4x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y103abcEv,_ZThn4_N3ccc9CC4x13y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x13y103pqrEv,_ZTv0_n12_N3ccc9CC4x13y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x13y103abcEv,_ZTv0_n16_N3ccc9CC4x13y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y10E[] = {
  {&(_ZTVN3ccc9CC4x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC4x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y10E[];
static VTBL_ENTRY alt_thunk_names2128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x13y103abcEv,_ZTv0_n16_N3ccc9CC4x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y103abcEv,_ZThn4_N3ccc9CC4x13y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x13y103pqrEv,_ZTv0_n12_N3ccc9CC4x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y103pqrEv,_ZThn4_N3ccc9CC4x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x13y10E = {  "_ZN3ccc9CC4x13y10E", // class name
  bases__ZN3ccc9CC4x13y10E, 2,
  &(vtc__ZN3ccc9CC4x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y10  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD4x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x13y103abcEv
  ~DD4x13y10(); // tgen
  DD4x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x13y103pqrEv");}
void  ccc::DD4x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x13y103abcEv");}
ccc::DD4x13y10 ::~DD4x13y10(){ note_dtor("_ZN3ccc9DD4x13y10E", this);} // tgen
ccc::DD4x13y10 ::DD4x13y10(){ note_ctor("_ZN3ccc9DD4x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y10E, buf);
    ::ccc::DD4x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y10E);
    dp->::ccc::DD4x13y10::~DD4x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y10E(Test__ZN3ccc9DD4x13y10E, "_ZN3ccc9DD4x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y10C1Ev();
extern void _ZN3ccc9DD4x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y10E[] = {
  NSPAIR(_ZN3ccc9DD4x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y10E[];
extern void _ZN3ccc9DD4x13y103pqrEv();
extern void _ZN3ccc9DD4x13y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y10E[] = {
  {&(_ZTVN3ccc9DD4x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y10E[];
Class_Descriptor cd__ZN3ccc9DD4x13y10E = {  "_ZN3ccc9DD4x13y10E", // class name
  bases__ZN3ccc9DD4x13y10E, 2,
  &(vtc__ZN3ccc9DD4x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y11  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x13y113efgEv
  ~CC4x13y11(); // tgen
  CC4x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y11E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y113pqrEv");}
void  ccc::CC4x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x13y113efgEv");}
ccc::CC4x13y11 ::~CC4x13y11(){ note_dtor("_ZN3ccc9CC4x13y11E", this);} // tgen
ccc::CC4x13y11 ::CC4x13y11(){ note_ctor("_ZN3ccc9CC4x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y11E, buf);
    ::ccc::CC4x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y11E);
    dp->::ccc::CC4x13y11::~CC4x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y11E(Test__ZN3ccc9CC4x13y11E, "_ZN3ccc9CC4x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y11C1Ev();
extern void _ZN3ccc9CC4x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y11E[] = {
  NSPAIR(_ZN3ccc9CC4x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y11E[];
extern void _ZN3ccc9CC4x13y113efgEv();
extern void _ZN3ccc9CC4x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x13y113pqrEv,_ZTv0_n12_N3ccc9CC4x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y113pqrEv,_ZThn4_N3ccc9CC4x13y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x13y113efgEv,_ZTv0_n20_N3ccc9CC4x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y113efgEv,_ZThn4_N3ccc9CC4x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x13y113pqrEv,_ZTv0_n12_N3ccc9CC4x13y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x13y113efgEv,_ZTv0_n20_N3ccc9CC4x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y11E[] = {
  {&(_ZTVN3ccc9CC4x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y11E[];
static VTBL_ENTRY alt_thunk_names2129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x13y113efgEv,_ZTv0_n20_N3ccc9CC4x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y113efgEv,_ZThn4_N3ccc9CC4x13y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x13y113pqrEv,_ZTv0_n12_N3ccc9CC4x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y113pqrEv,_ZThn4_N3ccc9CC4x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x13y11E = {  "_ZN3ccc9CC4x13y11E", // class name
  bases__ZN3ccc9CC4x13y11E, 2,
  &(vtc__ZN3ccc9CC4x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y11  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD4x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x13y113efgEv
  ~DD4x13y11(); // tgen
  DD4x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x13y113pqrEv");}
void  ccc::DD4x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x13y113efgEv");}
ccc::DD4x13y11 ::~DD4x13y11(){ note_dtor("_ZN3ccc9DD4x13y11E", this);} // tgen
ccc::DD4x13y11 ::DD4x13y11(){ note_ctor("_ZN3ccc9DD4x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y11E, buf);
    ::ccc::DD4x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y11E);
    dp->::ccc::DD4x13y11::~DD4x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y11E(Test__ZN3ccc9DD4x13y11E, "_ZN3ccc9DD4x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y11C1Ev();
extern void _ZN3ccc9DD4x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y11E[] = {
  NSPAIR(_ZN3ccc9DD4x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y11E[];
extern void _ZN3ccc9DD4x13y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x13y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x13y113efgEv,_ZTv0_n12_N3ccc9DD4x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x13y113efgEv,_ZThn4_N3ccc9DD4x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x13y113efgEv,_ZTv0_n12_N3ccc9DD4x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y11E[] = {
  {&(_ZTVN3ccc9DD4x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y11E[];
static VTBL_ENTRY alt_thunk_names2130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x13y113efgEv,_ZTv0_n12_N3ccc9DD4x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x13y113efgEv,_ZThn4_N3ccc9DD4x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x13y11E = {  "_ZN3ccc9DD4x13y11E", // class name
  bases__ZN3ccc9DD4x13y11E, 2,
  &(vtc__ZN3ccc9DD4x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y12  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC4x13y123abcEv
  ~CC4x13y12(); // tgen
  CC4x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x13y123abcEv");}
ccc::CC4x13y12 ::~CC4x13y12(){ note_dtor("_ZN3ccc9CC4x13y12E", this);} // tgen
ccc::CC4x13y12 ::CC4x13y12(){ note_ctor("_ZN3ccc9CC4x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y12E, buf);
    ::ccc::CC4x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y12E);
    dp->::ccc::CC4x13y12::~CC4x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y12E(Test__ZN3ccc9CC4x13y12E, "_ZN3ccc9CC4x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y12C1Ev();
extern void _ZN3ccc9CC4x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y12E[] = {
  NSPAIR(_ZN3ccc9CC4x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC4x13y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x13y123abcEv,_ZTv0_n16_N3ccc9CC4x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y123abcEv,_ZThn4_N3ccc9CC4x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x13y123abcEv,_ZTv0_n16_N3ccc9CC4x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y12E[] = {
  {&(_ZTVN3ccc9CC4x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y12E[];
static VTBL_ENTRY alt_thunk_names2131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x13y123abcEv,_ZTv0_n16_N3ccc9CC4x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y123abcEv,_ZThn4_N3ccc9CC4x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x13y12E = {  "_ZN3ccc9CC4x13y12E", // class name
  bases__ZN3ccc9CC4x13y12E, 2,
  &(vtc__ZN3ccc9CC4x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y12  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD4x13y123abcEv
  ~DD4x13y12(); // tgen
  DD4x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x13y123abcEv");}
ccc::DD4x13y12 ::~DD4x13y12(){ note_dtor("_ZN3ccc9DD4x13y12E", this);} // tgen
ccc::DD4x13y12 ::DD4x13y12(){ note_ctor("_ZN3ccc9DD4x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y12E, buf);
    ::ccc::DD4x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y12E);
    dp->::ccc::DD4x13y12::~DD4x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y12E(Test__ZN3ccc9DD4x13y12E, "_ZN3ccc9DD4x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y12C1Ev();
extern void _ZN3ccc9DD4x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y12E[] = {
  NSPAIR(_ZN3ccc9DD4x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x13y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y12E[] = {
  {&(_ZTVN3ccc9DD4x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y12E[];
Class_Descriptor cd__ZN3ccc9DD4x13y12E = {  "_ZN3ccc9DD4x13y12E", // class name
  bases__ZN3ccc9DD4x13y12E, 2,
  &(vtc__ZN3ccc9DD4x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y13  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC4x13y133efgEv
  ~CC4x13y13(); // tgen
  CC4x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y13E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x13y133efgEv");}
ccc::CC4x13y13 ::~CC4x13y13(){ note_dtor("_ZN3ccc9CC4x13y13E", this);} // tgen
ccc::CC4x13y13 ::CC4x13y13(){ note_ctor("_ZN3ccc9CC4x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y13E, buf);
    ::ccc::CC4x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y13E);
    dp->::ccc::CC4x13y13::~CC4x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y13E(Test__ZN3ccc9CC4x13y13E, "_ZN3ccc9CC4x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y13C1Ev();
extern void _ZN3ccc9CC4x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y13E[] = {
  NSPAIR(_ZN3ccc9CC4x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y13E[];
extern void _ZN3ccc9CC4x13y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x13y133efgEv,_ZTv0_n20_N3ccc9CC4x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y133efgEv,_ZThn4_N3ccc9CC4x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x13y133efgEv,_ZTv0_n20_N3ccc9CC4x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y13E[] = {
  {&(_ZTVN3ccc9CC4x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y13E[];
static VTBL_ENTRY alt_thunk_names2132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x13y133efgEv,_ZTv0_n20_N3ccc9CC4x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y133efgEv,_ZThn4_N3ccc9CC4x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x13y13E = {  "_ZN3ccc9CC4x13y13E", // class name
  bases__ZN3ccc9CC4x13y13E, 2,
  &(vtc__ZN3ccc9CC4x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y13  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD4x13y133efgEv
  ~DD4x13y13(); // tgen
  DD4x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD4x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x13y133efgEv");}
ccc::DD4x13y13 ::~DD4x13y13(){ note_dtor("_ZN3ccc9DD4x13y13E", this);} // tgen
ccc::DD4x13y13 ::DD4x13y13(){ note_ctor("_ZN3ccc9DD4x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y13E, buf);
    ::ccc::DD4x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y13E);
    dp->::ccc::DD4x13y13::~DD4x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y13E(Test__ZN3ccc9DD4x13y13E, "_ZN3ccc9DD4x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y13C1Ev();
extern void _ZN3ccc9DD4x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y13E[] = {
  NSPAIR(_ZN3ccc9DD4x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x13y133efgEv,_ZTv0_n12_N3ccc9DD4x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x13y133efgEv,_ZThn4_N3ccc9DD4x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y133efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x13y133efgEv,_ZTv0_n12_N3ccc9DD4x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y13E[] = {
  {&(_ZTVN3ccc9DD4x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y13E[];
static VTBL_ENTRY alt_thunk_names2133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x13y133efgEv,_ZTv0_n12_N3ccc9DD4x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x13y133efgEv,_ZThn4_N3ccc9DD4x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x13y13E = {  "_ZN3ccc9DD4x13y13E", // class name
  bases__ZN3ccc9DD4x13y13E, 2,
  &(vtc__ZN3ccc9DD4x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y14  : virtual ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y143pqrEv
  ~CC4x13y14(); // tgen
  CC4x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y143pqrEv");}
ccc::CC4x13y14 ::~CC4x13y14(){ note_dtor("_ZN3ccc9CC4x13y14E", this);} // tgen
ccc::CC4x13y14 ::CC4x13y14(){ note_ctor("_ZN3ccc9CC4x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y14E, buf);
    ::ccc::CC4x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y14E);
    dp->::ccc::CC4x13y14::~CC4x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y14E(Test__ZN3ccc9CC4x13y14E, "_ZN3ccc9CC4x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y14C1Ev();
extern void _ZN3ccc9CC4x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y14E[] = {
  NSPAIR(_ZN3ccc9CC4x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC4x13y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x13y143pqrEv,_ZTv0_n12_N3ccc9CC4x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y143pqrEv,_ZThn4_N3ccc9CC4x13y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x13y143pqrEv,_ZTv0_n12_N3ccc9CC4x13y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y14E[] = {
  {&(_ZTVN3ccc9CC4x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y14E[];
static VTBL_ENTRY alt_thunk_names2134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x13y143pqrEv,_ZTv0_n12_N3ccc9CC4x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x13y143pqrEv,_ZThn4_N3ccc9CC4x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x13y14E = {  "_ZN3ccc9CC4x13y14E", // class name
  bases__ZN3ccc9CC4x13y14E, 2,
  &(vtc__ZN3ccc9CC4x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y14  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD4x13y143pqrEv
  ~DD4x13y14(); // tgen
  DD4x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x13y143pqrEv");}
ccc::DD4x13y14 ::~DD4x13y14(){ note_dtor("_ZN3ccc9DD4x13y14E", this);} // tgen
ccc::DD4x13y14 ::DD4x13y14(){ note_ctor("_ZN3ccc9DD4x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y14E, buf);
    ::ccc::DD4x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y14E);
    dp->::ccc::DD4x13y14::~DD4x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y14E(Test__ZN3ccc9DD4x13y14E, "_ZN3ccc9DD4x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y14C1Ev();
extern void _ZN3ccc9DD4x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y14E[] = {
  NSPAIR(_ZN3ccc9DD4x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y14E[];
extern void _ZN3ccc9DD4x13y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y14E[] = {
  {&(_ZTVN3ccc9DD4x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y14E[];
Class_Descriptor cd__ZN3ccc9DD4x13y14E = {  "_ZN3ccc9DD4x13y14E", // class name
  bases__ZN3ccc9DD4x13y14E, 2,
  &(vtc__ZN3ccc9DD4x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y15  : virtual ::ccc::AA4 , ::ccc::BB13 {
  ~CC4x13y15(); // tgen
  CC4x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x13y15 ::~CC4x13y15(){ note_dtor("_ZN3ccc9CC4x13y15E", this);} // tgen
ccc::CC4x13y15 ::CC4x13y15(){ note_ctor("_ZN3ccc9CC4x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y15E, buf);
    ::ccc::CC4x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC4x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y15E);
    dp->::ccc::CC4x13y15::~CC4x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y15E(Test__ZN3ccc9CC4x13y15E, "_ZN3ccc9CC4x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y15C1Ev();
extern void _ZN3ccc9CC4x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y15E[] = {
  NSPAIR(_ZN3ccc9CC4x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x13y15E[] = {
  {&(_ZTVN3ccc9CC4x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x13y15E[];
Class_Descriptor cd__ZN3ccc9CC4x13y15E = {  "_ZN3ccc9CC4x13y15E", // class name
  bases__ZN3ccc9CC4x13y15E, 2,
  &(vtc__ZN3ccc9CC4x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x13y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x13y15  : virtual ::ccc::AA4 , virtual ::ccc::BB13 {
  ~DD4x13y15(); // tgen
  DD4x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD4x13y15 ::~DD4x13y15(){ note_dtor("_ZN3ccc9DD4x13y15E", this);} // tgen
ccc::DD4x13y15 ::DD4x13y15(){ note_ctor("_ZN3ccc9DD4x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x13y15E, buf);
    ::ccc::DD4x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x13y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD4x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x13y15E);
    dp->::ccc::DD4x13y15::~DD4x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x13y15E(Test__ZN3ccc9DD4x13y15E, "_ZN3ccc9DD4x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x13y15C1Ev();
extern void _ZN3ccc9DD4x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x13y15E[] = {
  NSPAIR(_ZN3ccc9DD4x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD4x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x13y15E[] = {
  {&(_ZTVN3ccc9DD4x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x13y15E[];
Class_Descriptor cd__ZN3ccc9DD4x13y15E = {  "_ZN3ccc9DD4x13y15E", // class name
  bases__ZN3ccc9DD4x13y15E, 2,
  &(vtc__ZN3ccc9DD4x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x13y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y0  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y03pqrEv
  ~CC4x14y0(); // tgen
  CC4x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y0E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y03abcEv");}
void  ccc::CC4x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y03efgEv");}
void  ccc::CC4x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y03pqrEv");}
ccc::CC4x14y0 ::~CC4x14y0(){ note_dtor("_ZN3ccc8CC4x14y0E", this);} // tgen
ccc::CC4x14y0 ::CC4x14y0(){ note_ctor("_ZN3ccc8CC4x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y0E, buf);
    ::ccc::CC4x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y0E);
    dp->::ccc::CC4x14y0::~CC4x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y0E(Test__ZN3ccc8CC4x14y0E, "_ZN3ccc8CC4x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y0C1Ev();
extern void _ZN3ccc8CC4x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y0E[] = {
  NSPAIR(_ZN3ccc8CC4x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y0E[];
extern void _ZN3ccc8CC4x14y03pqrEv();
extern void _ZN3ccc8CC4x14y03abcEv();
extern void _ZN3ccc8CC4x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y03pqrEv,_ZTv0_n12_N3ccc8CC4x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y03pqrEv,_ZThn4_N3ccc8CC4x14y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y03abcEv,_ZTv0_n16_N3ccc8CC4x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y03abcEv,_ZThn4_N3ccc8CC4x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y03efgEv,_ZTv0_n20_N3ccc8CC4x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y03efgEv,_ZThn4_N3ccc8CC4x14y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y03pqrEv,_ZTv0_n12_N3ccc8CC4x14y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y03abcEv,_ZTv0_n16_N3ccc8CC4x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y03efgEv,_ZTv0_n20_N3ccc8CC4x14y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y0E[] = {
  {&(_ZTVN3ccc8CC4x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y0E[];
static VTBL_ENTRY alt_thunk_names2135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y03efgEv,_ZTv0_n20_N3ccc8CC4x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y03efgEv,_ZThn4_N3ccc8CC4x14y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y03abcEv,_ZTv0_n16_N3ccc8CC4x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y03abcEv,_ZThn4_N3ccc8CC4x14y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y03pqrEv,_ZTv0_n12_N3ccc8CC4x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y03pqrEv,_ZThn4_N3ccc8CC4x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y0E = {  "_ZN3ccc8CC4x14y0E", // class name
  bases__ZN3ccc8CC4x14y0E, 2,
  &(vtc__ZN3ccc8CC4x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y0  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD4x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y03pqrEv
  ~DD4x14y0(); // tgen
  DD4x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y0E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y03abcEv");}
void  ccc::DD4x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y03efgEv");}
void  ccc::DD4x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y03pqrEv");}
ccc::DD4x14y0 ::~DD4x14y0(){ note_dtor("_ZN3ccc8DD4x14y0E", this);} // tgen
ccc::DD4x14y0 ::DD4x14y0(){ note_ctor("_ZN3ccc8DD4x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y0E, buf);
    ::ccc::DD4x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y0E);
    dp->::ccc::DD4x14y0::~DD4x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y0E(Test__ZN3ccc8DD4x14y0E, "_ZN3ccc8DD4x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y0C1Ev();
extern void _ZN3ccc8DD4x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y0E[] = {
  NSPAIR(_ZN3ccc8DD4x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y0E[];
extern void _ZN3ccc8DD4x14y03pqrEv();
extern void _ZN3ccc8DD4x14y03abcEv();
extern void _ZN3ccc8DD4x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y03pqrEv,_ZTv0_n12_N3ccc8DD4x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y03pqrEv,_ZThn4_N3ccc8DD4x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y03pqrEv,_ZTv0_n12_N3ccc8DD4x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y0E[] = {
  {&(_ZTVN3ccc8DD4x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y0E[];
static VTBL_ENTRY alt_thunk_names2136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y03pqrEv,_ZTv0_n12_N3ccc8DD4x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y03pqrEv,_ZThn4_N3ccc8DD4x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y0E = {  "_ZN3ccc8DD4x14y0E", // class name
  bases__ZN3ccc8DD4x14y0E, 2,
  &(vtc__ZN3ccc8DD4x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y1  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x14y13efgEv
  ~CC4x14y1(); // tgen
  CC4x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y1E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y13abcEv");}
void  ccc::CC4x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y13pqrEv");}
void  ccc::CC4x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y13efgEv");}
ccc::CC4x14y1 ::~CC4x14y1(){ note_dtor("_ZN3ccc8CC4x14y1E", this);} // tgen
ccc::CC4x14y1 ::CC4x14y1(){ note_ctor("_ZN3ccc8CC4x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y1E, buf);
    ::ccc::CC4x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y1E);
    dp->::ccc::CC4x14y1::~CC4x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y1E(Test__ZN3ccc8CC4x14y1E, "_ZN3ccc8CC4x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y1C1Ev();
extern void _ZN3ccc8CC4x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y1E[] = {
  NSPAIR(_ZN3ccc8CC4x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y1E[];
extern void _ZN3ccc8CC4x14y13pqrEv();
extern void _ZN3ccc8CC4x14y13abcEv();
extern void _ZN3ccc8CC4x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y13pqrEv,_ZTv0_n12_N3ccc8CC4x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y13pqrEv,_ZThn4_N3ccc8CC4x14y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y13abcEv,_ZTv0_n16_N3ccc8CC4x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y13abcEv,_ZThn4_N3ccc8CC4x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y13efgEv,_ZTv0_n20_N3ccc8CC4x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y13efgEv,_ZThn4_N3ccc8CC4x14y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y13pqrEv,_ZTv0_n12_N3ccc8CC4x14y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y13abcEv,_ZTv0_n16_N3ccc8CC4x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y13efgEv,_ZTv0_n20_N3ccc8CC4x14y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y1E[] = {
  {&(_ZTVN3ccc8CC4x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y1E[];
static VTBL_ENTRY alt_thunk_names2137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y13efgEv,_ZTv0_n20_N3ccc8CC4x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y13efgEv,_ZThn4_N3ccc8CC4x14y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y13abcEv,_ZTv0_n16_N3ccc8CC4x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y13abcEv,_ZThn4_N3ccc8CC4x14y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y13pqrEv,_ZTv0_n12_N3ccc8CC4x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y13pqrEv,_ZThn4_N3ccc8CC4x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y1E = {  "_ZN3ccc8CC4x14y1E", // class name
  bases__ZN3ccc8CC4x14y1E, 2,
  &(vtc__ZN3ccc8CC4x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y1  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD4x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x14y13efgEv
  ~DD4x14y1(); // tgen
  DD4x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y1E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y13abcEv");}
void  ccc::DD4x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y13pqrEv");}
void  ccc::DD4x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y13efgEv");}
ccc::DD4x14y1 ::~DD4x14y1(){ note_dtor("_ZN3ccc8DD4x14y1E", this);} // tgen
ccc::DD4x14y1 ::DD4x14y1(){ note_ctor("_ZN3ccc8DD4x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y1E, buf);
    ::ccc::DD4x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y1E);
    dp->::ccc::DD4x14y1::~DD4x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y1E(Test__ZN3ccc8DD4x14y1E, "_ZN3ccc8DD4x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y1C1Ev();
extern void _ZN3ccc8DD4x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y1E[] = {
  NSPAIR(_ZN3ccc8DD4x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y1E[];
extern void _ZN3ccc8DD4x14y13pqrEv();
extern void _ZN3ccc8DD4x14y13abcEv();
extern void _ZN3ccc8DD4x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y13pqrEv,_ZTv0_n12_N3ccc8DD4x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y13pqrEv,_ZThn4_N3ccc8DD4x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y13pqrEv,_ZTv0_n12_N3ccc8DD4x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y1E[] = {
  {&(_ZTVN3ccc8DD4x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y1E[];
static VTBL_ENTRY alt_thunk_names2138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y13pqrEv,_ZTv0_n12_N3ccc8DD4x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y13pqrEv,_ZThn4_N3ccc8DD4x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y1E = {  "_ZN3ccc8DD4x14y1E", // class name
  bases__ZN3ccc8DD4x14y1E, 2,
  &(vtc__ZN3ccc8DD4x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y2  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y23pqrEv
  ~CC4x14y2(); // tgen
  CC4x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y2E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y23efgEv");}
void  ccc::CC4x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y23abcEv");}
void  ccc::CC4x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y23pqrEv");}
ccc::CC4x14y2 ::~CC4x14y2(){ note_dtor("_ZN3ccc8CC4x14y2E", this);} // tgen
ccc::CC4x14y2 ::CC4x14y2(){ note_ctor("_ZN3ccc8CC4x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y2E, buf);
    ::ccc::CC4x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y2E);
    dp->::ccc::CC4x14y2::~CC4x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y2E(Test__ZN3ccc8CC4x14y2E, "_ZN3ccc8CC4x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y2C1Ev();
extern void _ZN3ccc8CC4x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y2E[] = {
  NSPAIR(_ZN3ccc8CC4x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y2E[];
extern void _ZN3ccc8CC4x14y23pqrEv();
extern void _ZN3ccc8CC4x14y23efgEv();
extern void _ZN3ccc8CC4x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y23pqrEv,_ZTv0_n12_N3ccc8CC4x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y23pqrEv,_ZThn4_N3ccc8CC4x14y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y23abcEv,_ZTv0_n16_N3ccc8CC4x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y23abcEv,_ZThn4_N3ccc8CC4x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y23efgEv,_ZTv0_n20_N3ccc8CC4x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y23efgEv,_ZThn4_N3ccc8CC4x14y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y23pqrEv,_ZTv0_n12_N3ccc8CC4x14y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y23abcEv,_ZTv0_n16_N3ccc8CC4x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y23efgEv,_ZTv0_n20_N3ccc8CC4x14y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y2E[] = {
  {&(_ZTVN3ccc8CC4x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y2E[];
static VTBL_ENTRY alt_thunk_names2139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y23efgEv,_ZTv0_n20_N3ccc8CC4x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y23efgEv,_ZThn4_N3ccc8CC4x14y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y23abcEv,_ZTv0_n16_N3ccc8CC4x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y23abcEv,_ZThn4_N3ccc8CC4x14y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y23pqrEv,_ZTv0_n12_N3ccc8CC4x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y23pqrEv,_ZThn4_N3ccc8CC4x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y2E = {  "_ZN3ccc8CC4x14y2E", // class name
  bases__ZN3ccc8CC4x14y2E, 2,
  &(vtc__ZN3ccc8CC4x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2139,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y2  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD4x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y23pqrEv
  ~DD4x14y2(); // tgen
  DD4x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y2E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y23efgEv");}
void  ccc::DD4x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y23abcEv");}
void  ccc::DD4x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y23pqrEv");}
ccc::DD4x14y2 ::~DD4x14y2(){ note_dtor("_ZN3ccc8DD4x14y2E", this);} // tgen
ccc::DD4x14y2 ::DD4x14y2(){ note_ctor("_ZN3ccc8DD4x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y2E, buf);
    ::ccc::DD4x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y2E);
    dp->::ccc::DD4x14y2::~DD4x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y2E(Test__ZN3ccc8DD4x14y2E, "_ZN3ccc8DD4x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y2C1Ev();
extern void _ZN3ccc8DD4x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y2E[] = {
  NSPAIR(_ZN3ccc8DD4x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y2E[];
extern void _ZN3ccc8DD4x14y23pqrEv();
extern void _ZN3ccc8DD4x14y23abcEv();
extern void _ZN3ccc8DD4x14y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y23pqrEv,_ZTv0_n12_N3ccc8DD4x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y23pqrEv,_ZThn4_N3ccc8DD4x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y23pqrEv,_ZTv0_n12_N3ccc8DD4x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y2E[] = {
  {&(_ZTVN3ccc8DD4x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y2E[];
static VTBL_ENTRY alt_thunk_names2140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y23pqrEv,_ZTv0_n12_N3ccc8DD4x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y23pqrEv,_ZThn4_N3ccc8DD4x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y2E = {  "_ZN3ccc8DD4x14y2E", // class name
  bases__ZN3ccc8DD4x14y2E, 2,
  &(vtc__ZN3ccc8DD4x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2140,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y3  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x14y33abcEv
  ~CC4x14y3(); // tgen
  CC4x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y3E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y33efgEv");}
void  ccc::CC4x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y33pqrEv");}
void  ccc::CC4x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y33abcEv");}
ccc::CC4x14y3 ::~CC4x14y3(){ note_dtor("_ZN3ccc8CC4x14y3E", this);} // tgen
ccc::CC4x14y3 ::CC4x14y3(){ note_ctor("_ZN3ccc8CC4x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y3E, buf);
    ::ccc::CC4x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y3E);
    dp->::ccc::CC4x14y3::~CC4x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y3E(Test__ZN3ccc8CC4x14y3E, "_ZN3ccc8CC4x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y3C1Ev();
extern void _ZN3ccc8CC4x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y3E[] = {
  NSPAIR(_ZN3ccc8CC4x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y3E[];
extern void _ZN3ccc8CC4x14y33pqrEv();
extern void _ZN3ccc8CC4x14y33efgEv();
extern void _ZN3ccc8CC4x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y33pqrEv,_ZTv0_n12_N3ccc8CC4x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y33pqrEv,_ZThn4_N3ccc8CC4x14y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y33abcEv,_ZTv0_n16_N3ccc8CC4x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y33abcEv,_ZThn4_N3ccc8CC4x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y33efgEv,_ZTv0_n20_N3ccc8CC4x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y33efgEv,_ZThn4_N3ccc8CC4x14y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y33pqrEv,_ZTv0_n12_N3ccc8CC4x14y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y33abcEv,_ZTv0_n16_N3ccc8CC4x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y33efgEv,_ZTv0_n20_N3ccc8CC4x14y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y3E[] = {
  {&(_ZTVN3ccc8CC4x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y3E[];
static VTBL_ENTRY alt_thunk_names2141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y33efgEv,_ZTv0_n20_N3ccc8CC4x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y33efgEv,_ZThn4_N3ccc8CC4x14y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y33abcEv,_ZTv0_n16_N3ccc8CC4x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y33abcEv,_ZThn4_N3ccc8CC4x14y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y33pqrEv,_ZTv0_n12_N3ccc8CC4x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y33pqrEv,_ZThn4_N3ccc8CC4x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y3E = {  "_ZN3ccc8CC4x14y3E", // class name
  bases__ZN3ccc8CC4x14y3E, 2,
  &(vtc__ZN3ccc8CC4x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2141,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y3  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD4x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x14y33abcEv
  ~DD4x14y3(); // tgen
  DD4x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y3E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y33efgEv");}
void  ccc::DD4x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y33pqrEv");}
void  ccc::DD4x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y33abcEv");}
ccc::DD4x14y3 ::~DD4x14y3(){ note_dtor("_ZN3ccc8DD4x14y3E", this);} // tgen
ccc::DD4x14y3 ::DD4x14y3(){ note_ctor("_ZN3ccc8DD4x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y3E, buf);
    ::ccc::DD4x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y3E);
    dp->::ccc::DD4x14y3::~DD4x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y3E(Test__ZN3ccc8DD4x14y3E, "_ZN3ccc8DD4x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y3C1Ev();
extern void _ZN3ccc8DD4x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y3E[] = {
  NSPAIR(_ZN3ccc8DD4x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y3E[];
extern void _ZN3ccc8DD4x14y33pqrEv();
extern void _ZN3ccc8DD4x14y33abcEv();
extern void _ZN3ccc8DD4x14y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y33pqrEv,_ZTv0_n12_N3ccc8DD4x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y33pqrEv,_ZThn4_N3ccc8DD4x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y33pqrEv,_ZTv0_n12_N3ccc8DD4x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y3E[] = {
  {&(_ZTVN3ccc8DD4x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y3E[];
static VTBL_ENTRY alt_thunk_names2142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y33pqrEv,_ZTv0_n12_N3ccc8DD4x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y33pqrEv,_ZThn4_N3ccc8DD4x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y3E = {  "_ZN3ccc8DD4x14y3E", // class name
  bases__ZN3ccc8DD4x14y3E, 2,
  &(vtc__ZN3ccc8DD4x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2142,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y4  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC4x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y43efgEv
  ~CC4x14y4(); // tgen
  CC4x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y4E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y43pqrEv");}
void  ccc::CC4x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y43abcEv");}
void  ccc::CC4x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y43efgEv");}
ccc::CC4x14y4 ::~CC4x14y4(){ note_dtor("_ZN3ccc8CC4x14y4E", this);} // tgen
ccc::CC4x14y4 ::CC4x14y4(){ note_ctor("_ZN3ccc8CC4x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y4E, buf);
    ::ccc::CC4x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y4E);
    dp->::ccc::CC4x14y4::~CC4x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y4E(Test__ZN3ccc8CC4x14y4E, "_ZN3ccc8CC4x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y4C1Ev();
extern void _ZN3ccc8CC4x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y4E[] = {
  NSPAIR(_ZN3ccc8CC4x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y4E[];
extern void _ZN3ccc8CC4x14y43pqrEv();
extern void _ZN3ccc8CC4x14y43abcEv();
extern void _ZN3ccc8CC4x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y43pqrEv,_ZTv0_n12_N3ccc8CC4x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y43pqrEv,_ZThn4_N3ccc8CC4x14y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y43abcEv,_ZTv0_n16_N3ccc8CC4x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y43abcEv,_ZThn4_N3ccc8CC4x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y43efgEv,_ZTv0_n20_N3ccc8CC4x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y43efgEv,_ZThn4_N3ccc8CC4x14y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y43pqrEv,_ZTv0_n12_N3ccc8CC4x14y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y43abcEv,_ZTv0_n16_N3ccc8CC4x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y43efgEv,_ZTv0_n20_N3ccc8CC4x14y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y4E[] = {
  {&(_ZTVN3ccc8CC4x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y4E[];
static VTBL_ENTRY alt_thunk_names2143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y43efgEv,_ZTv0_n20_N3ccc8CC4x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y43efgEv,_ZThn4_N3ccc8CC4x14y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y43abcEv,_ZTv0_n16_N3ccc8CC4x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y43abcEv,_ZThn4_N3ccc8CC4x14y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y43pqrEv,_ZTv0_n12_N3ccc8CC4x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y43pqrEv,_ZThn4_N3ccc8CC4x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y4E = {  "_ZN3ccc8CC4x14y4E", // class name
  bases__ZN3ccc8CC4x14y4E, 2,
  &(vtc__ZN3ccc8CC4x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y4  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD4x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x14y43efgEv
  ~DD4x14y4(); // tgen
  DD4x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y4E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y43pqrEv");}
void  ccc::DD4x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y43abcEv");}
void  ccc::DD4x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y43efgEv");}
ccc::DD4x14y4 ::~DD4x14y4(){ note_dtor("_ZN3ccc8DD4x14y4E", this);} // tgen
ccc::DD4x14y4 ::DD4x14y4(){ note_ctor("_ZN3ccc8DD4x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y4E, buf);
    ::ccc::DD4x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y4E);
    dp->::ccc::DD4x14y4::~DD4x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y4E(Test__ZN3ccc8DD4x14y4E, "_ZN3ccc8DD4x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y4C1Ev();
extern void _ZN3ccc8DD4x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y4E[] = {
  NSPAIR(_ZN3ccc8DD4x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y4E[];
extern void _ZN3ccc8DD4x14y43pqrEv();
extern void _ZN3ccc8DD4x14y43abcEv();
extern void _ZN3ccc8DD4x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y43pqrEv,_ZTv0_n12_N3ccc8DD4x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y43pqrEv,_ZThn4_N3ccc8DD4x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y43pqrEv,_ZTv0_n12_N3ccc8DD4x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y4E[] = {
  {&(_ZTVN3ccc8DD4x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y4E[];
static VTBL_ENTRY alt_thunk_names2144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y43pqrEv,_ZTv0_n12_N3ccc8DD4x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y43pqrEv,_ZThn4_N3ccc8DD4x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y4E = {  "_ZN3ccc8DD4x14y4E", // class name
  bases__ZN3ccc8DD4x14y4E, 2,
  &(vtc__ZN3ccc8DD4x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y5  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC4x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y53abcEv
  ~CC4x14y5(); // tgen
  CC4x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y5E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y53pqrEv");}
void  ccc::CC4x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y53efgEv");}
void  ccc::CC4x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y53abcEv");}
ccc::CC4x14y5 ::~CC4x14y5(){ note_dtor("_ZN3ccc8CC4x14y5E", this);} // tgen
ccc::CC4x14y5 ::CC4x14y5(){ note_ctor("_ZN3ccc8CC4x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y5E, buf);
    ::ccc::CC4x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y5E);
    dp->::ccc::CC4x14y5::~CC4x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y5E(Test__ZN3ccc8CC4x14y5E, "_ZN3ccc8CC4x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y5C1Ev();
extern void _ZN3ccc8CC4x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y5E[] = {
  NSPAIR(_ZN3ccc8CC4x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y5E[];
extern void _ZN3ccc8CC4x14y53pqrEv();
extern void _ZN3ccc8CC4x14y53efgEv();
extern void _ZN3ccc8CC4x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y53pqrEv,_ZTv0_n12_N3ccc8CC4x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y53pqrEv,_ZThn4_N3ccc8CC4x14y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y53abcEv,_ZTv0_n16_N3ccc8CC4x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y53abcEv,_ZThn4_N3ccc8CC4x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y53efgEv,_ZTv0_n20_N3ccc8CC4x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y53efgEv,_ZThn4_N3ccc8CC4x14y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y53pqrEv,_ZTv0_n12_N3ccc8CC4x14y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y53abcEv,_ZTv0_n16_N3ccc8CC4x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y53efgEv,_ZTv0_n20_N3ccc8CC4x14y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y5E[] = {
  {&(_ZTVN3ccc8CC4x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y5E[];
static VTBL_ENTRY alt_thunk_names2145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y53efgEv,_ZTv0_n20_N3ccc8CC4x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y53efgEv,_ZThn4_N3ccc8CC4x14y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y53abcEv,_ZTv0_n16_N3ccc8CC4x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y53abcEv,_ZThn4_N3ccc8CC4x14y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y53pqrEv,_ZTv0_n12_N3ccc8CC4x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y53pqrEv,_ZThn4_N3ccc8CC4x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y5E = {  "_ZN3ccc8CC4x14y5E", // class name
  bases__ZN3ccc8CC4x14y5E, 2,
  &(vtc__ZN3ccc8CC4x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y5  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD4x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x14y53abcEv
  ~DD4x14y5(); // tgen
  DD4x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y5E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y53pqrEv");}
void  ccc::DD4x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y53efgEv");}
void  ccc::DD4x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y53abcEv");}
ccc::DD4x14y5 ::~DD4x14y5(){ note_dtor("_ZN3ccc8DD4x14y5E", this);} // tgen
ccc::DD4x14y5 ::DD4x14y5(){ note_ctor("_ZN3ccc8DD4x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y5E, buf);
    ::ccc::DD4x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y5E);
    dp->::ccc::DD4x14y5::~DD4x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y5E(Test__ZN3ccc8DD4x14y5E, "_ZN3ccc8DD4x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y5C1Ev();
extern void _ZN3ccc8DD4x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y5E[] = {
  NSPAIR(_ZN3ccc8DD4x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y5E[];
extern void _ZN3ccc8DD4x14y53pqrEv();
extern void _ZN3ccc8DD4x14y53abcEv();
extern void _ZN3ccc8DD4x14y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y53pqrEv,_ZTv0_n12_N3ccc8DD4x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y53pqrEv,_ZThn4_N3ccc8DD4x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y53pqrEv,_ZTv0_n12_N3ccc8DD4x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y5E[] = {
  {&(_ZTVN3ccc8DD4x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y5E[];
static VTBL_ENTRY alt_thunk_names2146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y53pqrEv,_ZTv0_n12_N3ccc8DD4x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y53pqrEv,_ZThn4_N3ccc8DD4x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y5E = {  "_ZN3ccc8DD4x14y5E", // class name
  bases__ZN3ccc8DD4x14y5E, 2,
  &(vtc__ZN3ccc8DD4x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y6  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y63efgEv
  ~CC4x14y6(); // tgen
  CC4x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y6E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y63abcEv");}
void  ccc::CC4x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y63efgEv");}
ccc::CC4x14y6 ::~CC4x14y6(){ note_dtor("_ZN3ccc8CC4x14y6E", this);} // tgen
ccc::CC4x14y6 ::CC4x14y6(){ note_ctor("_ZN3ccc8CC4x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y6E, buf);
    ::ccc::CC4x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y6E);
    dp->::ccc::CC4x14y6::~CC4x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y6E(Test__ZN3ccc8CC4x14y6E, "_ZN3ccc8CC4x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y6C1Ev();
extern void _ZN3ccc8CC4x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y6E[] = {
  NSPAIR(_ZN3ccc8CC4x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC4x14y63abcEv();
extern void _ZN3ccc8CC4x14y63efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y63abcEv,_ZTv0_n16_N3ccc8CC4x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y63abcEv,_ZThn4_N3ccc8CC4x14y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y63efgEv,_ZTv0_n20_N3ccc8CC4x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y63efgEv,_ZThn4_N3ccc8CC4x14y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y63abcEv,_ZTv0_n16_N3ccc8CC4x14y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y63efgEv,_ZTv0_n20_N3ccc8CC4x14y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y6E[] = {
  {&(_ZTVN3ccc8CC4x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y6E[];
static VTBL_ENTRY alt_thunk_names2147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y63efgEv,_ZTv0_n20_N3ccc8CC4x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y63efgEv,_ZThn4_N3ccc8CC4x14y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y63abcEv,_ZTv0_n16_N3ccc8CC4x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y63abcEv,_ZThn4_N3ccc8CC4x14y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y6E = {  "_ZN3ccc8CC4x14y6E", // class name
  bases__ZN3ccc8CC4x14y6E, 2,
  &(vtc__ZN3ccc8CC4x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y6  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD4x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x14y63efgEv
  ~DD4x14y6(); // tgen
  DD4x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y6E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y63abcEv");}
void  ccc::DD4x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y63efgEv");}
ccc::DD4x14y6 ::~DD4x14y6(){ note_dtor("_ZN3ccc8DD4x14y6E", this);} // tgen
ccc::DD4x14y6 ::DD4x14y6(){ note_ctor("_ZN3ccc8DD4x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y6E, buf);
    ::ccc::DD4x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y6E);
    dp->::ccc::DD4x14y6::~DD4x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y6E(Test__ZN3ccc8DD4x14y6E, "_ZN3ccc8DD4x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y6C1Ev();
extern void _ZN3ccc8DD4x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y6E[] = {
  NSPAIR(_ZN3ccc8DD4x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x14y63abcEv();
extern void _ZN3ccc8DD4x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y6E[] = {
  {&(_ZTVN3ccc8DD4x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y6E[];
Class_Descriptor cd__ZN3ccc8DD4x14y6E = {  "_ZN3ccc8DD4x14y6E", // class name
  bases__ZN3ccc8DD4x14y6E, 2,
  &(vtc__ZN3ccc8DD4x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y7  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y73pqrEv
  ~CC4x14y7(); // tgen
  CC4x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y7E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y73abcEv");}
void  ccc::CC4x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y73pqrEv");}
ccc::CC4x14y7 ::~CC4x14y7(){ note_dtor("_ZN3ccc8CC4x14y7E", this);} // tgen
ccc::CC4x14y7 ::CC4x14y7(){ note_ctor("_ZN3ccc8CC4x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y7E, buf);
    ::ccc::CC4x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y7E);
    dp->::ccc::CC4x14y7::~CC4x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y7E(Test__ZN3ccc8CC4x14y7E, "_ZN3ccc8CC4x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y7C1Ev();
extern void _ZN3ccc8CC4x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y7E[] = {
  NSPAIR(_ZN3ccc8CC4x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y7E[];
extern void _ZN3ccc8CC4x14y73pqrEv();
extern void _ZN3ccc8CC4x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y73pqrEv,_ZTv0_n12_N3ccc8CC4x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y73pqrEv,_ZThn4_N3ccc8CC4x14y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y73abcEv,_ZTv0_n16_N3ccc8CC4x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y73abcEv,_ZThn4_N3ccc8CC4x14y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y73pqrEv,_ZTv0_n12_N3ccc8CC4x14y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y73abcEv,_ZTv0_n16_N3ccc8CC4x14y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y7E[] = {
  {&(_ZTVN3ccc8CC4x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y7E[];
static VTBL_ENTRY alt_thunk_names2148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y73abcEv,_ZTv0_n16_N3ccc8CC4x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y73abcEv,_ZThn4_N3ccc8CC4x14y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y73pqrEv,_ZTv0_n12_N3ccc8CC4x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y73pqrEv,_ZThn4_N3ccc8CC4x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y7E = {  "_ZN3ccc8CC4x14y7E", // class name
  bases__ZN3ccc8CC4x14y7E, 2,
  &(vtc__ZN3ccc8CC4x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y7  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD4x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y73pqrEv
  ~DD4x14y7(); // tgen
  DD4x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y7E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y73abcEv");}
void  ccc::DD4x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y73pqrEv");}
ccc::DD4x14y7 ::~DD4x14y7(){ note_dtor("_ZN3ccc8DD4x14y7E", this);} // tgen
ccc::DD4x14y7 ::DD4x14y7(){ note_ctor("_ZN3ccc8DD4x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y7E, buf);
    ::ccc::DD4x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y7E);
    dp->::ccc::DD4x14y7::~DD4x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y7E(Test__ZN3ccc8DD4x14y7E, "_ZN3ccc8DD4x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y7C1Ev();
extern void _ZN3ccc8DD4x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y7E[] = {
  NSPAIR(_ZN3ccc8DD4x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y7E[];
extern void _ZN3ccc8DD4x14y73pqrEv();
extern void _ZN3ccc8DD4x14y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y73pqrEv,_ZTv0_n12_N3ccc8DD4x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y73pqrEv,_ZThn4_N3ccc8DD4x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y73pqrEv,_ZTv0_n12_N3ccc8DD4x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y7E[] = {
  {&(_ZTVN3ccc8DD4x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y7E[];
static VTBL_ENTRY alt_thunk_names2149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y73pqrEv,_ZTv0_n12_N3ccc8DD4x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y73pqrEv,_ZThn4_N3ccc8DD4x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y7E = {  "_ZN3ccc8DD4x14y7E", // class name
  bases__ZN3ccc8DD4x14y7E, 2,
  &(vtc__ZN3ccc8DD4x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y8  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y83abcEv
  ~CC4x14y8(); // tgen
  CC4x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y8E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y83efgEv");}
void  ccc::CC4x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y83abcEv");}
ccc::CC4x14y8 ::~CC4x14y8(){ note_dtor("_ZN3ccc8CC4x14y8E", this);} // tgen
ccc::CC4x14y8 ::CC4x14y8(){ note_ctor("_ZN3ccc8CC4x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y8E, buf);
    ::ccc::CC4x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y8E);
    dp->::ccc::CC4x14y8::~CC4x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y8E(Test__ZN3ccc8CC4x14y8E, "_ZN3ccc8CC4x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y8C1Ev();
extern void _ZN3ccc8CC4x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y8E[] = {
  NSPAIR(_ZN3ccc8CC4x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC4x14y83efgEv();
extern void _ZN3ccc8CC4x14y83abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC4x14y83abcEv,_ZTv0_n16_N3ccc8CC4x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y83abcEv,_ZThn4_N3ccc8CC4x14y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y83efgEv,_ZTv0_n20_N3ccc8CC4x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y83efgEv,_ZThn4_N3ccc8CC4x14y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC4x14y83abcEv,_ZTv0_n16_N3ccc8CC4x14y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y83efgEv,_ZTv0_n20_N3ccc8CC4x14y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y8E[] = {
  {&(_ZTVN3ccc8CC4x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC4x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y8E[];
static VTBL_ENTRY alt_thunk_names2150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y83efgEv,_ZTv0_n20_N3ccc8CC4x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y83efgEv,_ZThn4_N3ccc8CC4x14y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC4x14y83abcEv,_ZTv0_n16_N3ccc8CC4x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y83abcEv,_ZThn4_N3ccc8CC4x14y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y8E = {  "_ZN3ccc8CC4x14y8E", // class name
  bases__ZN3ccc8CC4x14y8E, 2,
  &(vtc__ZN3ccc8CC4x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y8  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD4x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x14y83abcEv
  ~DD4x14y8(); // tgen
  DD4x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y8E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y83efgEv");}
void  ccc::DD4x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x14y83abcEv");}
ccc::DD4x14y8 ::~DD4x14y8(){ note_dtor("_ZN3ccc8DD4x14y8E", this);} // tgen
ccc::DD4x14y8 ::DD4x14y8(){ note_ctor("_ZN3ccc8DD4x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y8E, buf);
    ::ccc::DD4x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y8E);
    dp->::ccc::DD4x14y8::~DD4x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y8E(Test__ZN3ccc8DD4x14y8E, "_ZN3ccc8DD4x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y8C1Ev();
extern void _ZN3ccc8DD4x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y8E[] = {
  NSPAIR(_ZN3ccc8DD4x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x14y83abcEv();
extern void _ZN3ccc8DD4x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y83efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y8E[] = {
  {&(_ZTVN3ccc8DD4x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y8E[];
Class_Descriptor cd__ZN3ccc8DD4x14y8E = {  "_ZN3ccc8DD4x14y8E", // class name
  bases__ZN3ccc8DD4x14y8E, 2,
  &(vtc__ZN3ccc8DD4x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y9  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y93pqrEv
  ~CC4x14y9(); // tgen
  CC4x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y9E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y93efgEv");}
void  ccc::CC4x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y93pqrEv");}
ccc::CC4x14y9 ::~CC4x14y9(){ note_dtor("_ZN3ccc8CC4x14y9E", this);} // tgen
ccc::CC4x14y9 ::CC4x14y9(){ note_ctor("_ZN3ccc8CC4x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y9E, buf);
    ::ccc::CC4x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc8CC4x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC4x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y9E);
    dp->::ccc::CC4x14y9::~CC4x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y9E(Test__ZN3ccc8CC4x14y9E, "_ZN3ccc8CC4x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y9C1Ev();
extern void _ZN3ccc8CC4x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y9E[] = {
  NSPAIR(_ZN3ccc8CC4x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y9E[];
extern void _ZN3ccc8CC4x14y93pqrEv();
extern void _ZN3ccc8CC4x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC4x14y93pqrEv,_ZTv0_n12_N3ccc8CC4x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y93pqrEv,_ZThn4_N3ccc8CC4x14y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC4x14y93efgEv,_ZTv0_n20_N3ccc8CC4x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y93efgEv,_ZThn4_N3ccc8CC4x14y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC4x14y93pqrEv,_ZTv0_n12_N3ccc8CC4x14y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC4x14y93efgEv,_ZTv0_n20_N3ccc8CC4x14y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x14y9E[] = {
  {&(_ZTVN3ccc8CC4x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC4x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x14y9E[];
static VTBL_ENTRY alt_thunk_names2151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC4x14y93efgEv,_ZTv0_n20_N3ccc8CC4x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y93efgEv,_ZThn4_N3ccc8CC4x14y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC4x14y93pqrEv,_ZTv0_n12_N3ccc8CC4x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC4x14y93pqrEv,_ZThn4_N3ccc8CC4x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC4x14y9E = {  "_ZN3ccc8CC4x14y9E", // class name
  bases__ZN3ccc8CC4x14y9E, 2,
  &(vtc__ZN3ccc8CC4x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x14y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y9  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD4x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x14y93pqrEv
  ~DD4x14y9(); // tgen
  DD4x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x14y9E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x14y93efgEv");}
void  ccc::DD4x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x14y93pqrEv");}
ccc::DD4x14y9 ::~DD4x14y9(){ note_dtor("_ZN3ccc8DD4x14y9E", this);} // tgen
ccc::DD4x14y9 ::DD4x14y9(){ note_ctor("_ZN3ccc8DD4x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD4x14y9E, buf);
    ::ccc::DD4x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD4x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x14y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD4x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x14y9E);
    dp->::ccc::DD4x14y9::~DD4x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x14y9E(Test__ZN3ccc8DD4x14y9E, "_ZN3ccc8DD4x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD4x14y9C1Ev();
extern void _ZN3ccc8DD4x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x14y9E[] = {
  NSPAIR(_ZN3ccc8DD4x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD4x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y9E[];
extern void _ZN3ccc8DD4x14y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD4x14y93pqrEv,_ZTv0_n12_N3ccc8DD4x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD4x14y93pqrEv,_ZThn4_N3ccc8DD4x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD4x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD4x14y93pqrEv,_ZTv0_n12_N3ccc8DD4x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x14y9E[] = {
  {&(_ZTVN3ccc8DD4x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD4x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x14y9E[];
static VTBL_ENTRY alt_thunk_names2152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD4x14y93pqrEv,_ZTv0_n12_N3ccc8DD4x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD4x14y93pqrEv,_ZThn4_N3ccc8DD4x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD4x14y9E = {  "_ZN3ccc8DD4x14y9E", // class name
  bases__ZN3ccc8DD4x14y9E, 2,
  &(vtc__ZN3ccc8DD4x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD4x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x14y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y10  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x14y103abcEv
  ~CC4x14y10(); // tgen
  CC4x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y10E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y103pqrEv");}
void  ccc::CC4x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x14y103abcEv");}
ccc::CC4x14y10 ::~CC4x14y10(){ note_dtor("_ZN3ccc9CC4x14y10E", this);} // tgen
ccc::CC4x14y10 ::CC4x14y10(){ note_ctor("_ZN3ccc9CC4x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y10E, buf);
    ::ccc::CC4x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y10E);
    dp->::ccc::CC4x14y10::~CC4x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y10E(Test__ZN3ccc9CC4x14y10E, "_ZN3ccc9CC4x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y10C1Ev();
extern void _ZN3ccc9CC4x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y10E[] = {
  NSPAIR(_ZN3ccc9CC4x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y10E[];
extern void _ZN3ccc9CC4x14y103pqrEv();
extern void _ZN3ccc9CC4x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x14y103pqrEv,_ZTv0_n12_N3ccc9CC4x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y103pqrEv,_ZThn4_N3ccc9CC4x14y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x14y103abcEv,_ZTv0_n16_N3ccc9CC4x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y103abcEv,_ZThn4_N3ccc9CC4x14y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x14y103pqrEv,_ZTv0_n12_N3ccc9CC4x14y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x14y103abcEv,_ZTv0_n16_N3ccc9CC4x14y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y10E[] = {
  {&(_ZTVN3ccc9CC4x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y10E[];
static VTBL_ENTRY alt_thunk_names2153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x14y103abcEv,_ZTv0_n16_N3ccc9CC4x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y103abcEv,_ZThn4_N3ccc9CC4x14y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x14y103pqrEv,_ZTv0_n12_N3ccc9CC4x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y103pqrEv,_ZThn4_N3ccc9CC4x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x14y10E = {  "_ZN3ccc9CC4x14y10E", // class name
  bases__ZN3ccc9CC4x14y10E, 2,
  &(vtc__ZN3ccc9CC4x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y10  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD4x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x14y103abcEv
  ~DD4x14y10(); // tgen
  DD4x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y10E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x14y103pqrEv");}
void  ccc::DD4x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x14y103abcEv");}
ccc::DD4x14y10 ::~DD4x14y10(){ note_dtor("_ZN3ccc9DD4x14y10E", this);} // tgen
ccc::DD4x14y10 ::DD4x14y10(){ note_ctor("_ZN3ccc9DD4x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y10E, buf);
    ::ccc::DD4x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y10E);
    dp->::ccc::DD4x14y10::~DD4x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y10E(Test__ZN3ccc9DD4x14y10E, "_ZN3ccc9DD4x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y10C1Ev();
extern void _ZN3ccc9DD4x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y10E[] = {
  NSPAIR(_ZN3ccc9DD4x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y10E[];
extern void _ZN3ccc9DD4x14y103pqrEv();
extern void _ZN3ccc9DD4x14y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x14y103pqrEv,_ZTv0_n12_N3ccc9DD4x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x14y103pqrEv,_ZThn4_N3ccc9DD4x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x14y103pqrEv,_ZTv0_n12_N3ccc9DD4x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y10E[] = {
  {&(_ZTVN3ccc9DD4x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y10E[];
static VTBL_ENTRY alt_thunk_names2154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x14y103pqrEv,_ZTv0_n12_N3ccc9DD4x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x14y103pqrEv,_ZThn4_N3ccc9DD4x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x14y10E = {  "_ZN3ccc9DD4x14y10E", // class name
  bases__ZN3ccc9DD4x14y10E, 2,
  &(vtc__ZN3ccc9DD4x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y11  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x14y113efgEv
  ~CC4x14y11(); // tgen
  CC4x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y11E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y113pqrEv");}
void  ccc::CC4x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x14y113efgEv");}
ccc::CC4x14y11 ::~CC4x14y11(){ note_dtor("_ZN3ccc9CC4x14y11E", this);} // tgen
ccc::CC4x14y11 ::CC4x14y11(){ note_ctor("_ZN3ccc9CC4x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y11E, buf);
    ::ccc::CC4x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y11E);
    dp->::ccc::CC4x14y11::~CC4x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y11E(Test__ZN3ccc9CC4x14y11E, "_ZN3ccc9CC4x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y11C1Ev();
extern void _ZN3ccc9CC4x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y11E[] = {
  NSPAIR(_ZN3ccc9CC4x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y11E[];
extern void _ZN3ccc9CC4x14y113pqrEv();
extern void _ZN3ccc9CC4x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x14y113pqrEv,_ZTv0_n12_N3ccc9CC4x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y113pqrEv,_ZThn4_N3ccc9CC4x14y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x14y113efgEv,_ZTv0_n20_N3ccc9CC4x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y113efgEv,_ZThn4_N3ccc9CC4x14y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x14y113pqrEv,_ZTv0_n12_N3ccc9CC4x14y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x14y113efgEv,_ZTv0_n20_N3ccc9CC4x14y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y11E[] = {
  {&(_ZTVN3ccc9CC4x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y11E[];
static VTBL_ENTRY alt_thunk_names2155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x14y113efgEv,_ZTv0_n20_N3ccc9CC4x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y113efgEv,_ZThn4_N3ccc9CC4x14y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x14y113pqrEv,_ZTv0_n12_N3ccc9CC4x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y113pqrEv,_ZThn4_N3ccc9CC4x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x14y11E = {  "_ZN3ccc9CC4x14y11E", // class name
  bases__ZN3ccc9CC4x14y11E, 2,
  &(vtc__ZN3ccc9CC4x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y11  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD4x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x14y113efgEv
  ~DD4x14y11(); // tgen
  DD4x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y11E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD4x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x14y113pqrEv");}
void  ccc::DD4x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x14y113efgEv");}
ccc::DD4x14y11 ::~DD4x14y11(){ note_dtor("_ZN3ccc9DD4x14y11E", this);} // tgen
ccc::DD4x14y11 ::DD4x14y11(){ note_ctor("_ZN3ccc9DD4x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y11E, buf);
    ::ccc::DD4x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y11E);
    dp->::ccc::DD4x14y11::~DD4x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y11E(Test__ZN3ccc9DD4x14y11E, "_ZN3ccc9DD4x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y11C1Ev();
extern void _ZN3ccc9DD4x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y11E[] = {
  NSPAIR(_ZN3ccc9DD4x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y11E[];
extern void _ZN3ccc9DD4x14y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x14y113pqrEv,_ZTv0_n12_N3ccc9DD4x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x14y113pqrEv,_ZThn4_N3ccc9DD4x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x14y113pqrEv,_ZTv0_n12_N3ccc9DD4x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y11E[] = {
  {&(_ZTVN3ccc9DD4x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y11E[];
static VTBL_ENTRY alt_thunk_names2156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x14y113pqrEv,_ZTv0_n12_N3ccc9DD4x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x14y113pqrEv,_ZThn4_N3ccc9DD4x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x14y11E = {  "_ZN3ccc9DD4x14y11E", // class name
  bases__ZN3ccc9DD4x14y11E, 2,
  &(vtc__ZN3ccc9DD4x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y12  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC4x14y123abcEv
  ~CC4x14y12(); // tgen
  CC4x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y12E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x14y123abcEv");}
ccc::CC4x14y12 ::~CC4x14y12(){ note_dtor("_ZN3ccc9CC4x14y12E", this);} // tgen
ccc::CC4x14y12 ::CC4x14y12(){ note_ctor("_ZN3ccc9CC4x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y12E, buf);
    ::ccc::CC4x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y12E);
    dp->::ccc::CC4x14y12::~CC4x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y12E(Test__ZN3ccc9CC4x14y12E, "_ZN3ccc9CC4x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y12C1Ev();
extern void _ZN3ccc9CC4x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y12E[] = {
  NSPAIR(_ZN3ccc9CC4x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC4x14y123abcEv();
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC4x14y123abcEv,_ZTv0_n16_N3ccc9CC4x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y123abcEv,_ZThn4_N3ccc9CC4x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC4x14y123abcEv,_ZTv0_n16_N3ccc9CC4x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y12E[] = {
  {&(_ZTVN3ccc9CC4x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y12E[];
static VTBL_ENTRY alt_thunk_names2157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC4x14y123abcEv,_ZTv0_n16_N3ccc9CC4x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y123abcEv,_ZThn4_N3ccc9CC4x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x14y12E = {  "_ZN3ccc9CC4x14y12E", // class name
  bases__ZN3ccc9CC4x14y12E, 2,
  &(vtc__ZN3ccc9CC4x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y12  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD4x14y123abcEv
  ~DD4x14y12(); // tgen
  DD4x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y12E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x14y123abcEv");}
ccc::DD4x14y12 ::~DD4x14y12(){ note_dtor("_ZN3ccc9DD4x14y12E", this);} // tgen
ccc::DD4x14y12 ::DD4x14y12(){ note_ctor("_ZN3ccc9DD4x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y12E, buf);
    ::ccc::DD4x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y12E);
    dp->::ccc::DD4x14y12::~DD4x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y12E(Test__ZN3ccc9DD4x14y12E, "_ZN3ccc9DD4x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y12C1Ev();
extern void _ZN3ccc9DD4x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y12E[] = {
  NSPAIR(_ZN3ccc9DD4x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x14y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y12E[] = {
  {&(_ZTVN3ccc9DD4x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y12E[];
Class_Descriptor cd__ZN3ccc9DD4x14y12E = {  "_ZN3ccc9DD4x14y12E", // class name
  bases__ZN3ccc9DD4x14y12E, 2,
  &(vtc__ZN3ccc9DD4x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y13  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC4x14y133efgEv
  ~CC4x14y13(); // tgen
  CC4x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y13E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x14y133efgEv");}
ccc::CC4x14y13 ::~CC4x14y13(){ note_dtor("_ZN3ccc9CC4x14y13E", this);} // tgen
ccc::CC4x14y13 ::CC4x14y13(){ note_ctor("_ZN3ccc9CC4x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y13E, buf);
    ::ccc::CC4x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y13E);
    dp->::ccc::CC4x14y13::~CC4x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y13E(Test__ZN3ccc9CC4x14y13E, "_ZN3ccc9CC4x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y13C1Ev();
extern void _ZN3ccc9CC4x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y13E[] = {
  NSPAIR(_ZN3ccc9CC4x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    5, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC4x14y133efgEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC4x14y133efgEv,_ZTv0_n20_N3ccc9CC4x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y133efgEv,_ZThn4_N3ccc9CC4x14y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC4x14y133efgEv,_ZTv0_n20_N3ccc9CC4x14y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y13E[] = {
  {&(_ZTVN3ccc9CC4x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC4x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y13E[];
static VTBL_ENTRY alt_thunk_names2158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC4x14y133efgEv,_ZTv0_n20_N3ccc9CC4x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y133efgEv,_ZThn4_N3ccc9CC4x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x14y13E = {  "_ZN3ccc9CC4x14y13E", // class name
  bases__ZN3ccc9CC4x14y13E, 2,
  &(vtc__ZN3ccc9CC4x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y13  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD4x14y133efgEv
  ~DD4x14y13(); // tgen
  DD4x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y13E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD4x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x14y133efgEv");}
ccc::DD4x14y13 ::~DD4x14y13(){ note_dtor("_ZN3ccc9DD4x14y13E", this);} // tgen
ccc::DD4x14y13 ::DD4x14y13(){ note_ctor("_ZN3ccc9DD4x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y13E, buf);
    ::ccc::DD4x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y13E);
    dp->::ccc::DD4x14y13::~DD4x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y13E(Test__ZN3ccc9DD4x14y13E, "_ZN3ccc9DD4x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y13C1Ev();
extern void _ZN3ccc9DD4x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y13E[] = {
  NSPAIR(_ZN3ccc9DD4x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y13E[] = {
  {&(_ZTVN3ccc9DD4x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y13E[];
Class_Descriptor cd__ZN3ccc9DD4x14y13E = {  "_ZN3ccc9DD4x14y13E", // class name
  bases__ZN3ccc9DD4x14y13E, 2,
  &(vtc__ZN3ccc9DD4x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y14  : virtual ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y143pqrEv
  ~CC4x14y14(); // tgen
  CC4x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y143pqrEv");}
ccc::CC4x14y14 ::~CC4x14y14(){ note_dtor("_ZN3ccc9CC4x14y14E", this);} // tgen
ccc::CC4x14y14 ::CC4x14y14(){ note_ctor("_ZN3ccc9CC4x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y14E, buf);
    ::ccc::CC4x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y14E);
    dp->::ccc::CC4x14y14::~CC4x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y14E(Test__ZN3ccc9CC4x14y14E, "_ZN3ccc9CC4x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y14C1Ev();
extern void _ZN3ccc9CC4x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y14E[] = {
  NSPAIR(_ZN3ccc9CC4x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y14E[];
extern void _ZN3ccc9CC4x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC4x14y143pqrEv,_ZTv0_n12_N3ccc9CC4x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y143pqrEv,_ZThn4_N3ccc9CC4x14y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC4x14y143pqrEv,_ZTv0_n12_N3ccc9CC4x14y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y14E[] = {
  {&(_ZTVN3ccc9CC4x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y14E[];
static VTBL_ENTRY alt_thunk_names2159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC4x14y143pqrEv,_ZTv0_n12_N3ccc9CC4x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC4x14y143pqrEv,_ZThn4_N3ccc9CC4x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC4x14y14E = {  "_ZN3ccc9CC4x14y14E", // class name
  bases__ZN3ccc9CC4x14y14E, 2,
  &(vtc__ZN3ccc9CC4x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y14  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD4x14y143pqrEv
  ~DD4x14y14(); // tgen
  DD4x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD4x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x14y143pqrEv");}
ccc::DD4x14y14 ::~DD4x14y14(){ note_dtor("_ZN3ccc9DD4x14y14E", this);} // tgen
ccc::DD4x14y14 ::DD4x14y14(){ note_ctor("_ZN3ccc9DD4x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y14E, buf);
    ::ccc::DD4x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y14E);
    dp->::ccc::DD4x14y14::~DD4x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y14E(Test__ZN3ccc9DD4x14y14E, "_ZN3ccc9DD4x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y14C1Ev();
extern void _ZN3ccc9DD4x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y14E[] = {
  NSPAIR(_ZN3ccc9DD4x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y14E[];
extern void _ZN3ccc9DD4x14y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD4x14y143pqrEv,_ZTv0_n12_N3ccc9DD4x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD4x14y143pqrEv,_ZThn4_N3ccc9DD4x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD4x14y143pqrEv,_ZTv0_n12_N3ccc9DD4x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y14E[] = {
  {&(_ZTVN3ccc9DD4x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y14E[];
static VTBL_ENTRY alt_thunk_names2160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD4x14y143pqrEv,_ZTv0_n12_N3ccc9DD4x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD4x14y143pqrEv,_ZThn4_N3ccc9DD4x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD4x14y14E = {  "_ZN3ccc9DD4x14y14E", // class name
  bases__ZN3ccc9DD4x14y14E, 2,
  &(vtc__ZN3ccc9DD4x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y15  : virtual ::ccc::AA4 , ::ccc::BB14 {
  ~CC4x14y15(); // tgen
  CC4x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x14y15 ::~CC4x14y15(){ note_dtor("_ZN3ccc9CC4x14y15E", this);} // tgen
ccc::CC4x14y15 ::CC4x14y15(){ note_ctor("_ZN3ccc9CC4x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y15E, buf);
    ::ccc::CC4x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), ABISELECT(8,4), "_ZN3ccc9CC4x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC4x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y15E);
    dp->::ccc::CC4x14y15::~CC4x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y15E(Test__ZN3ccc9CC4x14y15E, "_ZN3ccc9CC4x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y15C1Ev();
extern void _ZN3ccc9CC4x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y15E[] = {
  NSPAIR(_ZN3ccc9CC4x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    ABISELECT(8,4), //bcp->offset
    4, //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},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x14y15E[] = {
  {&(_ZTVN3ccc9CC4x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC4x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x14y15E[];
Class_Descriptor cd__ZN3ccc9CC4x14y15E = {  "_ZN3ccc9CC4x14y15E", // class name
  bases__ZN3ccc9CC4x14y15E, 2,
  &(vtc__ZN3ccc9CC4x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x14y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD4x14y15  : virtual ::ccc::AA4 , virtual ::ccc::BB14 {
  ~DD4x14y15(); // tgen
  DD4x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD4x14y15 ::~DD4x14y15(){ note_dtor("_ZN3ccc9DD4x14y15E", this);} // tgen
ccc::DD4x14y15 ::DD4x14y15(){ note_ctor("_ZN3ccc9DD4x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD4x14y15E, buf);
    ::ccc::DD4x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD4x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x14y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD4x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x14y15E);
    dp->::ccc::DD4x14y15::~DD4x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x14y15E(Test__ZN3ccc9DD4x14y15E, "_ZN3ccc9DD4x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD4x14y15C1Ev();
extern void _ZN3ccc9DD4x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x14y15E[] = {
  NSPAIR(_ZN3ccc9DD4x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD4x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x14y15E[] = {
  {&(_ZTVN3ccc9DD4x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD4x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x14y15E[];
Class_Descriptor cd__ZN3ccc9DD4x14y15E = {  "_ZN3ccc9DD4x14y15E", // class name
  bases__ZN3ccc9DD4x14y15E, 2,
  &(vtc__ZN3ccc9DD4x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD4x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x14y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y0  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y03pqrEv
  ~CC4x15y0(); // tgen
  CC4x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y0E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y03abcEv");}
void  ccc::CC4x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y03efgEv");}
void  ccc::CC4x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y03pqrEv");}
ccc::CC4x15y0 ::~CC4x15y0(){ note_dtor("_ZN3ccc8CC4x15y0E", this);} // tgen
ccc::CC4x15y0 ::CC4x15y0(){ note_ctor("_ZN3ccc8CC4x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y0E, buf);
    ::ccc::CC4x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y0E);
    dp->::ccc::CC4x15y0::~CC4x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y0E(Test__ZN3ccc8CC4x15y0E, "_ZN3ccc8CC4x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y0C1Ev();
extern void _ZN3ccc8CC4x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y0E[] = {
  NSPAIR(_ZN3ccc8CC4x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y0E[];
extern void _ZN3ccc8CC4x15y03pqrEv();
extern void _ZN3ccc8CC4x15y03abcEv();
extern void _ZN3ccc8CC4x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y0E[] = {
  {&(_ZTVN3ccc8CC4x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y0E[];
Class_Descriptor cd__ZN3ccc8CC4x15y0E = {  "_ZN3ccc8CC4x15y0E", // class name
  bases__ZN3ccc8CC4x15y0E, 2,
  &(vtc__ZN3ccc8CC4x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y0E),2, //virtual 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  DD4x15y0  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD4x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD4x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y03pqrEv
  ~DD4x15y0(); // tgen
  DD4x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y0E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y03abcEv");}
void  ccc::DD4x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y03efgEv");}
void  ccc::DD4x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y03pqrEv");}
ccc::DD4x15y0 ::~DD4x15y0(){ note_dtor("_ZN3ccc8DD4x15y0E", this);} // tgen
ccc::DD4x15y0 ::DD4x15y0(){ note_ctor("_ZN3ccc8DD4x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y0E, buf);
    ::ccc::DD4x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y0E);
    dp->::ccc::DD4x15y0::~DD4x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y0E(Test__ZN3ccc8DD4x15y0E, "_ZN3ccc8DD4x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y0C1Ev();
extern void _ZN3ccc8DD4x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y0E[] = {
  NSPAIR(_ZN3ccc8DD4x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y0E[];
extern void _ZN3ccc8DD4x15y03pqrEv();
extern void _ZN3ccc8DD4x15y03abcEv();
extern void _ZN3ccc8DD4x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y0E[] = {
  {&(_ZTVN3ccc8DD4x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y0E[];
Class_Descriptor cd__ZN3ccc8DD4x15y0E = {  "_ZN3ccc8DD4x15y0E", // class name
  bases__ZN3ccc8DD4x15y0E, 2,
  &(vtc__ZN3ccc8DD4x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y0E),2, //virtual 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  CC4x15y1  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x15y13efgEv
  ~CC4x15y1(); // tgen
  CC4x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y1E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y13abcEv");}
void  ccc::CC4x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y13pqrEv");}
void  ccc::CC4x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y13efgEv");}
ccc::CC4x15y1 ::~CC4x15y1(){ note_dtor("_ZN3ccc8CC4x15y1E", this);} // tgen
ccc::CC4x15y1 ::CC4x15y1(){ note_ctor("_ZN3ccc8CC4x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y1E, buf);
    ::ccc::CC4x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y1E);
    dp->::ccc::CC4x15y1::~CC4x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y1E(Test__ZN3ccc8CC4x15y1E, "_ZN3ccc8CC4x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y1C1Ev();
extern void _ZN3ccc8CC4x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y1E[] = {
  NSPAIR(_ZN3ccc8CC4x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y1E[];
extern void _ZN3ccc8CC4x15y13pqrEv();
extern void _ZN3ccc8CC4x15y13abcEv();
extern void _ZN3ccc8CC4x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y1E[] = {
  {&(_ZTVN3ccc8CC4x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y1E[];
Class_Descriptor cd__ZN3ccc8CC4x15y1E = {  "_ZN3ccc8CC4x15y1E", // class name
  bases__ZN3ccc8CC4x15y1E, 2,
  &(vtc__ZN3ccc8CC4x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y1E),2, //virtual 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  DD4x15y1  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD4x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x15y13efgEv
  ~DD4x15y1(); // tgen
  DD4x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y1E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y13abcEv");}
void  ccc::DD4x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y13pqrEv");}
void  ccc::DD4x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y13efgEv");}
ccc::DD4x15y1 ::~DD4x15y1(){ note_dtor("_ZN3ccc8DD4x15y1E", this);} // tgen
ccc::DD4x15y1 ::DD4x15y1(){ note_ctor("_ZN3ccc8DD4x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y1E, buf);
    ::ccc::DD4x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y1E);
    dp->::ccc::DD4x15y1::~DD4x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y1E(Test__ZN3ccc8DD4x15y1E, "_ZN3ccc8DD4x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y1C1Ev();
extern void _ZN3ccc8DD4x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y1E[] = {
  NSPAIR(_ZN3ccc8DD4x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y1E[];
extern void _ZN3ccc8DD4x15y13pqrEv();
extern void _ZN3ccc8DD4x15y13abcEv();
extern void _ZN3ccc8DD4x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y1E[] = {
  {&(_ZTVN3ccc8DD4x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y1E[];
Class_Descriptor cd__ZN3ccc8DD4x15y1E = {  "_ZN3ccc8DD4x15y1E", // class name
  bases__ZN3ccc8DD4x15y1E, 2,
  &(vtc__ZN3ccc8DD4x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y1E),2, //virtual 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  CC4x15y2  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y23pqrEv
  ~CC4x15y2(); // tgen
  CC4x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y2E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y23efgEv");}
void  ccc::CC4x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y23abcEv");}
void  ccc::CC4x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y23pqrEv");}
ccc::CC4x15y2 ::~CC4x15y2(){ note_dtor("_ZN3ccc8CC4x15y2E", this);} // tgen
ccc::CC4x15y2 ::CC4x15y2(){ note_ctor("_ZN3ccc8CC4x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y2E, buf);
    ::ccc::CC4x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y2E);
    dp->::ccc::CC4x15y2::~CC4x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y2E(Test__ZN3ccc8CC4x15y2E, "_ZN3ccc8CC4x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y2C1Ev();
extern void _ZN3ccc8CC4x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y2E[] = {
  NSPAIR(_ZN3ccc8CC4x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y2E[];
extern void _ZN3ccc8CC4x15y23pqrEv();
extern void _ZN3ccc8CC4x15y23abcEv();
extern void _ZN3ccc8CC4x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y2E[] = {
  {&(_ZTVN3ccc8CC4x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y2E[];
Class_Descriptor cd__ZN3ccc8CC4x15y2E = {  "_ZN3ccc8CC4x15y2E", // class name
  bases__ZN3ccc8CC4x15y2E, 2,
  &(vtc__ZN3ccc8CC4x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y2E),2, //virtual 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  DD4x15y2  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD4x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD4x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y23pqrEv
  ~DD4x15y2(); // tgen
  DD4x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y2E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y23efgEv");}
void  ccc::DD4x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y23abcEv");}
void  ccc::DD4x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y23pqrEv");}
ccc::DD4x15y2 ::~DD4x15y2(){ note_dtor("_ZN3ccc8DD4x15y2E", this);} // tgen
ccc::DD4x15y2 ::DD4x15y2(){ note_ctor("_ZN3ccc8DD4x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y2E, buf);
    ::ccc::DD4x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y2E);
    dp->::ccc::DD4x15y2::~DD4x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y2E(Test__ZN3ccc8DD4x15y2E, "_ZN3ccc8DD4x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y2C1Ev();
extern void _ZN3ccc8DD4x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y2E[] = {
  NSPAIR(_ZN3ccc8DD4x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y2E[];
extern void _ZN3ccc8DD4x15y23pqrEv();
extern void _ZN3ccc8DD4x15y23abcEv();
extern void _ZN3ccc8DD4x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y2E[] = {
  {&(_ZTVN3ccc8DD4x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y2E[];
Class_Descriptor cd__ZN3ccc8DD4x15y2E = {  "_ZN3ccc8DD4x15y2E", // class name
  bases__ZN3ccc8DD4x15y2E, 2,
  &(vtc__ZN3ccc8DD4x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y2E),2, //virtual 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  CC4x15y3  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x15y33abcEv
  ~CC4x15y3(); // tgen
  CC4x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y3E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y33efgEv");}
void  ccc::CC4x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y33pqrEv");}
void  ccc::CC4x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y33abcEv");}
ccc::CC4x15y3 ::~CC4x15y3(){ note_dtor("_ZN3ccc8CC4x15y3E", this);} // tgen
ccc::CC4x15y3 ::CC4x15y3(){ note_ctor("_ZN3ccc8CC4x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y3E, buf);
    ::ccc::CC4x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y3E);
    dp->::ccc::CC4x15y3::~CC4x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y3E(Test__ZN3ccc8CC4x15y3E, "_ZN3ccc8CC4x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y3C1Ev();
extern void _ZN3ccc8CC4x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y3E[] = {
  NSPAIR(_ZN3ccc8CC4x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y3E[];
extern void _ZN3ccc8CC4x15y33pqrEv();
extern void _ZN3ccc8CC4x15y33abcEv();
extern void _ZN3ccc8CC4x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y3E[] = {
  {&(_ZTVN3ccc8CC4x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y3E[];
Class_Descriptor cd__ZN3ccc8CC4x15y3E = {  "_ZN3ccc8CC4x15y3E", // class name
  bases__ZN3ccc8CC4x15y3E, 2,
  &(vtc__ZN3ccc8CC4x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y3E),2, //virtual 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  DD4x15y3  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD4x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x15y33abcEv
  ~DD4x15y3(); // tgen
  DD4x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y3E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y33efgEv");}
void  ccc::DD4x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y33pqrEv");}
void  ccc::DD4x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y33abcEv");}
ccc::DD4x15y3 ::~DD4x15y3(){ note_dtor("_ZN3ccc8DD4x15y3E", this);} // tgen
ccc::DD4x15y3 ::DD4x15y3(){ note_ctor("_ZN3ccc8DD4x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y3E, buf);
    ::ccc::DD4x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y3E);
    dp->::ccc::DD4x15y3::~DD4x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y3E(Test__ZN3ccc8DD4x15y3E, "_ZN3ccc8DD4x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y3C1Ev();
extern void _ZN3ccc8DD4x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y3E[] = {
  NSPAIR(_ZN3ccc8DD4x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y3E[];
extern void _ZN3ccc8DD4x15y33pqrEv();
extern void _ZN3ccc8DD4x15y33abcEv();
extern void _ZN3ccc8DD4x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y3E[] = {
  {&(_ZTVN3ccc8DD4x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y3E[];
Class_Descriptor cd__ZN3ccc8DD4x15y3E = {  "_ZN3ccc8DD4x15y3E", // class name
  bases__ZN3ccc8DD4x15y3E, 2,
  &(vtc__ZN3ccc8DD4x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y3E),2, //virtual 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  CC4x15y4  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC4x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y43efgEv
  ~CC4x15y4(); // tgen
  CC4x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y4E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y43pqrEv");}
void  ccc::CC4x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y43abcEv");}
void  ccc::CC4x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y43efgEv");}
ccc::CC4x15y4 ::~CC4x15y4(){ note_dtor("_ZN3ccc8CC4x15y4E", this);} // tgen
ccc::CC4x15y4 ::CC4x15y4(){ note_ctor("_ZN3ccc8CC4x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y4E, buf);
    ::ccc::CC4x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y4E);
    dp->::ccc::CC4x15y4::~CC4x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y4E(Test__ZN3ccc8CC4x15y4E, "_ZN3ccc8CC4x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y4C1Ev();
extern void _ZN3ccc8CC4x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y4E[] = {
  NSPAIR(_ZN3ccc8CC4x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y4E[];
extern void _ZN3ccc8CC4x15y43pqrEv();
extern void _ZN3ccc8CC4x15y43abcEv();
extern void _ZN3ccc8CC4x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y4E[] = {
  {&(_ZTVN3ccc8CC4x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y4E[];
Class_Descriptor cd__ZN3ccc8CC4x15y4E = {  "_ZN3ccc8CC4x15y4E", // class name
  bases__ZN3ccc8CC4x15y4E, 2,
  &(vtc__ZN3ccc8CC4x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y4E),2, //virtual 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  DD4x15y4  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD4x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD4x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD4x15y43efgEv
  ~DD4x15y4(); // tgen
  DD4x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y4E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y43pqrEv");}
void  ccc::DD4x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y43abcEv");}
void  ccc::DD4x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y43efgEv");}
ccc::DD4x15y4 ::~DD4x15y4(){ note_dtor("_ZN3ccc8DD4x15y4E", this);} // tgen
ccc::DD4x15y4 ::DD4x15y4(){ note_ctor("_ZN3ccc8DD4x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y4E, buf);
    ::ccc::DD4x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y4E);
    dp->::ccc::DD4x15y4::~DD4x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y4E(Test__ZN3ccc8DD4x15y4E, "_ZN3ccc8DD4x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y4C1Ev();
extern void _ZN3ccc8DD4x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y4E[] = {
  NSPAIR(_ZN3ccc8DD4x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y4E[];
extern void _ZN3ccc8DD4x15y43pqrEv();
extern void _ZN3ccc8DD4x15y43abcEv();
extern void _ZN3ccc8DD4x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y4E[] = {
  {&(_ZTVN3ccc8DD4x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y4E[];
Class_Descriptor cd__ZN3ccc8DD4x15y4E = {  "_ZN3ccc8DD4x15y4E", // class name
  bases__ZN3ccc8DD4x15y4E, 2,
  &(vtc__ZN3ccc8DD4x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y4E),2, //virtual 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  CC4x15y5  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC4x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y53abcEv
  ~CC4x15y5(); // tgen
  CC4x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y5E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y53pqrEv");}
void  ccc::CC4x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y53efgEv");}
void  ccc::CC4x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y53abcEv");}
ccc::CC4x15y5 ::~CC4x15y5(){ note_dtor("_ZN3ccc8CC4x15y5E", this);} // tgen
ccc::CC4x15y5 ::CC4x15y5(){ note_ctor("_ZN3ccc8CC4x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y5E, buf);
    ::ccc::CC4x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y5E);
    dp->::ccc::CC4x15y5::~CC4x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y5E(Test__ZN3ccc8CC4x15y5E, "_ZN3ccc8CC4x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y5C1Ev();
extern void _ZN3ccc8CC4x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y5E[] = {
  NSPAIR(_ZN3ccc8CC4x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y5E[];
extern void _ZN3ccc8CC4x15y53pqrEv();
extern void _ZN3ccc8CC4x15y53abcEv();
extern void _ZN3ccc8CC4x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y5E[] = {
  {&(_ZTVN3ccc8CC4x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y5E[];
Class_Descriptor cd__ZN3ccc8CC4x15y5E = {  "_ZN3ccc8CC4x15y5E", // class name
  bases__ZN3ccc8CC4x15y5E, 2,
  &(vtc__ZN3ccc8CC4x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y5E),2, //virtual 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  DD4x15y5  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD4x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD4x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD4x15y53abcEv
  ~DD4x15y5(); // tgen
  DD4x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y5E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD4x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y53pqrEv");}
void  ccc::DD4x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y53efgEv");}
void  ccc::DD4x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y53abcEv");}
ccc::DD4x15y5 ::~DD4x15y5(){ note_dtor("_ZN3ccc8DD4x15y5E", this);} // tgen
ccc::DD4x15y5 ::DD4x15y5(){ note_ctor("_ZN3ccc8DD4x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y5E, buf);
    ::ccc::DD4x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y5E);
    dp->::ccc::DD4x15y5::~DD4x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y5E(Test__ZN3ccc8DD4x15y5E, "_ZN3ccc8DD4x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y5C1Ev();
extern void _ZN3ccc8DD4x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y5E[] = {
  NSPAIR(_ZN3ccc8DD4x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y5E[];
extern void _ZN3ccc8DD4x15y53pqrEv();
extern void _ZN3ccc8DD4x15y53abcEv();
extern void _ZN3ccc8DD4x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y5E[] = {
  {&(_ZTVN3ccc8DD4x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y5E[];
Class_Descriptor cd__ZN3ccc8DD4x15y5E = {  "_ZN3ccc8DD4x15y5E", // class name
  bases__ZN3ccc8DD4x15y5E, 2,
  &(vtc__ZN3ccc8DD4x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y5E),2, //virtual 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  CC4x15y6  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y63efgEv
  ~CC4x15y6(); // tgen
  CC4x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y6E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y63abcEv");}
void  ccc::CC4x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y63efgEv");}
ccc::CC4x15y6 ::~CC4x15y6(){ note_dtor("_ZN3ccc8CC4x15y6E", this);} // tgen
ccc::CC4x15y6 ::CC4x15y6(){ note_ctor("_ZN3ccc8CC4x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y6E, buf);
    ::ccc::CC4x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y6E);
    dp->::ccc::CC4x15y6::~CC4x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y6E(Test__ZN3ccc8CC4x15y6E, "_ZN3ccc8CC4x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y6C1Ev();
extern void _ZN3ccc8CC4x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y6E[] = {
  NSPAIR(_ZN3ccc8CC4x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x15y63abcEv();
extern void _ZN3ccc8CC4x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y6E[] = {
  {&(_ZTVN3ccc8CC4x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y6E[];
Class_Descriptor cd__ZN3ccc8CC4x15y6E = {  "_ZN3ccc8CC4x15y6E", // class name
  bases__ZN3ccc8CC4x15y6E, 2,
  &(vtc__ZN3ccc8CC4x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y6E),2, //virtual 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  DD4x15y6  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD4x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD4x15y63efgEv
  ~DD4x15y6(); // tgen
  DD4x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y6E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y63abcEv");}
void  ccc::DD4x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y63efgEv");}
ccc::DD4x15y6 ::~DD4x15y6(){ note_dtor("_ZN3ccc8DD4x15y6E", this);} // tgen
ccc::DD4x15y6 ::DD4x15y6(){ note_ctor("_ZN3ccc8DD4x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y6E, buf);
    ::ccc::DD4x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y6E);
    dp->::ccc::DD4x15y6::~DD4x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y6E(Test__ZN3ccc8DD4x15y6E, "_ZN3ccc8DD4x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y6C1Ev();
extern void _ZN3ccc8DD4x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y6E[] = {
  NSPAIR(_ZN3ccc8DD4x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x15y63abcEv();
extern void _ZN3ccc8DD4x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y6E[] = {
  {&(_ZTVN3ccc8DD4x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y6E[];
Class_Descriptor cd__ZN3ccc8DD4x15y6E = {  "_ZN3ccc8DD4x15y6E", // class name
  bases__ZN3ccc8DD4x15y6E, 2,
  &(vtc__ZN3ccc8DD4x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y6E),2, //virtual 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  CC4x15y7  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y73pqrEv
  ~CC4x15y7(); // tgen
  CC4x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y7E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y73abcEv");}
void  ccc::CC4x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y73pqrEv");}
ccc::CC4x15y7 ::~CC4x15y7(){ note_dtor("_ZN3ccc8CC4x15y7E", this);} // tgen
ccc::CC4x15y7 ::CC4x15y7(){ note_ctor("_ZN3ccc8CC4x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y7E, buf);
    ::ccc::CC4x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y7E);
    dp->::ccc::CC4x15y7::~CC4x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y7E(Test__ZN3ccc8CC4x15y7E, "_ZN3ccc8CC4x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y7C1Ev();
extern void _ZN3ccc8CC4x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y7E[] = {
  NSPAIR(_ZN3ccc8CC4x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y7E[];
extern void _ZN3ccc8CC4x15y73pqrEv();
extern void _ZN3ccc8CC4x15y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y7E[] = {
  {&(_ZTVN3ccc8CC4x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y7E[];
Class_Descriptor cd__ZN3ccc8CC4x15y7E = {  "_ZN3ccc8CC4x15y7E", // class name
  bases__ZN3ccc8CC4x15y7E, 2,
  &(vtc__ZN3ccc8CC4x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y7E),2, //virtual 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  DD4x15y7  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD4x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y73pqrEv
  ~DD4x15y7(); // tgen
  DD4x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y7E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y73abcEv");}
void  ccc::DD4x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y73pqrEv");}
ccc::DD4x15y7 ::~DD4x15y7(){ note_dtor("_ZN3ccc8DD4x15y7E", this);} // tgen
ccc::DD4x15y7 ::DD4x15y7(){ note_ctor("_ZN3ccc8DD4x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y7E, buf);
    ::ccc::DD4x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y7E);
    dp->::ccc::DD4x15y7::~DD4x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y7E(Test__ZN3ccc8DD4x15y7E, "_ZN3ccc8DD4x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y7C1Ev();
extern void _ZN3ccc8DD4x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y7E[] = {
  NSPAIR(_ZN3ccc8DD4x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y7E[];
extern void _ZN3ccc8DD4x15y73pqrEv();
extern void _ZN3ccc8DD4x15y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y7E[] = {
  {&(_ZTVN3ccc8DD4x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y7E[];
Class_Descriptor cd__ZN3ccc8DD4x15y7E = {  "_ZN3ccc8DD4x15y7E", // class name
  bases__ZN3ccc8DD4x15y7E, 2,
  &(vtc__ZN3ccc8DD4x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y7E),2, //virtual 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  CC4x15y8  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y83abcEv
  ~CC4x15y8(); // tgen
  CC4x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y8E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y83efgEv");}
void  ccc::CC4x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y83abcEv");}
ccc::CC4x15y8 ::~CC4x15y8(){ note_dtor("_ZN3ccc8CC4x15y8E", this);} // tgen
ccc::CC4x15y8 ::CC4x15y8(){ note_ctor("_ZN3ccc8CC4x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y8E, buf);
    ::ccc::CC4x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y8E);
    dp->::ccc::CC4x15y8::~CC4x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y8E(Test__ZN3ccc8CC4x15y8E, "_ZN3ccc8CC4x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y8C1Ev();
extern void _ZN3ccc8CC4x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y8E[] = {
  NSPAIR(_ZN3ccc8CC4x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x15y83abcEv();
extern void _ZN3ccc8CC4x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y8E[] = {
  {&(_ZTVN3ccc8CC4x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y8E[];
Class_Descriptor cd__ZN3ccc8CC4x15y8E = {  "_ZN3ccc8CC4x15y8E", // class name
  bases__ZN3ccc8CC4x15y8E, 2,
  &(vtc__ZN3ccc8CC4x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y8E),2, //virtual 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  DD4x15y8  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD4x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD4x15y83abcEv
  ~DD4x15y8(); // tgen
  DD4x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y8E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y83efgEv");}
void  ccc::DD4x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD4x15y83abcEv");}
ccc::DD4x15y8 ::~DD4x15y8(){ note_dtor("_ZN3ccc8DD4x15y8E", this);} // tgen
ccc::DD4x15y8 ::DD4x15y8(){ note_ctor("_ZN3ccc8DD4x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y8E, buf);
    ::ccc::DD4x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y8E);
    dp->::ccc::DD4x15y8::~DD4x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y8E(Test__ZN3ccc8DD4x15y8E, "_ZN3ccc8DD4x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y8C1Ev();
extern void _ZN3ccc8DD4x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y8E[] = {
  NSPAIR(_ZN3ccc8DD4x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8DD4x15y83abcEv();
extern void _ZN3ccc8DD4x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y8E[] = {
  {&(_ZTVN3ccc8DD4x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y8E[];
Class_Descriptor cd__ZN3ccc8DD4x15y8E = {  "_ZN3ccc8DD4x15y8E", // class name
  bases__ZN3ccc8DD4x15y8E, 2,
  &(vtc__ZN3ccc8DD4x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y8E),2, //virtual 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  CC4x15y9  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y93pqrEv
  ~CC4x15y9(); // tgen
  CC4x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y9E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y93efgEv");}
void  ccc::CC4x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y93pqrEv");}
ccc::CC4x15y9 ::~CC4x15y9(){ note_dtor("_ZN3ccc8CC4x15y9E", this);} // tgen
ccc::CC4x15y9 ::CC4x15y9(){ note_ctor("_ZN3ccc8CC4x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y9E, buf);
    ::ccc::CC4x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y9E);
    dp->::ccc::CC4x15y9::~CC4x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y9E(Test__ZN3ccc8CC4x15y9E, "_ZN3ccc8CC4x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y9C1Ev();
extern void _ZN3ccc8CC4x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y9E[] = {
  NSPAIR(_ZN3ccc8CC4x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y9E[];
extern void _ZN3ccc8CC4x15y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC4x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC4x15y9E[] = {
  {&(_ZTVN3ccc8CC4x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC4x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC4x15y9E[];
Class_Descriptor cd__ZN3ccc8CC4x15y9E = {  "_ZN3ccc8CC4x15y9E", // class name
  bases__ZN3ccc8CC4x15y9E, 2,
  &(vtc__ZN3ccc8CC4x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC4x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC4x15y9E),2, //virtual 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  DD4x15y9  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD4x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD4x15y93pqrEv
  ~DD4x15y9(); // tgen
  DD4x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD4x15y9E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD4x15y93efgEv");}
void  ccc::DD4x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD4x15y93pqrEv");}
ccc::DD4x15y9 ::~DD4x15y9(){ note_dtor("_ZN3ccc8DD4x15y9E", this);} // tgen
ccc::DD4x15y9 ::DD4x15y9(){ note_ctor("_ZN3ccc8DD4x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD4x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD4x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD4x15y9E, buf);
    ::ccc::DD4x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD4x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD4x15y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8DD4x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD4x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD4x15y9E);
    dp->::ccc::DD4x15y9::~DD4x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD4x15y9E(Test__ZN3ccc8DD4x15y9E, "_ZN3ccc8DD4x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD4x15y9C1Ev();
extern void _ZN3ccc8DD4x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD4x15y9E[] = {
  NSPAIR(_ZN3ccc8DD4x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD4x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD4x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y9E[];
extern void _ZN3ccc8DD4x15y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8DD4x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD4x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD4x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD4x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD4x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD4x15y9E[] = {
  {&(_ZTVN3ccc8DD4x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD4x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD4x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD4x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD4x15y9E[];
Class_Descriptor cd__ZN3ccc8DD4x15y9E = {  "_ZN3ccc8DD4x15y9E", // class name
  bases__ZN3ccc8DD4x15y9E, 2,
  &(vtc__ZN3ccc8DD4x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD4x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD4x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD4x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD4x15y9E),2, //virtual 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  CC4x15y10  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x15y103abcEv
  ~CC4x15y10(); // tgen
  CC4x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y10E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y103pqrEv");}
void  ccc::CC4x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x15y103abcEv");}
ccc::CC4x15y10 ::~CC4x15y10(){ note_dtor("_ZN3ccc9CC4x15y10E", this);} // tgen
ccc::CC4x15y10 ::CC4x15y10(){ note_ctor("_ZN3ccc9CC4x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y10E, buf);
    ::ccc::CC4x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y10E);
    dp->::ccc::CC4x15y10::~CC4x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y10E(Test__ZN3ccc9CC4x15y10E, "_ZN3ccc9CC4x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y10C1Ev();
extern void _ZN3ccc9CC4x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y10E[] = {
  NSPAIR(_ZN3ccc9CC4x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y10E[];
extern void _ZN3ccc9CC4x15y103pqrEv();
extern void _ZN3ccc9CC4x15y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y10E[] = {
  {&(_ZTVN3ccc9CC4x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y10E[];
Class_Descriptor cd__ZN3ccc9CC4x15y10E = {  "_ZN3ccc9CC4x15y10E", // class name
  bases__ZN3ccc9CC4x15y10E, 2,
  &(vtc__ZN3ccc9CC4x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y10E),2, //virtual 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  DD4x15y10  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD4x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD4x15y103abcEv
  ~DD4x15y10(); // tgen
  DD4x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y10E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x15y103pqrEv");}
void  ccc::DD4x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x15y103abcEv");}
ccc::DD4x15y10 ::~DD4x15y10(){ note_dtor("_ZN3ccc9DD4x15y10E", this);} // tgen
ccc::DD4x15y10 ::DD4x15y10(){ note_ctor("_ZN3ccc9DD4x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y10E, buf);
    ::ccc::DD4x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y10E);
    dp->::ccc::DD4x15y10::~DD4x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y10E(Test__ZN3ccc9DD4x15y10E, "_ZN3ccc9DD4x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y10C1Ev();
extern void _ZN3ccc9DD4x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y10E[] = {
  NSPAIR(_ZN3ccc9DD4x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y10E[];
extern void _ZN3ccc9DD4x15y103pqrEv();
extern void _ZN3ccc9DD4x15y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y10E[] = {
  {&(_ZTVN3ccc9DD4x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y10E[];
Class_Descriptor cd__ZN3ccc9DD4x15y10E = {  "_ZN3ccc9DD4x15y10E", // class name
  bases__ZN3ccc9DD4x15y10E, 2,
  &(vtc__ZN3ccc9DD4x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y10E),2, //virtual 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  CC4x15y11  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x15y113efgEv
  ~CC4x15y11(); // tgen
  CC4x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y11E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y113pqrEv");}
void  ccc::CC4x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x15y113efgEv");}
ccc::CC4x15y11 ::~CC4x15y11(){ note_dtor("_ZN3ccc9CC4x15y11E", this);} // tgen
ccc::CC4x15y11 ::CC4x15y11(){ note_ctor("_ZN3ccc9CC4x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y11E, buf);
    ::ccc::CC4x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y11E);
    dp->::ccc::CC4x15y11::~CC4x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y11E(Test__ZN3ccc9CC4x15y11E, "_ZN3ccc9CC4x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y11C1Ev();
extern void _ZN3ccc9CC4x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y11E[] = {
  NSPAIR(_ZN3ccc9CC4x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y11E[];
extern void _ZN3ccc9CC4x15y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y11E[] = {
  {&(_ZTVN3ccc9CC4x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y11E[];
Class_Descriptor cd__ZN3ccc9CC4x15y11E = {  "_ZN3ccc9CC4x15y11E", // class name
  bases__ZN3ccc9CC4x15y11E, 2,
  &(vtc__ZN3ccc9CC4x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y11E),2, //virtual 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  DD4x15y11  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD4x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD4x15y113efgEv
  ~DD4x15y11(); // tgen
  DD4x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y11E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD4x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x15y113pqrEv");}
void  ccc::DD4x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x15y113efgEv");}
ccc::DD4x15y11 ::~DD4x15y11(){ note_dtor("_ZN3ccc9DD4x15y11E", this);} // tgen
ccc::DD4x15y11 ::DD4x15y11(){ note_ctor("_ZN3ccc9DD4x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y11E, buf);
    ::ccc::DD4x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y11E);
    dp->::ccc::DD4x15y11::~DD4x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y11E(Test__ZN3ccc9DD4x15y11E, "_ZN3ccc9DD4x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y11C1Ev();
extern void _ZN3ccc9DD4x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y11E[] = {
  NSPAIR(_ZN3ccc9DD4x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y11E[];
extern void _ZN3ccc9DD4x15y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y11E[] = {
  {&(_ZTVN3ccc9DD4x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y11E[];
Class_Descriptor cd__ZN3ccc9DD4x15y11E = {  "_ZN3ccc9DD4x15y11E", // class name
  bases__ZN3ccc9DD4x15y11E, 2,
  &(vtc__ZN3ccc9DD4x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y11E),2, //virtual 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  CC4x15y12  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC4x15y123abcEv
  ~CC4x15y12(); // tgen
  CC4x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y12E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x15y123abcEv");}
ccc::CC4x15y12 ::~CC4x15y12(){ note_dtor("_ZN3ccc9CC4x15y12E", this);} // tgen
ccc::CC4x15y12 ::CC4x15y12(){ note_ctor("_ZN3ccc9CC4x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y12E, buf);
    ::ccc::CC4x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y12E);
    dp->::ccc::CC4x15y12::~CC4x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y12E(Test__ZN3ccc9CC4x15y12E, "_ZN3ccc9CC4x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y12C1Ev();
extern void _ZN3ccc9CC4x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y12E[] = {
  NSPAIR(_ZN3ccc9CC4x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x15y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y12E[] = {
  {&(_ZTVN3ccc9CC4x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y12E[];
Class_Descriptor cd__ZN3ccc9CC4x15y12E = {  "_ZN3ccc9CC4x15y12E", // class name
  bases__ZN3ccc9CC4x15y12E, 2,
  &(vtc__ZN3ccc9CC4x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y12E),2, //virtual 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  DD4x15y12  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD4x15y123abcEv
  ~DD4x15y12(); // tgen
  DD4x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y12E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD4x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD4x15y123abcEv");}
ccc::DD4x15y12 ::~DD4x15y12(){ note_dtor("_ZN3ccc9DD4x15y12E", this);} // tgen
ccc::DD4x15y12 ::DD4x15y12(){ note_ctor("_ZN3ccc9DD4x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y12E, buf);
    ::ccc::DD4x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y12E);
    dp->::ccc::DD4x15y12::~DD4x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y12E(Test__ZN3ccc9DD4x15y12E, "_ZN3ccc9DD4x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y12C1Ev();
extern void _ZN3ccc9DD4x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y12E[] = {
  NSPAIR(_ZN3ccc9DD4x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9DD4x15y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y12E[] = {
  {&(_ZTVN3ccc9DD4x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y12E[];
Class_Descriptor cd__ZN3ccc9DD4x15y12E = {  "_ZN3ccc9DD4x15y12E", // class name
  bases__ZN3ccc9DD4x15y12E, 2,
  &(vtc__ZN3ccc9DD4x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y12E),2, //virtual 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  CC4x15y13  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC4x15y133efgEv
  ~CC4x15y13(); // tgen
  CC4x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y13E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x15y133efgEv");}
ccc::CC4x15y13 ::~CC4x15y13(){ note_dtor("_ZN3ccc9CC4x15y13E", this);} // tgen
ccc::CC4x15y13 ::CC4x15y13(){ note_ctor("_ZN3ccc9CC4x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y13E, buf);
    ::ccc::CC4x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y13E);
    dp->::ccc::CC4x15y13::~CC4x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y13E(Test__ZN3ccc9CC4x15y13E, "_ZN3ccc9CC4x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y13C1Ev();
extern void _ZN3ccc9CC4x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y13E[] = {
  NSPAIR(_ZN3ccc9CC4x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y13E[] = {
  {&(_ZTVN3ccc9CC4x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y13E[];
Class_Descriptor cd__ZN3ccc9CC4x15y13E = {  "_ZN3ccc9CC4x15y13E", // class name
  bases__ZN3ccc9CC4x15y13E, 2,
  &(vtc__ZN3ccc9CC4x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y13E),2, //virtual 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  DD4x15y13  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD4x15y133efgEv
  ~DD4x15y13(); // tgen
  DD4x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y13E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD4x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD4x15y133efgEv");}
ccc::DD4x15y13 ::~DD4x15y13(){ note_dtor("_ZN3ccc9DD4x15y13E", this);} // tgen
ccc::DD4x15y13 ::DD4x15y13(){ note_ctor("_ZN3ccc9DD4x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y13E, buf);
    ::ccc::DD4x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y13E);
    dp->::ccc::DD4x15y13::~DD4x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y13E(Test__ZN3ccc9DD4x15y13E, "_ZN3ccc9DD4x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y13C1Ev();
extern void _ZN3ccc9DD4x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y13E[] = {
  NSPAIR(_ZN3ccc9DD4x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9DD4x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y13E[] = {
  {&(_ZTVN3ccc9DD4x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y13E[];
Class_Descriptor cd__ZN3ccc9DD4x15y13E = {  "_ZN3ccc9DD4x15y13E", // class name
  bases__ZN3ccc9DD4x15y13E, 2,
  &(vtc__ZN3ccc9DD4x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y13E),2, //virtual 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  CC4x15y14  : virtual ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y143pqrEv
  ~CC4x15y14(); // tgen
  CC4x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y14E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y143pqrEv");}
ccc::CC4x15y14 ::~CC4x15y14(){ note_dtor("_ZN3ccc9CC4x15y14E", this);} // tgen
ccc::CC4x15y14 ::CC4x15y14(){ note_ctor("_ZN3ccc9CC4x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y14E, buf);
    ::ccc::CC4x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y14E);
    dp->::ccc::CC4x15y14::~CC4x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y14E(Test__ZN3ccc9CC4x15y14E, "_ZN3ccc9CC4x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y14C1Ev();
extern void _ZN3ccc9CC4x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y14E[] = {
  NSPAIR(_ZN3ccc9CC4x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y14E[];
extern void _ZN3ccc9CC4x15y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y14E[] = {
  {&(_ZTVN3ccc9CC4x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y14E[];
Class_Descriptor cd__ZN3ccc9CC4x15y14E = {  "_ZN3ccc9CC4x15y14E", // class name
  bases__ZN3ccc9CC4x15y14E, 2,
  &(vtc__ZN3ccc9CC4x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y14E),2, //virtual 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  DD4x15y14  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD4x15y143pqrEv
  ~DD4x15y14(); // tgen
  DD4x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y14E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD4x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD4x15y143pqrEv");}
ccc::DD4x15y14 ::~DD4x15y14(){ note_dtor("_ZN3ccc9DD4x15y14E", this);} // tgen
ccc::DD4x15y14 ::DD4x15y14(){ note_ctor("_ZN3ccc9DD4x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y14E, buf);
    ::ccc::DD4x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y14E);
    dp->::ccc::DD4x15y14::~DD4x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y14E(Test__ZN3ccc9DD4x15y14E, "_ZN3ccc9DD4x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y14C1Ev();
extern void _ZN3ccc9DD4x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y14E[] = {
  NSPAIR(_ZN3ccc9DD4x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y14E[];
extern void _ZN3ccc9DD4x15y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD4x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y14E[] = {
  {&(_ZTVN3ccc9DD4x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y14E[];
Class_Descriptor cd__ZN3ccc9DD4x15y14E = {  "_ZN3ccc9DD4x15y14E", // class name
  bases__ZN3ccc9DD4x15y14E, 2,
  &(vtc__ZN3ccc9DD4x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y14E),2, //virtual 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  CC4x15y15  : virtual ::ccc::AA4 , ::ccc::BB15 {
  ~CC4x15y15(); // tgen
  CC4x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC4x15y15 ::~CC4x15y15(){ note_dtor("_ZN3ccc9CC4x15y15E", this);} // tgen
ccc::CC4x15y15 ::CC4x15y15(){ note_ctor("_ZN3ccc9CC4x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y15E, buf);
    ::ccc::CC4x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y15E);
    dp->::ccc::CC4x15y15::~CC4x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y15E(Test__ZN3ccc9CC4x15y15E, "_ZN3ccc9CC4x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y15C1Ev();
extern void _ZN3ccc9CC4x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y15E[] = {
  NSPAIR(_ZN3ccc9CC4x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC4x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC4x15y15E[] = {
  {&(_ZTVN3ccc9CC4x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC4x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC4x15y15E[];
Class_Descriptor cd__ZN3ccc9CC4x15y15E = {  "_ZN3ccc9CC4x15y15E", // class name
  bases__ZN3ccc9CC4x15y15E, 2,
  &(vtc__ZN3ccc9CC4x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC4x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC4x15y15E),2, //virtual 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  DD4x15y15  : virtual ::ccc::AA4 , virtual ::ccc::BB15 {
  ~DD4x15y15(); // tgen
  DD4x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD4x15y15E) C1{ VBC2{ v1 v2 v3} VBC3{}}
}
namespace ccc { 
ccc::DD4x15y15 ::~DD4x15y15(){ note_dtor("_ZN3ccc9DD4x15y15E", this);} // tgen
ccc::DD4x15y15 ::DD4x15y15(){ note_ctor("_ZN3ccc9DD4x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD4x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD4x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD4x15y15E, buf);
    ::ccc::DD4x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD4x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD4x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD4x15y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9DD4x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD4x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD4x15y15E);
    dp->::ccc::DD4x15y15::~DD4x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD4x15y15E(Test__ZN3ccc9DD4x15y15E, "_ZN3ccc9DD4x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD4x15y15C1Ev();
extern void _ZN3ccc9DD4x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD4x15y15E[] = {
  NSPAIR(_ZN3ccc9DD4x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD4x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD4x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_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},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD4x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD4x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD4x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD4x15y15E[] = {
  {&(_ZTVN3ccc9DD4x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD4x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD4x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD4x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD4x15y15E[];
Class_Descriptor cd__ZN3ccc9DD4x15y15E = {  "_ZN3ccc9DD4x15y15E", // class name
  bases__ZN3ccc9DD4x15y15E, 2,
  &(vtc__ZN3ccc9DD4x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD4x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD4x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD4x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD4x15y15E),2, //virtual 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  CC5x0y0  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y03pqrEv
  ~CC5x0y0(); // tgen
  CC5x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y0E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y03abcEv");}
void  ccc::CC5x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y03efgEv");}
void  ccc::CC5x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y03pqrEv");}
ccc::CC5x0y0 ::~CC5x0y0(){ note_dtor("_ZN3ccc7CC5x0y0E", this);} // tgen
ccc::CC5x0y0 ::CC5x0y0(){ note_ctor("_ZN3ccc7CC5x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y0E, buf);
    ::ccc::CC5x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y0E);
    dp->::ccc::CC5x0y0::~CC5x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y0E(Test__ZN3ccc7CC5x0y0E, "_ZN3ccc7CC5x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y0C1Ev();
extern void _ZN3ccc7CC5x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y0E[] = {
  NSPAIR(_ZN3ccc7CC5x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y0E[];
extern void _ZN3ccc7CC5x0y03abcEv();
extern void _ZN3ccc7CC5x0y03efgEv();
extern void _ZN3ccc7CC5x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y03pqrEv,_ZTv0_n12_N3ccc7CC5x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03pqrEv,_ZThn4_N3ccc7CC5x0y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y03efgEv,_ZTv0_n16_N3ccc7CC5x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03efgEv,_ZThn4_N3ccc7CC5x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y03abcEv,_ZTv0_n20_N3ccc7CC5x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03abcEv,_ZThn4_N3ccc7CC5x0y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y03pqrEv,_ZTv0_n12_N3ccc7CC5x0y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y03efgEv,_ZTv0_n16_N3ccc7CC5x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y03abcEv,_ZTv0_n20_N3ccc7CC5x0y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y0E[] = {
  {&(_ZTVN3ccc7CC5x0y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y0E[];
static VTBL_ENTRY alt_thunk_names2161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y03abcEv,_ZTv0_n20_N3ccc7CC5x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y03abcEv,_ZThn4_N3ccc7CC5x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y03efgEv,_ZTv0_n16_N3ccc7CC5x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y03efgEv,_ZThn4_N3ccc7CC5x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y03pqrEv,_ZTv0_n12_N3ccc7CC5x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y03pqrEv,_ZThn4_N3ccc7CC5x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y0E = {  "_ZN3ccc7CC5x0y0E", // class name
  bases__ZN3ccc7CC5x0y0E, 2,
  &(vtc__ZN3ccc7CC5x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y0  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD5x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y03pqrEv
  ~DD5x0y0(); // tgen
  DD5x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y03abcEv");}
void  ccc::DD5x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y03efgEv");}
void  ccc::DD5x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y03pqrEv");}
ccc::DD5x0y0 ::~DD5x0y0(){ note_dtor("_ZN3ccc7DD5x0y0E", this);} // tgen
ccc::DD5x0y0 ::DD5x0y0(){ note_ctor("_ZN3ccc7DD5x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y0E, buf);
    ::ccc::DD5x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y0E);
    dp->::ccc::DD5x0y0::~DD5x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y0E(Test__ZN3ccc7DD5x0y0E, "_ZN3ccc7DD5x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y0C1Ev();
extern void _ZN3ccc7DD5x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y0E[] = {
  NSPAIR(_ZN3ccc7DD5x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y0E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y0E[];
extern void _ZN3ccc7DD5x0y03pqrEv();
extern void _ZN3ccc7DD5x0y03efgEv();
extern void _ZN3ccc7DD5x0y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y03abcEv,_ZTv0_n12_N3ccc7DD5x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y03abcEv,_ZThn4_N3ccc7DD5x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y03efgEv,_ZTv0_n16_N3ccc7DD5x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y03efgEv,_ZThn4_N3ccc7DD5x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y03pqrEv,_ZTv0_n20_N3ccc7DD5x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y03pqrEv,_ZThn4_N3ccc7DD5x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y03abcEv,_ZTv0_n12_N3ccc7DD5x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y03efgEv,_ZTv0_n16_N3ccc7DD5x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y03pqrEv,_ZTv0_n20_N3ccc7DD5x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y0E[] = {
  {&(_ZTVN3ccc7DD5x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y0E[];
static VTBL_ENTRY alt_thunk_names2162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y03pqrEv,_ZTv0_n20_N3ccc7DD5x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y03pqrEv,_ZThn4_N3ccc7DD5x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y03efgEv,_ZTv0_n16_N3ccc7DD5x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y03efgEv,_ZThn4_N3ccc7DD5x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y03abcEv,_ZTv0_n12_N3ccc7DD5x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y03abcEv,_ZThn4_N3ccc7DD5x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y0E = {  "_ZN3ccc7DD5x0y0E", // class name
  bases__ZN3ccc7DD5x0y0E, 2,
  &(vtc__ZN3ccc7DD5x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y1  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x0y13efgEv
  ~CC5x0y1(); // tgen
  CC5x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y1E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y13abcEv");}
void  ccc::CC5x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y13pqrEv");}
void  ccc::CC5x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y13efgEv");}
ccc::CC5x0y1 ::~CC5x0y1(){ note_dtor("_ZN3ccc7CC5x0y1E", this);} // tgen
ccc::CC5x0y1 ::CC5x0y1(){ note_ctor("_ZN3ccc7CC5x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y1E, buf);
    ::ccc::CC5x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y1E);
    dp->::ccc::CC5x0y1::~CC5x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y1E(Test__ZN3ccc7CC5x0y1E, "_ZN3ccc7CC5x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y1C1Ev();
extern void _ZN3ccc7CC5x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y1E[] = {
  NSPAIR(_ZN3ccc7CC5x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y1E[];
extern void _ZN3ccc7CC5x0y13abcEv();
extern void _ZN3ccc7CC5x0y13efgEv();
extern void _ZN3ccc7CC5x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y13pqrEv,_ZTv0_n12_N3ccc7CC5x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13pqrEv,_ZThn4_N3ccc7CC5x0y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y13efgEv,_ZTv0_n16_N3ccc7CC5x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13efgEv,_ZThn4_N3ccc7CC5x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y13abcEv,_ZTv0_n20_N3ccc7CC5x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13abcEv,_ZThn4_N3ccc7CC5x0y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y13pqrEv,_ZTv0_n12_N3ccc7CC5x0y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y13efgEv,_ZTv0_n16_N3ccc7CC5x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y13abcEv,_ZTv0_n20_N3ccc7CC5x0y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y1E[] = {
  {&(_ZTVN3ccc7CC5x0y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y1E[];
static VTBL_ENTRY alt_thunk_names2163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y13abcEv,_ZTv0_n20_N3ccc7CC5x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y13abcEv,_ZThn4_N3ccc7CC5x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y13efgEv,_ZTv0_n16_N3ccc7CC5x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y13efgEv,_ZThn4_N3ccc7CC5x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y13pqrEv,_ZTv0_n12_N3ccc7CC5x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y13pqrEv,_ZThn4_N3ccc7CC5x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y1E = {  "_ZN3ccc7CC5x0y1E", // class name
  bases__ZN3ccc7CC5x0y1E, 2,
  &(vtc__ZN3ccc7CC5x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y1  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD5x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x0y13efgEv
  ~DD5x0y1(); // tgen
  DD5x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y13abcEv");}
void  ccc::DD5x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y13pqrEv");}
void  ccc::DD5x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y13efgEv");}
ccc::DD5x0y1 ::~DD5x0y1(){ note_dtor("_ZN3ccc7DD5x0y1E", this);} // tgen
ccc::DD5x0y1 ::DD5x0y1(){ note_ctor("_ZN3ccc7DD5x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y1E, buf);
    ::ccc::DD5x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y1E);
    dp->::ccc::DD5x0y1::~DD5x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y1E(Test__ZN3ccc7DD5x0y1E, "_ZN3ccc7DD5x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y1C1Ev();
extern void _ZN3ccc7DD5x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y1E[] = {
  NSPAIR(_ZN3ccc7DD5x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y1E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y1E[];
extern void _ZN3ccc7DD5x0y13pqrEv();
extern void _ZN3ccc7DD5x0y13efgEv();
extern void _ZN3ccc7DD5x0y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y13abcEv,_ZTv0_n12_N3ccc7DD5x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y13abcEv,_ZThn4_N3ccc7DD5x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y13efgEv,_ZTv0_n16_N3ccc7DD5x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y13efgEv,_ZThn4_N3ccc7DD5x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y13pqrEv,_ZTv0_n20_N3ccc7DD5x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y13pqrEv,_ZThn4_N3ccc7DD5x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y13abcEv,_ZTv0_n12_N3ccc7DD5x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y13efgEv,_ZTv0_n16_N3ccc7DD5x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y13pqrEv,_ZTv0_n20_N3ccc7DD5x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y1E[] = {
  {&(_ZTVN3ccc7DD5x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y1E[];
static VTBL_ENTRY alt_thunk_names2164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y13pqrEv,_ZTv0_n20_N3ccc7DD5x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y13pqrEv,_ZThn4_N3ccc7DD5x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y13efgEv,_ZTv0_n16_N3ccc7DD5x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y13efgEv,_ZThn4_N3ccc7DD5x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y13abcEv,_ZTv0_n12_N3ccc7DD5x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y13abcEv,_ZThn4_N3ccc7DD5x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y1E = {  "_ZN3ccc7DD5x0y1E", // class name
  bases__ZN3ccc7DD5x0y1E, 2,
  &(vtc__ZN3ccc7DD5x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y2  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y23pqrEv
  ~CC5x0y2(); // tgen
  CC5x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y2E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y23efgEv");}
void  ccc::CC5x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y23abcEv");}
void  ccc::CC5x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y23pqrEv");}
ccc::CC5x0y2 ::~CC5x0y2(){ note_dtor("_ZN3ccc7CC5x0y2E", this);} // tgen
ccc::CC5x0y2 ::CC5x0y2(){ note_ctor("_ZN3ccc7CC5x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y2E, buf);
    ::ccc::CC5x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y2E);
    dp->::ccc::CC5x0y2::~CC5x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y2E(Test__ZN3ccc7CC5x0y2E, "_ZN3ccc7CC5x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y2C1Ev();
extern void _ZN3ccc7CC5x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y2E[] = {
  NSPAIR(_ZN3ccc7CC5x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y2E[];
extern void _ZN3ccc7CC5x0y23abcEv();
extern void _ZN3ccc7CC5x0y23efgEv();
extern void _ZN3ccc7CC5x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y23pqrEv,_ZTv0_n12_N3ccc7CC5x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23pqrEv,_ZThn4_N3ccc7CC5x0y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y23efgEv,_ZTv0_n16_N3ccc7CC5x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23efgEv,_ZThn4_N3ccc7CC5x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y23abcEv,_ZTv0_n20_N3ccc7CC5x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23abcEv,_ZThn4_N3ccc7CC5x0y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y23pqrEv,_ZTv0_n12_N3ccc7CC5x0y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y23efgEv,_ZTv0_n16_N3ccc7CC5x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y23abcEv,_ZTv0_n20_N3ccc7CC5x0y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y2E[] = {
  {&(_ZTVN3ccc7CC5x0y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y2E[];
static VTBL_ENTRY alt_thunk_names2165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y23abcEv,_ZTv0_n20_N3ccc7CC5x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y23abcEv,_ZThn4_N3ccc7CC5x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y23efgEv,_ZTv0_n16_N3ccc7CC5x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y23efgEv,_ZThn4_N3ccc7CC5x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y23pqrEv,_ZTv0_n12_N3ccc7CC5x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y23pqrEv,_ZThn4_N3ccc7CC5x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y2E = {  "_ZN3ccc7CC5x0y2E", // class name
  bases__ZN3ccc7CC5x0y2E, 2,
  &(vtc__ZN3ccc7CC5x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y2  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD5x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y23pqrEv
  ~DD5x0y2(); // tgen
  DD5x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y23efgEv");}
void  ccc::DD5x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y23abcEv");}
void  ccc::DD5x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y23pqrEv");}
ccc::DD5x0y2 ::~DD5x0y2(){ note_dtor("_ZN3ccc7DD5x0y2E", this);} // tgen
ccc::DD5x0y2 ::DD5x0y2(){ note_ctor("_ZN3ccc7DD5x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y2E, buf);
    ::ccc::DD5x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y2E);
    dp->::ccc::DD5x0y2::~DD5x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y2E(Test__ZN3ccc7DD5x0y2E, "_ZN3ccc7DD5x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y2C1Ev();
extern void _ZN3ccc7DD5x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y2E[] = {
  NSPAIR(_ZN3ccc7DD5x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y2E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y2E[];
extern void _ZN3ccc7DD5x0y23pqrEv();
extern void _ZN3ccc7DD5x0y23efgEv();
extern void _ZN3ccc7DD5x0y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y23abcEv,_ZTv0_n12_N3ccc7DD5x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y23abcEv,_ZThn4_N3ccc7DD5x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y23efgEv,_ZTv0_n16_N3ccc7DD5x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y23efgEv,_ZThn4_N3ccc7DD5x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y23pqrEv,_ZTv0_n20_N3ccc7DD5x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y23pqrEv,_ZThn4_N3ccc7DD5x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y23abcEv,_ZTv0_n12_N3ccc7DD5x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y23efgEv,_ZTv0_n16_N3ccc7DD5x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y23pqrEv,_ZTv0_n20_N3ccc7DD5x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y2E[] = {
  {&(_ZTVN3ccc7DD5x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y2E[];
static VTBL_ENTRY alt_thunk_names2166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y23pqrEv,_ZTv0_n20_N3ccc7DD5x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y23pqrEv,_ZThn4_N3ccc7DD5x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y23efgEv,_ZTv0_n16_N3ccc7DD5x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y23efgEv,_ZThn4_N3ccc7DD5x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y23abcEv,_ZTv0_n12_N3ccc7DD5x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y23abcEv,_ZThn4_N3ccc7DD5x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y2E = {  "_ZN3ccc7DD5x0y2E", // class name
  bases__ZN3ccc7DD5x0y2E, 2,
  &(vtc__ZN3ccc7DD5x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y3  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x0y33abcEv
  ~CC5x0y3(); // tgen
  CC5x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y3E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y33efgEv");}
void  ccc::CC5x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y33pqrEv");}
void  ccc::CC5x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y33abcEv");}
ccc::CC5x0y3 ::~CC5x0y3(){ note_dtor("_ZN3ccc7CC5x0y3E", this);} // tgen
ccc::CC5x0y3 ::CC5x0y3(){ note_ctor("_ZN3ccc7CC5x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y3E, buf);
    ::ccc::CC5x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y3E);
    dp->::ccc::CC5x0y3::~CC5x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y3E(Test__ZN3ccc7CC5x0y3E, "_ZN3ccc7CC5x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y3C1Ev();
extern void _ZN3ccc7CC5x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y3E[] = {
  NSPAIR(_ZN3ccc7CC5x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y3E[];
extern void _ZN3ccc7CC5x0y33abcEv();
extern void _ZN3ccc7CC5x0y33efgEv();
extern void _ZN3ccc7CC5x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y33pqrEv,_ZTv0_n12_N3ccc7CC5x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33pqrEv,_ZThn4_N3ccc7CC5x0y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y33efgEv,_ZTv0_n16_N3ccc7CC5x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33efgEv,_ZThn4_N3ccc7CC5x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y33abcEv,_ZTv0_n20_N3ccc7CC5x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33abcEv,_ZThn4_N3ccc7CC5x0y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y33pqrEv,_ZTv0_n12_N3ccc7CC5x0y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y33efgEv,_ZTv0_n16_N3ccc7CC5x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y33abcEv,_ZTv0_n20_N3ccc7CC5x0y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y3E[] = {
  {&(_ZTVN3ccc7CC5x0y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y3E[];
static VTBL_ENTRY alt_thunk_names2167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y33abcEv,_ZTv0_n20_N3ccc7CC5x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y33abcEv,_ZThn4_N3ccc7CC5x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y33efgEv,_ZTv0_n16_N3ccc7CC5x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y33efgEv,_ZThn4_N3ccc7CC5x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y33pqrEv,_ZTv0_n12_N3ccc7CC5x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y33pqrEv,_ZThn4_N3ccc7CC5x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y3E = {  "_ZN3ccc7CC5x0y3E", // class name
  bases__ZN3ccc7CC5x0y3E, 2,
  &(vtc__ZN3ccc7CC5x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y3  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD5x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x0y33abcEv
  ~DD5x0y3(); // tgen
  DD5x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y33efgEv");}
void  ccc::DD5x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y33pqrEv");}
void  ccc::DD5x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y33abcEv");}
ccc::DD5x0y3 ::~DD5x0y3(){ note_dtor("_ZN3ccc7DD5x0y3E", this);} // tgen
ccc::DD5x0y3 ::DD5x0y3(){ note_ctor("_ZN3ccc7DD5x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y3E, buf);
    ::ccc::DD5x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y3E);
    dp->::ccc::DD5x0y3::~DD5x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y3E(Test__ZN3ccc7DD5x0y3E, "_ZN3ccc7DD5x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y3C1Ev();
extern void _ZN3ccc7DD5x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y3E[] = {
  NSPAIR(_ZN3ccc7DD5x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y3E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y3E[];
extern void _ZN3ccc7DD5x0y33pqrEv();
extern void _ZN3ccc7DD5x0y33efgEv();
extern void _ZN3ccc7DD5x0y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y33abcEv,_ZTv0_n12_N3ccc7DD5x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y33abcEv,_ZThn4_N3ccc7DD5x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y33efgEv,_ZTv0_n16_N3ccc7DD5x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y33efgEv,_ZThn4_N3ccc7DD5x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y33pqrEv,_ZTv0_n20_N3ccc7DD5x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y33pqrEv,_ZThn4_N3ccc7DD5x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y33abcEv,_ZTv0_n12_N3ccc7DD5x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y33efgEv,_ZTv0_n16_N3ccc7DD5x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y33pqrEv,_ZTv0_n20_N3ccc7DD5x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y3E[] = {
  {&(_ZTVN3ccc7DD5x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y3E[];
static VTBL_ENTRY alt_thunk_names2168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y33pqrEv,_ZTv0_n20_N3ccc7DD5x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y33pqrEv,_ZThn4_N3ccc7DD5x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y33efgEv,_ZTv0_n16_N3ccc7DD5x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y33efgEv,_ZThn4_N3ccc7DD5x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y33abcEv,_ZTv0_n12_N3ccc7DD5x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y33abcEv,_ZThn4_N3ccc7DD5x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y3E = {  "_ZN3ccc7DD5x0y3E", // class name
  bases__ZN3ccc7DD5x0y3E, 2,
  &(vtc__ZN3ccc7DD5x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y4  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC5x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y43efgEv
  ~CC5x0y4(); // tgen
  CC5x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y4E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y43pqrEv");}
void  ccc::CC5x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y43abcEv");}
void  ccc::CC5x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y43efgEv");}
ccc::CC5x0y4 ::~CC5x0y4(){ note_dtor("_ZN3ccc7CC5x0y4E", this);} // tgen
ccc::CC5x0y4 ::CC5x0y4(){ note_ctor("_ZN3ccc7CC5x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y4E, buf);
    ::ccc::CC5x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y4E);
    dp->::ccc::CC5x0y4::~CC5x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y4E(Test__ZN3ccc7CC5x0y4E, "_ZN3ccc7CC5x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y4C1Ev();
extern void _ZN3ccc7CC5x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y4E[] = {
  NSPAIR(_ZN3ccc7CC5x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y4E[];
extern void _ZN3ccc7CC5x0y43abcEv();
extern void _ZN3ccc7CC5x0y43efgEv();
extern void _ZN3ccc7CC5x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y43pqrEv,_ZTv0_n12_N3ccc7CC5x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43pqrEv,_ZThn4_N3ccc7CC5x0y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y43efgEv,_ZTv0_n16_N3ccc7CC5x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43efgEv,_ZThn4_N3ccc7CC5x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y43abcEv,_ZTv0_n20_N3ccc7CC5x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43abcEv,_ZThn4_N3ccc7CC5x0y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y43pqrEv,_ZTv0_n12_N3ccc7CC5x0y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y43efgEv,_ZTv0_n16_N3ccc7CC5x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y43abcEv,_ZTv0_n20_N3ccc7CC5x0y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y4E[] = {
  {&(_ZTVN3ccc7CC5x0y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y4E[];
static VTBL_ENTRY alt_thunk_names2169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y43abcEv,_ZTv0_n20_N3ccc7CC5x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y43abcEv,_ZThn4_N3ccc7CC5x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y43efgEv,_ZTv0_n16_N3ccc7CC5x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y43efgEv,_ZThn4_N3ccc7CC5x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y43pqrEv,_ZTv0_n12_N3ccc7CC5x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y43pqrEv,_ZThn4_N3ccc7CC5x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y4E = {  "_ZN3ccc7CC5x0y4E", // class name
  bases__ZN3ccc7CC5x0y4E, 2,
  &(vtc__ZN3ccc7CC5x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y4  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD5x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x0y43efgEv
  ~DD5x0y4(); // tgen
  DD5x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y43pqrEv");}
void  ccc::DD5x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y43abcEv");}
void  ccc::DD5x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y43efgEv");}
ccc::DD5x0y4 ::~DD5x0y4(){ note_dtor("_ZN3ccc7DD5x0y4E", this);} // tgen
ccc::DD5x0y4 ::DD5x0y4(){ note_ctor("_ZN3ccc7DD5x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y4E, buf);
    ::ccc::DD5x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y4E);
    dp->::ccc::DD5x0y4::~DD5x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y4E(Test__ZN3ccc7DD5x0y4E, "_ZN3ccc7DD5x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y4C1Ev();
extern void _ZN3ccc7DD5x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y4E[] = {
  NSPAIR(_ZN3ccc7DD5x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y4E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y4E[];
extern void _ZN3ccc7DD5x0y43pqrEv();
extern void _ZN3ccc7DD5x0y43efgEv();
extern void _ZN3ccc7DD5x0y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y43abcEv,_ZTv0_n12_N3ccc7DD5x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y43abcEv,_ZThn4_N3ccc7DD5x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y43efgEv,_ZTv0_n16_N3ccc7DD5x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y43efgEv,_ZThn4_N3ccc7DD5x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y43pqrEv,_ZTv0_n20_N3ccc7DD5x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y43pqrEv,_ZThn4_N3ccc7DD5x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y43abcEv,_ZTv0_n12_N3ccc7DD5x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y43efgEv,_ZTv0_n16_N3ccc7DD5x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y43pqrEv,_ZTv0_n20_N3ccc7DD5x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y4E[] = {
  {&(_ZTVN3ccc7DD5x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y4E[];
static VTBL_ENTRY alt_thunk_names2170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y43pqrEv,_ZTv0_n20_N3ccc7DD5x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y43pqrEv,_ZThn4_N3ccc7DD5x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y43efgEv,_ZTv0_n16_N3ccc7DD5x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y43efgEv,_ZThn4_N3ccc7DD5x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y43abcEv,_ZTv0_n12_N3ccc7DD5x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y43abcEv,_ZThn4_N3ccc7DD5x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y4E = {  "_ZN3ccc7DD5x0y4E", // class name
  bases__ZN3ccc7DD5x0y4E, 2,
  &(vtc__ZN3ccc7DD5x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y5  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC5x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y53abcEv
  ~CC5x0y5(); // tgen
  CC5x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y5E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y53pqrEv");}
void  ccc::CC5x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y53efgEv");}
void  ccc::CC5x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y53abcEv");}
ccc::CC5x0y5 ::~CC5x0y5(){ note_dtor("_ZN3ccc7CC5x0y5E", this);} // tgen
ccc::CC5x0y5 ::CC5x0y5(){ note_ctor("_ZN3ccc7CC5x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y5E, buf);
    ::ccc::CC5x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y5E);
    dp->::ccc::CC5x0y5::~CC5x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y5E(Test__ZN3ccc7CC5x0y5E, "_ZN3ccc7CC5x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y5C1Ev();
extern void _ZN3ccc7CC5x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y5E[] = {
  NSPAIR(_ZN3ccc7CC5x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y5E[];
extern void _ZN3ccc7CC5x0y53abcEv();
extern void _ZN3ccc7CC5x0y53efgEv();
extern void _ZN3ccc7CC5x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y53pqrEv,_ZTv0_n12_N3ccc7CC5x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53pqrEv,_ZThn4_N3ccc7CC5x0y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y53efgEv,_ZTv0_n16_N3ccc7CC5x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53efgEv,_ZThn4_N3ccc7CC5x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y53abcEv,_ZTv0_n20_N3ccc7CC5x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53abcEv,_ZThn4_N3ccc7CC5x0y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y53pqrEv,_ZTv0_n12_N3ccc7CC5x0y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y53efgEv,_ZTv0_n16_N3ccc7CC5x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y53abcEv,_ZTv0_n20_N3ccc7CC5x0y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y5E[] = {
  {&(_ZTVN3ccc7CC5x0y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y5E[];
static VTBL_ENTRY alt_thunk_names2171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y53abcEv,_ZTv0_n20_N3ccc7CC5x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y53abcEv,_ZThn4_N3ccc7CC5x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y53efgEv,_ZTv0_n16_N3ccc7CC5x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y53efgEv,_ZThn4_N3ccc7CC5x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y53pqrEv,_ZTv0_n12_N3ccc7CC5x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y53pqrEv,_ZThn4_N3ccc7CC5x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y5E = {  "_ZN3ccc7CC5x0y5E", // class name
  bases__ZN3ccc7CC5x0y5E, 2,
  &(vtc__ZN3ccc7CC5x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y5  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD5x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x0y53abcEv
  ~DD5x0y5(); // tgen
  DD5x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y53pqrEv");}
void  ccc::DD5x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y53efgEv");}
void  ccc::DD5x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y53abcEv");}
ccc::DD5x0y5 ::~DD5x0y5(){ note_dtor("_ZN3ccc7DD5x0y5E", this);} // tgen
ccc::DD5x0y5 ::DD5x0y5(){ note_ctor("_ZN3ccc7DD5x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y5E, buf);
    ::ccc::DD5x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y5E);
    dp->::ccc::DD5x0y5::~DD5x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y5E(Test__ZN3ccc7DD5x0y5E, "_ZN3ccc7DD5x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y5C1Ev();
extern void _ZN3ccc7DD5x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y5E[] = {
  NSPAIR(_ZN3ccc7DD5x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y5E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y5E[];
extern void _ZN3ccc7DD5x0y53pqrEv();
extern void _ZN3ccc7DD5x0y53efgEv();
extern void _ZN3ccc7DD5x0y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y53abcEv,_ZTv0_n12_N3ccc7DD5x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y53abcEv,_ZThn4_N3ccc7DD5x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y53efgEv,_ZTv0_n16_N3ccc7DD5x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y53efgEv,_ZThn4_N3ccc7DD5x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y53pqrEv,_ZTv0_n20_N3ccc7DD5x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y53pqrEv,_ZThn4_N3ccc7DD5x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y53abcEv,_ZTv0_n12_N3ccc7DD5x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y53efgEv,_ZTv0_n16_N3ccc7DD5x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y53pqrEv,_ZTv0_n20_N3ccc7DD5x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y5E[] = {
  {&(_ZTVN3ccc7DD5x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y5E[];
static VTBL_ENTRY alt_thunk_names2172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y53pqrEv,_ZTv0_n20_N3ccc7DD5x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y53pqrEv,_ZThn4_N3ccc7DD5x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y53efgEv,_ZTv0_n16_N3ccc7DD5x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y53efgEv,_ZThn4_N3ccc7DD5x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y53abcEv,_ZTv0_n12_N3ccc7DD5x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y53abcEv,_ZThn4_N3ccc7DD5x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y5E = {  "_ZN3ccc7DD5x0y5E", // class name
  bases__ZN3ccc7DD5x0y5E, 2,
  &(vtc__ZN3ccc7DD5x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y6  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y63efgEv
  ~CC5x0y6(); // tgen
  CC5x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y6E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y63abcEv");}
void  ccc::CC5x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y63efgEv");}
ccc::CC5x0y6 ::~CC5x0y6(){ note_dtor("_ZN3ccc7CC5x0y6E", this);} // tgen
ccc::CC5x0y6 ::CC5x0y6(){ note_ctor("_ZN3ccc7CC5x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y6E, buf);
    ::ccc::CC5x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y6E);
    dp->::ccc::CC5x0y6::~CC5x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y6E(Test__ZN3ccc7CC5x0y6E, "_ZN3ccc7CC5x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y6C1Ev();
extern void _ZN3ccc7CC5x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y6E[] = {
  NSPAIR(_ZN3ccc7CC5x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y6E[];
extern void _ZN3ccc7CC5x0y63abcEv();
extern void _ZN3ccc7CC5x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y63efgEv,_ZTv0_n16_N3ccc7CC5x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y63efgEv,_ZThn4_N3ccc7CC5x0y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y63abcEv,_ZTv0_n20_N3ccc7CC5x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y63abcEv,_ZThn4_N3ccc7CC5x0y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y63efgEv,_ZTv0_n16_N3ccc7CC5x0y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y63abcEv,_ZTv0_n20_N3ccc7CC5x0y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y6E[] = {
  {&(_ZTVN3ccc7CC5x0y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y6E[];
static VTBL_ENTRY alt_thunk_names2173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y63abcEv,_ZTv0_n20_N3ccc7CC5x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y63abcEv,_ZThn4_N3ccc7CC5x0y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y63efgEv,_ZTv0_n16_N3ccc7CC5x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y63efgEv,_ZThn4_N3ccc7CC5x0y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y6E = {  "_ZN3ccc7CC5x0y6E", // class name
  bases__ZN3ccc7CC5x0y6E, 2,
  &(vtc__ZN3ccc7CC5x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y6  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD5x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x0y63efgEv
  ~DD5x0y6(); // tgen
  DD5x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y63abcEv");}
void  ccc::DD5x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y63efgEv");}
ccc::DD5x0y6 ::~DD5x0y6(){ note_dtor("_ZN3ccc7DD5x0y6E", this);} // tgen
ccc::DD5x0y6 ::DD5x0y6(){ note_ctor("_ZN3ccc7DD5x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y6E, buf);
    ::ccc::DD5x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y6E);
    dp->::ccc::DD5x0y6::~DD5x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y6E(Test__ZN3ccc7DD5x0y6E, "_ZN3ccc7DD5x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y6C1Ev();
extern void _ZN3ccc7DD5x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y6E[] = {
  NSPAIR(_ZN3ccc7DD5x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y6E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x0y63efgEv();
extern void _ZN3ccc7DD5x0y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y63abcEv,_ZTv0_n12_N3ccc7DD5x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y63abcEv,_ZThn4_N3ccc7DD5x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y63efgEv,_ZTv0_n16_N3ccc7DD5x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y63efgEv,_ZThn4_N3ccc7DD5x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y63abcEv,_ZTv0_n12_N3ccc7DD5x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y63efgEv,_ZTv0_n16_N3ccc7DD5x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y6E[] = {
  {&(_ZTVN3ccc7DD5x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y6E[];
static VTBL_ENTRY alt_thunk_names2174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y63efgEv,_ZTv0_n16_N3ccc7DD5x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y63efgEv,_ZThn4_N3ccc7DD5x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y63abcEv,_ZTv0_n12_N3ccc7DD5x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y63abcEv,_ZThn4_N3ccc7DD5x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y6E = {  "_ZN3ccc7DD5x0y6E", // class name
  bases__ZN3ccc7DD5x0y6E, 2,
  &(vtc__ZN3ccc7DD5x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y7  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y73pqrEv
  ~CC5x0y7(); // tgen
  CC5x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y7E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y73abcEv");}
void  ccc::CC5x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y73pqrEv");}
ccc::CC5x0y7 ::~CC5x0y7(){ note_dtor("_ZN3ccc7CC5x0y7E", this);} // tgen
ccc::CC5x0y7 ::CC5x0y7(){ note_ctor("_ZN3ccc7CC5x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y7E, buf);
    ::ccc::CC5x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y7E);
    dp->::ccc::CC5x0y7::~CC5x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y7E(Test__ZN3ccc7CC5x0y7E, "_ZN3ccc7CC5x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y7C1Ev();
extern void _ZN3ccc7CC5x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y7E[] = {
  NSPAIR(_ZN3ccc7CC5x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y7E[];
extern void _ZN3ccc7CC5x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC5x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y73pqrEv,_ZTv0_n12_N3ccc7CC5x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y73pqrEv,_ZThn4_N3ccc7CC5x0y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y73abcEv,_ZTv0_n20_N3ccc7CC5x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y73abcEv,_ZThn4_N3ccc7CC5x0y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y73pqrEv,_ZTv0_n12_N3ccc7CC5x0y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y73abcEv,_ZTv0_n20_N3ccc7CC5x0y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y7E[] = {
  {&(_ZTVN3ccc7CC5x0y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y7E[];
static VTBL_ENTRY alt_thunk_names2175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y73abcEv,_ZTv0_n20_N3ccc7CC5x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y73abcEv,_ZThn4_N3ccc7CC5x0y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y73pqrEv,_ZTv0_n12_N3ccc7CC5x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y73pqrEv,_ZThn4_N3ccc7CC5x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y7E = {  "_ZN3ccc7CC5x0y7E", // class name
  bases__ZN3ccc7CC5x0y7E, 2,
  &(vtc__ZN3ccc7CC5x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y7  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD5x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y73pqrEv
  ~DD5x0y7(); // tgen
  DD5x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y73abcEv");}
void  ccc::DD5x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y73pqrEv");}
ccc::DD5x0y7 ::~DD5x0y7(){ note_dtor("_ZN3ccc7DD5x0y7E", this);} // tgen
ccc::DD5x0y7 ::DD5x0y7(){ note_ctor("_ZN3ccc7DD5x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y7E, buf);
    ::ccc::DD5x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y7E);
    dp->::ccc::DD5x0y7::~DD5x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y7E(Test__ZN3ccc7DD5x0y7E, "_ZN3ccc7DD5x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y7C1Ev();
extern void _ZN3ccc7DD5x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y7E[] = {
  NSPAIR(_ZN3ccc7DD5x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y7E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y7E[];
extern void _ZN3ccc7DD5x0y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x0y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y73abcEv,_ZTv0_n12_N3ccc7DD5x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y73abcEv,_ZThn4_N3ccc7DD5x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y73pqrEv,_ZTv0_n20_N3ccc7DD5x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y73pqrEv,_ZThn4_N3ccc7DD5x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y73abcEv,_ZTv0_n12_N3ccc7DD5x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y73pqrEv,_ZTv0_n20_N3ccc7DD5x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y7E[] = {
  {&(_ZTVN3ccc7DD5x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y7E[];
static VTBL_ENTRY alt_thunk_names2176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y73pqrEv,_ZTv0_n20_N3ccc7DD5x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y73pqrEv,_ZThn4_N3ccc7DD5x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y73abcEv,_ZTv0_n12_N3ccc7DD5x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y73abcEv,_ZThn4_N3ccc7DD5x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y7E = {  "_ZN3ccc7DD5x0y7E", // class name
  bases__ZN3ccc7DD5x0y7E, 2,
  &(vtc__ZN3ccc7DD5x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y8  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y83abcEv
  ~CC5x0y8(); // tgen
  CC5x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y8E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y83efgEv");}
void  ccc::CC5x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y83abcEv");}
ccc::CC5x0y8 ::~CC5x0y8(){ note_dtor("_ZN3ccc7CC5x0y8E", this);} // tgen
ccc::CC5x0y8 ::CC5x0y8(){ note_ctor("_ZN3ccc7CC5x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y8E, buf);
    ::ccc::CC5x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y8E);
    dp->::ccc::CC5x0y8::~CC5x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y8E(Test__ZN3ccc7CC5x0y8E, "_ZN3ccc7CC5x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y8C1Ev();
extern void _ZN3ccc7CC5x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y8E[] = {
  NSPAIR(_ZN3ccc7CC5x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y8E[];
extern void _ZN3ccc7CC5x0y83abcEv();
extern void _ZN3ccc7CC5x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y83efgEv,_ZTv0_n16_N3ccc7CC5x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y83efgEv,_ZThn4_N3ccc7CC5x0y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x0y83abcEv,_ZTv0_n20_N3ccc7CC5x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y83abcEv,_ZThn4_N3ccc7CC5x0y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y83efgEv,_ZTv0_n16_N3ccc7CC5x0y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x0y83abcEv,_ZTv0_n20_N3ccc7CC5x0y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y8E[] = {
  {&(_ZTVN3ccc7CC5x0y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y8E[];
static VTBL_ENTRY alt_thunk_names2177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x0y83abcEv,_ZTv0_n20_N3ccc7CC5x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y83abcEv,_ZThn4_N3ccc7CC5x0y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y83efgEv,_ZTv0_n16_N3ccc7CC5x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y83efgEv,_ZThn4_N3ccc7CC5x0y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y8E = {  "_ZN3ccc7CC5x0y8E", // class name
  bases__ZN3ccc7CC5x0y8E, 2,
  &(vtc__ZN3ccc7CC5x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y8  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD5x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x0y83abcEv
  ~DD5x0y8(); // tgen
  DD5x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y83efgEv");}
void  ccc::DD5x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x0y83abcEv");}
ccc::DD5x0y8 ::~DD5x0y8(){ note_dtor("_ZN3ccc7DD5x0y8E", this);} // tgen
ccc::DD5x0y8 ::DD5x0y8(){ note_ctor("_ZN3ccc7DD5x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y8E, buf);
    ::ccc::DD5x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y8E);
    dp->::ccc::DD5x0y8::~DD5x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y8E(Test__ZN3ccc7DD5x0y8E, "_ZN3ccc7DD5x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y8C1Ev();
extern void _ZN3ccc7DD5x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y8E[] = {
  NSPAIR(_ZN3ccc7DD5x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y8E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x0y83efgEv();
extern void _ZN3ccc7DD5x0y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x0y83abcEv,_ZTv0_n12_N3ccc7DD5x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y83abcEv,_ZThn4_N3ccc7DD5x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y83efgEv,_ZTv0_n16_N3ccc7DD5x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y83efgEv,_ZThn4_N3ccc7DD5x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x0y83abcEv,_ZTv0_n12_N3ccc7DD5x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y83efgEv,_ZTv0_n16_N3ccc7DD5x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y8E[] = {
  {&(_ZTVN3ccc7DD5x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y8E[];
static VTBL_ENTRY alt_thunk_names2178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y83efgEv,_ZTv0_n16_N3ccc7DD5x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y83efgEv,_ZThn4_N3ccc7DD5x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x0y83abcEv,_ZTv0_n12_N3ccc7DD5x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y83abcEv,_ZThn4_N3ccc7DD5x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y8E = {  "_ZN3ccc7DD5x0y8E", // class name
  bases__ZN3ccc7DD5x0y8E, 2,
  &(vtc__ZN3ccc7DD5x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y9  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y93pqrEv
  ~CC5x0y9(); // tgen
  CC5x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y9E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y93efgEv");}
void  ccc::CC5x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y93pqrEv");}
ccc::CC5x0y9 ::~CC5x0y9(){ note_dtor("_ZN3ccc7CC5x0y9E", this);} // tgen
ccc::CC5x0y9 ::CC5x0y9(){ note_ctor("_ZN3ccc7CC5x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y9E, buf);
    ::ccc::CC5x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC5x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y9E);
    dp->::ccc::CC5x0y9::~CC5x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y9E(Test__ZN3ccc7CC5x0y9E, "_ZN3ccc7CC5x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y9C1Ev();
extern void _ZN3ccc7CC5x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y9E[] = {
  NSPAIR(_ZN3ccc7CC5x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC5x0y93efgEv();
extern void _ZN3ccc7CC5x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x0y93pqrEv,_ZTv0_n12_N3ccc7CC5x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y93pqrEv,_ZThn4_N3ccc7CC5x0y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x0y93efgEv,_ZTv0_n16_N3ccc7CC5x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y93efgEv,_ZThn4_N3ccc7CC5x0y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x0y93pqrEv,_ZTv0_n12_N3ccc7CC5x0y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x0y93efgEv,_ZTv0_n16_N3ccc7CC5x0y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x0y9E[] = {
  {&(_ZTVN3ccc7CC5x0y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x0y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x0y9E[];
static VTBL_ENTRY alt_thunk_names2179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x0y93efgEv,_ZTv0_n16_N3ccc7CC5x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y93efgEv,_ZThn4_N3ccc7CC5x0y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x0y93pqrEv,_ZTv0_n12_N3ccc7CC5x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x0y93pqrEv,_ZThn4_N3ccc7CC5x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x0y9E = {  "_ZN3ccc7CC5x0y9E", // class name
  bases__ZN3ccc7CC5x0y9E, 2,
  &(vtc__ZN3ccc7CC5x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x0y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y9  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD5x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x0y93pqrEv
  ~DD5x0y9(); // tgen
  DD5x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x0y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x0y93efgEv");}
void  ccc::DD5x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x0y93pqrEv");}
ccc::DD5x0y9 ::~DD5x0y9(){ note_dtor("_ZN3ccc7DD5x0y9E", this);} // tgen
ccc::DD5x0y9 ::DD5x0y9(){ note_ctor("_ZN3ccc7DD5x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x0y9E, buf);
    ::ccc::DD5x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x0y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD5x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x0y9E);
    dp->::ccc::DD5x0y9::~DD5x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x0y9E(Test__ZN3ccc7DD5x0y9E, "_ZN3ccc7DD5x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x0y9C1Ev();
extern void _ZN3ccc7DD5x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x0y9E[] = {
  NSPAIR(_ZN3ccc7DD5x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD5x0y9E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y9E[];
extern void _ZN3ccc7DD5x0y93pqrEv();
extern void _ZN3ccc7DD5x0y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x0y93efgEv,_ZTv0_n16_N3ccc7DD5x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y93efgEv,_ZThn4_N3ccc7DD5x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x0y93pqrEv,_ZTv0_n20_N3ccc7DD5x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x0y93pqrEv,_ZThn4_N3ccc7DD5x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x0y93efgEv,_ZTv0_n16_N3ccc7DD5x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x0y93pqrEv,_ZTv0_n20_N3ccc7DD5x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x0y9E[] = {
  {&(_ZTVN3ccc7DD5x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x0y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x0y9E[];
static VTBL_ENTRY alt_thunk_names2180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x0y93pqrEv,_ZTv0_n20_N3ccc7DD5x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y93pqrEv,_ZThn4_N3ccc7DD5x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x0y93efgEv,_ZTv0_n16_N3ccc7DD5x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x0y93efgEv,_ZThn4_N3ccc7DD5x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x0y9E = {  "_ZN3ccc7DD5x0y9E", // class name
  bases__ZN3ccc7DD5x0y9E, 2,
  &(vtc__ZN3ccc7DD5x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x0y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x0y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y10  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x0y103abcEv
  ~CC5x0y10(); // tgen
  CC5x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y10E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y103pqrEv");}
void  ccc::CC5x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x0y103abcEv");}
ccc::CC5x0y10 ::~CC5x0y10(){ note_dtor("_ZN3ccc8CC5x0y10E", this);} // tgen
ccc::CC5x0y10 ::CC5x0y10(){ note_ctor("_ZN3ccc8CC5x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y10E, buf);
    ::ccc::CC5x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y10E);
    dp->::ccc::CC5x0y10::~CC5x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y10E(Test__ZN3ccc8CC5x0y10E, "_ZN3ccc8CC5x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y10C1Ev();
extern void _ZN3ccc8CC5x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y10E[] = {
  NSPAIR(_ZN3ccc8CC5x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y10E[];
extern void _ZN3ccc8CC5x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC5x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x0y103pqrEv,_ZTv0_n12_N3ccc8CC5x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y103pqrEv,_ZThn4_N3ccc8CC5x0y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x0y103abcEv,_ZTv0_n20_N3ccc8CC5x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y103abcEv,_ZThn4_N3ccc8CC5x0y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x0y103pqrEv,_ZTv0_n12_N3ccc8CC5x0y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x0y103abcEv,_ZTv0_n20_N3ccc8CC5x0y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y10E[] = {
  {&(_ZTVN3ccc8CC5x0y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y10E[];
static VTBL_ENTRY alt_thunk_names2181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x0y103abcEv,_ZTv0_n20_N3ccc8CC5x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y103abcEv,_ZThn4_N3ccc8CC5x0y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x0y103pqrEv,_ZTv0_n12_N3ccc8CC5x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y103pqrEv,_ZThn4_N3ccc8CC5x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x0y10E = {  "_ZN3ccc8CC5x0y10E", // class name
  bases__ZN3ccc8CC5x0y10E, 2,
  &(vtc__ZN3ccc8CC5x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y10  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD5x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x0y103abcEv
  ~DD5x0y10(); // tgen
  DD5x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x0y103pqrEv");}
void  ccc::DD5x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x0y103abcEv");}
ccc::DD5x0y10 ::~DD5x0y10(){ note_dtor("_ZN3ccc8DD5x0y10E", this);} // tgen
ccc::DD5x0y10 ::DD5x0y10(){ note_ctor("_ZN3ccc8DD5x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y10E, buf);
    ::ccc::DD5x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y10E);
    dp->::ccc::DD5x0y10::~DD5x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y10E(Test__ZN3ccc8DD5x0y10E, "_ZN3ccc8DD5x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y10C1Ev();
extern void _ZN3ccc8DD5x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y10E[] = {
  NSPAIR(_ZN3ccc8DD5x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y10E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y10E[];
extern void _ZN3ccc8DD5x0y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x0y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x0y103abcEv,_ZTv0_n12_N3ccc8DD5x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y103abcEv,_ZThn4_N3ccc8DD5x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x0y103pqrEv,_ZTv0_n20_N3ccc8DD5x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y103pqrEv,_ZThn4_N3ccc8DD5x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x0y103abcEv,_ZTv0_n12_N3ccc8DD5x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x0y103pqrEv,_ZTv0_n20_N3ccc8DD5x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y10E[] = {
  {&(_ZTVN3ccc8DD5x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y10E[];
static VTBL_ENTRY alt_thunk_names2182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x0y103pqrEv,_ZTv0_n20_N3ccc8DD5x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y103pqrEv,_ZThn4_N3ccc8DD5x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x0y103abcEv,_ZTv0_n12_N3ccc8DD5x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y103abcEv,_ZThn4_N3ccc8DD5x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x0y10E = {  "_ZN3ccc8DD5x0y10E", // class name
  bases__ZN3ccc8DD5x0y10E, 2,
  &(vtc__ZN3ccc8DD5x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y11  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x0y113efgEv
  ~CC5x0y11(); // tgen
  CC5x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y11E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y113pqrEv");}
void  ccc::CC5x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x0y113efgEv");}
ccc::CC5x0y11 ::~CC5x0y11(){ note_dtor("_ZN3ccc8CC5x0y11E", this);} // tgen
ccc::CC5x0y11 ::CC5x0y11(){ note_ctor("_ZN3ccc8CC5x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y11E, buf);
    ::ccc::CC5x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y11E);
    dp->::ccc::CC5x0y11::~CC5x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y11E(Test__ZN3ccc8CC5x0y11E, "_ZN3ccc8CC5x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y11C1Ev();
extern void _ZN3ccc8CC5x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y11E[] = {
  NSPAIR(_ZN3ccc8CC5x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC5x0y113efgEv();
extern void _ZN3ccc8CC5x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x0y113pqrEv,_ZTv0_n12_N3ccc8CC5x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y113pqrEv,_ZThn4_N3ccc8CC5x0y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x0y113efgEv,_ZTv0_n16_N3ccc8CC5x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y113efgEv,_ZThn4_N3ccc8CC5x0y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x0y113pqrEv,_ZTv0_n12_N3ccc8CC5x0y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x0y113efgEv,_ZTv0_n16_N3ccc8CC5x0y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y11E[] = {
  {&(_ZTVN3ccc8CC5x0y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y11E[];
static VTBL_ENTRY alt_thunk_names2183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x0y113efgEv,_ZTv0_n16_N3ccc8CC5x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y113efgEv,_ZThn4_N3ccc8CC5x0y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x0y113pqrEv,_ZTv0_n12_N3ccc8CC5x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y113pqrEv,_ZThn4_N3ccc8CC5x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x0y11E = {  "_ZN3ccc8CC5x0y11E", // class name
  bases__ZN3ccc8CC5x0y11E, 2,
  &(vtc__ZN3ccc8CC5x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y11  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD5x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x0y113efgEv
  ~DD5x0y11(); // tgen
  DD5x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x0y113pqrEv");}
void  ccc::DD5x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x0y113efgEv");}
ccc::DD5x0y11 ::~DD5x0y11(){ note_dtor("_ZN3ccc8DD5x0y11E", this);} // tgen
ccc::DD5x0y11 ::DD5x0y11(){ note_ctor("_ZN3ccc8DD5x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y11E, buf);
    ::ccc::DD5x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y11E);
    dp->::ccc::DD5x0y11::~DD5x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y11E(Test__ZN3ccc8DD5x0y11E, "_ZN3ccc8DD5x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y11C1Ev();
extern void _ZN3ccc8DD5x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y11E[] = {
  NSPAIR(_ZN3ccc8DD5x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y11E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y11E[];
extern void _ZN3ccc8DD5x0y113pqrEv();
extern void _ZN3ccc8DD5x0y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x0y113efgEv,_ZTv0_n16_N3ccc8DD5x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y113efgEv,_ZThn4_N3ccc8DD5x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x0y113pqrEv,_ZTv0_n20_N3ccc8DD5x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y113pqrEv,_ZThn4_N3ccc8DD5x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x0y113efgEv,_ZTv0_n16_N3ccc8DD5x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x0y113pqrEv,_ZTv0_n20_N3ccc8DD5x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y11E[] = {
  {&(_ZTVN3ccc8DD5x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y11E[];
static VTBL_ENTRY alt_thunk_names2184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x0y113pqrEv,_ZTv0_n20_N3ccc8DD5x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y113pqrEv,_ZThn4_N3ccc8DD5x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x0y113efgEv,_ZTv0_n16_N3ccc8DD5x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y113efgEv,_ZThn4_N3ccc8DD5x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x0y11E = {  "_ZN3ccc8DD5x0y11E", // class name
  bases__ZN3ccc8DD5x0y11E, 2,
  &(vtc__ZN3ccc8DD5x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y12  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC5x0y123abcEv
  ~CC5x0y12(); // tgen
  CC5x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x0y123abcEv");}
ccc::CC5x0y12 ::~CC5x0y12(){ note_dtor("_ZN3ccc8CC5x0y12E", this);} // tgen
ccc::CC5x0y12 ::CC5x0y12(){ note_ctor("_ZN3ccc8CC5x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y12E, buf);
    ::ccc::CC5x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y12E);
    dp->::ccc::CC5x0y12::~CC5x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y12E(Test__ZN3ccc8CC5x0y12E, "_ZN3ccc8CC5x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y12C1Ev();
extern void _ZN3ccc8CC5x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y12E[] = {
  NSPAIR(_ZN3ccc8CC5x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y12E[];
extern void _ZN3ccc8CC5x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x0y123abcEv,_ZTv0_n20_N3ccc8CC5x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y123abcEv,_ZThn4_N3ccc8CC5x0y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x0y123abcEv,_ZTv0_n20_N3ccc8CC5x0y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y12E[] = {
  {&(_ZTVN3ccc8CC5x0y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y12E[];
static VTBL_ENTRY alt_thunk_names2185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x0y123abcEv,_ZTv0_n20_N3ccc8CC5x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y123abcEv,_ZThn4_N3ccc8CC5x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x0y12E = {  "_ZN3ccc8CC5x0y12E", // class name
  bases__ZN3ccc8CC5x0y12E, 2,
  &(vtc__ZN3ccc8CC5x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y12  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD5x0y123abcEv
  ~DD5x0y12(); // tgen
  DD5x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x0y123abcEv");}
ccc::DD5x0y12 ::~DD5x0y12(){ note_dtor("_ZN3ccc8DD5x0y12E", this);} // tgen
ccc::DD5x0y12 ::DD5x0y12(){ note_ctor("_ZN3ccc8DD5x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y12E, buf);
    ::ccc::DD5x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y12E);
    dp->::ccc::DD5x0y12::~DD5x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y12E(Test__ZN3ccc8DD5x0y12E, "_ZN3ccc8DD5x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y12C1Ev();
extern void _ZN3ccc8DD5x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y12E[] = {
  NSPAIR(_ZN3ccc8DD5x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y12E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x0y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x0y123abcEv,_ZTv0_n12_N3ccc8DD5x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y123abcEv,_ZThn4_N3ccc8DD5x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x0y123abcEv,_ZTv0_n12_N3ccc8DD5x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y12E[] = {
  {&(_ZTVN3ccc8DD5x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y12E[];
static VTBL_ENTRY alt_thunk_names2186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x0y123abcEv,_ZTv0_n12_N3ccc8DD5x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y123abcEv,_ZThn4_N3ccc8DD5x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x0y12E = {  "_ZN3ccc8DD5x0y12E", // class name
  bases__ZN3ccc8DD5x0y12E, 2,
  &(vtc__ZN3ccc8DD5x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y13  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC5x0y133efgEv
  ~CC5x0y13(); // tgen
  CC5x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x0y133efgEv");}
ccc::CC5x0y13 ::~CC5x0y13(){ note_dtor("_ZN3ccc8CC5x0y13E", this);} // tgen
ccc::CC5x0y13 ::CC5x0y13(){ note_ctor("_ZN3ccc8CC5x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y13E, buf);
    ::ccc::CC5x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y13E);
    dp->::ccc::CC5x0y13::~CC5x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y13E(Test__ZN3ccc8CC5x0y13E, "_ZN3ccc8CC5x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y13C1Ev();
extern void _ZN3ccc8CC5x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y13E[] = {
  NSPAIR(_ZN3ccc8CC5x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC5x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x0y133efgEv,_ZTv0_n16_N3ccc8CC5x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y133efgEv,_ZThn4_N3ccc8CC5x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x0y133efgEv,_ZTv0_n16_N3ccc8CC5x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y13E[] = {
  {&(_ZTVN3ccc8CC5x0y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y13E[];
static VTBL_ENTRY alt_thunk_names2187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x0y133efgEv,_ZTv0_n16_N3ccc8CC5x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y133efgEv,_ZThn4_N3ccc8CC5x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x0y13E = {  "_ZN3ccc8CC5x0y13E", // class name
  bases__ZN3ccc8CC5x0y13E, 2,
  &(vtc__ZN3ccc8CC5x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y13  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD5x0y133efgEv
  ~DD5x0y13(); // tgen
  DD5x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x0y133efgEv");}
ccc::DD5x0y13 ::~DD5x0y13(){ note_dtor("_ZN3ccc8DD5x0y13E", this);} // tgen
ccc::DD5x0y13 ::DD5x0y13(){ note_ctor("_ZN3ccc8DD5x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y13E, buf);
    ::ccc::DD5x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y13E);
    dp->::ccc::DD5x0y13::~DD5x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y13E(Test__ZN3ccc8DD5x0y13E, "_ZN3ccc8DD5x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y13C1Ev();
extern void _ZN3ccc8DD5x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y13E[] = {
  NSPAIR(_ZN3ccc8DD5x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y13E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x0y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x0y133efgEv,_ZTv0_n16_N3ccc8DD5x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y133efgEv,_ZThn4_N3ccc8DD5x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x0y133efgEv,_ZTv0_n16_N3ccc8DD5x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y13E[] = {
  {&(_ZTVN3ccc8DD5x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y13E[];
static VTBL_ENTRY alt_thunk_names2188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x0y133efgEv,_ZTv0_n16_N3ccc8DD5x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y133efgEv,_ZThn4_N3ccc8DD5x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x0y13E = {  "_ZN3ccc8DD5x0y13E", // class name
  bases__ZN3ccc8DD5x0y13E, 2,
  &(vtc__ZN3ccc8DD5x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y14  : virtual ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y143pqrEv
  ~CC5x0y14(); // tgen
  CC5x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y143pqrEv");}
ccc::CC5x0y14 ::~CC5x0y14(){ note_dtor("_ZN3ccc8CC5x0y14E", this);} // tgen
ccc::CC5x0y14 ::CC5x0y14(){ note_ctor("_ZN3ccc8CC5x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y14E, buf);
    ::ccc::CC5x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y14E);
    dp->::ccc::CC5x0y14::~CC5x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y14E(Test__ZN3ccc8CC5x0y14E, "_ZN3ccc8CC5x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y14C1Ev();
extern void _ZN3ccc8CC5x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y14E[] = {
  NSPAIR(_ZN3ccc8CC5x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC5x0y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x0y143pqrEv,_ZTv0_n12_N3ccc8CC5x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y143pqrEv,_ZThn4_N3ccc8CC5x0y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x0y143pqrEv,_ZTv0_n12_N3ccc8CC5x0y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y14E[] = {
  {&(_ZTVN3ccc8CC5x0y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y14E[];
static VTBL_ENTRY alt_thunk_names2189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x0y143pqrEv,_ZTv0_n12_N3ccc8CC5x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x0y143pqrEv,_ZThn4_N3ccc8CC5x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x0y14E = {  "_ZN3ccc8CC5x0y14E", // class name
  bases__ZN3ccc8CC5x0y14E, 2,
  &(vtc__ZN3ccc8CC5x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y14  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD5x0y143pqrEv
  ~DD5x0y14(); // tgen
  DD5x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x0y143pqrEv");}
ccc::DD5x0y14 ::~DD5x0y14(){ note_dtor("_ZN3ccc8DD5x0y14E", this);} // tgen
ccc::DD5x0y14 ::DD5x0y14(){ note_ctor("_ZN3ccc8DD5x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y14E, buf);
    ::ccc::DD5x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y14E);
    dp->::ccc::DD5x0y14::~DD5x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y14E(Test__ZN3ccc8DD5x0y14E, "_ZN3ccc8DD5x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y14C1Ev();
extern void _ZN3ccc8DD5x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y14E[] = {
  NSPAIR(_ZN3ccc8DD5x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y14E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y14E[];
extern void _ZN3ccc8DD5x0y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x0y143pqrEv,_ZTv0_n20_N3ccc8DD5x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x0y143pqrEv,_ZThn4_N3ccc8DD5x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x0y143pqrEv,_ZTv0_n20_N3ccc8DD5x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y14E[] = {
  {&(_ZTVN3ccc8DD5x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y14E[];
static VTBL_ENTRY alt_thunk_names2190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x0y143pqrEv,_ZTv0_n20_N3ccc8DD5x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x0y143pqrEv,_ZThn4_N3ccc8DD5x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x0y14E = {  "_ZN3ccc8DD5x0y14E", // class name
  bases__ZN3ccc8DD5x0y14E, 2,
  &(vtc__ZN3ccc8DD5x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y15  : virtual ::ccc::AA5 , ::ccc::BB0 {
  ~CC5x0y15(); // tgen
  CC5x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x0y15 ::~CC5x0y15(){ note_dtor("_ZN3ccc8CC5x0y15E", this);} // tgen
ccc::CC5x0y15 ::CC5x0y15(){ note_ctor("_ZN3ccc8CC5x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y15E, buf);
    ::ccc::CC5x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC5x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y15E);
    dp->::ccc::CC5x0y15::~CC5x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y15E(Test__ZN3ccc8CC5x0y15E, "_ZN3ccc8CC5x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y15C1Ev();
extern void _ZN3ccc8CC5x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y15E[] = {
  NSPAIR(_ZN3ccc8CC5x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x0y15E[] = {
  {&(_ZTVN3ccc8CC5x0y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x0y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x0y15E[];
Class_Descriptor cd__ZN3ccc8CC5x0y15E = {  "_ZN3ccc8CC5x0y15E", // class name
  bases__ZN3ccc8CC5x0y15E, 2,
  &(vtc__ZN3ccc8CC5x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x0y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x0y15  : virtual ::ccc::AA5 , virtual ::ccc::BB0 {
  ~DD5x0y15(); // tgen
  DD5x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x0y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x0y15 ::~DD5x0y15(){ note_dtor("_ZN3ccc8DD5x0y15E", this);} // tgen
ccc::DD5x0y15 ::DD5x0y15(){ note_ctor("_ZN3ccc8DD5x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x0y15E, buf);
    ::ccc::DD5x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x0y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD5x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x0y15E);
    dp->::ccc::DD5x0y15::~DD5x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x0y15E(Test__ZN3ccc8DD5x0y15E, "_ZN3ccc8DD5x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x0y15C1Ev();
extern void _ZN3ccc8DD5x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x0y15E[] = {
  NSPAIR(_ZN3ccc8DD5x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD5x0y15E[] = {
  // 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},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x0y15E[] = {
  {&(_ZTVN3ccc8DD5x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x0y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x0y15E[];
Class_Descriptor cd__ZN3ccc8DD5x0y15E = {  "_ZN3ccc8DD5x0y15E", // class name
  bases__ZN3ccc8DD5x0y15E, 2,
  &(vtc__ZN3ccc8DD5x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x0y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x0y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y0  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y03pqrEv
  ~CC5x1y0(); // tgen
  CC5x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y0E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y03abcEv");}
void  ccc::CC5x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y03efgEv");}
void  ccc::CC5x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y03pqrEv");}
ccc::CC5x1y0 ::~CC5x1y0(){ note_dtor("_ZN3ccc7CC5x1y0E", this);} // tgen
ccc::CC5x1y0 ::CC5x1y0(){ note_ctor("_ZN3ccc7CC5x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y0E, buf);
    ::ccc::CC5x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y0E);
    dp->::ccc::CC5x1y0::~CC5x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y0E(Test__ZN3ccc7CC5x1y0E, "_ZN3ccc7CC5x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y0C1Ev();
extern void _ZN3ccc7CC5x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y0E[] = {
  NSPAIR(_ZN3ccc7CC5x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y0E[];
extern void _ZN3ccc7CC5x1y03abcEv();
extern void _ZN3ccc7CC5x1y03pqrEv();
extern void _ZN3ccc7CC5x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y03pqrEv,_ZTv0_n12_N3ccc7CC5x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03pqrEv,_ZThn4_N3ccc7CC5x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y03efgEv,_ZTv0_n16_N3ccc7CC5x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03efgEv,_ZThn4_N3ccc7CC5x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y03abcEv,_ZTv0_n20_N3ccc7CC5x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03abcEv,_ZThn4_N3ccc7CC5x1y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y03pqrEv,_ZTv0_n12_N3ccc7CC5x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y03efgEv,_ZTv0_n16_N3ccc7CC5x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y03abcEv,_ZTv0_n20_N3ccc7CC5x1y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y0E[] = {
  {&(_ZTVN3ccc7CC5x1y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y0E[];
static VTBL_ENTRY alt_thunk_names2191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y03abcEv,_ZTv0_n20_N3ccc7CC5x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y03abcEv,_ZThn4_N3ccc7CC5x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y03efgEv,_ZTv0_n16_N3ccc7CC5x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y03efgEv,_ZThn4_N3ccc7CC5x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y03pqrEv,_ZTv0_n12_N3ccc7CC5x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y03pqrEv,_ZThn4_N3ccc7CC5x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y0E = {  "_ZN3ccc7CC5x1y0E", // class name
  bases__ZN3ccc7CC5x1y0E, 2,
  &(vtc__ZN3ccc7CC5x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y0  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD5x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y03pqrEv
  ~DD5x1y0(); // tgen
  DD5x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y03abcEv");}
void  ccc::DD5x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y03efgEv");}
void  ccc::DD5x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y03pqrEv");}
ccc::DD5x1y0 ::~DD5x1y0(){ note_dtor("_ZN3ccc7DD5x1y0E", this);} // tgen
ccc::DD5x1y0 ::DD5x1y0(){ note_ctor("_ZN3ccc7DD5x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y0E, buf);
    ::ccc::DD5x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y0E);
    dp->::ccc::DD5x1y0::~DD5x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y0E(Test__ZN3ccc7DD5x1y0E, "_ZN3ccc7DD5x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y0C1Ev();
extern void _ZN3ccc7DD5x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y0E[] = {
  NSPAIR(_ZN3ccc7DD5x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y0E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y0E[];
extern void _ZN3ccc7DD5x1y03pqrEv();
extern void _ZN3ccc7DD5x1y03efgEv();
extern void _ZN3ccc7DD5x1y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y03abcEv,_ZTv0_n12_N3ccc7DD5x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y03abcEv,_ZThn4_N3ccc7DD5x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y03pqrEv,_ZTv0_n16_N3ccc7DD5x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y03pqrEv,_ZThn4_N3ccc7DD5x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y03efgEv,_ZTv0_n20_N3ccc7DD5x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y03efgEv,_ZThn4_N3ccc7DD5x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y03abcEv,_ZTv0_n12_N3ccc7DD5x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y03pqrEv,_ZTv0_n16_N3ccc7DD5x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y03efgEv,_ZTv0_n20_N3ccc7DD5x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y0E[] = {
  {&(_ZTVN3ccc7DD5x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y0E[];
static VTBL_ENTRY alt_thunk_names2192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y03efgEv,_ZTv0_n20_N3ccc7DD5x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y03efgEv,_ZThn4_N3ccc7DD5x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y03pqrEv,_ZTv0_n16_N3ccc7DD5x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y03pqrEv,_ZThn4_N3ccc7DD5x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y03abcEv,_ZTv0_n12_N3ccc7DD5x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y03abcEv,_ZThn4_N3ccc7DD5x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y0E = {  "_ZN3ccc7DD5x1y0E", // class name
  bases__ZN3ccc7DD5x1y0E, 2,
  &(vtc__ZN3ccc7DD5x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y1  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x1y13efgEv
  ~CC5x1y1(); // tgen
  CC5x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y1E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y13abcEv");}
void  ccc::CC5x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y13pqrEv");}
void  ccc::CC5x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y13efgEv");}
ccc::CC5x1y1 ::~CC5x1y1(){ note_dtor("_ZN3ccc7CC5x1y1E", this);} // tgen
ccc::CC5x1y1 ::CC5x1y1(){ note_ctor("_ZN3ccc7CC5x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y1E, buf);
    ::ccc::CC5x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y1E);
    dp->::ccc::CC5x1y1::~CC5x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y1E(Test__ZN3ccc7CC5x1y1E, "_ZN3ccc7CC5x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y1C1Ev();
extern void _ZN3ccc7CC5x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y1E[] = {
  NSPAIR(_ZN3ccc7CC5x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y1E[];
extern void _ZN3ccc7CC5x1y13abcEv();
extern void _ZN3ccc7CC5x1y13pqrEv();
extern void _ZN3ccc7CC5x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y13pqrEv,_ZTv0_n12_N3ccc7CC5x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13pqrEv,_ZThn4_N3ccc7CC5x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y13efgEv,_ZTv0_n16_N3ccc7CC5x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13efgEv,_ZThn4_N3ccc7CC5x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y13abcEv,_ZTv0_n20_N3ccc7CC5x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13abcEv,_ZThn4_N3ccc7CC5x1y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y13pqrEv,_ZTv0_n12_N3ccc7CC5x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y13efgEv,_ZTv0_n16_N3ccc7CC5x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y13abcEv,_ZTv0_n20_N3ccc7CC5x1y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y1E[] = {
  {&(_ZTVN3ccc7CC5x1y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y1E[];
static VTBL_ENTRY alt_thunk_names2193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y13abcEv,_ZTv0_n20_N3ccc7CC5x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y13abcEv,_ZThn4_N3ccc7CC5x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y13efgEv,_ZTv0_n16_N3ccc7CC5x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y13efgEv,_ZThn4_N3ccc7CC5x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y13pqrEv,_ZTv0_n12_N3ccc7CC5x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y13pqrEv,_ZThn4_N3ccc7CC5x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y1E = {  "_ZN3ccc7CC5x1y1E", // class name
  bases__ZN3ccc7CC5x1y1E, 2,
  &(vtc__ZN3ccc7CC5x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y1  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD5x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x1y13efgEv
  ~DD5x1y1(); // tgen
  DD5x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y13abcEv");}
void  ccc::DD5x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y13pqrEv");}
void  ccc::DD5x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y13efgEv");}
ccc::DD5x1y1 ::~DD5x1y1(){ note_dtor("_ZN3ccc7DD5x1y1E", this);} // tgen
ccc::DD5x1y1 ::DD5x1y1(){ note_ctor("_ZN3ccc7DD5x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y1E, buf);
    ::ccc::DD5x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y1E);
    dp->::ccc::DD5x1y1::~DD5x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y1E(Test__ZN3ccc7DD5x1y1E, "_ZN3ccc7DD5x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y1C1Ev();
extern void _ZN3ccc7DD5x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y1E[] = {
  NSPAIR(_ZN3ccc7DD5x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y1E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y1E[];
extern void _ZN3ccc7DD5x1y13pqrEv();
extern void _ZN3ccc7DD5x1y13efgEv();
extern void _ZN3ccc7DD5x1y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y13abcEv,_ZTv0_n12_N3ccc7DD5x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y13abcEv,_ZThn4_N3ccc7DD5x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y13pqrEv,_ZTv0_n16_N3ccc7DD5x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y13pqrEv,_ZThn4_N3ccc7DD5x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y13efgEv,_ZTv0_n20_N3ccc7DD5x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y13efgEv,_ZThn4_N3ccc7DD5x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y13abcEv,_ZTv0_n12_N3ccc7DD5x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y13pqrEv,_ZTv0_n16_N3ccc7DD5x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y13efgEv,_ZTv0_n20_N3ccc7DD5x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y1E[] = {
  {&(_ZTVN3ccc7DD5x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y1E[];
static VTBL_ENTRY alt_thunk_names2194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y13efgEv,_ZTv0_n20_N3ccc7DD5x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y13efgEv,_ZThn4_N3ccc7DD5x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y13pqrEv,_ZTv0_n16_N3ccc7DD5x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y13pqrEv,_ZThn4_N3ccc7DD5x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y13abcEv,_ZTv0_n12_N3ccc7DD5x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y13abcEv,_ZThn4_N3ccc7DD5x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y1E = {  "_ZN3ccc7DD5x1y1E", // class name
  bases__ZN3ccc7DD5x1y1E, 2,
  &(vtc__ZN3ccc7DD5x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y2  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y23pqrEv
  ~CC5x1y2(); // tgen
  CC5x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y2E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y23efgEv");}
void  ccc::CC5x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y23abcEv");}
void  ccc::CC5x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y23pqrEv");}
ccc::CC5x1y2 ::~CC5x1y2(){ note_dtor("_ZN3ccc7CC5x1y2E", this);} // tgen
ccc::CC5x1y2 ::CC5x1y2(){ note_ctor("_ZN3ccc7CC5x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y2E, buf);
    ::ccc::CC5x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y2E);
    dp->::ccc::CC5x1y2::~CC5x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y2E(Test__ZN3ccc7CC5x1y2E, "_ZN3ccc7CC5x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y2C1Ev();
extern void _ZN3ccc7CC5x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y2E[] = {
  NSPAIR(_ZN3ccc7CC5x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y2E[];
extern void _ZN3ccc7CC5x1y23abcEv();
extern void _ZN3ccc7CC5x1y23pqrEv();
extern void _ZN3ccc7CC5x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y23pqrEv,_ZTv0_n12_N3ccc7CC5x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23pqrEv,_ZThn4_N3ccc7CC5x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y23efgEv,_ZTv0_n16_N3ccc7CC5x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23efgEv,_ZThn4_N3ccc7CC5x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y23abcEv,_ZTv0_n20_N3ccc7CC5x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23abcEv,_ZThn4_N3ccc7CC5x1y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y23pqrEv,_ZTv0_n12_N3ccc7CC5x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y23efgEv,_ZTv0_n16_N3ccc7CC5x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y23abcEv,_ZTv0_n20_N3ccc7CC5x1y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y2E[] = {
  {&(_ZTVN3ccc7CC5x1y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y2E[];
static VTBL_ENTRY alt_thunk_names2195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y23abcEv,_ZTv0_n20_N3ccc7CC5x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y23abcEv,_ZThn4_N3ccc7CC5x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y23efgEv,_ZTv0_n16_N3ccc7CC5x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y23efgEv,_ZThn4_N3ccc7CC5x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y23pqrEv,_ZTv0_n12_N3ccc7CC5x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y23pqrEv,_ZThn4_N3ccc7CC5x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y2E = {  "_ZN3ccc7CC5x1y2E", // class name
  bases__ZN3ccc7CC5x1y2E, 2,
  &(vtc__ZN3ccc7CC5x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y2  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD5x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y23pqrEv
  ~DD5x1y2(); // tgen
  DD5x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y23efgEv");}
void  ccc::DD5x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y23abcEv");}
void  ccc::DD5x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y23pqrEv");}
ccc::DD5x1y2 ::~DD5x1y2(){ note_dtor("_ZN3ccc7DD5x1y2E", this);} // tgen
ccc::DD5x1y2 ::DD5x1y2(){ note_ctor("_ZN3ccc7DD5x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y2E, buf);
    ::ccc::DD5x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y2E);
    dp->::ccc::DD5x1y2::~DD5x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y2E(Test__ZN3ccc7DD5x1y2E, "_ZN3ccc7DD5x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y2C1Ev();
extern void _ZN3ccc7DD5x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y2E[] = {
  NSPAIR(_ZN3ccc7DD5x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y2E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y2E[];
extern void _ZN3ccc7DD5x1y23pqrEv();
extern void _ZN3ccc7DD5x1y23efgEv();
extern void _ZN3ccc7DD5x1y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y23abcEv,_ZTv0_n12_N3ccc7DD5x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y23abcEv,_ZThn4_N3ccc7DD5x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y23pqrEv,_ZTv0_n16_N3ccc7DD5x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y23pqrEv,_ZThn4_N3ccc7DD5x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y23efgEv,_ZTv0_n20_N3ccc7DD5x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y23efgEv,_ZThn4_N3ccc7DD5x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y23abcEv,_ZTv0_n12_N3ccc7DD5x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y23pqrEv,_ZTv0_n16_N3ccc7DD5x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y23efgEv,_ZTv0_n20_N3ccc7DD5x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y2E[] = {
  {&(_ZTVN3ccc7DD5x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y2E[];
static VTBL_ENTRY alt_thunk_names2196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y23efgEv,_ZTv0_n20_N3ccc7DD5x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y23efgEv,_ZThn4_N3ccc7DD5x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y23pqrEv,_ZTv0_n16_N3ccc7DD5x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y23pqrEv,_ZThn4_N3ccc7DD5x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y23abcEv,_ZTv0_n12_N3ccc7DD5x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y23abcEv,_ZThn4_N3ccc7DD5x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y2E = {  "_ZN3ccc7DD5x1y2E", // class name
  bases__ZN3ccc7DD5x1y2E, 2,
  &(vtc__ZN3ccc7DD5x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y3  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x1y33abcEv
  ~CC5x1y3(); // tgen
  CC5x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y3E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y33efgEv");}
void  ccc::CC5x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y33pqrEv");}
void  ccc::CC5x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y33abcEv");}
ccc::CC5x1y3 ::~CC5x1y3(){ note_dtor("_ZN3ccc7CC5x1y3E", this);} // tgen
ccc::CC5x1y3 ::CC5x1y3(){ note_ctor("_ZN3ccc7CC5x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y3E, buf);
    ::ccc::CC5x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y3E);
    dp->::ccc::CC5x1y3::~CC5x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y3E(Test__ZN3ccc7CC5x1y3E, "_ZN3ccc7CC5x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y3C1Ev();
extern void _ZN3ccc7CC5x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y3E[] = {
  NSPAIR(_ZN3ccc7CC5x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y3E[];
extern void _ZN3ccc7CC5x1y33abcEv();
extern void _ZN3ccc7CC5x1y33pqrEv();
extern void _ZN3ccc7CC5x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y33pqrEv,_ZTv0_n12_N3ccc7CC5x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33pqrEv,_ZThn4_N3ccc7CC5x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y33efgEv,_ZTv0_n16_N3ccc7CC5x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33efgEv,_ZThn4_N3ccc7CC5x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y33abcEv,_ZTv0_n20_N3ccc7CC5x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33abcEv,_ZThn4_N3ccc7CC5x1y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y33pqrEv,_ZTv0_n12_N3ccc7CC5x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y33efgEv,_ZTv0_n16_N3ccc7CC5x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y33abcEv,_ZTv0_n20_N3ccc7CC5x1y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y3E[] = {
  {&(_ZTVN3ccc7CC5x1y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y3E[];
static VTBL_ENTRY alt_thunk_names2197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y33abcEv,_ZTv0_n20_N3ccc7CC5x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y33abcEv,_ZThn4_N3ccc7CC5x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y33efgEv,_ZTv0_n16_N3ccc7CC5x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y33efgEv,_ZThn4_N3ccc7CC5x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y33pqrEv,_ZTv0_n12_N3ccc7CC5x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y33pqrEv,_ZThn4_N3ccc7CC5x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y3E = {  "_ZN3ccc7CC5x1y3E", // class name
  bases__ZN3ccc7CC5x1y3E, 2,
  &(vtc__ZN3ccc7CC5x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y3  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD5x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x1y33abcEv
  ~DD5x1y3(); // tgen
  DD5x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y33efgEv");}
void  ccc::DD5x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y33pqrEv");}
void  ccc::DD5x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y33abcEv");}
ccc::DD5x1y3 ::~DD5x1y3(){ note_dtor("_ZN3ccc7DD5x1y3E", this);} // tgen
ccc::DD5x1y3 ::DD5x1y3(){ note_ctor("_ZN3ccc7DD5x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y3E, buf);
    ::ccc::DD5x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y3E);
    dp->::ccc::DD5x1y3::~DD5x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y3E(Test__ZN3ccc7DD5x1y3E, "_ZN3ccc7DD5x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y3C1Ev();
extern void _ZN3ccc7DD5x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y3E[] = {
  NSPAIR(_ZN3ccc7DD5x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y3E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y3E[];
extern void _ZN3ccc7DD5x1y33pqrEv();
extern void _ZN3ccc7DD5x1y33efgEv();
extern void _ZN3ccc7DD5x1y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y33abcEv,_ZTv0_n12_N3ccc7DD5x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y33abcEv,_ZThn4_N3ccc7DD5x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y33pqrEv,_ZTv0_n16_N3ccc7DD5x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y33pqrEv,_ZThn4_N3ccc7DD5x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y33efgEv,_ZTv0_n20_N3ccc7DD5x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y33efgEv,_ZThn4_N3ccc7DD5x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y33abcEv,_ZTv0_n12_N3ccc7DD5x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y33pqrEv,_ZTv0_n16_N3ccc7DD5x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y33efgEv,_ZTv0_n20_N3ccc7DD5x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y3E[] = {
  {&(_ZTVN3ccc7DD5x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y3E[];
static VTBL_ENTRY alt_thunk_names2198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y33efgEv,_ZTv0_n20_N3ccc7DD5x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y33efgEv,_ZThn4_N3ccc7DD5x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y33pqrEv,_ZTv0_n16_N3ccc7DD5x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y33pqrEv,_ZThn4_N3ccc7DD5x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y33abcEv,_ZTv0_n12_N3ccc7DD5x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y33abcEv,_ZThn4_N3ccc7DD5x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y3E = {  "_ZN3ccc7DD5x1y3E", // class name
  bases__ZN3ccc7DD5x1y3E, 2,
  &(vtc__ZN3ccc7DD5x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y4  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC5x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y43efgEv
  ~CC5x1y4(); // tgen
  CC5x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y4E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y43pqrEv");}
void  ccc::CC5x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y43abcEv");}
void  ccc::CC5x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y43efgEv");}
ccc::CC5x1y4 ::~CC5x1y4(){ note_dtor("_ZN3ccc7CC5x1y4E", this);} // tgen
ccc::CC5x1y4 ::CC5x1y4(){ note_ctor("_ZN3ccc7CC5x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y4E, buf);
    ::ccc::CC5x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y4E);
    dp->::ccc::CC5x1y4::~CC5x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y4E(Test__ZN3ccc7CC5x1y4E, "_ZN3ccc7CC5x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y4C1Ev();
extern void _ZN3ccc7CC5x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y4E[] = {
  NSPAIR(_ZN3ccc7CC5x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y4E[];
extern void _ZN3ccc7CC5x1y43abcEv();
extern void _ZN3ccc7CC5x1y43pqrEv();
extern void _ZN3ccc7CC5x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y43pqrEv,_ZTv0_n12_N3ccc7CC5x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43pqrEv,_ZThn4_N3ccc7CC5x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y43efgEv,_ZTv0_n16_N3ccc7CC5x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43efgEv,_ZThn4_N3ccc7CC5x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y43abcEv,_ZTv0_n20_N3ccc7CC5x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43abcEv,_ZThn4_N3ccc7CC5x1y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y43pqrEv,_ZTv0_n12_N3ccc7CC5x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y43efgEv,_ZTv0_n16_N3ccc7CC5x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y43abcEv,_ZTv0_n20_N3ccc7CC5x1y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y4E[] = {
  {&(_ZTVN3ccc7CC5x1y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y4E[];
static VTBL_ENTRY alt_thunk_names2199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y43abcEv,_ZTv0_n20_N3ccc7CC5x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y43abcEv,_ZThn4_N3ccc7CC5x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y43efgEv,_ZTv0_n16_N3ccc7CC5x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y43efgEv,_ZThn4_N3ccc7CC5x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y43pqrEv,_ZTv0_n12_N3ccc7CC5x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y43pqrEv,_ZThn4_N3ccc7CC5x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y4E = {  "_ZN3ccc7CC5x1y4E", // class name
  bases__ZN3ccc7CC5x1y4E, 2,
  &(vtc__ZN3ccc7CC5x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y4  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD5x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x1y43efgEv
  ~DD5x1y4(); // tgen
  DD5x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y43pqrEv");}
void  ccc::DD5x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y43abcEv");}
void  ccc::DD5x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y43efgEv");}
ccc::DD5x1y4 ::~DD5x1y4(){ note_dtor("_ZN3ccc7DD5x1y4E", this);} // tgen
ccc::DD5x1y4 ::DD5x1y4(){ note_ctor("_ZN3ccc7DD5x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y4E, buf);
    ::ccc::DD5x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y4E);
    dp->::ccc::DD5x1y4::~DD5x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y4E(Test__ZN3ccc7DD5x1y4E, "_ZN3ccc7DD5x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y4C1Ev();
extern void _ZN3ccc7DD5x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y4E[] = {
  NSPAIR(_ZN3ccc7DD5x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y4E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y4E[];
extern void _ZN3ccc7DD5x1y43pqrEv();
extern void _ZN3ccc7DD5x1y43efgEv();
extern void _ZN3ccc7DD5x1y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y43abcEv,_ZTv0_n12_N3ccc7DD5x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y43abcEv,_ZThn4_N3ccc7DD5x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y43pqrEv,_ZTv0_n16_N3ccc7DD5x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y43pqrEv,_ZThn4_N3ccc7DD5x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y43efgEv,_ZTv0_n20_N3ccc7DD5x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y43efgEv,_ZThn4_N3ccc7DD5x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y43abcEv,_ZTv0_n12_N3ccc7DD5x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y43pqrEv,_ZTv0_n16_N3ccc7DD5x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y43efgEv,_ZTv0_n20_N3ccc7DD5x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y4E[] = {
  {&(_ZTVN3ccc7DD5x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y4E[];
static VTBL_ENTRY alt_thunk_names2200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y43efgEv,_ZTv0_n20_N3ccc7DD5x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y43efgEv,_ZThn4_N3ccc7DD5x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y43pqrEv,_ZTv0_n16_N3ccc7DD5x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y43pqrEv,_ZThn4_N3ccc7DD5x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y43abcEv,_ZTv0_n12_N3ccc7DD5x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y43abcEv,_ZThn4_N3ccc7DD5x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y4E = {  "_ZN3ccc7DD5x1y4E", // class name
  bases__ZN3ccc7DD5x1y4E, 2,
  &(vtc__ZN3ccc7DD5x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y5  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC5x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y53abcEv
  ~CC5x1y5(); // tgen
  CC5x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y5E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y53pqrEv");}
void  ccc::CC5x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y53efgEv");}
void  ccc::CC5x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y53abcEv");}
ccc::CC5x1y5 ::~CC5x1y5(){ note_dtor("_ZN3ccc7CC5x1y5E", this);} // tgen
ccc::CC5x1y5 ::CC5x1y5(){ note_ctor("_ZN3ccc7CC5x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y5E, buf);
    ::ccc::CC5x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y5E);
    dp->::ccc::CC5x1y5::~CC5x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y5E(Test__ZN3ccc7CC5x1y5E, "_ZN3ccc7CC5x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y5C1Ev();
extern void _ZN3ccc7CC5x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y5E[] = {
  NSPAIR(_ZN3ccc7CC5x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y5E[];
extern void _ZN3ccc7CC5x1y53abcEv();
extern void _ZN3ccc7CC5x1y53pqrEv();
extern void _ZN3ccc7CC5x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y53pqrEv,_ZTv0_n12_N3ccc7CC5x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53pqrEv,_ZThn4_N3ccc7CC5x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y53efgEv,_ZTv0_n16_N3ccc7CC5x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53efgEv,_ZThn4_N3ccc7CC5x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y53abcEv,_ZTv0_n20_N3ccc7CC5x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53abcEv,_ZThn4_N3ccc7CC5x1y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y53pqrEv,_ZTv0_n12_N3ccc7CC5x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y53efgEv,_ZTv0_n16_N3ccc7CC5x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y53abcEv,_ZTv0_n20_N3ccc7CC5x1y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y5E[] = {
  {&(_ZTVN3ccc7CC5x1y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y5E[];
static VTBL_ENTRY alt_thunk_names2201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y53abcEv,_ZTv0_n20_N3ccc7CC5x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y53abcEv,_ZThn4_N3ccc7CC5x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y53efgEv,_ZTv0_n16_N3ccc7CC5x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y53efgEv,_ZThn4_N3ccc7CC5x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y53pqrEv,_ZTv0_n12_N3ccc7CC5x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y53pqrEv,_ZThn4_N3ccc7CC5x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y5E = {  "_ZN3ccc7CC5x1y5E", // class name
  bases__ZN3ccc7CC5x1y5E, 2,
  &(vtc__ZN3ccc7CC5x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y5  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD5x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x1y53abcEv
  ~DD5x1y5(); // tgen
  DD5x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y53pqrEv");}
void  ccc::DD5x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y53efgEv");}
void  ccc::DD5x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y53abcEv");}
ccc::DD5x1y5 ::~DD5x1y5(){ note_dtor("_ZN3ccc7DD5x1y5E", this);} // tgen
ccc::DD5x1y5 ::DD5x1y5(){ note_ctor("_ZN3ccc7DD5x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y5E, buf);
    ::ccc::DD5x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y5E);
    dp->::ccc::DD5x1y5::~DD5x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y5E(Test__ZN3ccc7DD5x1y5E, "_ZN3ccc7DD5x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y5C1Ev();
extern void _ZN3ccc7DD5x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y5E[] = {
  NSPAIR(_ZN3ccc7DD5x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y5E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y5E[];
extern void _ZN3ccc7DD5x1y53pqrEv();
extern void _ZN3ccc7DD5x1y53efgEv();
extern void _ZN3ccc7DD5x1y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y53abcEv,_ZTv0_n12_N3ccc7DD5x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y53abcEv,_ZThn4_N3ccc7DD5x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y53pqrEv,_ZTv0_n16_N3ccc7DD5x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y53pqrEv,_ZThn4_N3ccc7DD5x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y53efgEv,_ZTv0_n20_N3ccc7DD5x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y53efgEv,_ZThn4_N3ccc7DD5x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y53abcEv,_ZTv0_n12_N3ccc7DD5x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y53pqrEv,_ZTv0_n16_N3ccc7DD5x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y53efgEv,_ZTv0_n20_N3ccc7DD5x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y5E[] = {
  {&(_ZTVN3ccc7DD5x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y5E[];
static VTBL_ENTRY alt_thunk_names2202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y53efgEv,_ZTv0_n20_N3ccc7DD5x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y53efgEv,_ZThn4_N3ccc7DD5x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y53pqrEv,_ZTv0_n16_N3ccc7DD5x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y53pqrEv,_ZThn4_N3ccc7DD5x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y53abcEv,_ZTv0_n12_N3ccc7DD5x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y53abcEv,_ZThn4_N3ccc7DD5x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y5E = {  "_ZN3ccc7DD5x1y5E", // class name
  bases__ZN3ccc7DD5x1y5E, 2,
  &(vtc__ZN3ccc7DD5x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2202,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y6  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y63efgEv
  ~CC5x1y6(); // tgen
  CC5x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y6E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y63abcEv");}
void  ccc::CC5x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y63efgEv");}
ccc::CC5x1y6 ::~CC5x1y6(){ note_dtor("_ZN3ccc7CC5x1y6E", this);} // tgen
ccc::CC5x1y6 ::CC5x1y6(){ note_ctor("_ZN3ccc7CC5x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y6E, buf);
    ::ccc::CC5x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y6E);
    dp->::ccc::CC5x1y6::~CC5x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y6E(Test__ZN3ccc7CC5x1y6E, "_ZN3ccc7CC5x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y6C1Ev();
extern void _ZN3ccc7CC5x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y6E[] = {
  NSPAIR(_ZN3ccc7CC5x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y6E[];
extern void _ZN3ccc7CC5x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC5x1y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y63efgEv,_ZTv0_n16_N3ccc7CC5x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y63efgEv,_ZThn4_N3ccc7CC5x1y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y63abcEv,_ZTv0_n20_N3ccc7CC5x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y63abcEv,_ZThn4_N3ccc7CC5x1y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y63efgEv,_ZTv0_n16_N3ccc7CC5x1y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y63abcEv,_ZTv0_n20_N3ccc7CC5x1y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y6E[] = {
  {&(_ZTVN3ccc7CC5x1y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y6E[];
static VTBL_ENTRY alt_thunk_names2203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y63abcEv,_ZTv0_n20_N3ccc7CC5x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y63abcEv,_ZThn4_N3ccc7CC5x1y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y63efgEv,_ZTv0_n16_N3ccc7CC5x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y63efgEv,_ZThn4_N3ccc7CC5x1y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y6E = {  "_ZN3ccc7CC5x1y6E", // class name
  bases__ZN3ccc7CC5x1y6E, 2,
  &(vtc__ZN3ccc7CC5x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2203,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y6  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD5x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x1y63efgEv
  ~DD5x1y6(); // tgen
  DD5x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y63abcEv");}
void  ccc::DD5x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y63efgEv");}
ccc::DD5x1y6 ::~DD5x1y6(){ note_dtor("_ZN3ccc7DD5x1y6E", this);} // tgen
ccc::DD5x1y6 ::DD5x1y6(){ note_ctor("_ZN3ccc7DD5x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y6E, buf);
    ::ccc::DD5x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y6E);
    dp->::ccc::DD5x1y6::~DD5x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y6E(Test__ZN3ccc7DD5x1y6E, "_ZN3ccc7DD5x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y6C1Ev();
extern void _ZN3ccc7DD5x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y6E[] = {
  NSPAIR(_ZN3ccc7DD5x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y6E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x1y63efgEv();
extern void _ZN3ccc7DD5x1y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y63abcEv,_ZTv0_n12_N3ccc7DD5x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y63abcEv,_ZThn4_N3ccc7DD5x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y63efgEv,_ZTv0_n20_N3ccc7DD5x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y63efgEv,_ZThn4_N3ccc7DD5x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y63abcEv,_ZTv0_n12_N3ccc7DD5x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y63efgEv,_ZTv0_n20_N3ccc7DD5x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y6E[] = {
  {&(_ZTVN3ccc7DD5x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y6E[];
static VTBL_ENTRY alt_thunk_names2204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y63efgEv,_ZTv0_n20_N3ccc7DD5x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y63efgEv,_ZThn4_N3ccc7DD5x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y63abcEv,_ZTv0_n12_N3ccc7DD5x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y63abcEv,_ZThn4_N3ccc7DD5x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y6E = {  "_ZN3ccc7DD5x1y6E", // class name
  bases__ZN3ccc7DD5x1y6E, 2,
  &(vtc__ZN3ccc7DD5x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2204,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y7  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y73pqrEv
  ~CC5x1y7(); // tgen
  CC5x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y7E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y73abcEv");}
void  ccc::CC5x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y73pqrEv");}
ccc::CC5x1y7 ::~CC5x1y7(){ note_dtor("_ZN3ccc7CC5x1y7E", this);} // tgen
ccc::CC5x1y7 ::CC5x1y7(){ note_ctor("_ZN3ccc7CC5x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y7E, buf);
    ::ccc::CC5x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y7E);
    dp->::ccc::CC5x1y7::~CC5x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y7E(Test__ZN3ccc7CC5x1y7E, "_ZN3ccc7CC5x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y7C1Ev();
extern void _ZN3ccc7CC5x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y7E[] = {
  NSPAIR(_ZN3ccc7CC5x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y7E[];
extern void _ZN3ccc7CC5x1y73abcEv();
extern void _ZN3ccc7CC5x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y73pqrEv,_ZTv0_n12_N3ccc7CC5x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y73pqrEv,_ZThn4_N3ccc7CC5x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y73abcEv,_ZTv0_n20_N3ccc7CC5x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y73abcEv,_ZThn4_N3ccc7CC5x1y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y73pqrEv,_ZTv0_n12_N3ccc7CC5x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y73abcEv,_ZTv0_n20_N3ccc7CC5x1y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y7E[] = {
  {&(_ZTVN3ccc7CC5x1y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y7E[];
static VTBL_ENTRY alt_thunk_names2205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y73abcEv,_ZTv0_n20_N3ccc7CC5x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y73abcEv,_ZThn4_N3ccc7CC5x1y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y73pqrEv,_ZTv0_n12_N3ccc7CC5x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y73pqrEv,_ZThn4_N3ccc7CC5x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y7E = {  "_ZN3ccc7CC5x1y7E", // class name
  bases__ZN3ccc7CC5x1y7E, 2,
  &(vtc__ZN3ccc7CC5x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2205,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y7  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD5x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y73pqrEv
  ~DD5x1y7(); // tgen
  DD5x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y73abcEv");}
void  ccc::DD5x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y73pqrEv");}
ccc::DD5x1y7 ::~DD5x1y7(){ note_dtor("_ZN3ccc7DD5x1y7E", this);} // tgen
ccc::DD5x1y7 ::DD5x1y7(){ note_ctor("_ZN3ccc7DD5x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y7E, buf);
    ::ccc::DD5x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y7E);
    dp->::ccc::DD5x1y7::~DD5x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y7E(Test__ZN3ccc7DD5x1y7E, "_ZN3ccc7DD5x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y7C1Ev();
extern void _ZN3ccc7DD5x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y7E[] = {
  NSPAIR(_ZN3ccc7DD5x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y7E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y7E[];
extern void _ZN3ccc7DD5x1y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x1y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y73abcEv,_ZTv0_n12_N3ccc7DD5x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y73abcEv,_ZThn4_N3ccc7DD5x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y73pqrEv,_ZTv0_n16_N3ccc7DD5x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y73pqrEv,_ZThn4_N3ccc7DD5x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y73abcEv,_ZTv0_n12_N3ccc7DD5x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y73pqrEv,_ZTv0_n16_N3ccc7DD5x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y7E[] = {
  {&(_ZTVN3ccc7DD5x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y7E[];
static VTBL_ENTRY alt_thunk_names2206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y73pqrEv,_ZTv0_n16_N3ccc7DD5x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y73pqrEv,_ZThn4_N3ccc7DD5x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y73abcEv,_ZTv0_n12_N3ccc7DD5x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y73abcEv,_ZThn4_N3ccc7DD5x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y7E = {  "_ZN3ccc7DD5x1y7E", // class name
  bases__ZN3ccc7DD5x1y7E, 2,
  &(vtc__ZN3ccc7DD5x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y8  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y83abcEv
  ~CC5x1y8(); // tgen
  CC5x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y8E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y83efgEv");}
void  ccc::CC5x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y83abcEv");}
ccc::CC5x1y8 ::~CC5x1y8(){ note_dtor("_ZN3ccc7CC5x1y8E", this);} // tgen
ccc::CC5x1y8 ::CC5x1y8(){ note_ctor("_ZN3ccc7CC5x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y8E, buf);
    ::ccc::CC5x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y8E);
    dp->::ccc::CC5x1y8::~CC5x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y8E(Test__ZN3ccc7CC5x1y8E, "_ZN3ccc7CC5x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y8C1Ev();
extern void _ZN3ccc7CC5x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y8E[] = {
  NSPAIR(_ZN3ccc7CC5x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y8E[];
extern void _ZN3ccc7CC5x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC5x1y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y83efgEv,_ZTv0_n16_N3ccc7CC5x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y83efgEv,_ZThn4_N3ccc7CC5x1y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x1y83abcEv,_ZTv0_n20_N3ccc7CC5x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y83abcEv,_ZThn4_N3ccc7CC5x1y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y83efgEv,_ZTv0_n16_N3ccc7CC5x1y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x1y83abcEv,_ZTv0_n20_N3ccc7CC5x1y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y8E[] = {
  {&(_ZTVN3ccc7CC5x1y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y8E[];
static VTBL_ENTRY alt_thunk_names2207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x1y83abcEv,_ZTv0_n20_N3ccc7CC5x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y83abcEv,_ZThn4_N3ccc7CC5x1y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y83efgEv,_ZTv0_n16_N3ccc7CC5x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y83efgEv,_ZThn4_N3ccc7CC5x1y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y8E = {  "_ZN3ccc7CC5x1y8E", // class name
  bases__ZN3ccc7CC5x1y8E, 2,
  &(vtc__ZN3ccc7CC5x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y8  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD5x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x1y83abcEv
  ~DD5x1y8(); // tgen
  DD5x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y83efgEv");}
void  ccc::DD5x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x1y83abcEv");}
ccc::DD5x1y8 ::~DD5x1y8(){ note_dtor("_ZN3ccc7DD5x1y8E", this);} // tgen
ccc::DD5x1y8 ::DD5x1y8(){ note_ctor("_ZN3ccc7DD5x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y8E, buf);
    ::ccc::DD5x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y8E);
    dp->::ccc::DD5x1y8::~DD5x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y8E(Test__ZN3ccc7DD5x1y8E, "_ZN3ccc7DD5x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y8C1Ev();
extern void _ZN3ccc7DD5x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y8E[] = {
  NSPAIR(_ZN3ccc7DD5x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y8E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x1y83efgEv();
extern void _ZN3ccc7DD5x1y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x1y83abcEv,_ZTv0_n12_N3ccc7DD5x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y83abcEv,_ZThn4_N3ccc7DD5x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y83efgEv,_ZTv0_n20_N3ccc7DD5x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y83efgEv,_ZThn4_N3ccc7DD5x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x1y83abcEv,_ZTv0_n12_N3ccc7DD5x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y83efgEv,_ZTv0_n20_N3ccc7DD5x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y8E[] = {
  {&(_ZTVN3ccc7DD5x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y8E[];
static VTBL_ENTRY alt_thunk_names2208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y83efgEv,_ZTv0_n20_N3ccc7DD5x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y83efgEv,_ZThn4_N3ccc7DD5x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x1y83abcEv,_ZTv0_n12_N3ccc7DD5x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y83abcEv,_ZThn4_N3ccc7DD5x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y8E = {  "_ZN3ccc7DD5x1y8E", // class name
  bases__ZN3ccc7DD5x1y8E, 2,
  &(vtc__ZN3ccc7DD5x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y9  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y93pqrEv
  ~CC5x1y9(); // tgen
  CC5x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y9E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y93efgEv");}
void  ccc::CC5x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y93pqrEv");}
ccc::CC5x1y9 ::~CC5x1y9(){ note_dtor("_ZN3ccc7CC5x1y9E", this);} // tgen
ccc::CC5x1y9 ::CC5x1y9(){ note_ctor("_ZN3ccc7CC5x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y9E, buf);
    ::ccc::CC5x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC5x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y9E);
    dp->::ccc::CC5x1y9::~CC5x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y9E(Test__ZN3ccc7CC5x1y9E, "_ZN3ccc7CC5x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y9C1Ev();
extern void _ZN3ccc7CC5x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y9E[] = {
  NSPAIR(_ZN3ccc7CC5x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC5x1y93pqrEv();
extern void _ZN3ccc7CC5x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x1y93pqrEv,_ZTv0_n12_N3ccc7CC5x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y93pqrEv,_ZThn4_N3ccc7CC5x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x1y93efgEv,_ZTv0_n16_N3ccc7CC5x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y93efgEv,_ZThn4_N3ccc7CC5x1y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x1y93pqrEv,_ZTv0_n12_N3ccc7CC5x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x1y93efgEv,_ZTv0_n16_N3ccc7CC5x1y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x1y9E[] = {
  {&(_ZTVN3ccc7CC5x1y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x1y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x1y9E[];
static VTBL_ENTRY alt_thunk_names2209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x1y93efgEv,_ZTv0_n16_N3ccc7CC5x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y93efgEv,_ZThn4_N3ccc7CC5x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x1y93pqrEv,_ZTv0_n12_N3ccc7CC5x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x1y93pqrEv,_ZThn4_N3ccc7CC5x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x1y9E = {  "_ZN3ccc7CC5x1y9E", // class name
  bases__ZN3ccc7CC5x1y9E, 2,
  &(vtc__ZN3ccc7CC5x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x1y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y9  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD5x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x1y93pqrEv
  ~DD5x1y9(); // tgen
  DD5x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x1y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x1y93efgEv");}
void  ccc::DD5x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x1y93pqrEv");}
ccc::DD5x1y9 ::~DD5x1y9(){ note_dtor("_ZN3ccc7DD5x1y9E", this);} // tgen
ccc::DD5x1y9 ::DD5x1y9(){ note_ctor("_ZN3ccc7DD5x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x1y9E, buf);
    ::ccc::DD5x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x1y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD5x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x1y9E);
    dp->::ccc::DD5x1y9::~DD5x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x1y9E(Test__ZN3ccc7DD5x1y9E, "_ZN3ccc7DD5x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x1y9C1Ev();
extern void _ZN3ccc7DD5x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x1y9E[] = {
  NSPAIR(_ZN3ccc7DD5x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD5x1y9E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y9E[];
extern void _ZN3ccc7DD5x1y93pqrEv();
extern void _ZN3ccc7DD5x1y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x1y93pqrEv,_ZTv0_n16_N3ccc7DD5x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y93pqrEv,_ZThn4_N3ccc7DD5x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x1y93efgEv,_ZTv0_n20_N3ccc7DD5x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x1y93efgEv,_ZThn4_N3ccc7DD5x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x1y93pqrEv,_ZTv0_n16_N3ccc7DD5x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x1y93efgEv,_ZTv0_n20_N3ccc7DD5x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x1y9E[] = {
  {&(_ZTVN3ccc7DD5x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x1y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x1y9E[];
static VTBL_ENTRY alt_thunk_names2210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x1y93efgEv,_ZTv0_n20_N3ccc7DD5x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y93efgEv,_ZThn4_N3ccc7DD5x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x1y93pqrEv,_ZTv0_n16_N3ccc7DD5x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x1y93pqrEv,_ZThn4_N3ccc7DD5x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x1y9E = {  "_ZN3ccc7DD5x1y9E", // class name
  bases__ZN3ccc7DD5x1y9E, 2,
  &(vtc__ZN3ccc7DD5x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x1y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x1y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y10  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x1y103abcEv
  ~CC5x1y10(); // tgen
  CC5x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y10E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y103pqrEv");}
void  ccc::CC5x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x1y103abcEv");}
ccc::CC5x1y10 ::~CC5x1y10(){ note_dtor("_ZN3ccc8CC5x1y10E", this);} // tgen
ccc::CC5x1y10 ::CC5x1y10(){ note_ctor("_ZN3ccc8CC5x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y10E, buf);
    ::ccc::CC5x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y10E);
    dp->::ccc::CC5x1y10::~CC5x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y10E(Test__ZN3ccc8CC5x1y10E, "_ZN3ccc8CC5x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y10C1Ev();
extern void _ZN3ccc8CC5x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y10E[] = {
  NSPAIR(_ZN3ccc8CC5x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y10E[];
extern void _ZN3ccc8CC5x1y103abcEv();
extern void _ZN3ccc8CC5x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x1y103pqrEv,_ZTv0_n12_N3ccc8CC5x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y103pqrEv,_ZThn4_N3ccc8CC5x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x1y103abcEv,_ZTv0_n20_N3ccc8CC5x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y103abcEv,_ZThn4_N3ccc8CC5x1y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x1y103pqrEv,_ZTv0_n12_N3ccc8CC5x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x1y103abcEv,_ZTv0_n20_N3ccc8CC5x1y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y10E[] = {
  {&(_ZTVN3ccc8CC5x1y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y10E[];
static VTBL_ENTRY alt_thunk_names2211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x1y103abcEv,_ZTv0_n20_N3ccc8CC5x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y103abcEv,_ZThn4_N3ccc8CC5x1y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x1y103pqrEv,_ZTv0_n12_N3ccc8CC5x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y103pqrEv,_ZThn4_N3ccc8CC5x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x1y10E = {  "_ZN3ccc8CC5x1y10E", // class name
  bases__ZN3ccc8CC5x1y10E, 2,
  &(vtc__ZN3ccc8CC5x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y10  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD5x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x1y103abcEv
  ~DD5x1y10(); // tgen
  DD5x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x1y103pqrEv");}
void  ccc::DD5x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x1y103abcEv");}
ccc::DD5x1y10 ::~DD5x1y10(){ note_dtor("_ZN3ccc8DD5x1y10E", this);} // tgen
ccc::DD5x1y10 ::DD5x1y10(){ note_ctor("_ZN3ccc8DD5x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y10E, buf);
    ::ccc::DD5x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y10E);
    dp->::ccc::DD5x1y10::~DD5x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y10E(Test__ZN3ccc8DD5x1y10E, "_ZN3ccc8DD5x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y10C1Ev();
extern void _ZN3ccc8DD5x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y10E[] = {
  NSPAIR(_ZN3ccc8DD5x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y10E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y10E[];
extern void _ZN3ccc8DD5x1y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x1y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x1y103abcEv,_ZTv0_n12_N3ccc8DD5x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y103abcEv,_ZThn4_N3ccc8DD5x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x1y103pqrEv,_ZTv0_n16_N3ccc8DD5x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y103pqrEv,_ZThn4_N3ccc8DD5x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x1y103abcEv,_ZTv0_n12_N3ccc8DD5x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x1y103pqrEv,_ZTv0_n16_N3ccc8DD5x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y10E[] = {
  {&(_ZTVN3ccc8DD5x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y10E[];
static VTBL_ENTRY alt_thunk_names2212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x1y103pqrEv,_ZTv0_n16_N3ccc8DD5x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y103pqrEv,_ZThn4_N3ccc8DD5x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x1y103abcEv,_ZTv0_n12_N3ccc8DD5x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y103abcEv,_ZThn4_N3ccc8DD5x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x1y10E = {  "_ZN3ccc8DD5x1y10E", // class name
  bases__ZN3ccc8DD5x1y10E, 2,
  &(vtc__ZN3ccc8DD5x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y11  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x1y113efgEv
  ~CC5x1y11(); // tgen
  CC5x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y11E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y113pqrEv");}
void  ccc::CC5x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x1y113efgEv");}
ccc::CC5x1y11 ::~CC5x1y11(){ note_dtor("_ZN3ccc8CC5x1y11E", this);} // tgen
ccc::CC5x1y11 ::CC5x1y11(){ note_ctor("_ZN3ccc8CC5x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y11E, buf);
    ::ccc::CC5x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y11E);
    dp->::ccc::CC5x1y11::~CC5x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y11E(Test__ZN3ccc8CC5x1y11E, "_ZN3ccc8CC5x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y11C1Ev();
extern void _ZN3ccc8CC5x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y11E[] = {
  NSPAIR(_ZN3ccc8CC5x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC5x1y113pqrEv();
extern void _ZN3ccc8CC5x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x1y113pqrEv,_ZTv0_n12_N3ccc8CC5x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y113pqrEv,_ZThn4_N3ccc8CC5x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x1y113efgEv,_ZTv0_n16_N3ccc8CC5x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y113efgEv,_ZThn4_N3ccc8CC5x1y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x1y113pqrEv,_ZTv0_n12_N3ccc8CC5x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x1y113efgEv,_ZTv0_n16_N3ccc8CC5x1y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y11E[] = {
  {&(_ZTVN3ccc8CC5x1y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y11E[];
static VTBL_ENTRY alt_thunk_names2213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x1y113efgEv,_ZTv0_n16_N3ccc8CC5x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y113efgEv,_ZThn4_N3ccc8CC5x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x1y113pqrEv,_ZTv0_n12_N3ccc8CC5x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y113pqrEv,_ZThn4_N3ccc8CC5x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x1y11E = {  "_ZN3ccc8CC5x1y11E", // class name
  bases__ZN3ccc8CC5x1y11E, 2,
  &(vtc__ZN3ccc8CC5x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y11  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD5x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x1y113efgEv
  ~DD5x1y11(); // tgen
  DD5x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x1y113pqrEv");}
void  ccc::DD5x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x1y113efgEv");}
ccc::DD5x1y11 ::~DD5x1y11(){ note_dtor("_ZN3ccc8DD5x1y11E", this);} // tgen
ccc::DD5x1y11 ::DD5x1y11(){ note_ctor("_ZN3ccc8DD5x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y11E, buf);
    ::ccc::DD5x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y11E);
    dp->::ccc::DD5x1y11::~DD5x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y11E(Test__ZN3ccc8DD5x1y11E, "_ZN3ccc8DD5x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y11C1Ev();
extern void _ZN3ccc8DD5x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y11E[] = {
  NSPAIR(_ZN3ccc8DD5x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y11E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y11E[];
extern void _ZN3ccc8DD5x1y113pqrEv();
extern void _ZN3ccc8DD5x1y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x1y113pqrEv,_ZTv0_n16_N3ccc8DD5x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y113pqrEv,_ZThn4_N3ccc8DD5x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x1y113efgEv,_ZTv0_n20_N3ccc8DD5x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y113efgEv,_ZThn4_N3ccc8DD5x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x1y113pqrEv,_ZTv0_n16_N3ccc8DD5x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x1y113efgEv,_ZTv0_n20_N3ccc8DD5x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y11E[] = {
  {&(_ZTVN3ccc8DD5x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y11E[];
static VTBL_ENTRY alt_thunk_names2214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x1y113efgEv,_ZTv0_n20_N3ccc8DD5x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y113efgEv,_ZThn4_N3ccc8DD5x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x1y113pqrEv,_ZTv0_n16_N3ccc8DD5x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y113pqrEv,_ZThn4_N3ccc8DD5x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x1y11E = {  "_ZN3ccc8DD5x1y11E", // class name
  bases__ZN3ccc8DD5x1y11E, 2,
  &(vtc__ZN3ccc8DD5x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y12  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC5x1y123abcEv
  ~CC5x1y12(); // tgen
  CC5x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x1y123abcEv");}
ccc::CC5x1y12 ::~CC5x1y12(){ note_dtor("_ZN3ccc8CC5x1y12E", this);} // tgen
ccc::CC5x1y12 ::CC5x1y12(){ note_ctor("_ZN3ccc8CC5x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y12E, buf);
    ::ccc::CC5x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y12E);
    dp->::ccc::CC5x1y12::~CC5x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y12E(Test__ZN3ccc8CC5x1y12E, "_ZN3ccc8CC5x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y12C1Ev();
extern void _ZN3ccc8CC5x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y12E[] = {
  NSPAIR(_ZN3ccc8CC5x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y12E[];
extern void _ZN3ccc8CC5x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x1y123abcEv,_ZTv0_n20_N3ccc8CC5x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y123abcEv,_ZThn4_N3ccc8CC5x1y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x1y123abcEv,_ZTv0_n20_N3ccc8CC5x1y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y12E[] = {
  {&(_ZTVN3ccc8CC5x1y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y12E[];
static VTBL_ENTRY alt_thunk_names2215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x1y123abcEv,_ZTv0_n20_N3ccc8CC5x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y123abcEv,_ZThn4_N3ccc8CC5x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x1y12E = {  "_ZN3ccc8CC5x1y12E", // class name
  bases__ZN3ccc8CC5x1y12E, 2,
  &(vtc__ZN3ccc8CC5x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y12  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD5x1y123abcEv
  ~DD5x1y12(); // tgen
  DD5x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x1y123abcEv");}
ccc::DD5x1y12 ::~DD5x1y12(){ note_dtor("_ZN3ccc8DD5x1y12E", this);} // tgen
ccc::DD5x1y12 ::DD5x1y12(){ note_ctor("_ZN3ccc8DD5x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y12E, buf);
    ::ccc::DD5x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y12E);
    dp->::ccc::DD5x1y12::~DD5x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y12E(Test__ZN3ccc8DD5x1y12E, "_ZN3ccc8DD5x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y12C1Ev();
extern void _ZN3ccc8DD5x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y12E[] = {
  NSPAIR(_ZN3ccc8DD5x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y12E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x1y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x1y123abcEv,_ZTv0_n12_N3ccc8DD5x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y123abcEv,_ZThn4_N3ccc8DD5x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x1y123abcEv,_ZTv0_n12_N3ccc8DD5x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y12E[] = {
  {&(_ZTVN3ccc8DD5x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y12E[];
static VTBL_ENTRY alt_thunk_names2216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x1y123abcEv,_ZTv0_n12_N3ccc8DD5x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y123abcEv,_ZThn4_N3ccc8DD5x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x1y12E = {  "_ZN3ccc8DD5x1y12E", // class name
  bases__ZN3ccc8DD5x1y12E, 2,
  &(vtc__ZN3ccc8DD5x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y13  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC5x1y133efgEv
  ~CC5x1y13(); // tgen
  CC5x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x1y133efgEv");}
ccc::CC5x1y13 ::~CC5x1y13(){ note_dtor("_ZN3ccc8CC5x1y13E", this);} // tgen
ccc::CC5x1y13 ::CC5x1y13(){ note_ctor("_ZN3ccc8CC5x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y13E, buf);
    ::ccc::CC5x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y13E);
    dp->::ccc::CC5x1y13::~CC5x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y13E(Test__ZN3ccc8CC5x1y13E, "_ZN3ccc8CC5x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y13C1Ev();
extern void _ZN3ccc8CC5x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y13E[] = {
  NSPAIR(_ZN3ccc8CC5x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC5x1y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x1y133efgEv,_ZTv0_n16_N3ccc8CC5x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y133efgEv,_ZThn4_N3ccc8CC5x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x1y133efgEv,_ZTv0_n16_N3ccc8CC5x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y13E[] = {
  {&(_ZTVN3ccc8CC5x1y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y13E[];
static VTBL_ENTRY alt_thunk_names2217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x1y133efgEv,_ZTv0_n16_N3ccc8CC5x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y133efgEv,_ZThn4_N3ccc8CC5x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x1y13E = {  "_ZN3ccc8CC5x1y13E", // class name
  bases__ZN3ccc8CC5x1y13E, 2,
  &(vtc__ZN3ccc8CC5x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y13  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD5x1y133efgEv
  ~DD5x1y13(); // tgen
  DD5x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x1y133efgEv");}
ccc::DD5x1y13 ::~DD5x1y13(){ note_dtor("_ZN3ccc8DD5x1y13E", this);} // tgen
ccc::DD5x1y13 ::DD5x1y13(){ note_ctor("_ZN3ccc8DD5x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y13E, buf);
    ::ccc::DD5x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y13E);
    dp->::ccc::DD5x1y13::~DD5x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y13E(Test__ZN3ccc8DD5x1y13E, "_ZN3ccc8DD5x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y13C1Ev();
extern void _ZN3ccc8DD5x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y13E[] = {
  NSPAIR(_ZN3ccc8DD5x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y13E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x1y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x1y133efgEv,_ZTv0_n20_N3ccc8DD5x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y133efgEv,_ZThn4_N3ccc8DD5x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x1y133efgEv,_ZTv0_n20_N3ccc8DD5x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y13E[] = {
  {&(_ZTVN3ccc8DD5x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y13E[];
static VTBL_ENTRY alt_thunk_names2218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x1y133efgEv,_ZTv0_n20_N3ccc8DD5x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y133efgEv,_ZThn4_N3ccc8DD5x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x1y13E = {  "_ZN3ccc8DD5x1y13E", // class name
  bases__ZN3ccc8DD5x1y13E, 2,
  &(vtc__ZN3ccc8DD5x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y14  : virtual ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y143pqrEv
  ~CC5x1y14(); // tgen
  CC5x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y143pqrEv");}
ccc::CC5x1y14 ::~CC5x1y14(){ note_dtor("_ZN3ccc8CC5x1y14E", this);} // tgen
ccc::CC5x1y14 ::CC5x1y14(){ note_ctor("_ZN3ccc8CC5x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y14E, buf);
    ::ccc::CC5x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y14E);
    dp->::ccc::CC5x1y14::~CC5x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y14E(Test__ZN3ccc8CC5x1y14E, "_ZN3ccc8CC5x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y14C1Ev();
extern void _ZN3ccc8CC5x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y14E[] = {
  NSPAIR(_ZN3ccc8CC5x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC5x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x1y143pqrEv,_ZTv0_n12_N3ccc8CC5x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y143pqrEv,_ZThn4_N3ccc8CC5x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x1y143pqrEv,_ZTv0_n12_N3ccc8CC5x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y14E[] = {
  {&(_ZTVN3ccc8CC5x1y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y14E[];
static VTBL_ENTRY alt_thunk_names2219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x1y143pqrEv,_ZTv0_n12_N3ccc8CC5x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x1y143pqrEv,_ZThn4_N3ccc8CC5x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x1y14E = {  "_ZN3ccc8CC5x1y14E", // class name
  bases__ZN3ccc8CC5x1y14E, 2,
  &(vtc__ZN3ccc8CC5x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y14  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD5x1y143pqrEv
  ~DD5x1y14(); // tgen
  DD5x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x1y143pqrEv");}
ccc::DD5x1y14 ::~DD5x1y14(){ note_dtor("_ZN3ccc8DD5x1y14E", this);} // tgen
ccc::DD5x1y14 ::DD5x1y14(){ note_ctor("_ZN3ccc8DD5x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y14E, buf);
    ::ccc::DD5x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y14E);
    dp->::ccc::DD5x1y14::~DD5x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y14E(Test__ZN3ccc8DD5x1y14E, "_ZN3ccc8DD5x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y14C1Ev();
extern void _ZN3ccc8DD5x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y14E[] = {
  NSPAIR(_ZN3ccc8DD5x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y14E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y14E[];
extern void _ZN3ccc8DD5x1y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x1y143pqrEv,_ZTv0_n16_N3ccc8DD5x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x1y143pqrEv,_ZThn4_N3ccc8DD5x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x1y143pqrEv,_ZTv0_n16_N3ccc8DD5x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y14E[] = {
  {&(_ZTVN3ccc8DD5x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y14E[];
static VTBL_ENTRY alt_thunk_names2220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x1y143pqrEv,_ZTv0_n16_N3ccc8DD5x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x1y143pqrEv,_ZThn4_N3ccc8DD5x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x1y14E = {  "_ZN3ccc8DD5x1y14E", // class name
  bases__ZN3ccc8DD5x1y14E, 2,
  &(vtc__ZN3ccc8DD5x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y15  : virtual ::ccc::AA5 , ::ccc::BB1 {
  ~CC5x1y15(); // tgen
  CC5x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x1y15 ::~CC5x1y15(){ note_dtor("_ZN3ccc8CC5x1y15E", this);} // tgen
ccc::CC5x1y15 ::CC5x1y15(){ note_ctor("_ZN3ccc8CC5x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y15E, buf);
    ::ccc::CC5x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC5x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y15E);
    dp->::ccc::CC5x1y15::~CC5x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y15E(Test__ZN3ccc8CC5x1y15E, "_ZN3ccc8CC5x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y15C1Ev();
extern void _ZN3ccc8CC5x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y15E[] = {
  NSPAIR(_ZN3ccc8CC5x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x1y15E[] = {
  {&(_ZTVN3ccc8CC5x1y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x1y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x1y15E[];
Class_Descriptor cd__ZN3ccc8CC5x1y15E = {  "_ZN3ccc8CC5x1y15E", // class name
  bases__ZN3ccc8CC5x1y15E, 2,
  &(vtc__ZN3ccc8CC5x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x1y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x1y15  : virtual ::ccc::AA5 , virtual ::ccc::BB1 {
  ~DD5x1y15(); // tgen
  DD5x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x1y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x1y15 ::~DD5x1y15(){ note_dtor("_ZN3ccc8DD5x1y15E", this);} // tgen
ccc::DD5x1y15 ::DD5x1y15(){ note_ctor("_ZN3ccc8DD5x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x1y15E, buf);
    ::ccc::DD5x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x1y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD5x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x1y15E);
    dp->::ccc::DD5x1y15::~DD5x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x1y15E(Test__ZN3ccc8DD5x1y15E, "_ZN3ccc8DD5x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x1y15C1Ev();
extern void _ZN3ccc8DD5x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x1y15E[] = {
  NSPAIR(_ZN3ccc8DD5x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD5x1y15E[] = {
  // 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},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x1y15E[] = {
  {&(_ZTVN3ccc8DD5x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x1y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x1y15E[];
Class_Descriptor cd__ZN3ccc8DD5x1y15E = {  "_ZN3ccc8DD5x1y15E", // class name
  bases__ZN3ccc8DD5x1y15E, 2,
  &(vtc__ZN3ccc8DD5x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x1y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x1y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y0  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y03pqrEv
  ~CC5x2y0(); // tgen
  CC5x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y0E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y03abcEv");}
void  ccc::CC5x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y03efgEv");}
void  ccc::CC5x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y03pqrEv");}
ccc::CC5x2y0 ::~CC5x2y0(){ note_dtor("_ZN3ccc7CC5x2y0E", this);} // tgen
ccc::CC5x2y0 ::CC5x2y0(){ note_ctor("_ZN3ccc7CC5x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y0E, buf);
    ::ccc::CC5x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y0E);
    dp->::ccc::CC5x2y0::~CC5x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y0E(Test__ZN3ccc7CC5x2y0E, "_ZN3ccc7CC5x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y0C1Ev();
extern void _ZN3ccc7CC5x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y0E[] = {
  NSPAIR(_ZN3ccc7CC5x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y0E[];
extern void _ZN3ccc7CC5x2y03efgEv();
extern void _ZN3ccc7CC5x2y03abcEv();
extern void _ZN3ccc7CC5x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y03pqrEv,_ZTv0_n12_N3ccc7CC5x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03pqrEv,_ZThn4_N3ccc7CC5x2y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y03efgEv,_ZTv0_n16_N3ccc7CC5x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03efgEv,_ZThn4_N3ccc7CC5x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y03abcEv,_ZTv0_n20_N3ccc7CC5x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03abcEv,_ZThn4_N3ccc7CC5x2y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y03pqrEv,_ZTv0_n12_N3ccc7CC5x2y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y03efgEv,_ZTv0_n16_N3ccc7CC5x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y03abcEv,_ZTv0_n20_N3ccc7CC5x2y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y0E[] = {
  {&(_ZTVN3ccc7CC5x2y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y0E[];
static VTBL_ENTRY alt_thunk_names2221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y03abcEv,_ZTv0_n20_N3ccc7CC5x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y03abcEv,_ZThn4_N3ccc7CC5x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y03efgEv,_ZTv0_n16_N3ccc7CC5x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y03efgEv,_ZThn4_N3ccc7CC5x2y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y03pqrEv,_ZTv0_n12_N3ccc7CC5x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y03pqrEv,_ZThn4_N3ccc7CC5x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y0E = {  "_ZN3ccc7CC5x2y0E", // class name
  bases__ZN3ccc7CC5x2y0E, 2,
  &(vtc__ZN3ccc7CC5x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y0  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD5x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y03pqrEv
  ~DD5x2y0(); // tgen
  DD5x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y03abcEv");}
void  ccc::DD5x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y03efgEv");}
void  ccc::DD5x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y03pqrEv");}
ccc::DD5x2y0 ::~DD5x2y0(){ note_dtor("_ZN3ccc7DD5x2y0E", this);} // tgen
ccc::DD5x2y0 ::DD5x2y0(){ note_ctor("_ZN3ccc7DD5x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y0E, buf);
    ::ccc::DD5x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y0E);
    dp->::ccc::DD5x2y0::~DD5x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y0E(Test__ZN3ccc7DD5x2y0E, "_ZN3ccc7DD5x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y0C1Ev();
extern void _ZN3ccc7DD5x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y0E[] = {
  NSPAIR(_ZN3ccc7DD5x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y0E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y0E[];
extern void _ZN3ccc7DD5x2y03pqrEv();
extern void _ZN3ccc7DD5x2y03efgEv();
extern void _ZN3ccc7DD5x2y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y03efgEv,_ZTv0_n12_N3ccc7DD5x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y03efgEv,_ZThn4_N3ccc7DD5x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y03abcEv,_ZTv0_n16_N3ccc7DD5x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y03abcEv,_ZThn4_N3ccc7DD5x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y03pqrEv,_ZTv0_n20_N3ccc7DD5x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y03pqrEv,_ZThn4_N3ccc7DD5x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y03efgEv,_ZTv0_n12_N3ccc7DD5x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y03abcEv,_ZTv0_n16_N3ccc7DD5x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y03pqrEv,_ZTv0_n20_N3ccc7DD5x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y0E[] = {
  {&(_ZTVN3ccc7DD5x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y0E[];
static VTBL_ENTRY alt_thunk_names2222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y03pqrEv,_ZTv0_n20_N3ccc7DD5x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y03pqrEv,_ZThn4_N3ccc7DD5x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y03abcEv,_ZTv0_n16_N3ccc7DD5x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y03abcEv,_ZThn4_N3ccc7DD5x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y03efgEv,_ZTv0_n12_N3ccc7DD5x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y03efgEv,_ZThn4_N3ccc7DD5x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y0E = {  "_ZN3ccc7DD5x2y0E", // class name
  bases__ZN3ccc7DD5x2y0E, 2,
  &(vtc__ZN3ccc7DD5x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y1  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x2y13efgEv
  ~CC5x2y1(); // tgen
  CC5x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y1E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y13abcEv");}
void  ccc::CC5x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y13pqrEv");}
void  ccc::CC5x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y13efgEv");}
ccc::CC5x2y1 ::~CC5x2y1(){ note_dtor("_ZN3ccc7CC5x2y1E", this);} // tgen
ccc::CC5x2y1 ::CC5x2y1(){ note_ctor("_ZN3ccc7CC5x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y1E, buf);
    ::ccc::CC5x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y1E);
    dp->::ccc::CC5x2y1::~CC5x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y1E(Test__ZN3ccc7CC5x2y1E, "_ZN3ccc7CC5x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y1C1Ev();
extern void _ZN3ccc7CC5x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y1E[] = {
  NSPAIR(_ZN3ccc7CC5x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y1E[];
extern void _ZN3ccc7CC5x2y13efgEv();
extern void _ZN3ccc7CC5x2y13abcEv();
extern void _ZN3ccc7CC5x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y13pqrEv,_ZTv0_n12_N3ccc7CC5x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13pqrEv,_ZThn4_N3ccc7CC5x2y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y13efgEv,_ZTv0_n16_N3ccc7CC5x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13efgEv,_ZThn4_N3ccc7CC5x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y13abcEv,_ZTv0_n20_N3ccc7CC5x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13abcEv,_ZThn4_N3ccc7CC5x2y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y13pqrEv,_ZTv0_n12_N3ccc7CC5x2y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y13efgEv,_ZTv0_n16_N3ccc7CC5x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y13abcEv,_ZTv0_n20_N3ccc7CC5x2y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y1E[] = {
  {&(_ZTVN3ccc7CC5x2y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y1E[];
static VTBL_ENTRY alt_thunk_names2223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y13abcEv,_ZTv0_n20_N3ccc7CC5x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y13abcEv,_ZThn4_N3ccc7CC5x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y13efgEv,_ZTv0_n16_N3ccc7CC5x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y13efgEv,_ZThn4_N3ccc7CC5x2y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y13pqrEv,_ZTv0_n12_N3ccc7CC5x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y13pqrEv,_ZThn4_N3ccc7CC5x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y1E = {  "_ZN3ccc7CC5x2y1E", // class name
  bases__ZN3ccc7CC5x2y1E, 2,
  &(vtc__ZN3ccc7CC5x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y1  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD5x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x2y13efgEv
  ~DD5x2y1(); // tgen
  DD5x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y13abcEv");}
void  ccc::DD5x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y13pqrEv");}
void  ccc::DD5x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y13efgEv");}
ccc::DD5x2y1 ::~DD5x2y1(){ note_dtor("_ZN3ccc7DD5x2y1E", this);} // tgen
ccc::DD5x2y1 ::DD5x2y1(){ note_ctor("_ZN3ccc7DD5x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y1E, buf);
    ::ccc::DD5x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y1E);
    dp->::ccc::DD5x2y1::~DD5x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y1E(Test__ZN3ccc7DD5x2y1E, "_ZN3ccc7DD5x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y1C1Ev();
extern void _ZN3ccc7DD5x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y1E[] = {
  NSPAIR(_ZN3ccc7DD5x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y1E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y1E[];
extern void _ZN3ccc7DD5x2y13pqrEv();
extern void _ZN3ccc7DD5x2y13efgEv();
extern void _ZN3ccc7DD5x2y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y13efgEv,_ZTv0_n12_N3ccc7DD5x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y13efgEv,_ZThn4_N3ccc7DD5x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y13abcEv,_ZTv0_n16_N3ccc7DD5x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y13abcEv,_ZThn4_N3ccc7DD5x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y13pqrEv,_ZTv0_n20_N3ccc7DD5x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y13pqrEv,_ZThn4_N3ccc7DD5x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y13efgEv,_ZTv0_n12_N3ccc7DD5x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y13abcEv,_ZTv0_n16_N3ccc7DD5x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y13pqrEv,_ZTv0_n20_N3ccc7DD5x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y1E[] = {
  {&(_ZTVN3ccc7DD5x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y1E[];
static VTBL_ENTRY alt_thunk_names2224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y13pqrEv,_ZTv0_n20_N3ccc7DD5x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y13pqrEv,_ZThn4_N3ccc7DD5x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y13abcEv,_ZTv0_n16_N3ccc7DD5x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y13abcEv,_ZThn4_N3ccc7DD5x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y13efgEv,_ZTv0_n12_N3ccc7DD5x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y13efgEv,_ZThn4_N3ccc7DD5x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y1E = {  "_ZN3ccc7DD5x2y1E", // class name
  bases__ZN3ccc7DD5x2y1E, 2,
  &(vtc__ZN3ccc7DD5x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y2  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y23pqrEv
  ~CC5x2y2(); // tgen
  CC5x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y2E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y23efgEv");}
void  ccc::CC5x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y23abcEv");}
void  ccc::CC5x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y23pqrEv");}
ccc::CC5x2y2 ::~CC5x2y2(){ note_dtor("_ZN3ccc7CC5x2y2E", this);} // tgen
ccc::CC5x2y2 ::CC5x2y2(){ note_ctor("_ZN3ccc7CC5x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y2E, buf);
    ::ccc::CC5x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y2E);
    dp->::ccc::CC5x2y2::~CC5x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y2E(Test__ZN3ccc7CC5x2y2E, "_ZN3ccc7CC5x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y2C1Ev();
extern void _ZN3ccc7CC5x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y2E[] = {
  NSPAIR(_ZN3ccc7CC5x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y2E[];
extern void _ZN3ccc7CC5x2y23efgEv();
extern void _ZN3ccc7CC5x2y23abcEv();
extern void _ZN3ccc7CC5x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y23pqrEv,_ZTv0_n12_N3ccc7CC5x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23pqrEv,_ZThn4_N3ccc7CC5x2y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y23efgEv,_ZTv0_n16_N3ccc7CC5x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23efgEv,_ZThn4_N3ccc7CC5x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y23abcEv,_ZTv0_n20_N3ccc7CC5x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23abcEv,_ZThn4_N3ccc7CC5x2y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y23pqrEv,_ZTv0_n12_N3ccc7CC5x2y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y23efgEv,_ZTv0_n16_N3ccc7CC5x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y23abcEv,_ZTv0_n20_N3ccc7CC5x2y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y2E[] = {
  {&(_ZTVN3ccc7CC5x2y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y2E[];
static VTBL_ENTRY alt_thunk_names2225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y23abcEv,_ZTv0_n20_N3ccc7CC5x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y23abcEv,_ZThn4_N3ccc7CC5x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y23efgEv,_ZTv0_n16_N3ccc7CC5x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y23efgEv,_ZThn4_N3ccc7CC5x2y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y23pqrEv,_ZTv0_n12_N3ccc7CC5x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y23pqrEv,_ZThn4_N3ccc7CC5x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y2E = {  "_ZN3ccc7CC5x2y2E", // class name
  bases__ZN3ccc7CC5x2y2E, 2,
  &(vtc__ZN3ccc7CC5x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y2  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD5x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y23pqrEv
  ~DD5x2y2(); // tgen
  DD5x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y23efgEv");}
void  ccc::DD5x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y23abcEv");}
void  ccc::DD5x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y23pqrEv");}
ccc::DD5x2y2 ::~DD5x2y2(){ note_dtor("_ZN3ccc7DD5x2y2E", this);} // tgen
ccc::DD5x2y2 ::DD5x2y2(){ note_ctor("_ZN3ccc7DD5x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y2E, buf);
    ::ccc::DD5x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y2E);
    dp->::ccc::DD5x2y2::~DD5x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y2E(Test__ZN3ccc7DD5x2y2E, "_ZN3ccc7DD5x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y2C1Ev();
extern void _ZN3ccc7DD5x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y2E[] = {
  NSPAIR(_ZN3ccc7DD5x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y2E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y2E[];
extern void _ZN3ccc7DD5x2y23pqrEv();
extern void _ZN3ccc7DD5x2y23efgEv();
extern void _ZN3ccc7DD5x2y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y23efgEv,_ZTv0_n12_N3ccc7DD5x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y23efgEv,_ZThn4_N3ccc7DD5x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y23abcEv,_ZTv0_n16_N3ccc7DD5x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y23abcEv,_ZThn4_N3ccc7DD5x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y23pqrEv,_ZTv0_n20_N3ccc7DD5x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y23pqrEv,_ZThn4_N3ccc7DD5x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y23efgEv,_ZTv0_n12_N3ccc7DD5x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y23abcEv,_ZTv0_n16_N3ccc7DD5x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y23pqrEv,_ZTv0_n20_N3ccc7DD5x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y2E[] = {
  {&(_ZTVN3ccc7DD5x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y2E[];
static VTBL_ENTRY alt_thunk_names2226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y23pqrEv,_ZTv0_n20_N3ccc7DD5x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y23pqrEv,_ZThn4_N3ccc7DD5x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y23abcEv,_ZTv0_n16_N3ccc7DD5x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y23abcEv,_ZThn4_N3ccc7DD5x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y23efgEv,_ZTv0_n12_N3ccc7DD5x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y23efgEv,_ZThn4_N3ccc7DD5x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y2E = {  "_ZN3ccc7DD5x2y2E", // class name
  bases__ZN3ccc7DD5x2y2E, 2,
  &(vtc__ZN3ccc7DD5x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y2E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y3  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x2y33abcEv
  ~CC5x2y3(); // tgen
  CC5x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y3E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y33efgEv");}
void  ccc::CC5x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y33pqrEv");}
void  ccc::CC5x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y33abcEv");}
ccc::CC5x2y3 ::~CC5x2y3(){ note_dtor("_ZN3ccc7CC5x2y3E", this);} // tgen
ccc::CC5x2y3 ::CC5x2y3(){ note_ctor("_ZN3ccc7CC5x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y3E, buf);
    ::ccc::CC5x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y3E);
    dp->::ccc::CC5x2y3::~CC5x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y3E(Test__ZN3ccc7CC5x2y3E, "_ZN3ccc7CC5x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y3C1Ev();
extern void _ZN3ccc7CC5x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y3E[] = {
  NSPAIR(_ZN3ccc7CC5x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y3E[];
extern void _ZN3ccc7CC5x2y33efgEv();
extern void _ZN3ccc7CC5x2y33abcEv();
extern void _ZN3ccc7CC5x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y33pqrEv,_ZTv0_n12_N3ccc7CC5x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33pqrEv,_ZThn4_N3ccc7CC5x2y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y33efgEv,_ZTv0_n16_N3ccc7CC5x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33efgEv,_ZThn4_N3ccc7CC5x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y33abcEv,_ZTv0_n20_N3ccc7CC5x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33abcEv,_ZThn4_N3ccc7CC5x2y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y33pqrEv,_ZTv0_n12_N3ccc7CC5x2y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y33efgEv,_ZTv0_n16_N3ccc7CC5x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y33abcEv,_ZTv0_n20_N3ccc7CC5x2y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y3E[] = {
  {&(_ZTVN3ccc7CC5x2y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y3E[];
static VTBL_ENTRY alt_thunk_names2227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y33abcEv,_ZTv0_n20_N3ccc7CC5x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y33abcEv,_ZThn4_N3ccc7CC5x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y33efgEv,_ZTv0_n16_N3ccc7CC5x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y33efgEv,_ZThn4_N3ccc7CC5x2y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y33pqrEv,_ZTv0_n12_N3ccc7CC5x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y33pqrEv,_ZThn4_N3ccc7CC5x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y3E = {  "_ZN3ccc7CC5x2y3E", // class name
  bases__ZN3ccc7CC5x2y3E, 2,
  &(vtc__ZN3ccc7CC5x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y3E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y3  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD5x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x2y33abcEv
  ~DD5x2y3(); // tgen
  DD5x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y33efgEv");}
void  ccc::DD5x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y33pqrEv");}
void  ccc::DD5x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y33abcEv");}
ccc::DD5x2y3 ::~DD5x2y3(){ note_dtor("_ZN3ccc7DD5x2y3E", this);} // tgen
ccc::DD5x2y3 ::DD5x2y3(){ note_ctor("_ZN3ccc7DD5x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y3E, buf);
    ::ccc::DD5x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y3E);
    dp->::ccc::DD5x2y3::~DD5x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y3E(Test__ZN3ccc7DD5x2y3E, "_ZN3ccc7DD5x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y3C1Ev();
extern void _ZN3ccc7DD5x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y3E[] = {
  NSPAIR(_ZN3ccc7DD5x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y3E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y3E[];
extern void _ZN3ccc7DD5x2y33pqrEv();
extern void _ZN3ccc7DD5x2y33efgEv();
extern void _ZN3ccc7DD5x2y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y33efgEv,_ZTv0_n12_N3ccc7DD5x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y33efgEv,_ZThn4_N3ccc7DD5x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y33abcEv,_ZTv0_n16_N3ccc7DD5x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y33abcEv,_ZThn4_N3ccc7DD5x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y33pqrEv,_ZTv0_n20_N3ccc7DD5x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y33pqrEv,_ZThn4_N3ccc7DD5x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y33efgEv,_ZTv0_n12_N3ccc7DD5x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y33abcEv,_ZTv0_n16_N3ccc7DD5x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y33pqrEv,_ZTv0_n20_N3ccc7DD5x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y3E[] = {
  {&(_ZTVN3ccc7DD5x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y3E[];
static VTBL_ENTRY alt_thunk_names2228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y33pqrEv,_ZTv0_n20_N3ccc7DD5x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y33pqrEv,_ZThn4_N3ccc7DD5x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y33abcEv,_ZTv0_n16_N3ccc7DD5x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y33abcEv,_ZThn4_N3ccc7DD5x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y33efgEv,_ZTv0_n12_N3ccc7DD5x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y33efgEv,_ZThn4_N3ccc7DD5x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y3E = {  "_ZN3ccc7DD5x2y3E", // class name
  bases__ZN3ccc7DD5x2y3E, 2,
  &(vtc__ZN3ccc7DD5x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y4  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC5x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y43efgEv
  ~CC5x2y4(); // tgen
  CC5x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y4E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y43pqrEv");}
void  ccc::CC5x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y43abcEv");}
void  ccc::CC5x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y43efgEv");}
ccc::CC5x2y4 ::~CC5x2y4(){ note_dtor("_ZN3ccc7CC5x2y4E", this);} // tgen
ccc::CC5x2y4 ::CC5x2y4(){ note_ctor("_ZN3ccc7CC5x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y4E, buf);
    ::ccc::CC5x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y4E);
    dp->::ccc::CC5x2y4::~CC5x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y4E(Test__ZN3ccc7CC5x2y4E, "_ZN3ccc7CC5x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y4C1Ev();
extern void _ZN3ccc7CC5x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y4E[] = {
  NSPAIR(_ZN3ccc7CC5x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y4E[];
extern void _ZN3ccc7CC5x2y43efgEv();
extern void _ZN3ccc7CC5x2y43abcEv();
extern void _ZN3ccc7CC5x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y43pqrEv,_ZTv0_n12_N3ccc7CC5x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43pqrEv,_ZThn4_N3ccc7CC5x2y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y43efgEv,_ZTv0_n16_N3ccc7CC5x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43efgEv,_ZThn4_N3ccc7CC5x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y43abcEv,_ZTv0_n20_N3ccc7CC5x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43abcEv,_ZThn4_N3ccc7CC5x2y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y43pqrEv,_ZTv0_n12_N3ccc7CC5x2y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y43efgEv,_ZTv0_n16_N3ccc7CC5x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y43abcEv,_ZTv0_n20_N3ccc7CC5x2y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y4E[] = {
  {&(_ZTVN3ccc7CC5x2y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y4E[];
static VTBL_ENTRY alt_thunk_names2229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y43abcEv,_ZTv0_n20_N3ccc7CC5x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y43abcEv,_ZThn4_N3ccc7CC5x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y43efgEv,_ZTv0_n16_N3ccc7CC5x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y43efgEv,_ZThn4_N3ccc7CC5x2y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y43pqrEv,_ZTv0_n12_N3ccc7CC5x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y43pqrEv,_ZThn4_N3ccc7CC5x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y4E = {  "_ZN3ccc7CC5x2y4E", // class name
  bases__ZN3ccc7CC5x2y4E, 2,
  &(vtc__ZN3ccc7CC5x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2229,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y4  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD5x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x2y43efgEv
  ~DD5x2y4(); // tgen
  DD5x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y43pqrEv");}
void  ccc::DD5x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y43abcEv");}
void  ccc::DD5x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y43efgEv");}
ccc::DD5x2y4 ::~DD5x2y4(){ note_dtor("_ZN3ccc7DD5x2y4E", this);} // tgen
ccc::DD5x2y4 ::DD5x2y4(){ note_ctor("_ZN3ccc7DD5x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y4E, buf);
    ::ccc::DD5x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y4E);
    dp->::ccc::DD5x2y4::~DD5x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y4E(Test__ZN3ccc7DD5x2y4E, "_ZN3ccc7DD5x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y4C1Ev();
extern void _ZN3ccc7DD5x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y4E[] = {
  NSPAIR(_ZN3ccc7DD5x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y4E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y4E[];
extern void _ZN3ccc7DD5x2y43pqrEv();
extern void _ZN3ccc7DD5x2y43efgEv();
extern void _ZN3ccc7DD5x2y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y43efgEv,_ZTv0_n12_N3ccc7DD5x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y43efgEv,_ZThn4_N3ccc7DD5x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y43abcEv,_ZTv0_n16_N3ccc7DD5x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y43abcEv,_ZThn4_N3ccc7DD5x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y43pqrEv,_ZTv0_n20_N3ccc7DD5x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y43pqrEv,_ZThn4_N3ccc7DD5x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y43efgEv,_ZTv0_n12_N3ccc7DD5x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y43abcEv,_ZTv0_n16_N3ccc7DD5x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y43pqrEv,_ZTv0_n20_N3ccc7DD5x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y4E[] = {
  {&(_ZTVN3ccc7DD5x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y4E[];
static VTBL_ENTRY alt_thunk_names2230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y43pqrEv,_ZTv0_n20_N3ccc7DD5x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y43pqrEv,_ZThn4_N3ccc7DD5x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y43abcEv,_ZTv0_n16_N3ccc7DD5x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y43abcEv,_ZThn4_N3ccc7DD5x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y43efgEv,_ZTv0_n12_N3ccc7DD5x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y43efgEv,_ZThn4_N3ccc7DD5x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y4E = {  "_ZN3ccc7DD5x2y4E", // class name
  bases__ZN3ccc7DD5x2y4E, 2,
  &(vtc__ZN3ccc7DD5x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y4E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2230,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y5  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC5x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y53abcEv
  ~CC5x2y5(); // tgen
  CC5x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y5E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y53pqrEv");}
void  ccc::CC5x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y53efgEv");}
void  ccc::CC5x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y53abcEv");}
ccc::CC5x2y5 ::~CC5x2y5(){ note_dtor("_ZN3ccc7CC5x2y5E", this);} // tgen
ccc::CC5x2y5 ::CC5x2y5(){ note_ctor("_ZN3ccc7CC5x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y5E, buf);
    ::ccc::CC5x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y5E);
    dp->::ccc::CC5x2y5::~CC5x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y5E(Test__ZN3ccc7CC5x2y5E, "_ZN3ccc7CC5x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y5C1Ev();
extern void _ZN3ccc7CC5x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y5E[] = {
  NSPAIR(_ZN3ccc7CC5x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y5E[];
extern void _ZN3ccc7CC5x2y53efgEv();
extern void _ZN3ccc7CC5x2y53abcEv();
extern void _ZN3ccc7CC5x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y53pqrEv,_ZTv0_n12_N3ccc7CC5x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53pqrEv,_ZThn4_N3ccc7CC5x2y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y53efgEv,_ZTv0_n16_N3ccc7CC5x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53efgEv,_ZThn4_N3ccc7CC5x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y53abcEv,_ZTv0_n20_N3ccc7CC5x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53abcEv,_ZThn4_N3ccc7CC5x2y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y53pqrEv,_ZTv0_n12_N3ccc7CC5x2y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y53efgEv,_ZTv0_n16_N3ccc7CC5x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y53abcEv,_ZTv0_n20_N3ccc7CC5x2y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y5E[] = {
  {&(_ZTVN3ccc7CC5x2y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y5E[];
static VTBL_ENTRY alt_thunk_names2231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y53abcEv,_ZTv0_n20_N3ccc7CC5x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y53abcEv,_ZThn4_N3ccc7CC5x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y53efgEv,_ZTv0_n16_N3ccc7CC5x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y53efgEv,_ZThn4_N3ccc7CC5x2y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y53pqrEv,_ZTv0_n12_N3ccc7CC5x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y53pqrEv,_ZThn4_N3ccc7CC5x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y5E = {  "_ZN3ccc7CC5x2y5E", // class name
  bases__ZN3ccc7CC5x2y5E, 2,
  &(vtc__ZN3ccc7CC5x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2231,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y5  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD5x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x2y53abcEv
  ~DD5x2y5(); // tgen
  DD5x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y53pqrEv");}
void  ccc::DD5x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y53efgEv");}
void  ccc::DD5x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y53abcEv");}
ccc::DD5x2y5 ::~DD5x2y5(){ note_dtor("_ZN3ccc7DD5x2y5E", this);} // tgen
ccc::DD5x2y5 ::DD5x2y5(){ note_ctor("_ZN3ccc7DD5x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y5E, buf);
    ::ccc::DD5x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y5E);
    dp->::ccc::DD5x2y5::~DD5x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y5E(Test__ZN3ccc7DD5x2y5E, "_ZN3ccc7DD5x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y5C1Ev();
extern void _ZN3ccc7DD5x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y5E[] = {
  NSPAIR(_ZN3ccc7DD5x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y5E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y5E[];
extern void _ZN3ccc7DD5x2y53pqrEv();
extern void _ZN3ccc7DD5x2y53efgEv();
extern void _ZN3ccc7DD5x2y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y53efgEv,_ZTv0_n12_N3ccc7DD5x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y53efgEv,_ZThn4_N3ccc7DD5x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y53abcEv,_ZTv0_n16_N3ccc7DD5x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y53abcEv,_ZThn4_N3ccc7DD5x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y53pqrEv,_ZTv0_n20_N3ccc7DD5x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y53pqrEv,_ZThn4_N3ccc7DD5x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y53efgEv,_ZTv0_n12_N3ccc7DD5x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y53abcEv,_ZTv0_n16_N3ccc7DD5x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y53pqrEv,_ZTv0_n20_N3ccc7DD5x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y5E[] = {
  {&(_ZTVN3ccc7DD5x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y5E[];
static VTBL_ENTRY alt_thunk_names2232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y53pqrEv,_ZTv0_n20_N3ccc7DD5x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y53pqrEv,_ZThn4_N3ccc7DD5x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y53abcEv,_ZTv0_n16_N3ccc7DD5x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y53abcEv,_ZThn4_N3ccc7DD5x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y53efgEv,_ZTv0_n12_N3ccc7DD5x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y53efgEv,_ZThn4_N3ccc7DD5x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y5E = {  "_ZN3ccc7DD5x2y5E", // class name
  bases__ZN3ccc7DD5x2y5E, 2,
  &(vtc__ZN3ccc7DD5x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y5E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2232,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y6  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y63efgEv
  ~CC5x2y6(); // tgen
  CC5x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y6E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y63abcEv");}
void  ccc::CC5x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y63efgEv");}
ccc::CC5x2y6 ::~CC5x2y6(){ note_dtor("_ZN3ccc7CC5x2y6E", this);} // tgen
ccc::CC5x2y6 ::CC5x2y6(){ note_ctor("_ZN3ccc7CC5x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y6E, buf);
    ::ccc::CC5x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y6E);
    dp->::ccc::CC5x2y6::~CC5x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y6E(Test__ZN3ccc7CC5x2y6E, "_ZN3ccc7CC5x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y6C1Ev();
extern void _ZN3ccc7CC5x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y6E[] = {
  NSPAIR(_ZN3ccc7CC5x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y6E[];
extern void _ZN3ccc7CC5x2y63efgEv();
extern void _ZN3ccc7CC5x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y63efgEv,_ZTv0_n16_N3ccc7CC5x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y63efgEv,_ZThn4_N3ccc7CC5x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y63abcEv,_ZTv0_n20_N3ccc7CC5x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y63abcEv,_ZThn4_N3ccc7CC5x2y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y63efgEv,_ZTv0_n16_N3ccc7CC5x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y63abcEv,_ZTv0_n20_N3ccc7CC5x2y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y6E[] = {
  {&(_ZTVN3ccc7CC5x2y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y6E[];
static VTBL_ENTRY alt_thunk_names2233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y63abcEv,_ZTv0_n20_N3ccc7CC5x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y63abcEv,_ZThn4_N3ccc7CC5x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y63efgEv,_ZTv0_n16_N3ccc7CC5x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y63efgEv,_ZThn4_N3ccc7CC5x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y6E = {  "_ZN3ccc7CC5x2y6E", // class name
  bases__ZN3ccc7CC5x2y6E, 2,
  &(vtc__ZN3ccc7CC5x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y6E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2233,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y6  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD5x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x2y63efgEv
  ~DD5x2y6(); // tgen
  DD5x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y63abcEv");}
void  ccc::DD5x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y63efgEv");}
ccc::DD5x2y6 ::~DD5x2y6(){ note_dtor("_ZN3ccc7DD5x2y6E", this);} // tgen
ccc::DD5x2y6 ::DD5x2y6(){ note_ctor("_ZN3ccc7DD5x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y6E, buf);
    ::ccc::DD5x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y6E);
    dp->::ccc::DD5x2y6::~DD5x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y6E(Test__ZN3ccc7DD5x2y6E, "_ZN3ccc7DD5x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y6C1Ev();
extern void _ZN3ccc7DD5x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y6E[] = {
  NSPAIR(_ZN3ccc7DD5x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y6E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x2y63efgEv();
extern void _ZN3ccc7DD5x2y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y63efgEv,_ZTv0_n12_N3ccc7DD5x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y63efgEv,_ZThn4_N3ccc7DD5x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y63abcEv,_ZTv0_n16_N3ccc7DD5x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y63abcEv,_ZThn4_N3ccc7DD5x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y63efgEv,_ZTv0_n12_N3ccc7DD5x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y63abcEv,_ZTv0_n16_N3ccc7DD5x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y6E[] = {
  {&(_ZTVN3ccc7DD5x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y6E[];
static VTBL_ENTRY alt_thunk_names2234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y63abcEv,_ZTv0_n16_N3ccc7DD5x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y63abcEv,_ZThn4_N3ccc7DD5x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y63efgEv,_ZTv0_n12_N3ccc7DD5x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y63efgEv,_ZThn4_N3ccc7DD5x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y6E = {  "_ZN3ccc7DD5x2y6E", // class name
  bases__ZN3ccc7DD5x2y6E, 2,
  &(vtc__ZN3ccc7DD5x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y6E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y7  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y73pqrEv
  ~CC5x2y7(); // tgen
  CC5x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y7E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y73abcEv");}
void  ccc::CC5x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y73pqrEv");}
ccc::CC5x2y7 ::~CC5x2y7(){ note_dtor("_ZN3ccc7CC5x2y7E", this);} // tgen
ccc::CC5x2y7 ::CC5x2y7(){ note_ctor("_ZN3ccc7CC5x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y7E, buf);
    ::ccc::CC5x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y7E);
    dp->::ccc::CC5x2y7::~CC5x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y7E(Test__ZN3ccc7CC5x2y7E, "_ZN3ccc7CC5x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y7C1Ev();
extern void _ZN3ccc7CC5x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y7E[] = {
  NSPAIR(_ZN3ccc7CC5x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC5x2y73abcEv();
extern void _ZN3ccc7CC5x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y73pqrEv,_ZTv0_n12_N3ccc7CC5x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y73pqrEv,_ZThn4_N3ccc7CC5x2y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y73abcEv,_ZTv0_n20_N3ccc7CC5x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y73abcEv,_ZThn4_N3ccc7CC5x2y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y73pqrEv,_ZTv0_n12_N3ccc7CC5x2y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y73abcEv,_ZTv0_n20_N3ccc7CC5x2y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y7E[] = {
  {&(_ZTVN3ccc7CC5x2y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y7E[];
static VTBL_ENTRY alt_thunk_names2235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y73abcEv,_ZTv0_n20_N3ccc7CC5x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y73abcEv,_ZThn4_N3ccc7CC5x2y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y73pqrEv,_ZTv0_n12_N3ccc7CC5x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y73pqrEv,_ZThn4_N3ccc7CC5x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y7E = {  "_ZN3ccc7CC5x2y7E", // class name
  bases__ZN3ccc7CC5x2y7E, 2,
  &(vtc__ZN3ccc7CC5x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y7E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y7  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD5x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y73pqrEv
  ~DD5x2y7(); // tgen
  DD5x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y73abcEv");}
void  ccc::DD5x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y73pqrEv");}
ccc::DD5x2y7 ::~DD5x2y7(){ note_dtor("_ZN3ccc7DD5x2y7E", this);} // tgen
ccc::DD5x2y7 ::DD5x2y7(){ note_ctor("_ZN3ccc7DD5x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y7E, buf);
    ::ccc::DD5x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y7E);
    dp->::ccc::DD5x2y7::~DD5x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y7E(Test__ZN3ccc7DD5x2y7E, "_ZN3ccc7DD5x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y7C1Ev();
extern void _ZN3ccc7DD5x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y7E[] = {
  NSPAIR(_ZN3ccc7DD5x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y7E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y7E[];
extern void _ZN3ccc7DD5x2y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y73abcEv,_ZTv0_n16_N3ccc7DD5x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y73abcEv,_ZThn4_N3ccc7DD5x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y73pqrEv,_ZTv0_n20_N3ccc7DD5x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y73pqrEv,_ZThn4_N3ccc7DD5x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y73abcEv,_ZTv0_n16_N3ccc7DD5x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y73pqrEv,_ZTv0_n20_N3ccc7DD5x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y7E[] = {
  {&(_ZTVN3ccc7DD5x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y7E[];
static VTBL_ENTRY alt_thunk_names2236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y73pqrEv,_ZTv0_n20_N3ccc7DD5x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y73pqrEv,_ZThn4_N3ccc7DD5x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y73abcEv,_ZTv0_n16_N3ccc7DD5x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y73abcEv,_ZThn4_N3ccc7DD5x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y7E = {  "_ZN3ccc7DD5x2y7E", // class name
  bases__ZN3ccc7DD5x2y7E, 2,
  &(vtc__ZN3ccc7DD5x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y7E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y8  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y83abcEv
  ~CC5x2y8(); // tgen
  CC5x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y8E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y83efgEv");}
void  ccc::CC5x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y83abcEv");}
ccc::CC5x2y8 ::~CC5x2y8(){ note_dtor("_ZN3ccc7CC5x2y8E", this);} // tgen
ccc::CC5x2y8 ::CC5x2y8(){ note_ctor("_ZN3ccc7CC5x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y8E, buf);
    ::ccc::CC5x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y8E);
    dp->::ccc::CC5x2y8::~CC5x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y8E(Test__ZN3ccc7CC5x2y8E, "_ZN3ccc7CC5x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y8C1Ev();
extern void _ZN3ccc7CC5x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y8E[] = {
  NSPAIR(_ZN3ccc7CC5x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y8E[];
extern void _ZN3ccc7CC5x2y83efgEv();
extern void _ZN3ccc7CC5x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y83efgEv,_ZTv0_n16_N3ccc7CC5x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y83efgEv,_ZThn4_N3ccc7CC5x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x2y83abcEv,_ZTv0_n20_N3ccc7CC5x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y83abcEv,_ZThn4_N3ccc7CC5x2y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y83efgEv,_ZTv0_n16_N3ccc7CC5x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x2y83abcEv,_ZTv0_n20_N3ccc7CC5x2y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y8E[] = {
  {&(_ZTVN3ccc7CC5x2y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y8E[];
static VTBL_ENTRY alt_thunk_names2237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x2y83abcEv,_ZTv0_n20_N3ccc7CC5x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y83abcEv,_ZThn4_N3ccc7CC5x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y83efgEv,_ZTv0_n16_N3ccc7CC5x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y83efgEv,_ZThn4_N3ccc7CC5x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y8E = {  "_ZN3ccc7CC5x2y8E", // class name
  bases__ZN3ccc7CC5x2y8E, 2,
  &(vtc__ZN3ccc7CC5x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y8  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD5x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x2y83abcEv
  ~DD5x2y8(); // tgen
  DD5x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y83efgEv");}
void  ccc::DD5x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x2y83abcEv");}
ccc::DD5x2y8 ::~DD5x2y8(){ note_dtor("_ZN3ccc7DD5x2y8E", this);} // tgen
ccc::DD5x2y8 ::DD5x2y8(){ note_ctor("_ZN3ccc7DD5x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y8E, buf);
    ::ccc::DD5x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y8E);
    dp->::ccc::DD5x2y8::~DD5x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y8E(Test__ZN3ccc7DD5x2y8E, "_ZN3ccc7DD5x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y8C1Ev();
extern void _ZN3ccc7DD5x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y8E[] = {
  NSPAIR(_ZN3ccc7DD5x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y8E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x2y83efgEv();
extern void _ZN3ccc7DD5x2y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y83efgEv,_ZTv0_n12_N3ccc7DD5x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y83efgEv,_ZThn4_N3ccc7DD5x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x2y83abcEv,_ZTv0_n16_N3ccc7DD5x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y83abcEv,_ZThn4_N3ccc7DD5x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y83efgEv,_ZTv0_n12_N3ccc7DD5x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x2y83abcEv,_ZTv0_n16_N3ccc7DD5x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y8E[] = {
  {&(_ZTVN3ccc7DD5x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y8E[];
static VTBL_ENTRY alt_thunk_names2238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x2y83abcEv,_ZTv0_n16_N3ccc7DD5x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y83abcEv,_ZThn4_N3ccc7DD5x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y83efgEv,_ZTv0_n12_N3ccc7DD5x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y83efgEv,_ZThn4_N3ccc7DD5x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y8E = {  "_ZN3ccc7DD5x2y8E", // class name
  bases__ZN3ccc7DD5x2y8E, 2,
  &(vtc__ZN3ccc7DD5x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y8E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y9  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y93pqrEv
  ~CC5x2y9(); // tgen
  CC5x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y9E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y93efgEv");}
void  ccc::CC5x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y93pqrEv");}
ccc::CC5x2y9 ::~CC5x2y9(){ note_dtor("_ZN3ccc7CC5x2y9E", this);} // tgen
ccc::CC5x2y9 ::CC5x2y9(){ note_ctor("_ZN3ccc7CC5x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y9E, buf);
    ::ccc::CC5x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC5x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y9E);
    dp->::ccc::CC5x2y9::~CC5x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y9E(Test__ZN3ccc7CC5x2y9E, "_ZN3ccc7CC5x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y9C1Ev();
extern void _ZN3ccc7CC5x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y9E[] = {
  NSPAIR(_ZN3ccc7CC5x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y9E[];
extern void _ZN3ccc7CC5x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC5x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x2y93pqrEv,_ZTv0_n12_N3ccc7CC5x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y93pqrEv,_ZThn4_N3ccc7CC5x2y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x2y93efgEv,_ZTv0_n16_N3ccc7CC5x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y93efgEv,_ZThn4_N3ccc7CC5x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x2y93pqrEv,_ZTv0_n12_N3ccc7CC5x2y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x2y93efgEv,_ZTv0_n16_N3ccc7CC5x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x2y9E[] = {
  {&(_ZTVN3ccc7CC5x2y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x2y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x2y9E[];
static VTBL_ENTRY alt_thunk_names2239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x2y93efgEv,_ZTv0_n16_N3ccc7CC5x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y93efgEv,_ZThn4_N3ccc7CC5x2y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x2y93pqrEv,_ZTv0_n12_N3ccc7CC5x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x2y93pqrEv,_ZThn4_N3ccc7CC5x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x2y9E = {  "_ZN3ccc7CC5x2y9E", // class name
  bases__ZN3ccc7CC5x2y9E, 2,
  &(vtc__ZN3ccc7CC5x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x2y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y9  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD5x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x2y93pqrEv
  ~DD5x2y9(); // tgen
  DD5x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x2y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x2y93efgEv");}
void  ccc::DD5x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x2y93pqrEv");}
ccc::DD5x2y9 ::~DD5x2y9(){ note_dtor("_ZN3ccc7DD5x2y9E", this);} // tgen
ccc::DD5x2y9 ::DD5x2y9(){ note_ctor("_ZN3ccc7DD5x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x2y9E, buf);
    ::ccc::DD5x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x2y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD5x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x2y9E);
    dp->::ccc::DD5x2y9::~DD5x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x2y9E(Test__ZN3ccc7DD5x2y9E, "_ZN3ccc7DD5x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x2y9C1Ev();
extern void _ZN3ccc7DD5x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x2y9E[] = {
  NSPAIR(_ZN3ccc7DD5x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD5x2y9E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y9E[];
extern void _ZN3ccc7DD5x2y93pqrEv();
extern void _ZN3ccc7DD5x2y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x2y93efgEv,_ZTv0_n12_N3ccc7DD5x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y93efgEv,_ZThn4_N3ccc7DD5x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x2y93pqrEv,_ZTv0_n20_N3ccc7DD5x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x2y93pqrEv,_ZThn4_N3ccc7DD5x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x2y93efgEv,_ZTv0_n12_N3ccc7DD5x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x2y93pqrEv,_ZTv0_n20_N3ccc7DD5x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x2y9E[] = {
  {&(_ZTVN3ccc7DD5x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x2y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x2y9E[];
static VTBL_ENTRY alt_thunk_names2240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x2y93pqrEv,_ZTv0_n20_N3ccc7DD5x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y93pqrEv,_ZThn4_N3ccc7DD5x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x2y93efgEv,_ZTv0_n12_N3ccc7DD5x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x2y93efgEv,_ZThn4_N3ccc7DD5x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x2y9E = {  "_ZN3ccc7DD5x2y9E", // class name
  bases__ZN3ccc7DD5x2y9E, 2,
  &(vtc__ZN3ccc7DD5x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x2y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x2y9E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y10  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x2y103abcEv
  ~CC5x2y10(); // tgen
  CC5x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y10E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y103pqrEv");}
void  ccc::CC5x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x2y103abcEv");}
ccc::CC5x2y10 ::~CC5x2y10(){ note_dtor("_ZN3ccc8CC5x2y10E", this);} // tgen
ccc::CC5x2y10 ::CC5x2y10(){ note_ctor("_ZN3ccc8CC5x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y10E, buf);
    ::ccc::CC5x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y10E);
    dp->::ccc::CC5x2y10::~CC5x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y10E(Test__ZN3ccc8CC5x2y10E, "_ZN3ccc8CC5x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y10C1Ev();
extern void _ZN3ccc8CC5x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y10E[] = {
  NSPAIR(_ZN3ccc8CC5x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC5x2y103abcEv();
extern void _ZN3ccc8CC5x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x2y103pqrEv,_ZTv0_n12_N3ccc8CC5x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y103pqrEv,_ZThn4_N3ccc8CC5x2y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x2y103abcEv,_ZTv0_n20_N3ccc8CC5x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y103abcEv,_ZThn4_N3ccc8CC5x2y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x2y103pqrEv,_ZTv0_n12_N3ccc8CC5x2y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x2y103abcEv,_ZTv0_n20_N3ccc8CC5x2y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y10E[] = {
  {&(_ZTVN3ccc8CC5x2y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y10E[];
static VTBL_ENTRY alt_thunk_names2241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x2y103abcEv,_ZTv0_n20_N3ccc8CC5x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y103abcEv,_ZThn4_N3ccc8CC5x2y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x2y103pqrEv,_ZTv0_n12_N3ccc8CC5x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y103pqrEv,_ZThn4_N3ccc8CC5x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x2y10E = {  "_ZN3ccc8CC5x2y10E", // class name
  bases__ZN3ccc8CC5x2y10E, 2,
  &(vtc__ZN3ccc8CC5x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y10  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD5x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x2y103abcEv
  ~DD5x2y10(); // tgen
  DD5x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x2y103pqrEv");}
void  ccc::DD5x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x2y103abcEv");}
ccc::DD5x2y10 ::~DD5x2y10(){ note_dtor("_ZN3ccc8DD5x2y10E", this);} // tgen
ccc::DD5x2y10 ::DD5x2y10(){ note_ctor("_ZN3ccc8DD5x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y10E, buf);
    ::ccc::DD5x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y10E);
    dp->::ccc::DD5x2y10::~DD5x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y10E(Test__ZN3ccc8DD5x2y10E, "_ZN3ccc8DD5x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y10C1Ev();
extern void _ZN3ccc8DD5x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y10E[] = {
  NSPAIR(_ZN3ccc8DD5x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y10E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y10E[];
extern void _ZN3ccc8DD5x2y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x2y103abcEv,_ZTv0_n16_N3ccc8DD5x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y103abcEv,_ZThn4_N3ccc8DD5x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x2y103pqrEv,_ZTv0_n20_N3ccc8DD5x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y103pqrEv,_ZThn4_N3ccc8DD5x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x2y103abcEv,_ZTv0_n16_N3ccc8DD5x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x2y103pqrEv,_ZTv0_n20_N3ccc8DD5x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y10E[] = {
  {&(_ZTVN3ccc8DD5x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y10E[];
static VTBL_ENTRY alt_thunk_names2242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x2y103pqrEv,_ZTv0_n20_N3ccc8DD5x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y103pqrEv,_ZThn4_N3ccc8DD5x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x2y103abcEv,_ZTv0_n16_N3ccc8DD5x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y103abcEv,_ZThn4_N3ccc8DD5x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x2y10E = {  "_ZN3ccc8DD5x2y10E", // class name
  bases__ZN3ccc8DD5x2y10E, 2,
  &(vtc__ZN3ccc8DD5x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y10E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y11  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x2y113efgEv
  ~CC5x2y11(); // tgen
  CC5x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y11E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y113pqrEv");}
void  ccc::CC5x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x2y113efgEv");}
ccc::CC5x2y11 ::~CC5x2y11(){ note_dtor("_ZN3ccc8CC5x2y11E", this);} // tgen
ccc::CC5x2y11 ::CC5x2y11(){ note_ctor("_ZN3ccc8CC5x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y11E, buf);
    ::ccc::CC5x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y11E);
    dp->::ccc::CC5x2y11::~CC5x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y11E(Test__ZN3ccc8CC5x2y11E, "_ZN3ccc8CC5x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y11C1Ev();
extern void _ZN3ccc8CC5x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y11E[] = {
  NSPAIR(_ZN3ccc8CC5x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y11E[];
extern void _ZN3ccc8CC5x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC5x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x2y113pqrEv,_ZTv0_n12_N3ccc8CC5x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y113pqrEv,_ZThn4_N3ccc8CC5x2y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x2y113efgEv,_ZTv0_n16_N3ccc8CC5x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y113efgEv,_ZThn4_N3ccc8CC5x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x2y113pqrEv,_ZTv0_n12_N3ccc8CC5x2y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x2y113efgEv,_ZTv0_n16_N3ccc8CC5x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y11E[] = {
  {&(_ZTVN3ccc8CC5x2y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y11E[];
static VTBL_ENTRY alt_thunk_names2243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x2y113efgEv,_ZTv0_n16_N3ccc8CC5x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y113efgEv,_ZThn4_N3ccc8CC5x2y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x2y113pqrEv,_ZTv0_n12_N3ccc8CC5x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y113pqrEv,_ZThn4_N3ccc8CC5x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x2y11E = {  "_ZN3ccc8CC5x2y11E", // class name
  bases__ZN3ccc8CC5x2y11E, 2,
  &(vtc__ZN3ccc8CC5x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y11  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD5x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x2y113efgEv
  ~DD5x2y11(); // tgen
  DD5x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x2y113pqrEv");}
void  ccc::DD5x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x2y113efgEv");}
ccc::DD5x2y11 ::~DD5x2y11(){ note_dtor("_ZN3ccc8DD5x2y11E", this);} // tgen
ccc::DD5x2y11 ::DD5x2y11(){ note_ctor("_ZN3ccc8DD5x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y11E, buf);
    ::ccc::DD5x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y11E);
    dp->::ccc::DD5x2y11::~DD5x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y11E(Test__ZN3ccc8DD5x2y11E, "_ZN3ccc8DD5x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y11C1Ev();
extern void _ZN3ccc8DD5x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y11E[] = {
  NSPAIR(_ZN3ccc8DD5x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y11E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y11E[];
extern void _ZN3ccc8DD5x2y113pqrEv();
extern void _ZN3ccc8DD5x2y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x2y113efgEv,_ZTv0_n12_N3ccc8DD5x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y113efgEv,_ZThn4_N3ccc8DD5x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x2y113pqrEv,_ZTv0_n20_N3ccc8DD5x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y113pqrEv,_ZThn4_N3ccc8DD5x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x2y113efgEv,_ZTv0_n12_N3ccc8DD5x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x2y113pqrEv,_ZTv0_n20_N3ccc8DD5x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y11E[] = {
  {&(_ZTVN3ccc8DD5x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y11E[];
static VTBL_ENTRY alt_thunk_names2244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x2y113pqrEv,_ZTv0_n20_N3ccc8DD5x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y113pqrEv,_ZThn4_N3ccc8DD5x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x2y113efgEv,_ZTv0_n12_N3ccc8DD5x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y113efgEv,_ZThn4_N3ccc8DD5x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x2y11E = {  "_ZN3ccc8DD5x2y11E", // class name
  bases__ZN3ccc8DD5x2y11E, 2,
  &(vtc__ZN3ccc8DD5x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y11E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y12  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC5x2y123abcEv
  ~CC5x2y12(); // tgen
  CC5x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x2y123abcEv");}
ccc::CC5x2y12 ::~CC5x2y12(){ note_dtor("_ZN3ccc8CC5x2y12E", this);} // tgen
ccc::CC5x2y12 ::CC5x2y12(){ note_ctor("_ZN3ccc8CC5x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y12E, buf);
    ::ccc::CC5x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y12E);
    dp->::ccc::CC5x2y12::~CC5x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y12E(Test__ZN3ccc8CC5x2y12E, "_ZN3ccc8CC5x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y12C1Ev();
extern void _ZN3ccc8CC5x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y12E[] = {
  NSPAIR(_ZN3ccc8CC5x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC5x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x2y123abcEv,_ZTv0_n20_N3ccc8CC5x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y123abcEv,_ZThn4_N3ccc8CC5x2y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x2y123abcEv,_ZTv0_n20_N3ccc8CC5x2y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y12E[] = {
  {&(_ZTVN3ccc8CC5x2y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y12E[];
static VTBL_ENTRY alt_thunk_names2245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x2y123abcEv,_ZTv0_n20_N3ccc8CC5x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y123abcEv,_ZThn4_N3ccc8CC5x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x2y12E = {  "_ZN3ccc8CC5x2y12E", // class name
  bases__ZN3ccc8CC5x2y12E, 2,
  &(vtc__ZN3ccc8CC5x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y12E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y12  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD5x2y123abcEv
  ~DD5x2y12(); // tgen
  DD5x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x2y123abcEv");}
ccc::DD5x2y12 ::~DD5x2y12(){ note_dtor("_ZN3ccc8DD5x2y12E", this);} // tgen
ccc::DD5x2y12 ::DD5x2y12(){ note_ctor("_ZN3ccc8DD5x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y12E, buf);
    ::ccc::DD5x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y12E);
    dp->::ccc::DD5x2y12::~DD5x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y12E(Test__ZN3ccc8DD5x2y12E, "_ZN3ccc8DD5x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y12C1Ev();
extern void _ZN3ccc8DD5x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y12E[] = {
  NSPAIR(_ZN3ccc8DD5x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y12E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x2y123abcEv,_ZTv0_n16_N3ccc8DD5x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y123abcEv,_ZThn4_N3ccc8DD5x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x2y123abcEv,_ZTv0_n16_N3ccc8DD5x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y12E[] = {
  {&(_ZTVN3ccc8DD5x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y12E[];
static VTBL_ENTRY alt_thunk_names2246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x2y123abcEv,_ZTv0_n16_N3ccc8DD5x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y123abcEv,_ZThn4_N3ccc8DD5x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x2y12E = {  "_ZN3ccc8DD5x2y12E", // class name
  bases__ZN3ccc8DD5x2y12E, 2,
  &(vtc__ZN3ccc8DD5x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y12E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y13  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC5x2y133efgEv
  ~CC5x2y13(); // tgen
  CC5x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x2y133efgEv");}
ccc::CC5x2y13 ::~CC5x2y13(){ note_dtor("_ZN3ccc8CC5x2y13E", this);} // tgen
ccc::CC5x2y13 ::CC5x2y13(){ note_ctor("_ZN3ccc8CC5x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y13E, buf);
    ::ccc::CC5x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y13E);
    dp->::ccc::CC5x2y13::~CC5x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y13E(Test__ZN3ccc8CC5x2y13E, "_ZN3ccc8CC5x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y13C1Ev();
extern void _ZN3ccc8CC5x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y13E[] = {
  NSPAIR(_ZN3ccc8CC5x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y13E[];
extern void _ZN3ccc8CC5x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x2y133efgEv,_ZTv0_n16_N3ccc8CC5x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y133efgEv,_ZThn4_N3ccc8CC5x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x2y133efgEv,_ZTv0_n16_N3ccc8CC5x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y13E[] = {
  {&(_ZTVN3ccc8CC5x2y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y13E[];
static VTBL_ENTRY alt_thunk_names2247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x2y133efgEv,_ZTv0_n16_N3ccc8CC5x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y133efgEv,_ZThn4_N3ccc8CC5x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x2y13E = {  "_ZN3ccc8CC5x2y13E", // class name
  bases__ZN3ccc8CC5x2y13E, 2,
  &(vtc__ZN3ccc8CC5x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y13  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD5x2y133efgEv
  ~DD5x2y13(); // tgen
  DD5x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x2y133efgEv");}
ccc::DD5x2y13 ::~DD5x2y13(){ note_dtor("_ZN3ccc8DD5x2y13E", this);} // tgen
ccc::DD5x2y13 ::DD5x2y13(){ note_ctor("_ZN3ccc8DD5x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y13E, buf);
    ::ccc::DD5x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y13E);
    dp->::ccc::DD5x2y13::~DD5x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y13E(Test__ZN3ccc8DD5x2y13E, "_ZN3ccc8DD5x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y13C1Ev();
extern void _ZN3ccc8DD5x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y13E[] = {
  NSPAIR(_ZN3ccc8DD5x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y13E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x2y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x2y133efgEv,_ZTv0_n12_N3ccc8DD5x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y133efgEv,_ZThn4_N3ccc8DD5x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x2y133efgEv,_ZTv0_n12_N3ccc8DD5x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y13E[] = {
  {&(_ZTVN3ccc8DD5x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y13E[];
static VTBL_ENTRY alt_thunk_names2248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x2y133efgEv,_ZTv0_n12_N3ccc8DD5x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y133efgEv,_ZThn4_N3ccc8DD5x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x2y13E = {  "_ZN3ccc8DD5x2y13E", // class name
  bases__ZN3ccc8DD5x2y13E, 2,
  &(vtc__ZN3ccc8DD5x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y13E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y14  : virtual ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y143pqrEv
  ~CC5x2y14(); // tgen
  CC5x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y143pqrEv");}
ccc::CC5x2y14 ::~CC5x2y14(){ note_dtor("_ZN3ccc8CC5x2y14E", this);} // tgen
ccc::CC5x2y14 ::CC5x2y14(){ note_ctor("_ZN3ccc8CC5x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y14E, buf);
    ::ccc::CC5x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y14E);
    dp->::ccc::CC5x2y14::~CC5x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y14E(Test__ZN3ccc8CC5x2y14E, "_ZN3ccc8CC5x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y14C1Ev();
extern void _ZN3ccc8CC5x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y14E[] = {
  NSPAIR(_ZN3ccc8CC5x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC5x2y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x2y143pqrEv,_ZTv0_n12_N3ccc8CC5x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y143pqrEv,_ZThn4_N3ccc8CC5x2y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x2y143pqrEv,_ZTv0_n12_N3ccc8CC5x2y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y14E[] = {
  {&(_ZTVN3ccc8CC5x2y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y14E[];
static VTBL_ENTRY alt_thunk_names2249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x2y143pqrEv,_ZTv0_n12_N3ccc8CC5x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x2y143pqrEv,_ZThn4_N3ccc8CC5x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x2y14E = {  "_ZN3ccc8CC5x2y14E", // class name
  bases__ZN3ccc8CC5x2y14E, 2,
  &(vtc__ZN3ccc8CC5x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y14E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y14  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD5x2y143pqrEv
  ~DD5x2y14(); // tgen
  DD5x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x2y143pqrEv");}
ccc::DD5x2y14 ::~DD5x2y14(){ note_dtor("_ZN3ccc8DD5x2y14E", this);} // tgen
ccc::DD5x2y14 ::DD5x2y14(){ note_ctor("_ZN3ccc8DD5x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y14E, buf);
    ::ccc::DD5x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y14E);
    dp->::ccc::DD5x2y14::~DD5x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y14E(Test__ZN3ccc8DD5x2y14E, "_ZN3ccc8DD5x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y14C1Ev();
extern void _ZN3ccc8DD5x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y14E[] = {
  NSPAIR(_ZN3ccc8DD5x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y14E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y14E[];
extern void _ZN3ccc8DD5x2y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x2y143pqrEv,_ZTv0_n20_N3ccc8DD5x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x2y143pqrEv,_ZThn4_N3ccc8DD5x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x2y143pqrEv,_ZTv0_n20_N3ccc8DD5x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y14E[] = {
  {&(_ZTVN3ccc8DD5x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y14E[];
static VTBL_ENTRY alt_thunk_names2250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x2y143pqrEv,_ZTv0_n20_N3ccc8DD5x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x2y143pqrEv,_ZThn4_N3ccc8DD5x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x2y14E = {  "_ZN3ccc8DD5x2y14E", // class name
  bases__ZN3ccc8DD5x2y14E, 2,
  &(vtc__ZN3ccc8DD5x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y14E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y15  : virtual ::ccc::AA5 , ::ccc::BB2 {
  ~CC5x2y15(); // tgen
  CC5x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x2y15 ::~CC5x2y15(){ note_dtor("_ZN3ccc8CC5x2y15E", this);} // tgen
ccc::CC5x2y15 ::CC5x2y15(){ note_ctor("_ZN3ccc8CC5x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y15E, buf);
    ::ccc::CC5x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC5x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y15E);
    dp->::ccc::CC5x2y15::~CC5x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y15E(Test__ZN3ccc8CC5x2y15E, "_ZN3ccc8CC5x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y15C1Ev();
extern void _ZN3ccc8CC5x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y15E[] = {
  NSPAIR(_ZN3ccc8CC5x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x2y15E[] = {
  {&(_ZTVN3ccc8CC5x2y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x2y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x2y15E[];
Class_Descriptor cd__ZN3ccc8CC5x2y15E = {  "_ZN3ccc8CC5x2y15E", // class name
  bases__ZN3ccc8CC5x2y15E, 2,
  &(vtc__ZN3ccc8CC5x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x2y15E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x2y15  : virtual ::ccc::AA5 , virtual ::ccc::BB2 {
  ~DD5x2y15(); // tgen
  DD5x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x2y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x2y15 ::~DD5x2y15(){ note_dtor("_ZN3ccc8DD5x2y15E", this);} // tgen
ccc::DD5x2y15 ::DD5x2y15(){ note_ctor("_ZN3ccc8DD5x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x2y15E, buf);
    ::ccc::DD5x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x2y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD5x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x2y15E);
    dp->::ccc::DD5x2y15::~DD5x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x2y15E(Test__ZN3ccc8DD5x2y15E, "_ZN3ccc8DD5x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x2y15C1Ev();
extern void _ZN3ccc8DD5x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x2y15E[] = {
  NSPAIR(_ZN3ccc8DD5x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD5x2y15E[] = {
  // 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},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x2y15E[] = {
  {&(_ZTVN3ccc8DD5x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x2y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x2y15E[];
Class_Descriptor cd__ZN3ccc8DD5x2y15E = {  "_ZN3ccc8DD5x2y15E", // class name
  bases__ZN3ccc8DD5x2y15E, 2,
  &(vtc__ZN3ccc8DD5x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x2y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x2y15E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y0  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y03pqrEv
  ~CC5x3y0(); // tgen
  CC5x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y0E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y03abcEv");}
void  ccc::CC5x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y03efgEv");}
void  ccc::CC5x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y03pqrEv");}
ccc::CC5x3y0 ::~CC5x3y0(){ note_dtor("_ZN3ccc7CC5x3y0E", this);} // tgen
ccc::CC5x3y0 ::CC5x3y0(){ note_ctor("_ZN3ccc7CC5x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y0E, buf);
    ::ccc::CC5x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y0E);
    dp->::ccc::CC5x3y0::~CC5x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y0E(Test__ZN3ccc7CC5x3y0E, "_ZN3ccc7CC5x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y0C1Ev();
extern void _ZN3ccc7CC5x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y0E[] = {
  NSPAIR(_ZN3ccc7CC5x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC5x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y0E[];
extern void _ZN3ccc7CC5x3y03efgEv();
extern void _ZN3ccc7CC5x3y03pqrEv();
extern void _ZN3ccc7CC5x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y03pqrEv,_ZTv0_n12_N3ccc7CC5x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03pqrEv,_ZThn4_N3ccc7CC5x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y03efgEv,_ZTv0_n16_N3ccc7CC5x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03efgEv,_ZThn4_N3ccc7CC5x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y03abcEv,_ZTv0_n20_N3ccc7CC5x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03abcEv,_ZThn4_N3ccc7CC5x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y03pqrEv,_ZTv0_n12_N3ccc7CC5x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y03efgEv,_ZTv0_n16_N3ccc7CC5x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y03abcEv,_ZTv0_n20_N3ccc7CC5x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y0E[] = {
  {&(_ZTVN3ccc7CC5x3y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y0E[];
static VTBL_ENTRY alt_thunk_names2251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y03abcEv,_ZTv0_n20_N3ccc7CC5x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y03abcEv,_ZThn4_N3ccc7CC5x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y03efgEv,_ZTv0_n16_N3ccc7CC5x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y03efgEv,_ZThn4_N3ccc7CC5x3y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y03pqrEv,_ZTv0_n12_N3ccc7CC5x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y03pqrEv,_ZThn4_N3ccc7CC5x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y0E = {  "_ZN3ccc7CC5x3y0E", // class name
  bases__ZN3ccc7CC5x3y0E, 2,
  &(vtc__ZN3ccc7CC5x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y0E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x3y0  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD5x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y03pqrEv
  ~DD5x3y0(); // tgen
  DD5x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y03abcEv");}
void  ccc::DD5x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y03efgEv");}
void  ccc::DD5x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y03pqrEv");}
ccc::DD5x3y0 ::~DD5x3y0(){ note_dtor("_ZN3ccc7DD5x3y0E", this);} // tgen
ccc::DD5x3y0 ::DD5x3y0(){ note_ctor("_ZN3ccc7DD5x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y0E, buf);
    ::ccc::DD5x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y0E);
    dp->::ccc::DD5x3y0::~DD5x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y0E(Test__ZN3ccc7DD5x3y0E, "_ZN3ccc7DD5x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y0C1Ev();
extern void _ZN3ccc7DD5x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y0E[] = {
  NSPAIR(_ZN3ccc7DD5x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD5x3y0E[] = {
  // 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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y0E[];
extern void _ZN3ccc7DD5x3y03pqrEv();
extern void _ZN3ccc7DD5x3y03efgEv();
extern void _ZN3ccc7DD5x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y03efgEv,_ZTv0_n12_N3ccc7DD5x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y03efgEv,_ZThn4_N3ccc7DD5x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y03pqrEv,_ZTv0_n16_N3ccc7DD5x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y03pqrEv,_ZThn4_N3ccc7DD5x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y03abcEv,_ZTv0_n20_N3ccc7DD5x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y03abcEv,_ZThn4_N3ccc7DD5x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y03efgEv,_ZTv0_n12_N3ccc7DD5x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y03pqrEv,_ZTv0_n16_N3ccc7DD5x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y03abcEv,_ZTv0_n20_N3ccc7DD5x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y0E[] = {
  {&(_ZTVN3ccc7DD5x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y0E[];
static VTBL_ENTRY alt_thunk_names2252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y03abcEv,_ZTv0_n20_N3ccc7DD5x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y03abcEv,_ZThn4_N3ccc7DD5x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y03pqrEv,_ZTv0_n16_N3ccc7DD5x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y03pqrEv,_ZThn4_N3ccc7DD5x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y03efgEv,_ZTv0_n12_N3ccc7DD5x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y03efgEv,_ZThn4_N3ccc7DD5x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y0E = {  "_ZN3ccc7DD5x3y0E", // class name
  bases__ZN3ccc7DD5x3y0E, 2,
  &(vtc__ZN3ccc7DD5x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y0E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y1  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x3y13efgEv
  ~CC5x3y1(); // tgen
  CC5x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y1E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y13abcEv");}
void  ccc::CC5x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y13pqrEv");}
void  ccc::CC5x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y13efgEv");}
ccc::CC5x3y1 ::~CC5x3y1(){ note_dtor("_ZN3ccc7CC5x3y1E", this);} // tgen
ccc::CC5x3y1 ::CC5x3y1(){ note_ctor("_ZN3ccc7CC5x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y1E, buf);
    ::ccc::CC5x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y1E);
    dp->::ccc::CC5x3y1::~CC5x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y1E(Test__ZN3ccc7CC5x3y1E, "_ZN3ccc7CC5x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y1C1Ev();
extern void _ZN3ccc7CC5x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y1E[] = {
  NSPAIR(_ZN3ccc7CC5x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC5x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    ABISELECT(8,4), //bcp->offset
    6, //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},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y1E[];
extern void _ZN3ccc7CC5x3y13efgEv();
extern void _ZN3ccc7CC5x3y13pqrEv();
extern void _ZN3ccc7CC5x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y13pqrEv,_ZTv0_n12_N3ccc7CC5x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13pqrEv,_ZThn4_N3ccc7CC5x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y13efgEv,_ZTv0_n16_N3ccc7CC5x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13efgEv,_ZThn4_N3ccc7CC5x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y13abcEv,_ZTv0_n20_N3ccc7CC5x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13abcEv,_ZThn4_N3ccc7CC5x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y13pqrEv,_ZTv0_n12_N3ccc7CC5x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y13efgEv,_ZTv0_n16_N3ccc7CC5x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y13abcEv,_ZTv0_n20_N3ccc7CC5x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y1E[] = {
  {&(_ZTVN3ccc7CC5x3y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y1E[];
static VTBL_ENTRY alt_thunk_names2253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y13abcEv,_ZTv0_n20_N3ccc7CC5x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y13abcEv,_ZThn4_N3ccc7CC5x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y13efgEv,_ZTv0_n16_N3ccc7CC5x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y13efgEv,_ZThn4_N3ccc7CC5x3y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y13pqrEv,_ZTv0_n12_N3ccc7CC5x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y13pqrEv,_ZThn4_N3ccc7CC5x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y1E = {  "_ZN3ccc7CC5x3y1E", // class name
  bases__ZN3ccc7CC5x3y1E, 2,
  &(vtc__ZN3ccc7CC5x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y1E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  DD5x3y1  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD5x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x3y13efgEv
  ~DD5x3y1(); // tgen
  DD5x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y13abcEv");}
void  ccc::DD5x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y13pqrEv");}
void  ccc::DD5x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y13efgEv");}
ccc::DD5x3y1 ::~DD5x3y1(){ note_dtor("_ZN3ccc7DD5x3y1E", this);} // tgen
ccc::DD5x3y1 ::DD5x3y1(){ note_ctor("_ZN3ccc7DD5x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y1E, buf);
    ::ccc::DD5x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y1E);
    dp->::ccc::DD5x3y1::~DD5x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y1E(Test__ZN3ccc7DD5x3y1E, "_ZN3ccc7DD5x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y1C1Ev();
extern void _ZN3ccc7DD5x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y1E[] = {
  NSPAIR(_ZN3ccc7DD5x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD5x3y1E[] = {
  // 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},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    10, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y1E[];
extern void _ZN3ccc7DD5x3y13pqrEv();
extern void _ZN3ccc7DD5x3y13efgEv();
extern void _ZN3ccc7DD5x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y13efgEv,_ZTv0_n12_N3ccc7DD5x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y13efgEv,_ZThn4_N3ccc7DD5x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y13pqrEv,_ZTv0_n16_N3ccc7DD5x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y13pqrEv,_ZThn4_N3ccc7DD5x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y13abcEv,_ZTv0_n20_N3ccc7DD5x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y13abcEv,_ZThn4_N3ccc7DD5x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y13efgEv,_ZTv0_n12_N3ccc7DD5x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y13pqrEv,_ZTv0_n16_N3ccc7DD5x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y13abcEv,_ZTv0_n20_N3ccc7DD5x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y1E[] = {
  {&(_ZTVN3ccc7DD5x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y1E[];
static VTBL_ENTRY alt_thunk_names2254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y13abcEv,_ZTv0_n20_N3ccc7DD5x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y13abcEv,_ZThn4_N3ccc7DD5x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y13pqrEv,_ZTv0_n16_N3ccc7DD5x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y13pqrEv,_ZThn4_N3ccc7DD5x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y13efgEv,_ZTv0_n12_N3ccc7DD5x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y13efgEv,_ZThn4_N3ccc7DD5x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y1E = {  "_ZN3ccc7DD5x3y1E", // class name
  bases__ZN3ccc7DD5x3y1E, 2,
  &(vtc__ZN3ccc7DD5x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y1E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2254,
};
#endif // __cplusplus

//============================================================================

